From ee1a7a12ccf1c537f04ed0165749030c0149811b Mon Sep 17 00:00:00 2001 From: Fairuz Date: Thu, 17 Jun 2021 20:12:08 +0800 Subject: [PATCH] Initial setup --- .editorconfig | 15 + .env.example | 51 + .gitattributes | 5 + .gitignore | 27 + .styleci.yml | 13 + README.md | 62 + .../Exceptions/AccessForbiddenException.php | 12 + .../AccessUnauthorisedException.php | 12 + app/Classes/Exceptions/ErrorException.php | 19 + .../InternalServerErrorException.php | 12 + .../Exceptions/MalformedRequestException.php | 11 + .../Exceptions/RequestValidationException.php | 11 + .../Exceptions/ResourceConflictException.php | 12 + .../Exceptions/ResourceNotFoundException.php | 11 + .../Exceptions/ServiceApiException.php | 11 + .../Abstracts/AbstractControllerLogic.php | 97 + .../General/Abstracts/AbstractRule.php | 46 + .../General/Abstracts/AbstractService.php | 42 + .../General/Abstracts/AbstractValidation.php | 49 + .../General/DummyDataTransferObject.php | 10 + .../Eloquent/AbstractDeleteMultipleRecord.php | 32 + .../General/Eloquent/AbstractDeleteRecord.php | 31 + .../General/Eloquent/AbstractFetchRecord.php | 37 + .../General/Eloquent/AbstractGetRecord.php | 70 + .../General/Eloquent/AbstractListRecord.php | 46 + .../Eloquent/AbstractUpdateMultipleRecord.php | 33 + .../General/Eloquent/AbstractUpdateRecord.php | 30 + .../AbstractUpdateRelationshipRecord.php | 33 + .../General/Eloquent/ApplyFiltersToQuery.php | 40 + .../General/Eloquent/Filters/Active.php | 20 + .../General/Eloquent/Filters/BusinessType.php | 20 + .../General/Eloquent/Filters/CompanyId.php | 20 + .../Filters/ConvertibleCurrencyId.php | 20 + .../General/Eloquent/Filters/CountryId.php | 20 + .../General/Eloquent/Filters/CurrencyId.php | 20 + .../Eloquent/Filters/CustomServiceType.php | 21 + .../Eloquent/Filters/DocumentTypeIn.php | 20 + .../General/Eloquent/Filters/Email.php | 20 + .../General/Eloquent/Filters/Filter.php | 19 + .../Eloquent/Filters/FixedCurrencyId.php | 20 + app/Classes/General/Eloquent/Filters/Id.php | 20 + app/Classes/General/Eloquent/Filters/IdIn.php | 20 + .../General/Eloquent/Filters/IdNot.php | 20 + .../General/Eloquent/Filters/IdNotIn.php | 20 + .../General/Eloquent/Filters/IssuerIn.php | 20 + .../General/Eloquent/Filters/Marking.php | 20 + app/Classes/General/Eloquent/Filters/Name.php | 20 + .../General/Eloquent/Filters/NotExpired.php | 21 + .../Eloquent/Filters/OriginalCurrencyIdIn.php | 20 + .../Eloquent/Filters/PaymentApprovals.php | 20 + .../Eloquent/Filters/PaymentMethodType.php | 20 + .../Eloquent/Filters/PendingPayment.php | 24 + .../Eloquent/Filters/PendingPurchaseOrder.php | 29 + .../Filters/PurchaseOrderApproval.php | 29 + .../General/Eloquent/Filters/Reference.php | 20 + .../General/Eloquent/Filters/SegmentId.php | 20 + .../General/Eloquent/Filters/ServiceId.php | 20 + .../General/Eloquent/Filters/ServiceType.php | 21 + .../General/Eloquent/Filters/ShortCode.php | 20 + .../General/Eloquent/Filters/Status.php | 20 + .../General/Eloquent/Filters/StatusIn.php | 20 + .../Eloquent/Filters/SupplierCurrencies.php | 21 + .../General/Eloquent/Filters/Token.php | 20 + app/Classes/General/Eloquent/Filters/Type.php | 20 + .../General/Eloquent/Filters/WithBookings.php | 20 + .../General/Eloquent/Filters/WithCompany.php | 20 + .../Eloquent/Filters/WithTransactions.php | 20 + .../General/Eloquent/Filters/WithUser.php | 20 + .../General/Eloquent/Filters/isDefault.php | 20 + app/Classes/General/Helper.php | 27 + .../General/Interfaces/DataTransferObject.php | 9 + .../General/Interfaces/Documentable.php | 13 + .../General/Services/GeneratesInitials.php | 152 ++ app/Classes/General/Wrapper/Hasher.php | 23 + app/Classes/Notifications/AbstractEmail.php | 15 + .../ValueObjects/Constants/HttpStatus.php | 31 + .../ValueObjects/Constants/Notifications.php | 14 + .../Response/ApiResponseObject.php | 78 + app/Console/Kernel.php | 41 + app/Exceptions/Handler.php | 64 + app/Http/Controllers/Controller.php | 13 + app/Http/Controllers/TestSetup.php | 10 + app/Http/Kernel.php | 67 + app/Http/Middleware/Authenticate.php | 21 + app/Http/Middleware/EncryptCookies.php | 17 + .../PreventRequestsDuringMaintenance.php | 17 + .../Middleware/RedirectIfAuthenticated.php | 32 + app/Http/Middleware/TrimStrings.php | 19 + app/Http/Middleware/TrustHosts.php | 20 + app/Http/Middleware/TrustProxies.php | 23 + app/Http/Middleware/ValidateToken.php | 48 + app/Http/Middleware/VerifyCsrfToken.php | 17 + app/Models/AbstractModel.php | 13 + app/Models/Permission.php | 9 + app/Models/Role.php | 8 + app/Models/User.php | 67 + app/Providers/AppServiceProvider.php | 28 + app/Providers/AuthServiceProvider.php | 30 + app/Providers/BroadcastServiceProvider.php | 21 + app/Providers/EventServiceProvider.php | 32 + app/Providers/RouteServiceProvider.php | 63 + artisan | 53 + bootstrap/app.php | 55 + bootstrap/cache/.gitignore | 2 + composer.json | 68 + config/activitylog.php | 52 + config/app.php | 238 ++ config/auth.php | 117 + config/broadcasting.php | 64 + config/cache.php | 110 + config/cors.php | 34 + config/database.php | 147 ++ config/filesystems.php | 73 + config/hashing.php | 52 + config/jwt.php | 304 +++ config/logging.php | 105 + config/mail.php | 110 + config/pdf.php | 27 + config/permission.php | 143 ++ config/queue.php | 93 + config/services.php | 33 + config/session.php | 201 ++ config/view.php | 36 + database/.gitignore | 1 + database/factories/UserFactory.php | 47 + .../2014_10_12_000000_create_users_table.php | 36 + ...12_100000_create_password_resets_table.php | 32 + ..._08_19_000000_create_failed_jobs_table.php | 36 + ..._06_17_041313_create_permission_tables.php | 114 + ...06_17_041406_create_activity_log_table.php | 33 + database/seeders/DatabaseSeeder.php | 18 + package.json | 129 + phpunit.xml | 31 + .../fonts/montserrat/Montserrat-Bold.ttf | Bin 0 -> 54864 bytes .../fonts/montserrat/Montserrat-Regular.ttf | Bin 0 -> 54988 bytes .../montserrat/montserrat-bold-webfont.svg | 1462 +++++++++++ .../montserrat/montserrat-regular-webfont.svg | 1317 ++++++++++ resources/assets/images/2829248.png | Bin 0 -> 74265 bytes resources/assets/images/2853457.png | Bin 0 -> 43878 bytes resources/assets/images/2942005.jpg | Bin 0 -> 105176 bytes resources/assets/images/3231370.jpg | Bin 0 -> 39936 bytes resources/assets/images/3568950.png | Bin 0 -> 75966 bytes .../images/favicon/android-chrome-192x192.png | Bin 0 -> 15724 bytes .../images/favicon/android-chrome-512x512.png | Bin 0 -> 73717 bytes .../images/favicon/apple-touch-icon.png | Bin 0 -> 13884 bytes .../assets/images/favicon/favicon-16x16.png | Bin 0 -> 546 bytes .../assets/images/favicon/favicon-32x32.png | Bin 0 -> 1200 bytes resources/assets/images/favicon/favicon.ico | Bin 0 -> 15406 bytes .../assets/images/favicon/site.webmanifest | 1 + .../assets/images/icons/packing-icon.png | Bin 0 -> 13029 bytes resources/assets/images/icons/pdf.png | Bin 0 -> 7901 bytes .../assets/images/icons/processing-icon.png | Bin 0 -> 7860 bytes resources/assets/images/icons/xlsx.png | Bin 0 -> 64553 bytes resources/assets/js/pages.js | 2036 +++++++++++++++ resources/assets/js/pdfThumbnail.js | 90 + resources/assets/js/scripts.js | 56 + resources/assets/js/three.r92.min.js | 927 +++++++ resources/assets/js/vanta.birds.min.js | 1 + resources/assets/sass/_color.scss | 543 ++++ resources/assets/sass/_mixins.scss | 903 +++++++ resources/assets/sass/_modules.scss | 96 + resources/assets/sass/_responsive.scss | 1187 +++++++++ resources/assets/sass/_var.scss | 168 ++ resources/assets/sass/main.scss | 40 + resources/assets/sass/modules/_alerts.scss | 93 + resources/assets/sass/modules/_animation.scss | 112 + resources/assets/sass/modules/_buttons.scss | 679 +++++ resources/assets/sass/modules/_calendar.scss | 719 ++++++ resources/assets/sass/modules/_cards.scss | 410 ++++ resources/assets/sass/modules/_charts.scss | 367 +++ resources/assets/sass/modules/_chat.scss | 81 + resources/assets/sass/modules/_email.scss | 150 ++ .../assets/sass/modules/_form_elements.scss | 2142 ++++++++++++++++ resources/assets/sass/modules/_gallery.scss | 255 ++ resources/assets/sass/modules/_layout.scss | 2176 +++++++++++++++++ resources/assets/sass/modules/_list.scss | 210 ++ .../assets/sass/modules/_lock_screen.scss | 92 + resources/assets/sass/modules/_login.scss | 70 + resources/assets/sass/modules/_misc.scss | 718 ++++++ resources/assets/sass/modules/_modals.scss | 285 +++ resources/assets/sass/modules/_nestables.scss | 84 + .../assets/sass/modules/_notifications.scss | 675 +++++ resources/assets/sass/modules/_print.scss | 32 + .../sass/modules/_progress_indicators.scss | 225 ++ resources/assets/sass/modules/_sliders.scss | 313 +++ resources/assets/sass/modules/_social.scss | 450 ++++ resources/assets/sass/modules/_tables.scss | 416 ++++ .../assets/sass/modules/_tabs_accordian.scss | 764 ++++++ resources/assets/sass/modules/_timeline.scss | 521 ++++ resources/assets/sass/modules/_treeview.scss | 36 + .../assets/sass/modules/_typography.scss | 885 +++++++ .../assets/sass/modules/_vector_map.scss | 144 ++ resources/assets/sass/modules/_view.scss | 116 + resources/assets/sass/modules/_widgets.scss | 472 ++++ resources/assets/sass/modules/_z_index.scss | 24 + resources/assets/vue/app.js | 54 + .../assets/vue/general/directives/closable.js | 39 + .../assets/vue/general/functions/router.js | 16 + .../mixins/accounts/authenticationHandler.js | 16 + .../mixins/accounts/resetPasswordHandler.js | 17 + .../mixins/accounts/updateProfileHandler.js | 18 + .../validation/loginFormValidation.js | 11 + .../validation/registrationFormValidation.js | 30 + .../validation/resetPasswordFormValidation.js | 10 + .../validation/updateProfileFormValidation.js | 10 + ...dentificationVerificationFormValidation.js | 16 + .../vue/general/mixins/componentHandler.js | 18 + .../assets/vue/general/mixins/crudHandler.js | 45 + .../vue/general/mixins/errorMessageHandler.js | 13 + .../assets/vue/general/mixins/formHandler.js | 48 + resources/assets/vue/general/mixins/guards.js | 17 + .../vue/general/mixins/modalFormHandler.js | 15 + .../assets/vue/general/mixins/request.js | 50 + .../vue/general/mixins/staticFormHandler.js | 14 + .../assets/vue/vuex/modules/authentication.js | 90 + .../vue/vuex/modules/createNotification.js | 15 + .../assets/vue/vuex/modules/crudRequest.js | 23 + .../vue/vuex/modules/loadRequestQueue.js | 71 + .../assets/vue/vuex/modules/toggleLoading.js | 26 + .../assets/vue/vuex/modules/toggleSection.js | 29 + resources/assets/vue/vuex/store.js | 21 + resources/lang/en/auth.php | 20 + resources/lang/en/pagination.php | 19 + resources/lang/en/passwords.php | 22 + resources/lang/en/validation.php | 156 ++ resources/views/layouts/base.blade.php | 13 + resources/views/layouts/base_login.blade.php | 7 + resources/views/layouts/base_pdf.blade.php | 152 ++ resources/views/layouts/base_portal.blade.php | 19 + resources/views/vendor/head.blade.php | 13 + resources/views/vendor/js.blade.php | 12 + resources/views/welcome.blade.php | 7 + routes/api.php | 19 + routes/channels.php | 18 + routes/console.php | 19 + routes/web.php | 18 + server.php | 21 + storage/app/.gitignore | 3 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + webpack.mix.js | 14 + 247 files changed, 29192 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .styleci.yml create mode 100644 README.md create mode 100644 app/Classes/Exceptions/AccessForbiddenException.php create mode 100644 app/Classes/Exceptions/AccessUnauthorisedException.php create mode 100644 app/Classes/Exceptions/ErrorException.php create mode 100644 app/Classes/Exceptions/InternalServerErrorException.php create mode 100644 app/Classes/Exceptions/MalformedRequestException.php create mode 100644 app/Classes/Exceptions/RequestValidationException.php create mode 100644 app/Classes/Exceptions/ResourceConflictException.php create mode 100644 app/Classes/Exceptions/ResourceNotFoundException.php create mode 100644 app/Classes/Exceptions/ServiceApiException.php create mode 100644 app/Classes/General/Abstracts/AbstractControllerLogic.php create mode 100644 app/Classes/General/Abstracts/AbstractRule.php create mode 100644 app/Classes/General/Abstracts/AbstractService.php create mode 100644 app/Classes/General/Abstracts/AbstractValidation.php create mode 100644 app/Classes/General/DummyDataTransferObject.php create mode 100644 app/Classes/General/Eloquent/AbstractDeleteMultipleRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractDeleteRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractFetchRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractGetRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractListRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractUpdateMultipleRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractUpdateRecord.php create mode 100644 app/Classes/General/Eloquent/AbstractUpdateRelationshipRecord.php create mode 100644 app/Classes/General/Eloquent/ApplyFiltersToQuery.php create mode 100644 app/Classes/General/Eloquent/Filters/Active.php create mode 100644 app/Classes/General/Eloquent/Filters/BusinessType.php create mode 100644 app/Classes/General/Eloquent/Filters/CompanyId.php create mode 100644 app/Classes/General/Eloquent/Filters/ConvertibleCurrencyId.php create mode 100644 app/Classes/General/Eloquent/Filters/CountryId.php create mode 100644 app/Classes/General/Eloquent/Filters/CurrencyId.php create mode 100644 app/Classes/General/Eloquent/Filters/CustomServiceType.php create mode 100644 app/Classes/General/Eloquent/Filters/DocumentTypeIn.php create mode 100644 app/Classes/General/Eloquent/Filters/Email.php create mode 100644 app/Classes/General/Eloquent/Filters/Filter.php create mode 100644 app/Classes/General/Eloquent/Filters/FixedCurrencyId.php create mode 100644 app/Classes/General/Eloquent/Filters/Id.php create mode 100644 app/Classes/General/Eloquent/Filters/IdIn.php create mode 100644 app/Classes/General/Eloquent/Filters/IdNot.php create mode 100644 app/Classes/General/Eloquent/Filters/IdNotIn.php create mode 100644 app/Classes/General/Eloquent/Filters/IssuerIn.php create mode 100644 app/Classes/General/Eloquent/Filters/Marking.php create mode 100644 app/Classes/General/Eloquent/Filters/Name.php create mode 100644 app/Classes/General/Eloquent/Filters/NotExpired.php create mode 100644 app/Classes/General/Eloquent/Filters/OriginalCurrencyIdIn.php create mode 100644 app/Classes/General/Eloquent/Filters/PaymentApprovals.php create mode 100644 app/Classes/General/Eloquent/Filters/PaymentMethodType.php create mode 100644 app/Classes/General/Eloquent/Filters/PendingPayment.php create mode 100644 app/Classes/General/Eloquent/Filters/PendingPurchaseOrder.php create mode 100644 app/Classes/General/Eloquent/Filters/PurchaseOrderApproval.php create mode 100644 app/Classes/General/Eloquent/Filters/Reference.php create mode 100644 app/Classes/General/Eloquent/Filters/SegmentId.php create mode 100644 app/Classes/General/Eloquent/Filters/ServiceId.php create mode 100644 app/Classes/General/Eloquent/Filters/ServiceType.php create mode 100644 app/Classes/General/Eloquent/Filters/ShortCode.php create mode 100644 app/Classes/General/Eloquent/Filters/Status.php create mode 100644 app/Classes/General/Eloquent/Filters/StatusIn.php create mode 100644 app/Classes/General/Eloquent/Filters/SupplierCurrencies.php create mode 100644 app/Classes/General/Eloquent/Filters/Token.php create mode 100644 app/Classes/General/Eloquent/Filters/Type.php create mode 100644 app/Classes/General/Eloquent/Filters/WithBookings.php create mode 100644 app/Classes/General/Eloquent/Filters/WithCompany.php create mode 100644 app/Classes/General/Eloquent/Filters/WithTransactions.php create mode 100644 app/Classes/General/Eloquent/Filters/WithUser.php create mode 100644 app/Classes/General/Eloquent/Filters/isDefault.php create mode 100644 app/Classes/General/Helper.php create mode 100644 app/Classes/General/Interfaces/DataTransferObject.php create mode 100644 app/Classes/General/Interfaces/Documentable.php create mode 100644 app/Classes/General/Services/GeneratesInitials.php create mode 100644 app/Classes/General/Wrapper/Hasher.php create mode 100644 app/Classes/Notifications/AbstractEmail.php create mode 100644 app/Classes/ValueObjects/Constants/HttpStatus.php create mode 100644 app/Classes/ValueObjects/Constants/Notifications.php create mode 100644 app/Classes/ValueObjects/Response/ApiResponseObject.php create mode 100644 app/Console/Kernel.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/TestSetup.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustHosts.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/ValidateToken.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Models/AbstractModel.php create mode 100644 app/Models/Permission.php create mode 100644 app/Models/Role.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100755 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 composer.json create mode 100644 config/activitylog.php create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/hashing.php create mode 100644 config/jwt.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/pdf.php create mode 100644 config/permission.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/view.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/2014_10_12_000000_create_users_table.php create mode 100644 database/migrations/2014_10_12_100000_create_password_resets_table.php create mode 100644 database/migrations/2019_08_19_000000_create_failed_jobs_table.php create mode 100644 database/migrations/2021_06_17_041313_create_permission_tables.php create mode 100644 database/migrations/2021_06_17_041406_create_activity_log_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 resources/assets/fonts/montserrat/Montserrat-Bold.ttf create mode 100644 resources/assets/fonts/montserrat/Montserrat-Regular.ttf create mode 100644 resources/assets/fonts/montserrat/montserrat-bold-webfont.svg create mode 100644 resources/assets/fonts/montserrat/montserrat-regular-webfont.svg create mode 100644 resources/assets/images/2829248.png create mode 100644 resources/assets/images/2853457.png create mode 100644 resources/assets/images/2942005.jpg create mode 100644 resources/assets/images/3231370.jpg create mode 100644 resources/assets/images/3568950.png create mode 100644 resources/assets/images/favicon/android-chrome-192x192.png create mode 100644 resources/assets/images/favicon/android-chrome-512x512.png create mode 100644 resources/assets/images/favicon/apple-touch-icon.png create mode 100644 resources/assets/images/favicon/favicon-16x16.png create mode 100644 resources/assets/images/favicon/favicon-32x32.png create mode 100644 resources/assets/images/favicon/favicon.ico create mode 100644 resources/assets/images/favicon/site.webmanifest create mode 100644 resources/assets/images/icons/packing-icon.png create mode 100644 resources/assets/images/icons/pdf.png create mode 100644 resources/assets/images/icons/processing-icon.png create mode 100644 resources/assets/images/icons/xlsx.png create mode 100644 resources/assets/js/pages.js create mode 100644 resources/assets/js/pdfThumbnail.js create mode 100644 resources/assets/js/scripts.js create mode 100644 resources/assets/js/three.r92.min.js create mode 100644 resources/assets/js/vanta.birds.min.js create mode 100644 resources/assets/sass/_color.scss create mode 100644 resources/assets/sass/_mixins.scss create mode 100644 resources/assets/sass/_modules.scss create mode 100644 resources/assets/sass/_responsive.scss create mode 100644 resources/assets/sass/_var.scss create mode 100644 resources/assets/sass/main.scss create mode 100644 resources/assets/sass/modules/_alerts.scss create mode 100644 resources/assets/sass/modules/_animation.scss create mode 100644 resources/assets/sass/modules/_buttons.scss create mode 100644 resources/assets/sass/modules/_calendar.scss create mode 100644 resources/assets/sass/modules/_cards.scss create mode 100644 resources/assets/sass/modules/_charts.scss create mode 100644 resources/assets/sass/modules/_chat.scss create mode 100644 resources/assets/sass/modules/_email.scss create mode 100644 resources/assets/sass/modules/_form_elements.scss create mode 100644 resources/assets/sass/modules/_gallery.scss create mode 100644 resources/assets/sass/modules/_layout.scss create mode 100644 resources/assets/sass/modules/_list.scss create mode 100644 resources/assets/sass/modules/_lock_screen.scss create mode 100644 resources/assets/sass/modules/_login.scss create mode 100644 resources/assets/sass/modules/_misc.scss create mode 100644 resources/assets/sass/modules/_modals.scss create mode 100644 resources/assets/sass/modules/_nestables.scss create mode 100644 resources/assets/sass/modules/_notifications.scss create mode 100644 resources/assets/sass/modules/_print.scss create mode 100644 resources/assets/sass/modules/_progress_indicators.scss create mode 100644 resources/assets/sass/modules/_sliders.scss create mode 100644 resources/assets/sass/modules/_social.scss create mode 100644 resources/assets/sass/modules/_tables.scss create mode 100644 resources/assets/sass/modules/_tabs_accordian.scss create mode 100644 resources/assets/sass/modules/_timeline.scss create mode 100644 resources/assets/sass/modules/_treeview.scss create mode 100644 resources/assets/sass/modules/_typography.scss create mode 100644 resources/assets/sass/modules/_vector_map.scss create mode 100644 resources/assets/sass/modules/_view.scss create mode 100644 resources/assets/sass/modules/_widgets.scss create mode 100644 resources/assets/sass/modules/_z_index.scss create mode 100644 resources/assets/vue/app.js create mode 100644 resources/assets/vue/general/directives/closable.js create mode 100644 resources/assets/vue/general/functions/router.js create mode 100644 resources/assets/vue/general/mixins/accounts/authenticationHandler.js create mode 100644 resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js create mode 100644 resources/assets/vue/general/mixins/accounts/updateProfileHandler.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/loginFormValidation.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/registrationFormValidation.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js create mode 100644 resources/assets/vue/general/mixins/companies/validation/identificationVerificationFormValidation.js create mode 100644 resources/assets/vue/general/mixins/componentHandler.js create mode 100644 resources/assets/vue/general/mixins/crudHandler.js create mode 100644 resources/assets/vue/general/mixins/errorMessageHandler.js create mode 100644 resources/assets/vue/general/mixins/formHandler.js create mode 100644 resources/assets/vue/general/mixins/guards.js create mode 100644 resources/assets/vue/general/mixins/modalFormHandler.js create mode 100644 resources/assets/vue/general/mixins/request.js create mode 100644 resources/assets/vue/general/mixins/staticFormHandler.js create mode 100644 resources/assets/vue/vuex/modules/authentication.js create mode 100644 resources/assets/vue/vuex/modules/createNotification.js create mode 100644 resources/assets/vue/vuex/modules/crudRequest.js create mode 100644 resources/assets/vue/vuex/modules/loadRequestQueue.js create mode 100644 resources/assets/vue/vuex/modules/toggleLoading.js create mode 100644 resources/assets/vue/vuex/modules/toggleSection.js create mode 100644 resources/assets/vue/vuex/store.js create mode 100644 resources/lang/en/auth.php create mode 100644 resources/lang/en/pagination.php create mode 100644 resources/lang/en/passwords.php create mode 100644 resources/lang/en/validation.php create mode 100644 resources/views/layouts/base.blade.php create mode 100644 resources/views/layouts/base_login.blade.php create mode 100644 resources/views/layouts/base_pdf.blade.php create mode 100644 resources/views/layouts/base_portal.blade.php create mode 100644 resources/views/vendor/head.blade.php create mode 100644 resources/views/vendor/js.blade.php create mode 100644 resources/views/welcome.blade.php create mode 100644 routes/api.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 server.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 webpack.mix.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..6537ca46 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..44853cd5 --- /dev/null +++ b/.env.example @@ -0,0 +1,51 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +LOG_CHANNEL=stack +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=laravel +DB_USERNAME=root +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DRIVER=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailhog +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS=null +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_APP_CLUSTER=mt1 + +MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..967315dd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto +*.css linguist-vendored +*.scss linguist-vendored +*.js linguist-vendored +CHANGELOG.md export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..95d268cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +/node_modules +/public/hot +/public/storage +/storage/*.key +/vendor +**/.idea/ +.env +.env.backup +.phpunit.result.cache +Homestead.json +Homestead.yaml +npm-debug.log +yarn-error.log +/storage/file +composer.lock +yarn.lock +.DS_Store +public/.DS_Store +public/images/.DS_Store +gox.iml +rebuild_docker.sh +docker/* +db/* +docker-compose.yml +package-lock.json +public/* +/public/* \ No newline at end of file diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 00000000..9231873a --- /dev/null +++ b/.styleci.yml @@ -0,0 +1,13 @@ +php: + preset: laravel + disabled: + - no_unused_imports + finder: + not-name: + - index.php + - server.php +js: + finder: + not-name: + - webpack.mix.js +css: true diff --git a/README.md b/README.md new file mode 100644 index 00000000..ceb6ac0a --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 1500 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell). + +### Premium Partners + +- **[Vehikl](https://vehikl.com/)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Cubet Techno Labs](https://cubettech.com)** +- **[Cyber-Duck](https://cyber-duck.co.uk)** +- **[Many](https://www.many.co.uk)** +- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)** +- **[DevSquad](https://devsquad.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel/)** +- **[OP.GG](https://op.gg)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Classes/Exceptions/AccessForbiddenException.php b/app/Classes/Exceptions/AccessForbiddenException.php new file mode 100644 index 00000000..8d7e09aa --- /dev/null +++ b/app/Classes/Exceptions/AccessForbiddenException.php @@ -0,0 +1,12 @@ +httpStatusCode = $httpStatusCode; + } +} diff --git a/app/Classes/General/Abstracts/AbstractControllerLogic.php b/app/Classes/General/Abstracts/AbstractControllerLogic.php new file mode 100644 index 00000000..2fdd0dab --- /dev/null +++ b/app/Classes/General/Abstracts/AbstractControllerLogic.php @@ -0,0 +1,97 @@ +notification()['title'] ? $this->notification()['title']: Notifications::UNDEFINED['title']; + } + + /** + * @return string + */ + private function getNotificationMessage():string { + return $this->notification()['message'] ? $this->notification()['message']: Notifications::UNDEFINED['message']; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + abstract protected function logic(Request $request) : JsonResponse; + + /** + * @param Request $request + * @return JsonResponse + */ + public function execute(Request $request) : JsonResponse { + + try { + + DB::beginTransaction(); + + $response = $this->logic($request); + + DB::commit(); + + return $response; + + } catch (ErrorException|GeneralExceptions $exception){ + return (new ApiResponseObject($this->getNotificationTitle().' failed', $exception->getMessage(), + $exception->getCode() ? $exception->getCode() : HttpStatus::SERVER_ERROR))->handler(); + + } + } + + /** + * @param array|null $data + * @return JsonResponse + */ + public function response(?array $data = []) : JsonResponse { + + return (new ApiResponseObject($this->getNotificationTitle().' Successful', + $this->getNotificationMessage(), + HttpStatus::OK_WITH_MESSAGE, $data))->handler(); + } + + /** + * @param JsonResource $resource + * @return JsonResponse + */ + public function resourceResponse(JsonResource $resource){ + return $this->response(['data' => $resource]); + } + + /** + * @param ResourceCollection $collection + * @return JsonResponse + */ + public function collectionResponse(ResourceCollection $collection){ + return $this->response(json_decode($collection->response()->getContent(), true)); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Abstracts/AbstractRule.php b/app/Classes/General/Abstracts/AbstractRule.php new file mode 100644 index 00000000..d2e0568b --- /dev/null +++ b/app/Classes/General/Abstracts/AbstractRule.php @@ -0,0 +1,46 @@ +authorized()){ + throw new AccessForbiddenException('You don\'t have permission to preform this action'); + } + + $this->validators($object); + $this->criteria($object); + + return true; + + } catch(AccessForbiddenException $exception){ + throw new AccessForbiddenException('You don\'t have permission to preform this action'); + } catch(\Exception $exception){ + throw new RequestValidationException($exception->getMessage()); + } + + } + +} \ No newline at end of file diff --git a/app/Classes/General/Abstracts/AbstractService.php b/app/Classes/General/Abstracts/AbstractService.php new file mode 100644 index 00000000..7c7b6ddb --- /dev/null +++ b/app/Classes/General/Abstracts/AbstractService.php @@ -0,0 +1,42 @@ +handler($model); + + if($model->save()){ + return $model; + } + + + + } catch (QueryException $exception){ + throw new MalformedRequestException('Unable to update the record due to unexpected error'); + } + + } + + abstract function getModel(Model $model); + abstract function handler(Model $model); + + +} \ No newline at end of file diff --git a/app/Classes/General/Abstracts/AbstractValidation.php b/app/Classes/General/Abstracts/AbstractValidation.php new file mode 100644 index 00000000..fae27298 --- /dev/null +++ b/app/Classes/General/Abstracts/AbstractValidation.php @@ -0,0 +1,49 @@ +validator = $validator; + } + + + abstract protected function data($object): array; + + abstract protected function rules(): array; + + abstract protected function messages(): array; + + /** + * @param DataTransferObject $object + * @param null|string $type + * @return bool + * @throws RequestValidationException + */ + public function validate(DataTransferObject $object, ?string $type = 'POST') + { + $validator = $this->validator::make($this->data($object), $this->rules($type), $this->messages()); + + if($validator->fails()) { + throw new RequestValidationException($validator->messages()->first()); + } + + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/General/DummyDataTransferObject.php b/app/Classes/General/DummyDataTransferObject.php new file mode 100644 index 00000000..98f2a056 --- /dev/null +++ b/app/Classes/General/DummyDataTransferObject.php @@ -0,0 +1,10 @@ +whereIn('id',$ids)->delete(); + + return ($record_deleted == count($ids)) ? true : false; + + } catch (QueryException|\Exception $exception){ + throw new MalformedRequestException('Unable to delete the record due to unexpected error'); + } + } + + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractDeleteRecord.php b/app/Classes/General/Eloquent/AbstractDeleteRecord.php new file mode 100644 index 00000000..963df421 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractDeleteRecord.php @@ -0,0 +1,31 @@ +delete()){ + return []; + } + + } catch (QueryException|\Exception $exception){ + throw new MalformedRequestException('Unable to update the record due to unexpected error'); + } + } + + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractFetchRecord.php b/app/Classes/General/Eloquent/AbstractFetchRecord.php new file mode 100644 index 00000000..1fbd39da --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractFetchRecord.php @@ -0,0 +1,37 @@ +handler($filters); + + } + + + /** + * @param Builder $query + * @return Model + * @throws ResourceNotFoundException + */ + public function getResults(Builder $query): Model { + if(!$query->exists()){ + throw new ResourceNotFoundException('Unable to find any record based on the criteria provided'); + } + + return $query->first(); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractGetRecord.php b/app/Classes/General/Eloquent/AbstractGetRecord.php new file mode 100644 index 00000000..f927d818 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractGetRecord.php @@ -0,0 +1,70 @@ +filters->except(self::DECORATION_FILTERS); + } + + /** + * @return Collection + */ + public function getDecorationFilters(){ + return $this->filters->only(self::DECORATION_FILTERS); + } + + /** + * @param null|string $json + * @return array + */ + public function deserializeFilters(?string $json): array { + return $json !== null ? collect(json_decode($json))->toArray() : []; + } + + /** + * @return Builder + */ + private function applyFiltersToQuery(): Builder + { + return (new ApplyFiltersToQuery())->execute($this->getRepository(), $this->getQueryFilters()->toArray()); + } + + /** + * @param array $filters + * @return mixed + */ + public function handler(array $filters){ + $this->filters = collect($filters); + return $this->getResults($this->applyFiltersToQuery()); + } + + + /** + * @return Builder + */ + abstract function getRepository(): Builder; + + /** + * @param Builder $query + * @return mixed + */ + abstract function getResults(Builder $query); + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractListRecord.php b/app/Classes/General/Eloquent/AbstractListRecord.php new file mode 100644 index 00000000..c5d2e6e6 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractListRecord.php @@ -0,0 +1,46 @@ +handler($filters); + + } catch (QueryException $exception){ + throw new MalformedRequestException('Unable to fetch the list of records due to unexpected error'); + } + + } + + /** + * @param Builder $query + * @return mixed + */ + public function getResults(Builder $query) { + $filters = $this->getDecorationFilters(); + + if($filters->has('order_by')){ + $query = $query->orderBy($filters->get('order_by')->column, $filters->get('order_by')->DESC ? 'DESC': 'ASC'); + } + + return $filters->has('per_page') ? $query->paginate($filters->get('per_page')) : $query->get(); + + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractUpdateMultipleRecord.php b/app/Classes/General/Eloquent/AbstractUpdateMultipleRecord.php new file mode 100644 index 00000000..26b89a30 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractUpdateMultipleRecord.php @@ -0,0 +1,33 @@ +whereIn('id',$ids)->update($values); + + return ($record_updated == count($ids)) ? true : false; + + } catch (QueryException|\Exception $exception){ + throw new MalformedRequestException('Unable to update the record due to unexpected error'); + } + } + + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractUpdateRecord.php b/app/Classes/General/Eloquent/AbstractUpdateRecord.php new file mode 100644 index 00000000..44129c92 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractUpdateRecord.php @@ -0,0 +1,30 @@ +save()){ return $model; } + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception); + } + } + + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/AbstractUpdateRelationshipRecord.php b/app/Classes/General/Eloquent/AbstractUpdateRelationshipRecord.php new file mode 100644 index 00000000..00894f11 --- /dev/null +++ b/app/Classes/General/Eloquent/AbstractUpdateRelationshipRecord.php @@ -0,0 +1,33 @@ +save($model)){ + return $model; + } + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception->getMessage()); + } + } + + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/ApplyFiltersToQuery.php b/app/Classes/General/Eloquent/ApplyFiltersToQuery.php new file mode 100644 index 00000000..afa2adb8 --- /dev/null +++ b/app/Classes/General/Eloquent/ApplyFiltersToQuery.php @@ -0,0 +1,40 @@ + $value){ + $decorator = static::createFilterDecorator($filterName); + + if (static::isValidDecorator($decorator)) { + $query = $decorator::apply($query, $value); + } + } + + return $query; + } + + private static function createFilterDecorator($name) + { + return __NAMESPACE__ . '\Filters\\' . Str::studly($name); + } + + private static function isValidDecorator($decorator) + { + return class_exists($decorator); + } + + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Active.php b/app/Classes/General/Eloquent/Filters/Active.php new file mode 100644 index 00000000..7bc21e5e --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Active.php @@ -0,0 +1,20 @@ +where('active', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/BusinessType.php b/app/Classes/General/Eloquent/Filters/BusinessType.php new file mode 100644 index 00000000..a654c9ac --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/BusinessType.php @@ -0,0 +1,20 @@ +where('business_type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/CompanyId.php b/app/Classes/General/Eloquent/Filters/CompanyId.php new file mode 100644 index 00000000..379326cf --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CompanyId.php @@ -0,0 +1,20 @@ +where('company_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/ConvertibleCurrencyId.php b/app/Classes/General/Eloquent/Filters/ConvertibleCurrencyId.php new file mode 100644 index 00000000..3d5701f7 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ConvertibleCurrencyId.php @@ -0,0 +1,20 @@ +where('convertible_currency_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/CountryId.php b/app/Classes/General/Eloquent/Filters/CountryId.php new file mode 100644 index 00000000..eb1a8b8e --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CountryId.php @@ -0,0 +1,20 @@ +where('country_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/CurrencyId.php b/app/Classes/General/Eloquent/Filters/CurrencyId.php new file mode 100644 index 00000000..a9fba8e8 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CurrencyId.php @@ -0,0 +1,20 @@ +where('currency_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/CustomServiceType.php b/app/Classes/General/Eloquent/Filters/CustomServiceType.php new file mode 100644 index 00000000..e894a5e0 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CustomServiceType.php @@ -0,0 +1,21 @@ +where('reference', SegmentConstants::CUSTOM_SERVICE_TYPE)->where('detail->id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/DocumentTypeIn.php b/app/Classes/General/Eloquent/Filters/DocumentTypeIn.php new file mode 100644 index 00000000..c6382c10 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/DocumentTypeIn.php @@ -0,0 +1,20 @@ +whereIn('document_type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Email.php b/app/Classes/General/Eloquent/Filters/Email.php new file mode 100644 index 00000000..cc403255 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Email.php @@ -0,0 +1,20 @@ +where('email', '=', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Filter.php b/app/Classes/General/Eloquent/Filters/Filter.php new file mode 100644 index 00000000..42810e8b --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Filter.php @@ -0,0 +1,19 @@ +where('fix_currency_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Id.php b/app/Classes/General/Eloquent/Filters/Id.php new file mode 100644 index 00000000..a18c7601 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Id.php @@ -0,0 +1,20 @@ +where('id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/IdIn.php b/app/Classes/General/Eloquent/Filters/IdIn.php new file mode 100644 index 00000000..cfe9358e --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IdIn.php @@ -0,0 +1,20 @@ +whereIn('id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/IdNot.php b/app/Classes/General/Eloquent/Filters/IdNot.php new file mode 100644 index 00000000..8ed35044 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IdNot.php @@ -0,0 +1,20 @@ +where('id', '!=', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/IdNotIn.php b/app/Classes/General/Eloquent/Filters/IdNotIn.php new file mode 100644 index 00000000..12dd733d --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IdNotIn.php @@ -0,0 +1,20 @@ +whereNotIn('id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/IssuerIn.php b/app/Classes/General/Eloquent/Filters/IssuerIn.php new file mode 100644 index 00000000..f8958842 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/IssuerIn.php @@ -0,0 +1,20 @@ +whereIn('issuer', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Marking.php b/app/Classes/General/Eloquent/Filters/Marking.php new file mode 100644 index 00000000..77a4dae2 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Marking.php @@ -0,0 +1,20 @@ +where('marking', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Name.php b/app/Classes/General/Eloquent/Filters/Name.php new file mode 100644 index 00000000..92d27f01 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Name.php @@ -0,0 +1,20 @@ +where('name', 'LIKE', '%' . $value . '%'); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/NotExpired.php b/app/Classes/General/Eloquent/Filters/NotExpired.php new file mode 100644 index 00000000..c61a2fe8 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/NotExpired.php @@ -0,0 +1,21 @@ +whereDate('expires_on', '>=', Carbon::now()); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/OriginalCurrencyIdIn.php b/app/Classes/General/Eloquent/Filters/OriginalCurrencyIdIn.php new file mode 100644 index 00000000..628a27fa --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/OriginalCurrencyIdIn.php @@ -0,0 +1,20 @@ +whereIn('original_currency_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/PaymentApprovals.php b/app/Classes/General/Eloquent/Filters/PaymentApprovals.php new file mode 100644 index 00000000..981764a3 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PaymentApprovals.php @@ -0,0 +1,20 @@ +payments()->inComplete()->has('documents'); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/PaymentMethodType.php b/app/Classes/General/Eloquent/Filters/PaymentMethodType.php new file mode 100644 index 00000000..07350f0c --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PaymentMethodType.php @@ -0,0 +1,20 @@ +where('payment_method_type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/PendingPayment.php b/app/Classes/General/Eloquent/Filters/PendingPayment.php new file mode 100644 index 00000000..ab055987 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PendingPayment.php @@ -0,0 +1,24 @@ +whereHas('service', function($service){ + $service->whereHas('constants', function($query) { + $query->where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->is_billable', true); + }); + })->whereDoesntHave('transactions', function($transaction){ + return $transaction->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + }); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/PurchaseOrderApproval.php b/app/Classes/General/Eloquent/Filters/PurchaseOrderApproval.php new file mode 100644 index 00000000..45277c97 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PurchaseOrderApproval.php @@ -0,0 +1,29 @@ +whereHas('service', function($service){ + $service->whereHas('constants', function($query) { + $query->where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->is_billable', true); + }); + })->whereHas('transactions', function($transaction){ + return $transaction->where('type', TransactionType::PURCHASE_ORDER)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION]); + }); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Reference.php b/app/Classes/General/Eloquent/Filters/Reference.php new file mode 100644 index 00000000..fe2cbf03 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Reference.php @@ -0,0 +1,20 @@ +where('Reference', '=', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/SegmentId.php b/app/Classes/General/Eloquent/Filters/SegmentId.php new file mode 100644 index 00000000..dade3d25 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/SegmentId.php @@ -0,0 +1,20 @@ +where('segment_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/ServiceId.php b/app/Classes/General/Eloquent/Filters/ServiceId.php new file mode 100644 index 00000000..b5a55286 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ServiceId.php @@ -0,0 +1,20 @@ +where('service_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/ServiceType.php b/app/Classes/General/Eloquent/Filters/ServiceType.php new file mode 100644 index 00000000..d3d8a2f1 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ServiceType.php @@ -0,0 +1,21 @@ +where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/ShortCode.php b/app/Classes/General/Eloquent/Filters/ShortCode.php new file mode 100644 index 00000000..a5030343 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ShortCode.php @@ -0,0 +1,20 @@ +where('short_code', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Status.php b/app/Classes/General/Eloquent/Filters/Status.php new file mode 100644 index 00000000..19b23b9d --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Status.php @@ -0,0 +1,20 @@ +where('status', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/StatusIn.php b/app/Classes/General/Eloquent/Filters/StatusIn.php new file mode 100644 index 00000000..cbfdfbd0 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/StatusIn.php @@ -0,0 +1,20 @@ +whereIn('status', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/SupplierCurrencies.php b/app/Classes/General/Eloquent/Filters/SupplierCurrencies.php new file mode 100644 index 00000000..1461dbae --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/SupplierCurrencies.php @@ -0,0 +1,21 @@ +where('reference', SegmentConstants::SUPPLIER_CURRENCIES)->where('detail->id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Token.php b/app/Classes/General/Eloquent/Filters/Token.php new file mode 100644 index 00000000..8093fc61 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Token.php @@ -0,0 +1,20 @@ +where('token', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/Type.php b/app/Classes/General/Eloquent/Filters/Type.php new file mode 100644 index 00000000..60555260 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/Type.php @@ -0,0 +1,20 @@ +where('type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithBookings.php b/app/Classes/General/Eloquent/Filters/WithBookings.php new file mode 100644 index 00000000..8728e119 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithBookings.php @@ -0,0 +1,20 @@ +with('bookings'); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithCompany.php b/app/Classes/General/Eloquent/Filters/WithCompany.php new file mode 100644 index 00000000..7c19bd29 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithCompany.php @@ -0,0 +1,20 @@ +with('owner'); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithTransactions.php b/app/Classes/General/Eloquent/Filters/WithTransactions.php new file mode 100644 index 00000000..15cbd88e --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithTransactions.php @@ -0,0 +1,20 @@ +with('transactions'); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithUser.php b/app/Classes/General/Eloquent/Filters/WithUser.php new file mode 100644 index 00000000..b731c621 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithUser.php @@ -0,0 +1,20 @@ +with('user'); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/isDefault.php b/app/Classes/General/Eloquent/Filters/isDefault.php new file mode 100644 index 00000000..da62e1f6 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/isDefault.php @@ -0,0 +1,20 @@ +where('default', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Helper.php b/app/Classes/General/Helper.php new file mode 100644 index 00000000..cad68208 --- /dev/null +++ b/app/Classes/General/Helper.php @@ -0,0 +1,27 @@ +generate($nameOrInitials); + + return $this; + } + + /** + * Set if should keep lettercase on name. + * Setting this to false (default) will uppercase the name. + * + * @param boolean $keepCase + * + * @return GeneratesInitials + */ + public function keepCase($keepCase = true) + { + $this->keepCase = $keepCase; + + return $this; + } + + /** + * Set the length of the generated initials. + * + * @param int $length + * + * @return GeneratesInitials + */ + public function length($length = 2) + { + $this->length = (int) $length; + $this->initials = $this->generateInitials(); + + return $this; + } + + /** + * Generate the initials. + * + * @param null|string $name + * + * @return string + */ + public function generate($name = null) + { + if ($name !== null) { + $this->name = $name; + $this->initials = $this->generateInitials(); + } + + return (string) $this; + } + + /** + * Will return the generated initials. + * + * @return string + */ + public function getInitials() + { + return $this->initials; + } + + /** + * Return the initials. + * + * @return string + */ + public function __toString() + { + return $this->getInitials(); + } + + /** + * Generate a two-letter initial from a name, + * and if no name, assume its already initials. + * For safety, we limit it to two characters, + * in case its a single, but long, name. + * + * @return string + */ + protected function generateInitials() + { + $nameOrInitials = trim($this->name); + + if( !$this->keepCase ) { + $nameOrInitials = mb_strtoupper($nameOrInitials); + } + + $nameOrInitials = trim( trim( $nameOrInitials, '-' ) ); + + $names = explode(' ', $nameOrInitials); + + // Get names with dash (-) between into separate names + $names = array_map( static function ($namePart) { return explode('-', $namePart); }, $names ); + $realNames = []; + + foreach( new \RecursiveIteratorIterator( new \RecursiveArrayIterator($names) ) as $namePart ) { + $realNames[] = $namePart; + } + + $names = $realNames; + + $initials = $nameOrInitials; + $assignedNames = 0; + + if (count($names) > 1) { + $initials = ''; + $start = 0; + + for ($i = 0; $i < $this->length; $i++) { + $index = $i; + + if (($index === ($this->length - 1) && $index > 0) || ($index > (count($names) - 1))) { + $index = count($names) - 1; + } + + if ($assignedNames >= count($names)) { + $start++; + } + + $initials .= mb_substr($names[$index], $start, 1); + $assignedNames++; + } + } + + $initials = mb_substr($initials, 0, $this->length); + + return $initials; + } + +} \ No newline at end of file diff --git a/app/Classes/General/Wrapper/Hasher.php b/app/Classes/General/Wrapper/Hasher.php new file mode 100644 index 00000000..d02b05eb --- /dev/null +++ b/app/Classes/General/Wrapper/Hasher.php @@ -0,0 +1,23 @@ +encode(...$args); + } + public static function decode($enc) + { + if (is_int($enc)) { + return $enc; + } + return app(Hashids::class)->decode($enc)[0]; + } + +} \ No newline at end of file diff --git a/app/Classes/Notifications/AbstractEmail.php b/app/Classes/Notifications/AbstractEmail.php new file mode 100644 index 00000000..83efa01c --- /dev/null +++ b/app/Classes/Notifications/AbstractEmail.php @@ -0,0 +1,15 @@ + 'Unknown Action', + 'message' => 'unknown message..' + ]; + +} \ No newline at end of file diff --git a/app/Classes/ValueObjects/Response/ApiResponseObject.php b/app/Classes/ValueObjects/Response/ApiResponseObject.php new file mode 100644 index 00000000..c5a9a758 --- /dev/null +++ b/app/Classes/ValueObjects/Response/ApiResponseObject.php @@ -0,0 +1,78 @@ +title = $title; + $this->message = $message; + $this->statusCode = $statusCode; + $this->data = $data; + + } + + /** + * @return JsonResponse + */ + public function handler(){ + return new JsonResponse(['title' => $this->getTitle(), 'message' => $this->getMessage(), 'payload' => $this->getData()], $this->getStatusCode()); + } + + /** + * @return string + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * @return string + */ + public function getMessage(): string + { + return $this->message; + } + + /** + * @return int + */ + public function getStatusCode(): int + { + return $this->statusCode; + } + + /** + * @return array + */ + public function getData(): array + { + return $this->data; + } +} \ No newline at end of file diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 00000000..69914e99 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,41 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 00000000..3d292064 --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,64 @@ +view('pages.errors.maintenance'); + } + + if ($exception instanceof AuthenticationException) { + return (new ApiResponseObject('Authentication', 'To keep your account secure we need to re-validate your account', HttpStatus::ACCESS_UNAUTHORISED))->handler(); + } + + return parent::render($request, $exception); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 00000000..a0a2a8a3 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + 'throttle:api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'valid.token' => ValidateToken::class + ]; +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 00000000..704089a7 --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 00000000..033136ad --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 00000000..a8a252df --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ +allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 00000000..a3b6aef9 --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,23 @@ +manager = $manager; + } + + + /** + * Checks if jwt token is valid. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + try { + + if(!$this->manager->check()){ throw new AccessUnauthorisedException(); } + + } catch (Exception $exception) { + + return (new ApiResponseObject('Authentication', 'To keep your account secure we need to re-validate your account', HttpStatus::ACCESS_UNAUTHORISED))->handler(); + + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 00000000..0c13b854 --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ +getKey(); + } + + /** + * Return a key value array, containing any custom claims to be added to the JWT. + * + * @return array + */ + public function getJWTCustomClaims() + { + return []; + } + + public function emailVerification(): HasMany { + return $this->hasMany(UserEmailVerification::class, 'email', 'email'); + } + + /** + * @return HasMany + */ + public function passwordReset(): HasMany { + return $this->hasMany(PasswordReset::class, 'user_id', 'id'); + } + + /** + * @return belongsToMany + */ + public function company(): belongsToMany + { + return $this->belongsToMany(Company::class, (new Employee())->getTable(), 'user_id', 'company_id'); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 00000000..ee8ca5bc --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,28 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 00000000..395c518b --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ + [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + // + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..3bd3c81e --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,63 @@ +configureRateLimiting(); + + $this->routes(function () { + Route::prefix('api') + ->middleware('api') + ->namespace($this->namespace) + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/web.php')); + }); + } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting() + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); + }); + } +} diff --git a/artisan b/artisan new file mode 100755 index 00000000..67a3329b --- /dev/null +++ b/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 00000000..037e17df --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/composer.json b/composer.json new file mode 100644 index 00000000..61a75285 --- /dev/null +++ b/composer.json @@ -0,0 +1,68 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The Laravel Framework.", + "keywords": ["framework", "laravel"], + "license": "MIT", + "require": { + "php": "^7.3|^8.0", + "fideloper/proxy": "^4.4", + "fruitcake/laravel-cors": "^2.0", + "guzzlehttp/guzzle": "^7.0.1", + "laravel/framework": "^8.40", + "laravel/tinker": "^2.5", + "ext-fileinfo": "^7.3", + "ext-json": "^1.7", + "barryvdh/laravel-dompdf": "^0.9.0", + "carlos-meneses/laravel-mpdf": "^2.1", + "intervention/image": "^2.5", + "rinvex/countries": "^6.1", + "spatie/laravel-activitylog": "^3.14", + "spatie/laravel-permission": "^4.2", + "tymon/jwt-auth": "^1.0" + }, + "require-dev": { + "facade/ignition": "^2.5", + "fakerphp/faker": "^1.9.1", + "laravel/sail": "^1.0.1", + "mockery/mockery": "^1.4.2", + "nunomaduro/collision": "^5.0", + "phpunit/phpunit": "^9.3.3" + }, + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/config/activitylog.php b/config/activitylog.php new file mode 100644 index 00000000..a6558ecb --- /dev/null +++ b/config/activitylog.php @@ -0,0 +1,52 @@ + env('ACTIVITY_LOGGER_ENABLED', true), + + /* + * When the clean-command is executed, all recording activities older than + * the number of days specified here will be deleted. + */ + 'delete_records_older_than_days' => 365, + + /* + * If no log name is passed to the activity() helper + * we use this default log name. + */ + 'default_log_name' => 'default', + + /* + * You can specify an auth driver here that gets user models. + * If this is null we'll use the default Laravel auth driver. + */ + 'default_auth_driver' => null, + + /* + * If set to true, the subject returns soft deleted models. + */ + 'subject_returns_soft_deleted_models' => false, + + /* + * This model will be used to log activity. + * It should be implements the Spatie\Activitylog\Contracts\Activity interface + * and extend Illuminate\Database\Eloquent\Model. + */ + 'activity_model' => \Spatie\Activitylog\Models\Activity::class, + + /* + * This is the name of the table that will be created by the migration and + * used by the Activity model shipped with this package. + */ + 'table_name' => 'activity_log', + + /* + * This is the database connection that will be used by the migration and + * the Activity model shipped with this package. In case it's not set + * Laravel database.default will be used instead. + */ + 'database_connection' => env('ACTIVITY_LOGGER_DB_CONNECTION'), +]; diff --git a/config/app.php b/config/app.php new file mode 100644 index 00000000..bad26462 --- /dev/null +++ b/config/app.php @@ -0,0 +1,238 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL', null), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => 'Asia/Kuala_Lumpur', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => [ + + /* + * Laravel Framework Service Providers... + */ + Illuminate\Auth\AuthServiceProvider::class, + Illuminate\Broadcasting\BroadcastServiceProvider::class, + Illuminate\Bus\BusServiceProvider::class, + Illuminate\Cache\CacheServiceProvider::class, + Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, + Illuminate\Cookie\CookieServiceProvider::class, + Illuminate\Database\DatabaseServiceProvider::class, + Illuminate\Encryption\EncryptionServiceProvider::class, + Illuminate\Filesystem\FilesystemServiceProvider::class, + Illuminate\Foundation\Providers\FoundationServiceProvider::class, + Illuminate\Hashing\HashServiceProvider::class, + Illuminate\Mail\MailServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + Illuminate\Pagination\PaginationServiceProvider::class, + Illuminate\Pipeline\PipelineServiceProvider::class, + Illuminate\Queue\QueueServiceProvider::class, + Illuminate\Redis\RedisServiceProvider::class, + Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, + Illuminate\Session\SessionServiceProvider::class, + Illuminate\Translation\TranslationServiceProvider::class, + Illuminate\Validation\ValidationServiceProvider::class, + Illuminate\View\ViewServiceProvider::class, + + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + + // Third Parties + Spatie\Permission\PermissionServiceProvider::class, + Barryvdh\DomPDF\ServiceProvider::class, + Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class + ], + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => [ + + 'App' => Illuminate\Support\Facades\App::class, + 'Arr' => Illuminate\Support\Arr::class, + 'Artisan' => Illuminate\Support\Facades\Artisan::class, + 'Auth' => Illuminate\Support\Facades\Auth::class, + 'Blade' => Illuminate\Support\Facades\Blade::class, + 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, + 'Bus' => Illuminate\Support\Facades\Bus::class, + 'Cache' => Illuminate\Support\Facades\Cache::class, + 'Config' => Illuminate\Support\Facades\Config::class, + 'Cookie' => Illuminate\Support\Facades\Cookie::class, + 'Crypt' => Illuminate\Support\Facades\Crypt::class, + 'Date' => Illuminate\Support\Facades\Date::class, + 'DB' => Illuminate\Support\Facades\DB::class, + 'Eloquent' => Illuminate\Database\Eloquent\Model::class, + 'Event' => Illuminate\Support\Facades\Event::class, + 'File' => Illuminate\Support\Facades\File::class, + 'Gate' => Illuminate\Support\Facades\Gate::class, + 'Hash' => Illuminate\Support\Facades\Hash::class, + 'Http' => Illuminate\Support\Facades\Http::class, + 'Lang' => Illuminate\Support\Facades\Lang::class, + 'Log' => Illuminate\Support\Facades\Log::class, + 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Notification' => Illuminate\Support\Facades\Notification::class, + 'Password' => Illuminate\Support\Facades\Password::class, + 'Queue' => Illuminate\Support\Facades\Queue::class, + 'Redirect' => Illuminate\Support\Facades\Redirect::class, + // 'Redis' => Illuminate\Support\Facades\Redis::class, + 'Request' => Illuminate\Support\Facades\Request::class, + 'Response' => Illuminate\Support\Facades\Response::class, + 'Route' => Illuminate\Support\Facades\Route::class, + 'Schema' => Illuminate\Support\Facades\Schema::class, + 'Session' => Illuminate\Support\Facades\Session::class, + 'Storage' => Illuminate\Support\Facades\Storage::class, + 'Str' => Illuminate\Support\Str::class, + 'URL' => Illuminate\Support\Facades\URL::class, + 'Validator' => Illuminate\Support\Facades\Validator::class, + 'View' => Illuminate\Support\Facades\View::class, + 'PDF' => Barryvdh\DomPDF\Facade::class, + 'MPDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class, + ], + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 00000000..ba1a4d8c --- /dev/null +++ b/config/auth.php @@ -0,0 +1,117 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + + 'api' => [ + 'driver' => 'token', + 'provider' => 'users', + 'hash' => false, + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_resets', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 00000000..2d529820 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,64 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 00000000..8736c7a7 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,110 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing a RAM based store such as APC or Memcached, there might + | be other applications utilizing the same cache. So, we'll specify a + | value to get prefixed to all our keys so we can avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 00000000..8a39e6da --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 00000000..b42d9b30 --- /dev/null +++ b/config/database.php @@ -0,0 +1,147 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'schema' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'password' => env('REDIS_PASSWORD', null), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 00000000..760ef972 --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,73 @@ + env('FILESYSTEM_DRIVER', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 00000000..84257708 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 1024, + 'threads' => 2, + 'time' => 2, + ], + +]; diff --git a/config/jwt.php b/config/jwt.php new file mode 100644 index 00000000..8b7843b6 --- /dev/null +++ b/config/jwt.php @@ -0,0 +1,304 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + + /* + |-------------------------------------------------------------------------- + | JWT Authentication Secret + |-------------------------------------------------------------------------- + | + | Don't forget to set this in your .env file, as it will be used to sign + | your tokens. A helper command is provided for this: + | `php artisan jwt:secret` + | + | Note: This will be used for Symmetric algorithms only (HMAC), + | since RSA and ECDSA use a private/public key combo (See below). + | + */ + + 'secret' => env('JWT_SECRET'), + + /* + |-------------------------------------------------------------------------- + | JWT Authentication Keys + |-------------------------------------------------------------------------- + | + | The algorithm you are using, will determine whether your tokens are + | signed with a random string (defined in `JWT_SECRET`) or using the + | following public & private keys. + | + | Symmetric Algorithms: + | HS256, HS384 & HS512 will use `JWT_SECRET`. + | + | Asymmetric Algorithms: + | RS256, RS384 & RS512 / ES256, ES384 & ES512 will use the keys below. + | + */ + + 'keys' => [ + + /* + |-------------------------------------------------------------------------- + | Public Key + |-------------------------------------------------------------------------- + | + | A path or resource to your public key. + | + | E.g. 'file://path/to/public/key' + | + */ + + 'public' => env('JWT_PUBLIC_KEY'), + + /* + |-------------------------------------------------------------------------- + | Private Key + |-------------------------------------------------------------------------- + | + | A path or resource to your private key. + | + | E.g. 'file://path/to/private/key' + | + */ + + 'private' => env('JWT_PRIVATE_KEY'), + + /* + |-------------------------------------------------------------------------- + | Passphrase + |-------------------------------------------------------------------------- + | + | The passphrase for your private key. Can be null if none set. + | + */ + + 'passphrase' => env('JWT_PASSPHRASE'), + + ], + + /* + |-------------------------------------------------------------------------- + | JWT time to live + |-------------------------------------------------------------------------- + | + | Specify the length of time (in minutes) that the token will be valid for. + | Defaults to 1 hour. + | + | You can also set this to null, to yield a never expiring token. + | Some people may want this behaviour for e.g. a mobile app. + | This is not particularly recommended, so make sure you have appropriate + | systems in place to revoke the token if necessary. + | Notice: If you set this to null you should remove 'exp' element from 'required_claims' list. + | + */ + + 'ttl' => env('JWT_TTL', 60), + + /* + |-------------------------------------------------------------------------- + | Refresh time to live + |-------------------------------------------------------------------------- + | + | Specify the length of time (in minutes) that the token can be refreshed + | within. I.E. The user can refresh their token within a 2 week window of + | the original token being created until they must re-authenticate. + | Defaults to 2 weeks. + | + | You can also set this to null, to yield an infinite refresh time. + | Some may want this instead of never expiring tokens for e.g. a mobile app. + | This is not particularly recommended, so make sure you have appropriate + | systems in place to revoke the token if necessary. + | + */ + + 'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), + + /* + |-------------------------------------------------------------------------- + | JWT hashing algorithm + |-------------------------------------------------------------------------- + | + | Specify the hashing algorithm that will be used to sign the token. + | + | See here: https://github.com/namshi/jose/tree/master/src/Namshi/JOSE/Signer/OpenSSL + | for possible values. + | + */ + + 'algo' => env('JWT_ALGO', 'HS256'), + + /* + |-------------------------------------------------------------------------- + | Required Claims + |-------------------------------------------------------------------------- + | + | Specify the required claims that must exist in any token. + | A TokenInvalidException will be thrown if any of these claims are not + | present in the payload. + | + */ + + 'required_claims' => [ + 'iss', + 'iat', + 'exp', + 'nbf', + 'sub', + 'jti', + ], + + /* + |-------------------------------------------------------------------------- + | Persistent Claims + |-------------------------------------------------------------------------- + | + | Specify the claim keys to be persisted when refreshing a token. + | `sub` and `iat` will automatically be persisted, in + | addition to the these claims. + | + | Note: If a claim does not exist then it will be ignored. + | + */ + + 'persistent_claims' => [ + // 'foo', + // 'bar', + ], + + /* + |-------------------------------------------------------------------------- + | Lock Subject + |-------------------------------------------------------------------------- + | + | This will determine whether a `prv` claim is automatically added to + | the token. The purpose of this is to ensure that if you have multiple + | authentication models e.g. `App\User` & `App\OtherPerson`, then we + | should prevent one authentication request from impersonating another, + | if 2 tokens happen to have the same id across the 2 different models. + | + | Under specific circumstances, you may want to disable this behaviour + | e.g. if you only have one authentication model, then you would save + | a little on token size. + | + */ + + 'lock_subject' => true, + + /* + |-------------------------------------------------------------------------- + | Leeway + |-------------------------------------------------------------------------- + | + | This property gives the jwt timestamp claims some "leeway". + | Meaning that if you have any unavoidable slight clock skew on + | any of your servers then this will afford you some level of cushioning. + | + | This applies to the claims `iat`, `nbf` and `exp`. + | + | Specify in seconds - only if you know you need it. + | + */ + + 'leeway' => env('JWT_LEEWAY', 0), + + /* + |-------------------------------------------------------------------------- + | Blacklist Enabled + |-------------------------------------------------------------------------- + | + | In order to invalidate tokens, you must have the blacklist enabled. + | If you do not want or need this functionality, then set this to false. + | + */ + + 'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true), + + /* + | ------------------------------------------------------------------------- + | Blacklist Grace Period + | ------------------------------------------------------------------------- + | + | When multiple concurrent requests are made with the same JWT, + | it is possible that some of them fail, due to token regeneration + | on every request. + | + | Set grace period in seconds to prevent parallel request failure. + | + */ + + 'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0), + + /* + |-------------------------------------------------------------------------- + | Cookies encryption + |-------------------------------------------------------------------------- + | + | By default Laravel encrypt cookies for security reason. + | If you decide to not decrypt cookies, you will have to configure Laravel + | to not encrypt your cookie token by adding its name into the $except + | array available in the middleware "EncryptCookies" provided by Laravel. + | see https://laravel.com/docs/master/responses#cookies-and-encryption + | for details. + | + | Set it to true if you want to decrypt cookies. + | + */ + + 'decrypt_cookies' => false, + + /* + |-------------------------------------------------------------------------- + | Providers + |-------------------------------------------------------------------------- + | + | Specify the various providers used throughout the package. + | + */ + + 'providers' => [ + + /* + |-------------------------------------------------------------------------- + | JWT Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to create and decode the tokens. + | + */ + + 'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class, + + /* + |-------------------------------------------------------------------------- + | Authentication Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to authenticate users. + | + */ + + 'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class, + + /* + |-------------------------------------------------------------------------- + | Storage Provider + |-------------------------------------------------------------------------- + | + | Specify the provider that is used to store tokens in the blacklist. + | + */ + + 'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class, + + ], + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 00000000..1aa06aa3 --- /dev/null +++ b/config/logging.php @@ -0,0 +1,105 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 00000000..54299aab --- /dev/null +++ b/config/mail.php @@ -0,0 +1,110 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", + | "postmark", "log", "array" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'tls'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'auth_mode' => null, + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + ], + + 'postmark' => [ + 'transport' => 'postmark', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => '/usr/sbin/sendmail -bs', + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/config/pdf.php b/config/pdf.php new file mode 100644 index 00000000..3459543c --- /dev/null +++ b/config/pdf.php @@ -0,0 +1,27 @@ + '', + 'format' => 'A4', + 'default_font_size' => '12', + 'default_font' => 'sans-serif', + 'margin_left' => 10, + 'margin_right' => 10, + 'margin_top' => 10, + 'margin_bottom' => 10, + 'margin_header' => 0, + 'margin_footer' => 0, + 'orientation' => 'P', + 'title' => 'Laravel mPDF', + 'author' => '', + 'watermark' => '', + 'show_watermark' => false, + 'watermark_font' => 'sans-serif', + 'display_mode' => 'fullpage', + 'watermark_text_alpha' => 0.1, + 'custom_font_dir' => '', + 'custom_font_data' => [], + 'auto_language_detection' => false, + 'temp_dir' => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR), + 'pdfa' => false, + 'pdfaauto' => false, +]; \ No newline at end of file diff --git a/config/permission.php b/config/permission.php new file mode 100644 index 00000000..e41ef0ec --- /dev/null +++ b/config/permission.php @@ -0,0 +1,143 @@ + [ + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * Eloquent model should be used to retrieve your permissions. Of course, it + * is often just the "Permission" model but you may use whatever you like. + * + * The model you want to use as a Permission model needs to implement the + * `Spatie\Permission\Contracts\Permission` contract. + */ + + 'permission' => App\Models\Permission::class, + + /* + * When using the "HasRoles" trait from this package, we need to know which + * Eloquent model should be used to retrieve your roles. Of course, it + * is often just the "Role" model but you may use whatever you like. + * + * The model you want to use as a Role model needs to implement the + * `Spatie\Permission\Contracts\Role` contract. + */ + + 'role' => App\Models\Role::class, + + ], + + 'table_names' => [ + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'roles' => 'roles', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your permissions. We have chosen a basic + * default value but you may easily change it to any table you like. + */ + + 'permissions' => 'permissions', + + /* + * When using the "HasPermissions" trait from this package, we need to know which + * table should be used to retrieve your models permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_permissions' => 'model_has_permissions', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your models roles. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'model_has_roles' => 'model_has_roles', + + /* + * When using the "HasRoles" trait from this package, we need to know which + * table should be used to retrieve your roles permissions. We have chosen a + * basic default value but you may easily change it to any table you like. + */ + + 'role_has_permissions' => 'role_has_permissions', + ], + + 'column_names' => [ + + /* + * Change this if you want to name the related model primary key other than + * `model_id`. + * + * For example, this would be nice if your primary keys are all UUIDs. In + * that case, name this `model_uuid`. + */ + + 'model_morph_key' => 'model_id', + ], + + /* + * When set to true, the required permission names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_permission_in_exception' => false, + + /* + * When set to true, the required role names are added to the exception + * message. This could be considered an information leak in some contexts, so + * the default setting is false here for optimum safety. + */ + + 'display_role_in_exception' => false, + + /* + * By default wildcard permission lookups are disabled. + */ + + 'enable_wildcard_permission' => false, + + 'cache' => [ + + /* + * By default all permissions are cached for 24 hours to speed up performance. + * When permissions or roles are updated the cache is flushed automatically. + */ + + 'expiration_time' => \DateInterval::createFromDateString('24 hours'), + + /* + * The cache key used to store all permissions. + */ + + 'key' => 'spatie.permission.cache', + + /* + * When checking for a permission against a model by passing a Permission + * instance to the check, this key determines what attribute on the + * Permissions model is used to cache against. + * + * Ideally, this should match your preferred way of checking permissions, eg: + * `$user->can('view-posts')` would be 'name'. + */ + + 'model_key' => 'name', + + /* + * You may optionally indicate a specific cache driver to use for permission and + * role caching using any of the `store` drivers listed in the cache.php config + * file. Using 'default' here means to use the `default` set in cache.php. + */ + + 'store' => 'default', + ], +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 00000000..25ea5a81 --- /dev/null +++ b/config/queue.php @@ -0,0 +1,93 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 00000000..2a1d616c --- /dev/null +++ b/config/services.php @@ -0,0 +1,33 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 00000000..ac0802b1 --- /dev/null +++ b/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION', null), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE', null), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 00000000..22b8a18d --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 00000000..9b19b93c --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 00000000..a24ce53f --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,47 @@ + $this->faker->name(), + 'email' => $this->faker->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + * + * @return \Illuminate\Database\Eloquent\Factories\Factory + */ + public function unverified() + { + return $this->state(function (array $attributes) { + return [ + 'email_verified_at' => null, + ]; + }); + } +} diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 00000000..621a24eb --- /dev/null +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +} diff --git a/database/migrations/2014_10_12_100000_create_password_resets_table.php b/database/migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 00000000..0ee0a36a --- /dev/null +++ b/database/migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,32 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +} diff --git a/database/migrations/2019_08_19_000000_create_failed_jobs_table.php b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 00000000..6aa6d743 --- /dev/null +++ b/database/migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +} diff --git a/database/migrations/2021_06_17_041313_create_permission_tables.php b/database/migrations/2021_06_17_041313_create_permission_tables.php new file mode 100644 index 00000000..edf92e7a --- /dev/null +++ b/database/migrations/2021_06_17_041313_create_permission_tables.php @@ -0,0 +1,114 @@ +bigIncrements('id'); + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['roles'], function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames) { + $table->unsignedBigInteger('permission_id'); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign('permission_id') + ->references('id') + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->primary(['permission_id', $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + }); + + Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames) { + $table->unsignedBigInteger('role_id'); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign('role_id') + ->references('id') + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary(['role_id', $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + }); + + Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) { + $table->unsignedBigInteger('permission_id'); + $table->unsignedBigInteger('role_id'); + + $table->foreign('permission_id') + ->references('id') + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign('role_id') + ->references('id') + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary(['permission_id', 'role_id'], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $tableNames = config('permission.table_names'); + + if (empty($tableNames)) { + throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + } + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +} diff --git a/database/migrations/2021_06_17_041406_create_activity_log_table.php b/database/migrations/2021_06_17_041406_create_activity_log_table.php new file mode 100644 index 00000000..d2743d38 --- /dev/null +++ b/database/migrations/2021_06_17_041406_create_activity_log_table.php @@ -0,0 +1,33 @@ +create(config('activitylog.table_name'), function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('log_name')->nullable(); + $table->text('description'); + $table->nullableMorphs('subject', 'subject'); + $table->nullableMorphs('causer', 'causer'); + $table->json('properties')->nullable(); + $table->timestamps(); + $table->index('log_name'); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name')); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 00000000..57b73b54 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,18 @@ +create(); + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..694987df --- /dev/null +++ b/package.json @@ -0,0 +1,129 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch": "npm run development -- --watch", + "watch-poll": "npm run watch -- --watch-poll", + "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", + "prod": "npm run production", + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "dependencies": { + "animate.css": "^4.1.1", + "bootstrap": "^4.0.0", + "bootstrap-datepicker": "^1.7.1", + "chart.js": "^2.9.4", + "dropzone": "^5.7.2", + "epic-spinners": "^1.1.0", + "flag-icon-css": "^3.5.0", + "font-awesome": "^4.7.0", + "intro.js": "^3.1.0", + "jquery": "^3.2", + "jquery.scrollbar": "^0.2.11", + "jwt-decode": "^3.1.2", + "noty": "^3.2.0-beta", + "perfect-scrollbar": "^1.5.0", + "popper.js": "^1.12", + "sass-loader": "10.1.0", + "select2": "^4.0.6-rc.1", + "v-money": "^0.8.1", + "vue": "^2.6.10", + "vue-avatar": "^2.1.8", + "vue-debounce": "^2.6.0", + "vue-template-compiler": "^2.6.10", + "vue-the-mask": "^0.11.1", + "vuelidate": "^0.7.4", + "vuex": "^3.1.1" + }, + "devDependencies": { + "axios": "^0.21", + "laravel-mix": "^5.0.9", + "lodash": "^4.17.19", + "postcss": "^8.1.14", + "cross-env": "^7.0.2", + "del": "^6.0.0", + "fancy-log": "^1.3.0", + "gulp": "^4.0.2", + "gulp-autoprefixer": "^7.0.1", + "gulp-clean-css": "^4.3.0", + "gulp-concat": "^2.6.1", + "gulp-concat-css": "^3.1.0", + "gulp-copy": "^4.0.1", + "gulp-livereload": "^4.0.2", + "gulp-load-plugins": "^2.0.6", + "gulp-newer": "^1.3.0", + "gulp-plumber": "^1.1.0", + "gulp-print": "^5.0.2", + "gulp-rename": "^2.0.0", + "gulp-replace": "^1.0.0", + "gulp-sass": "^4.1.0", + "gulp-streamify": "^1.0.2", + "gulp-uglify": "^3.0.0", + "gulp-uglify-es": "^2.0.0", + "resolve-url-loader": "^3.1.2" + }, + "paths": { + "build": { + "css": "./public/css/", + "js": "./public/js/", + "images": "./public/images/", + "fonts": "./public/fonts/", + "flags": "./public/flag-icon-css/flags", + "main": "./public/" + } + }, + "globs": { + "vendorJs": [ + "./node_modules/jquery/dist/jquery.min.js", + "./node_modules/popper.js/dist/umd/popper.min.js", + "./node_modules/bootstrap/dist/js/bootstrap.min.js", + "./node_modules/jquery.scrollbar/jquery.scrollbar.min.js", + "./node_modules/select2/dist/js/select2.full.min.js", + "./node_modules/dropzone/dist/dropzone.js", + "./node_modules/bootstrap-datepicker/dist/js/bootstrap-datepicker.js", + "./node_modules/noty/lib/noty.js", + "./node_modules/intro.js/intro.js", + "./node_modules/vue/dist/vue.min.js" + ], + "vendorCss": [ + "./node_modules/font-awesome/css/font-awesome.min.css", + "./node_modules/flag-icon-css/css/flag-icon.min.css", + "./node_modules/jquery.scrollbar/jquery.scrollbar.css", + "./node_modules/select2/dist/css/select2.min.css", + "./node_modules/dropzone/dist/dropzone.css", + "./node_modules/bootstrap-datepicker/dist/css/bootstrap-datepicker3.css", + "./node_modules/noty/lib/noty.css", + "./node_modules/noty/lib/themes/*.css", + "./node_modules/animate.css/animate.css", + "./node_modules/intro.js/introjs.css", + "./node_modules/bootstrap/dist/css/bootstrap.min.css" + ], + "vendorFonts": [ + "./node_modules/font-awesome/fonts/**/*" + ], + "vendorFlags": [ + "./node_modules/flag-icon-css/flags/**/*" + ], + "vendorImages": [ + "./node_modules/jquery-ui-dist/images/**/*.png", + "./node_modules/datatables.net-dt/images/**/*.png" + ], + "sourceCss": [ + "./resources/assets/sass/**/*.scss", + "./resources/assets/css/**/*.css" + ], + "sourceImages": [ + "./resources/assets/images/**/*" + ], + "sourceJs": [ + "./resources/assets/js/pages*.js", + "./resources/assets/js/three.r92.min.js", + "./resources/assets/js/vanta.birds.min.js", + "./resources/assets/js/scripts.js" + ], + "sourceFonts": [ + "./resources/assets/fonts/**/*" + ] + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 00000000..4ae4d979 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,31 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + + + + diff --git a/resources/assets/fonts/montserrat/Montserrat-Bold.ttf b/resources/assets/fonts/montserrat/Montserrat-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b4c25f449814d8fb5b64d211ed2f20a03462c9a5 GIT binary patch literal 54864 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 literal 0 HcmV?d00001 diff --git a/resources/assets/fonts/montserrat/Montserrat-Regular.ttf b/resources/assets/fonts/montserrat/Montserrat-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7648363a038d248cec56001e848e7af2cbecc1c3 GIT binary patch literal 54988 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

mK*R{6<>ay*~p#|lF zqjEud%VYvVxFh{55fgHG};{G`xoSVASS9@P_$dg&m2y z1gFuVSC>TIEJ<{uL$4{Bh77T=Orts8lrgHsrI#Row_+CyV1&CYTz0ey7aEB{<0f<# z=%D8%HB#P>7sb})1mpLSKIR+uD-HI#Y}=yxw)w&|dYBmzrh2*jHs(B&7%sOM z8^BJ+VW6LJ81OL;1G^Z<3t%_nFtCSl7}(1=4D4f^jR07})R7Yv z+@aUcqfW3#p-w7@QEyWaqlO$8a2GT(GxC(^)}U_6>pI3mjgv6Rez6A=5OE5fvN5fm zoS`Vs1Ep@% z8Pj0XOac3zv|^3e>^?bwITQjhOZHu|5e)Fg6+a>7KBJpIk1?Z34NjQJ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/fonts/montserrat/montserrat-regular-webfont.svg b/resources/assets/fonts/montserrat/montserrat-regular-webfont.svg new file mode 100644 index 00000000..66cffa36 --- /dev/null +++ b/resources/assets/fonts/montserrat/montserrat-regular-webfont.svg @@ -0,0 +1,1317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/assets/images/2829248.png b/resources/assets/images/2829248.png new file mode 100644 index 0000000000000000000000000000000000000000..50a0280f1c53d3bf70f0929c294fc81371dd720c GIT binary patch literal 74265 zcmeFZ`9IYA`#(-9mC(_VgAgf|EZNslsf19JeJeDHkg@M2Nl13GOtK|g_GN5Q*=ItG zZAkWp84P0?%;)hO)mdKeAHILU_uOvhc5XLkJeTWnUH9vLzhBn~xvs6oe1Pi!9UUFB z`qfLibaV_e(7*fkf}d!mf1LpT;dHrd=%VL%*Twy|vklz^YsWh_$J8I(hTG`c+_v_7 z*lMFhN6(K^zjWcI$KV`}$;WiklSpYUCZy+z*ykNPSA4uXK=o4KjkMcvpYEsMcHb#> zXEWXv*Rx#Agd7ybWlWdi5_Ggy)n`X!)V0YlZzVHkG;Mhmt2P*F*ja6 z`{={5<0jZD%_SquE9n;^c!{Wy6P?B+iXSX6{A~U4e9l%9mZC&Fz6(6?|Nqbb*9bH; z8aAGwqqBUp!oy-j?Hv+Ad*B0HDIu^A92ggh~Jl+ zlqX;YO(d>eQgJ}X8Zx`6c=zjqpKcG60Ye@ITwolZX&x%RqcE#c~jZshkL zyhiJhdqw5w=ytn+OWYW}tsHAc=?MJXcU0&3$ETM*e}~sA*BfS78!!`iRog z(Uq`FX=#hIa+;97R$jf+UmYYwMc{5kB!A)Cedr54EfOzDA8Ok6Pl;T?_FgX-GgaMi zIZ1d29tnDB`M=OTq>j#&#E27@?ri125Oj3s&rh>~`#%t81;OnZ0QdiTo|oHF?I;}` zbj6lq35+S0yb|SEaqoqi1Qu@>i0uSiTvZ&)<|bkztLU!8S@d}QONZ|i-A=^EHl0E< zSRP3Z!(j0*udD zem4B?tAk($=TXa_&%zMOblR+s!L^~>g@Ui}LCM-)OXRlB(|jjb$I70aw79!(%D6FA z6fP?Sh4|2~2%q0OR&!Z5yM&t{iS?XP|HqNA%73V7?SC~0|36~D9iE>Eexb`YrsU^K z_3S0NAlHwaGeQ?+7vpE=!nDBufYR~q!D*2w1v=4t_FD5|5zHZBpQ`G99?QWGN)x+D zFG2X9nCaa8{c0d^cKcD}#EQSn3|Irwf5o%qRI(#SkM9(@ztrz{^bbC+N^L7ZOM zn&?qFR;=A{@)%do_2RTVePf2)lSAi_>PfCc9S-0rLF@zS13jdez>k_yfDT^#_h|KR=_D|8|lvRP}!6S-1Ct z^Bk0B3n9Z}}uZ-5AWN}Rrzh_sYaNlhd#L=t6pe@uJphQmO?Y~-*s6d ztCAI5HNG!a3bKVDwy(K&FG6v5WpjjW$uaxMN=Cr)7HHUM|&X#Px}BEA~s&E zLjP+k`h0$ujdYBi9QGxQ6E16J!anE;03WKdVx#-^#<>XuNu3C-z^g|2%W+uFc}XlU zf_Vxa_p>4zk|5Aou_i+W-88yF!|sk^?9YUJ)YU7 ztXtn4?qb9|<<*0uK`|qpha!ZxbzKmSr5-dH^GU$x?h?+(tr?l=mx3w?dX>$?9c53H z&Cm`n$ccD;P+&Q@YD;&Hoy~dny%Ivnw zz_Jo4=W`Y)8&De!iXW5&b9iVco(yUln}TS0`rONwIZr}CM$5fjI=Kg`P=K4?wk&yF zXr~Oi2uOL|;%n7s47foQx1B|PgJ=WggA%ycBWB@{|28`1k#Tx^_fJgthO`{{1vlV@St5&#XGIDn0lr!F zlqRSA!doIE>5NbUggvTNPZ8kEifqk#!>>>Pp4f?FAr=6&phCs%Hn(#)=y&gIEhi39 zxsJ4|#`48r{!BvEfVPo2XWaekqnhDbcI@fCQ~ET3Dp*>wQ8mghjm2`B$?$Z{O73L9 zg5N)Z`||fDQww%O{#thC&*07pk}}M+^9S)Twaar&UDr>?pFFNF&i4jm%6_Y@CziR} z^pJRY2077AT<2u8sm0Dy@;xCPQRmqOuf+I>OT$E_sh@VX?E4j^Nac(FLf}M&Urjf@L>0iSmoQh@DmaYnpM?t!u0}&U+*aK2Ty??D z?+*D+=@`gdMOw#ar6o_g)%ug(qI2lez6oD;GNEh!{-U!L-!ZEsb&OHh{$ zsOH~c1}Xh-4q>f&xwdq#J||C77HX0U{m&07eDFyxk_PQvK_T4PEi%fc`&QN9J!IA1 zrF&8uzmkgev1c{LCp6(K9IH35;^Ou>E9B4J8TrK@JdmC=h=f@B2Dx>ZfvUjI*(!i?Wz-<1#*AN$i-ZA>>3Uu0kGZ{DJ zx{mN;=gYSfi%yhbOanb75+{E0m9=BZj;@VWV=&T(uWO~rRBZZHw-{_Y;3Q$9?Y}rL z6pWQoeSm1Z6_3~Nh2inbi51|aMBrE)$n!=WB-cqiWan;+wsQSJnap51FfUnjnKlsbC3d+^+<^;oYn-O zPX$`05+p|jPPPxM+;me;0kH3FZ)|c4I#UrFY!t-C!96`xk}Iy>$0`BRnqtMv4Nw-G zR6e_FvE+3-7f@6*Pyz=5;W4Ehs1O?Aj$rMAryltmwe`@yBVj(dn*_4xenb@+Jh8)S zqKetTvCcj8011&*ymZ-6GC@S(S2FGJ7zh7mu_($J{dSQP?O`H-anp(!w9f#(W!}M4 znoKUVM`WHTqTlGaWnO20DmS*T;Y|AE+^i)niJ_icNb5hKvOpETr*xp&@H=4rv&;T` zi~obFlrJfaTlGjK2u0Im0d!l|#(&ZjhV#yrt=FXq=J`JhVFi7!b4 zebj5;QLCQ0BHIVI!a;NFfm9v@n+txwvWT=MZq;+syl&X|hL9pd*_HUrpLNrq@;5z! zBnN0B&tiHt96eLO@iR};#0>59A>uT0#|5{nw8H=jZ~9(`C0N))v<=JfO$u@epui3N z4?O{e=*ylv85d>qISv2|$SE@@Dmys^ILsg%>T~FG5zJkHrv6O@^aHC#{({=^PAdPK zsr;w-_x^{WK%`7o9<;$W>3<&9G>^Xx3XoK6ku9x<5I9piXp9X!)!Jo<%KkMk zS+R>oe#@+L>`zexAe8=D`@iZCbh-b?_rf!@-VgMI0LWv1K)z{W?RQ4~ho{hx8bCTt z9)Ttcy{T)n#mJ8*h$i2uz??TIB7s*!N-71@BoigY^M&%L;$`ueE&m6 zChOxYj;+S|Hp~>yT53bh2)f#8pl8d^eu_%%fXIer(6YYNUm(dXwSS6E=tKXo4D_C# znVfCgYb(0%FB4se*9k=@`?2msBG{=8w?RB|PG07L)JZnJ49xI0!ANlRR$iQmMjWS! z1a8N-*r_k5kLbW54fb2IaJSvhlz!iKPaZ{x!xsR!{q;H>Nq}3?Oc%gyZm%Y~$6~ob z``VgR!2AyMe@X9U8dO^Xfc?qRz*zy7_7B5nIWf1!XW;f8lA?yeUuOE61GHui;)=Tf15MV#!-Bn?o^S4Ct`_=OG zcbNQ6%GL07r~>X%`wwg55(r&I4I1RZUPK#2|G?XVj|FOrkKVKIgjA(=da_x@Tiw(G z`UXK$I5ib|?omzPL z=+&!N_eB9BLGt;%93(r-Fc1ayqB{yc{vQUn@LUFR|3I(N3ntCqsfJGG(*{u4^||b= zFP6N1(>NdwA_k!60O9>MOe4bup1-{;MS$m;c9yYSMYh!@1!EwSJg%E)X=y3OgNyG{ z2(b9K$@MJeY;-|eZ}DB*ND#ex({_+A!D_C?6`iI#5=57#mgy@0w!e1d0w^Z{`wZqR z)6&w?45q-juL;r{rg#5uBU+kfzp!p>nb~CnF3dVt?BMrym9Z0LE;kB%Jy8vd8t zb9Xh-5%g`)ZPVMc0zru^yvOxD;D+2OkXsoW045*+bZ>KQHg!kyv;EC4fCMmKNiTY@ zq{553J^hZg?4dLr-GY$Umq#7{G=6A$ecQz*P>N%Bm`INA6jw*Ix^{iAtZRgjjoD^G z%goDdG1L@Y)=lqOh5R2q%uil-%r^|WZNU(8nOiBQT9yyr2eNb=?Eq0U`DiVVqNO;E z#Zb*W1MSb4IoP+lKn(BOt*z|O)_TP{3T#4oLd&zn!}!eGzNlHs{q4@eEQ_zKn{!Cw zc#!@e1gYaMLx5AMPE6nsQ;aJ|5g6rm!J~#)q=pL)A z>`_LkjL~+20;umJ#}n|{-P-4rWki5U=V@#iK$+<1kD${b3tkpD z%j49w+5S>P6`G|1TI1%6ZuTqjy^#MrW`h;-5+WyZv(D%P=CfXbKh*swh;`a{wpg!& z9GBELwcE8$mTs@pbHy+2{hKO&J0>(#xDXKob!!KDSlESUa+RuuT2Nkur(|#|JqhHxvwVWxF-NGNAUa8N=Khw~!SDg#hp1)a zC6U@!6lb*MQ6^#pSB}~gH8v-aWLfz_omWb0W5nW%3MwBNrXKOQOxzL2auifEmG%O( zT1(>HrG~8f)s!Jcw;+JRm;#>W?8ad<=7ajn0n4fLqV1jp|N8o#CqVK>PL&k(t{-)HJ;4JSOyUz#zP6m~&e$Lh|G&z;Dc3<~xi$6U;x$Ugv^9>ySZ0cS zg8KoMlaD+4W6S$61(m;gs7Lm;l_tANMx3!!g7m=jF#h6(>Rvp_Narf!-3T`K2@P@9 z)|^FsqbT@XQ0{N-l>4uKGImRai>X~pLFU15|7r+AV>qSA_R5g!a`5dCC&Q>NMDxX| zNs-v@$#yZyfXZm|S?dN?0K6sR1}dd;PSwaz>o>QD82 zr(#O}FAt%ng+Ox#U0TX0P8%KJ6?nn)8~CB2mKb*7@o_7OrR~KtyfzJnayqNY6s>5I zYVe9u+xe-b%H0dLAbme)xoZA!xuIHUdR!oK_44-)Dd6Bz;(QI+r0v3kfKBWvcl2a( zQ*yUuzP(*}TC%GLXX2Uh$f)My z6k9_uG;Kgl-38<)hSnrUuj>mxm~;g>4MWtP1Ata0DSylzIFX_+w4!~3FY3!-iH@JO z-TPo94>@~Z?{qUp!`*%?)3ze|SE;Q<@nquE*xr3JE%}zbQ8%mLU}#gV2?iEI$7%kV z+2qOOu>{ZkIJ0_x)QD&=|L}j27i5k`DMzRa>Rbxf8YT?2mkb%~)^c2p3hn z?>j%s?=+~xVtJ#{GnzCwdDdISJ^!nLeoHTPji=tX&G^LYOafl0>c|FMCI0I@85ZPj z`V>t%Rz}3u(}Jz|E7MzpG=HkbiQUNfl;RoD7#iD>Q3lM-z$2EN=su%_;AqZLhgW=s zEk=D^Ng5ghfx0B+<7LkkaJdBWoqK!Z6;<^jUzMTY)R3FPyqaTT##d!!-X(rKMr{16 zJH%d|lEUFWshYXDmeB44uGv!fTDADlbu%-v_pE{+O=2Hq&crp87B=SehV*};JMII;X7|28o&AO zdC3TIBebt&)Qxu;Z_}SakCPV^lN-al^N0f!$=Y8I>-Y^MwyV8y9x#IbIYj`J1dB_Z ziB=97CxAn%Jzf?8b1cUw$)5>n+2=cTp8T|@WOI8mK82(m-)nJ9`qQUw4$|aW)9b@% zp(Kq(0i8b%eR(toh@g5bY)@ycbD8NcJBY-yePK9X&Vj<{tL=C~W9qL=G z#2^_GJrI54^Tk~QEeA3;yiU4I4VA9?d?!@pS6+otHN*WzE+fw-+gWTlq@D(dIluuC zUe-kKNd?iUgP|WGO8!>2`W-hgMFCf0o(bTffjdY6&^stB>Lf|CEAh}=>CT>(`z9yr z#-=pIQkPOzFg{1W2$dws&w^e)zz(JhX8v!gd*_6)JC0&S{rAv`v^Lf@`14Lzrhb%L z$dg(-7LQ1BqN4^`U2U@x<-R<3+lcb<0(dV484($!OGx=|%-onwK9Sq?b8n>e>PSB} zm?rd?SC%|hO{$!I%N3M29`wzd-+dDpz;ZTgT^#~(YcV|CW#{vi^q2Hev7GK#P|#e1+GYL*Q%g4+Ds43e6L~o z`f}usS&17Si^>BHT5{iR7t1t2&Q@H=Cj$#j^#J6|HkIztzv_6I!FQ^GQy2LC;(YGs zzWwMgWkgEuj4QsKP786Y+*Y-_yQwK(846o`6_oe7u6_Rx2BmPoNrssqRpcnO+SWU} zGhF=-zJE|k%s4|oVhx>0sdc@#`y1aWo&*L0^c%t+A-~-pk8+Y4ABAEcv8-BAipA6H&%W$DxE0mV}ejKVaWu0CJ{y_B& z295BkGq zXXm50N*roOscRpbtNa9XjQDFqve|s7x~ZB0d%zG_-(%#o=2FK>qMg5|{j(z5zggWQ z)21pyDuX%nUIkT2Rz1}bp-OJ&Uqz%ytegE~i z+@#5zijlTn-PO`FLK%f{As%ofejiM!H>!KKn{7kV-Z0}%fEt*U)H$uJQ+-BM3QP(p z?XLD*fMUPf8b4R1PwBvc5rFR$g++t(NS5ZX>0D`?OJIPN)z$g+`Dd@FScvg$_4#&l zw9hv2_wd&~N_7FHI6#|%n1mJNGByCqPxsKv^0vJL*KgWN9la->9m8XuIXM@;=+2RW z@tKz_RGUa4jfa{;QX z&%feXYmsewpURcR4_{Bu|MW$ElRuu6&mfUCC>@GyLc=^seFGw8IyKgA_QuXP*&_eo z)DrYKMDM@1t%SjAQfvbgQL|F+gCF&Gpl(AY>L%mW*+#NnT|vfSU|-_!*qf~3cJk!z zZJbgqNWv`EDX)d3R51AlY3P;4!~GgFT$J`^1gK*$<1qt%*x0R{BHMo;4IsCQkXu`2 zv+|sz9ZbrlE-Ge^Zl@SnM9Vr-=51MD_R!U@BCu_7e9EzS#aYGtmm^nl6!*YBLF&N$H7Bu((4ZwCVHTb0XmCm)J2DRx5W2d9yX|w9hhDm>rn(H)n+(1m^Wb zYKg{s?stBFd?~EI7w(%>K=c{pSh~f&R4e9xp>DBfdIFD8MuuW#-Uct6b7S7^a%{fJ zpSiX5ut}y@VoTHslIP?r1v&?*&(gOZv3HwvSpu&m5E!Wo?`|U3&*3RSp`$`B_Je^K zPN1ZpG)09;9ARs@%*C63NPZUCDV>1Kth~DY4GZH(mi2A49jBU@6ZtyIH1li-yFsec zHy@F=t+nLkJd^{|$*8&G=5GS5+CHZ5YvKmF|DHU8c?8!Nda+_awE9*PyZBcLmna>p zJW*5d>M$A?`lR+W$B^F1*!4z{FutIm{`{ch*1OVqYSr+1^b6A;TGZW`GvJPtTO_?( z-QEJOr%VL|oHs=x)0`tGg)cvsTx%Ax-AY*l<6W}BoycK>B4dZsMt6TpPcW4@Js`xh zI8GS3(VSaMZdCOKH+c|$m% z-uWvSVP!^zT>)N@eGlupB~%p2^I=n=kmTqf-id{xzwisT!ds7tCmj z^wgSrP<7h*W33Yy=+tL--jf45Wu`ScYG1@5H2t+q-*+l+3*}ZfQ+tI^##FLKJiFE- zQ8KBfld@e)h^a7olxFi z66D6uZ3~!;7R_S&P27o+qwZhU`b*bZc6uq@-Sp1t2PtR7E3~DZA2?Zl4sw-MQf92p zsx*WRC9JQ>Y|($P@hTxuk1!x7`h;O8E4J_PMaY~#ucj|7nmn59^3(he2P+510D;yR z7`sJjwsOu#OS+d}fWOD*ec=^r4cHI4BzO@iA5b+YdFwo~`(Wn0ZS`S4*R4Gge?{nc zy&Sr@vG#Gq6WEc~X>S^jQrgbMmcQ#QPJ7!8)I~uGn4oz?zRAYVexsULL*Y!J_rA-*AF4jz=7+Kx-a+y zXZXUgUE)*yniO{f|BYz(Ho@ReDJPn`-6E>v;kzKZr+4!-SSC45wS3dR!e|5A`- z#lPy&)Rm1`8yUk2d6&eMyDxnK(X&jo;Q!Z9>_fXYAfZYK+4ccNl+FBcMzF;p^yW60 zmKjQE)_IIK5b#`?pJ4ikplFtDfOQ1z5#KO;G+!W$hO z{Uld->3ODCt8OYo!q<^5{sA_BEUw5F*L;~*@mOcG_A90-1&k6~WS3zK;~(est&Q+U zmU`iThPIRa@d;~v+QP|>G=HOEIF@Fh12@AK8nl^ozz~Xt;o;B1p27+2XyHGNxL(%o z>2(fY5q_=m1!A_%jRaf>IgzM%s*`a!}XW?d^!Iz)e+Qk5Ql5PtF6E?M`kXcyh>U z5f$y25q!#874EzosM>}+-|8A|a!fB5ZF(3ACP~DEW^deSRc*57xZzE6F*B{Jt5sk7 zODh0T^RKX&DB{RiZ}I*dS1PQ3b57cI{@73|6^@K4@a zOzyAGNwm|;X(JLyPAgRp^*nP>(LoW*^`DkM<)4-~| z%RzS|P|x`^V~bI?N+-i3k3Vri79-V)(gB#*$%7rKK;ZmBb`OG%xBD*6SfX>25LI58hO z_6z9_dPcn*;kY+ZHF4MtTHt}~59Rf!ym^mK&>;F3pxxk_844$(i(-aJT2*y7F5(nh zS@(r8Q@=0o6QkTfv*{S)w6K;+&JJ9^GdDPpc4i|Bg-Ypp;xez}SLt*Db2_2~BmCtD zldOM3kFV){KA%2&NIh`VKou^s{yqFbHg9Ep^Tq>lVc0R|X|LQ?4|p98Y`X3tx$$a2 zH)yT@vsXQ{gL<7^#0qO!X9y<#ytkRBvyV7p-yiogttQ2*tD4j6oMqKmN#slNoEY($ z`G?S^_qvP>A2vtEuMP-y(GSrQt7dA8R#;+_PsCkDp+4z zYjMDrUp`{TVdmZuoKi=A*LIV0YhrJ5glhzQhoWacm$RmtDJy}l&yN6y=~ zFB=;Zz4N<$r$VJ=MDnlb^tmB;SL}`WG~LHE+`5#{n+V99pv<)~8o0W(52~>MBPT-b zinaY8{^EP-91NE}aWiTwJJqLpZGU-;%ONDF9TymLI+GyGJRN;hVKvRB7sW^P!<%1} zfA0i@ehWKRO0X9upnANS{Bb`_pF#KkkpWLhb)NbIt5!BaLiQWQz ztNMz`__Hgg8>=?P?fg6Qc@Vo)#P_&;iIn8Z@~Fn&lfrSb?%w4#;B7u4=I4;Ld%;4fiIaGC$T_#~7@5Z~? z7Qb#Tx0<)d7^c;{v9B(6!_I^d%i;^hA3=3KQ99@A;n6SZEha2n5~why)Ds&2a;vYo zLbNbJNH^|1Qr1iRQ4%}HAbe!;mFeQ8?6XG2ANz~JircHNv$d|3o)Or$;>t6PIB=Ul6=JuYYw^BqwnERkBGhC$W2c zc=<~?M~a2w{7}QUuPU*<;srKynOq$uQ$6#7ufgq(9XHlT^=Fom!w{@b5WVM)jH{Ql zkYBL09>GaNR?~gtdR^dWAezK2F1>s@?H*o(h3CM#z(6LSbty%wQ3HZc#eBNunQFp%Y>dcme?zEap!wf+b z>$9$=>HA`4*yEwncUS-jj_jX4>3tv0gLb{*dL*?E=6gQ-tY_MQ$e|E(;mK5|)fZ%* zC@{gk4`i#Mk^}M8v@_Dv^Vl)}?cjI4x-=1NV>*{d2cIx-94=R8U zTDtY2^Ldb!&}F|h#5mY=knomx-^->A%8kKqN5;W1_iXTdj!3_4Ij_ zNp+TE*>dB3rK73aypUteDq>Kl&l+@m;tm^bT-_*JrG}HonW$Zg@fqc}^~-9XDF)o& z58l>67^!fJV1Pa&Db~{zV_LpmZ?BYHx|K%V5@h^H-_rYXb9td|J zK5vX(W|U2e^6maZg+Sm@_BQN;J^XSHx$YrwdJ#x~6VXQAzJ(_KWqDQa9WD?_OJ#g< z7Sy#^cx`?Kad&VNeT!?-iCa@6A2Y!f8{TyL-7#>#GN$gu`v|x6?e4A1s}FO07mUE0 zFFF~1{yyMeOl^DhYEM08l)4l?T{BNzCvPc@jlBXj%jfb~XF5u3M6QATf{e2UPC7&7 z1RUcF>Xh!ti#XAtU|)I`6h>(TPv|fGJ(}qZ3ed~ejxVutj-KzY|LSTuNZq32U~~u~ z>Eq+$mJRAws6%-#>ym`WtD4VEY|6N7grCTi@LQiuDSF=adc{A5JjCn!5zlYdT#zr6 z0c>H*uDnp5OyW@)8da>4zoP@pGxO*vAq%PMxqD|%E=Ge!KhDPJUdA%fmRof{9-l&!;Ft0=rpDC7N~dz0dN@MIvK`FP7xa|^oOGkpdJ3WV-RnAsrgbK3PP0<=|vMUaA}Q*g!P zNCqGR4tF{Ag=@86QP7`H4jl7a&Zz03z`#52*IsnH=tbTOR=LBEDps(fK5lGxxg=hS z6H%Ow(D3%YTpdwKy1@RYlsq5Ch_NzAFW9)8!SoyR<|B78u=!w5?5~V;o!2-kfMU1$#-J4_j${T6{R8fFW}n&-l?8~0_jDkSnuq0 z$s6oM))Vq7W(~{gsSe!WiGCzcVWcwbUf!RUu+b8)*UQ>S(`dS{E@dv5zGu($)b!gG z-?dLjvA$s5Gjf~vTQ*$rPcUi><**9BJ2*GY${d66TgQrv8xGThr3=?C6ts-9(J?uu z3N5O^u$S_}NP(+lfbzk%GyX#s{+0&+?8G z@+$A`JT6n4AOYqX<(`^$RqfN#N5m2s^OMLX71~^A>6aFML6=19th=2Y>f5)s1RS*5 z4fQ2wU-%l&wnhs$>UhP45IpcNDB4{Yix>%xuHY*-npcTM4qhInWv)G*vnfi5Z|-xi z8JMoI(vxsG^PWLU?>WCXlds^;Sp>jH5K5IM`<~^EhjeuW;%=k;jA2^5z+0d#{KT1+-e1;B8j2oDrC|Y`+!?1)e3^~YJO`BfJ-AQo^!E=b=UI1sg^`l-lI(n^z&93r zr$)Ux!15njG9r1V#4mi|JUa5ltt1ceWKKl*T1QZUIR{v{K z1q|xDLCzWjo$I~(8Jj>!5|zku9D766HE}B;oXJzZQ_9D2@|)KvBd!(wsc_}ds(!Gn ze@j~qxpBVI6)$mMdfm8>@R?9W7_snCpCTfUO1omXx-F712$ltIw=a+O9B_bcpSg?# zP17PCWu=B=nuZ1^9YjhI;K)2lN8~*pJNYSGMM=U4sr9xtd0aH0dX8( z)4%fS@Y?Yu1OK5j^Hjfp&`|q*vkIzSL*QT^ZR89*brDK-Oj(%XorWReT+NnWm0nwC z;XK;n7RTRY)mxgkwd7jDG)?fhS5VSTU!V4o$0<>HbvRh4A{!THk%)-M`8ksO{sc8S zw*%8xrW3)GSV=;_${}SNf7`Lf^Cqw758LB*xK&*69QVs0e&2ZZComzs2y;cr3|VW5 zl0o@Rd%X4NCugN(Jga;bp~&3R?=E9;)n$LV_X(^11cY|It;7* z#&xbGXS==C<-$@|wpA6ri=w6eOUId6H6c1q_yUA#(|Vi=Ra5kU^QT(Qy;<4G+q0bY z(%Oq;4uo8CHpBG9^7YCHbXxT543}-beXOzz;1&)Jd1PgbT6S*xl(Jvj@G%u!_=7wLHnTPF{dYNE)%*=$$nq4 zPZ}nkEU)OzXDABQGiI+*=H-2I_@ZW6ChV&1wQVLNnM7Z9A6L8dblUL8$a`b9a1I+) zb;?abX{z3Xsu3<=5YffY@$!&YrdOLD+tm3VTnRo4MrXLK3!z|AUUL$JyBF-Vk`sj* zZ*%hTjfXxwkfi}u>Yk9|jGmCLscxk7Y~s*IYtchC)kk&-3u4|8eRe5-$zNE(UaF3; zCUZ!ISzH%V$NNQ}IALD-#5l4jwa^eu8UC7{ZW|Y)4EznsOy^8dlKP;9A_Ct=w zUb21?JwTt#$ptS#q~5sdu06t{z39GIV%B1H%(c%>Vue+tw6u2djVCUc;1^-;6Y{6w zBhp7J?(bRb*5y>8ZieYR!wB$i-DXS20>HA2NnMx+_mpA3Ng*R>P1glG z+}Y)!=9M3h3Jy!{0N<8a{6jdQ`Hc_#u7rE-O4My@e%~G`A`*d`MxUPOL9%$Z8e2_H zR&%GC=E0V1q_foWwMu(VyYhY0A?G0p1w@Pc@f(}RoG zRjXZ-Y~dwB@uCHijD8z-n`x};(}xT4oV*#$9uyVeMcujp6R{LrsH$c{wU9UNt#1DE zDE`-tRcanyOSGGq!dM8|Waiw^tQhrW<>yI!qJ|5}lc<@yhIgI%vXXM2Wm9aXgJc6! zFzo$US<#VdHHfJXFT4XzyrbO;#xh+jbqs4LTUY{A(ui9H?0mT(ro@uOh9Bbb%rw~<)?IqGCvd#2ME zq2Th&WiWGWs0mwNUMAOE#1K;LhCXCjBV9g5puE*Eym4hZN2NyKyb)n7h7zq<{TE+g zB(Vo;F=l8O`}_r!g{556v)8h1BMB8kY6V1eSi$0t-a5+16~T?hC5_0jJ@SX*&7s*} zhwN)g$wyzu#XTcFdt#5iM7e^5g^>v3x)dBs4!6{5KLmzHWoH?IVCh79GKCn_kXO7Ki?ik zG}Qeu8a-qeCwBAv^d)F3sRQR%kA|&U605*k9np1_@#G+UdxqZDZ}M#whhMg~x&&A3 zC66a!Z-a`l*hv!62 zw&!rbr~T83D=E1o%qlU+(ENC}uXP&X0TVsgAD}}l4OXh?^pbU<`+_fbMs3ktQ~*Ss zI(7G4jKK1X>bJj=%Fpl0Tw3zqiUL`mO2%yztlyeNZN%GjuBN{Hu14*g34T2}XJYK9 z=eIR(fL^N;bLENqDK<|=@JK9HU9KKw@;!=nm0eA{HtJtffUeLf_*iViG!Sf_d5Z~h znjPx$Kyio*k8(zAEGS+Mg1cb~D;|3WL-Up7TCj)#b8Y}%dlTS74;0y^fdNguKPkMp z_-@taS~jMw7DXM{T6%z!9(60ZYO8*i=vX_-ZBeH^(PPkl!k-k-l7!7%$`m5mh)*!E*h6`SpU=V=C(n9!IrT&)n{eU6e9(K!7lTws z-#{s*Z!G>S|w3>Oa10b49k*n@l7&E@7=B7DtDKw_Zx%tf*Y#X(Wv|~>bAP= zwnK1{6PPp>jol78NS?Nr!*&x;<+%I7h)l)SRsV7PQm@$Xw?W^}eHQ#;)K;Q3FB)@G z&xVSNr`{{UmB0!Ol0@p|AIMZb91Z3w@7|{&&AyW6riM!YzXlI^Nrb;XH_XptdjA!WN!( z*&Nni)40+ouOc)5Vsxub-m!E z@wK(x-!qBbz+WIV6X zuB3}9CI=Vrgr_9mVC#8V|9eu&5ue7{YK~v+mo#5`>nU8wYI-+h08{? z&AX2tSKQtp7N1M5xG_Rt)<4x3Q0E<~au9c!=%%f->MV!6HR@?B!Qu90-tjAw*CF#z zk_Yr{g2Zi20+MaD_S1mTpr7{}9j>Neobv7hFjU*hB@P8QB%Xou>AcXecRK$@HSp-J z>9ub`E1b2+RQqiVs!r6z#G#l{J}r3tOyTA%5xq?e|9q*jS?{)K;D)uv^GkljYNOy~ zNn3e}#nyvdpUDWKl<_&smwRDu1vNHFu6Walhzm_ObJ^ed5#}y>cj=+0&!Ga$b)ydJ z6i-~{GoC>Wx5Uc;{e3sG(MR{Yd8HDb^)t<6PuHW>cY}{ShmNg}*uZIpfCiVE%`gpg`d85Yz1-hd37)c>Az8V6VpEzsr zV}y!1y#YPO24w-+?GM;uPnTCuYq-s~7n>NA>}s1%i&!A{@SE8Z7xeV6`nSk8pbzIo zxMp`uzOP+sOZH41Pv-%w&OESXp%trJtGun;z;vvfCtc3*PS<{Z2ktpID(# zVrp!7YR?`7)zI!Ks~5GXQ#h{fyj7o%95jTy;jTI0YClNZ|I@)pVpep?r!AV$cRuzf z!WOwL5^+t6@pYtx*auOF1n=z#l{ig5uNEEF9#Om-$Jj6meX5JarYpE?sQN+s)V2#A zEY!=#ln=%AUY%$YMoh`e$b1o-#B93o6PG0LRXwc+vYXF%TCz4^@?ysUC^za9axeZx_~?IdBFKQWq1RPFnv>b z>3i;xImVa^*?Z`L&ALEjJ+kp!%&-&%HX~lmBsuF%JZq`cq&L`E%kduE8E)}_#X;vc z7=m>3rtJX5chvW)9|Dh^Q~ioQIPG6K&P%~a`n9OW!|S{qlo?OJVshhsD>B*!Do6)A z5?_xHVrt=f*I6}wd|bWE^aH(xrq(esA_(%aNTe7s&-Apee%*EVb@{rev34THbXNyw z@JB5TI0B`x-5%>?eyT9u@A^BAG$k-f1mY*-_`}9p9z^eeh#jB2WnK&pjR?v32v&^a zt}SgfT#hf?dao>5vo&gwa7)fW%%7x_C)Rc__o9H1%hlS*i1nz^f!Wyh+z;2hJLK(8 zH_IRYQaY>@bD2*+!gVN5<(lDZyDx%>qd9Ibjw%Xjrzm;qvV}ak$;zs^Vpk~o(d@^- zfnJ}LM#rV9-2p}hlk8W6<6)MR>y=C#Cm;_B7h>+N*5k^@;W-x|#iwX1nh+5_FgXWI zGM%+O;@HG**<7%fo^se?a*>CqSsyR>8xo5L1GjW8oY`HWc)_gM&_;FL>AG(Ez_Jyp zz4Nt02JvY5_L6f>pV@Nc?F!;MjrQUE={=*(Kq`ornZ(B#(Qj4C!VHUwPe;GY|#JY19tq_E19c?!F%v zgfbi-K3=-h&Byh`l;ubM6&1`q!EB_Os<45^rCBFcFB8EEx?*RV11n{C5ICs1Hrp|RI z>22g&WR7U;-0?|h^)lNs&7<2m=Zn$>P4?u z^ON-Q3;3e?NMCbh#YE#C=4l0t5C2Ao9nzzPFw^^yt3%=nwar8}A?T-&<_x~75j&KBjs0!;m`Q_R7G5(NPgNY83wU5tc9yKEG zU2J!%Lj^HT!hMY;yOKe)|K`h2@HjceY3y0%vn@Di#r+ld!f!?6I%*4SIF8PX)7FpA zMm~yuf+%d8Sawsc!eyhTCm#iD&gR#PsI15PA4_hsHXMC`bBWuKQ7^l8_9Qb_rDB(H zu3nVN5Lir7bf3OVwj^8&x_WJiIN{xHcj@^N>p8*fDo7@HRZJS(b(OPtmI7@hPCT;@ zshb_)cQQtA*G^}wn?yi=CINzqaMf=$?XY8_>5M~2o3|EQjm*we**eks?L}cviH7{w z1(U>hb+=_|`HYGpV&4w}?*Z8u#q_?DgjA#-rTA4)rT0`C?S9Ojdjtl`Lmh&ag7!^= zMViAZC-IGi)!zGt>r{)$sll0Gs5515DHx?MuEM_)E|`Y z&56*@ERR5oF8V+ZxFTX-vc=4}$DBx{fyJNuS#`ExFwYv5_e)CaQ~uOf!)5dOMn)yc z&3sHeUtKxO+DF`NT7#t?Tz79APATyJvnenNd2Q+=;u!4HZKrfDbi7!LsDce)fte+Q z!PMD{1J`-DUDD}R*8$J|NxmbS_s*V`o$Z&BW&I59&kBQ=#+bRc9v*uyi10c3qVPl> zN4TR)NX)Hgrk0bzjglMuI-V*JKsfr|P9Jva6!Od~>gP9e|FUwZiWoW@X+vWAA=1}e zYNDH6w<`Cj)-??l@c93c^%ZVa#Z9+#OG$}zcY}17GzfyEw21VfOG-*9LF&+{q;w-C zedz8yboYV7-T1!WeZJ@3e_+RN&#akQvu1XDJY;NdkEvY>{^l^d#1e4D!&B3GsZe~g zFaWqy#`YCT@?Ah5T!N)da}GG${!DeP0$m}KMXc>SE~-!k&qJxt~iH zY3B-W18DSIMM$nMia;B-?VtWJAVr`f7yeW@nqmnFY zw?nBcuI%0m^t`6%fZUN`Jo@4d1gKlC6aYi6(zR|Z3$<%Aq*pQ6$%Ff0>~H8-jI;f> zfwt1m?{iE4Bhx=00u~@py@>x!!7A2`GM~Ks*rt3KMi)e<8G!W!+4t~dr$j;0=~FMd z^pHCbb{@Ok<`^DqYi%tvmL|(~F$!G$TZ!x}kw-ta;|c>-XyeP#DW=!okb%Y3&yZemalZ1cT#O+lH(*Gx@e3B(;4j31SNhrle=;}x4dfO`g z1_06H+^J8G+J2okRA08~OTkkwgbg^fUlg~K?nFx-59&1dWWahXcy?!fc#1XQXt=7X zFXZ_yfoGt>^Ys$kfIqY@e~@P1YB65_F#ZrL;s#}J9EHa%~Y{GUXZO0~4HaHOHT*(<>m=)esKX4{4&JDhltb-TG5hvgUUlTJOIy zl63;wI9+IyfEuBp2UtFJ z(d0Xu@x+qZWDPkc{M+9I9>T3?a(tLN^EHDL0y=j&I#3!1Ve65ZnV`}U#_+pP6IjJn5-Y+u}dmFDX9OH?#9$FUl}1j zj3}WOSPFo#_P?X9waEGw-Tx}+IkUY@Di3$91&YeL?v<(h{pAdxm-*jjx1yB*$<}K$ z;E2zMAFcE5?|LgXEuMr5o)gul_>H%r=a&$uV3I@t&W=xT^RmsT(AxD~O0(WweS8Ja z6V;IVZ70Kt5m;z2p9=%{?V~4)C9|0$x7=J386b)Pckp zW9^bj%vcbmFqY;ml#>H!0#L!@enYF+i-|mD}|2 zJ&>!1?b%{MZD$Ybd$~eBFE;{bmxD4=COgYC20v%5o=!Bv!N ziSOdm64M){w5>e_cH!dPX;G6h;iah9M@X%K#3RJV}? z0wly}=S~tf0$}Dm?MUzrJ-Dmd@qS3~DZFV2qub!_%^6-vW;w&P+a)yk6B{(&E@uY# z0e6`P+*KhX;Xe;kWG+T0-IbdYAE~;^&Z0`j z!Huv_UvpV~ep5V-+U zej@Dr`I=vcTkBFKrz|qgXY#px>>#{-$@;^-tikl-1J#MS*36$7o3N(C=?Wt&bI*K1 z@Np)TybWuI|01hiQ*T)^=qR_D*R^cGCsW|z@t_scPxrF%@sXjLG4;SIsFHzJQ5rv& zgCJVaII4jN=PhbnqcfP4&FnJhD~TBv?qbC7tz6uStgk%Y4@ea+IqE;~{vI(N z_+dvK7abstJFnDL@cn9ZruaLzhL0)!E_SH3L7LPy+njZ)yxg-bwc?JiC~Ww9vDoYT zcI}nE28`>*Zo(Om_nl%ynM}7nxo&?^QA9rj3%0srqb1$0MZ72Gu3wENCNF$ZWTyq}XPBznf`2Cs@@^Ufb!g@sHS2a`kX*rc4Q^aj*uvTE&_y^hJio2Od zE&2ZGT3xRfD-Bn%lI6tmV!i=c1WsvgOf?oikWiyRnOXMta1e=?o(c)nqq$X9bz|gk zDp-EBL{1`>ug+Lb3WN}Zix2^9a0BOUyVj|12wdqe=bimMAIEe%vgL~4tEhg?tgXZW z_N6Rq^6f{UWw)MucX(fXOZHH=YuWakNo9nNjZDd^F7!SirY;aNkh7luq!~FDF+hs;eLmt?W*<;+mN=Y)PmSac)S8ROF9Yvqt z%w-{$Ho8zy@RfZ4PD6tcgvUg~sHsKQ=Uy(i&Xf~t!7$>$K~g3|O7!BJdnDcgTYs9) z>(;E2-#bpCtOs8!zXi+YmV)8ORyl1l_`B?(S^IH!xFDvozy!~%ZQI$^ zfH^GC&Bu3G?AU&Mu7PYm9Exb~Y_={cLCb$y^BVE4vGEY;bF&oi2_~3+^RZ^0LunMe>@AB5FBWcGCzq4q`-#gwd^>ldW>au*&rk+244} z$PGE4jJZ!t-~03XXs>J4#b_%=?sc)p*pJ`bj!h(#CA^sxvB1r0Y%5L?%%C!8OFVN^ z#DR&%fUAWA?V#xi4$XBeu{-7aA%R@hg@bMHocO zC^p4KvgG(GLyEcvZP-F4TVKg5KseZxv8&v+-`x~34q1K_Q47&xK>+IF?Y|9%Kst>r zvb=$G)NlJPXkxDYvDWv?Me4OpuTisI*Yrmj=FF*S8fS7**k2Ly;kHw))frda`$=1Q zN(b6SPTxqlcic|h+*-8T7wWW_J_gYlAMKRbz+*DX3@sk8ux(VR^-IA6t9ZD8jkp#z zyyo(u6~$bdXTd5e?OJh)^$4(GF5?FL0oB_MrF^{OOxoM1p0yylC*)FgjvbM7D<6XF z9=M*}(f0dqFA5FMEu#TChtuw|?II(5l@X3%%OXy-c00@c=C|<8C?bj|0*w!q z%c}{d>leU5KC>-ett>;RF2Pm^oM27FV5GGtmkcy2LSVj}q_Lb$~AI z>&z=$_h4;flOT6!-2Y71x9V^6$u9-j=&oXu1~^S5^-0ObiMkjbcwl+xAZstXk&Bd z^2Y*Nw;dzhkMm-!492{a;F72=f2C}vI~8L@1e_QkR5@IT^YUt!4tFsyGDf1V8ybbo zH;P12{gh75GcbNP@?$vlBnNrQ*pmziArT0KZlbYce7)MY-QIs};n5#o_cZF?bb5g8 zzX;EWJyQ0_%45!RYT-yoQ_QsVSLUYr~HyHPvbFDo=BTNmB*h zj+=;OCXw4U`4I~q40RJD{E7RpefK^-Gn1;O!A8N~-(Mb&@t)2w26Ta?CYMcuFN014 zsT}bOD@yffg!DD%m?(W1un%XrPHm>3oZLEHl@CS~5X{PZJkM&M0S445_R@+^LN-9a z^tKXH=!ogr=P1+D*LjRft$$B%$68vW{PZdj5s+EO$2;=#^CQ|W%FE3;y-HZmhR8*t zdOE^!pFTmyyJNco=0*%K*kOVkW$kgmS9jUVv`VjPWU&Dp$mlA9p|m617Q8fgWhjl{>^+PrY$uonkWbemeQ7 z^*iDnJ}ffq<}MQ!)kkkCC50I=6*iKNg!Mj0p!^fIA)6gVSGuFo#&YL_>G?tuluf=0 zocI@D;s%PDHDb)=0+BqQ!MpX_CX8|elFLjf>hGD`wbzTvpk63^)1QsQ@YD% z0{K-{dk|K@!z;GH!_QVF2UlMG-Z_Fc62l5E0mJznk8WyQOoUpJV4&$B!zKmVMV!kS zQBN#gzgrIe)L&A6Oev)kHI=xwiJVO>i@(bOVW)rR*_om0z!!0`?=tl6sJqZaM6`e1@Q=!_}X(jDVTB_7RS zRJs|$rrdWETtY%ZS??G1=8J%@nts(?#gjoTq|-u<$VR4l4r|It+z?hN5sU3-hK$rd zZ>i|I&&*4Y&pr!M(xEI(@vh$wtY9qQ~%xRS{P zV-?tZ13yC5Xvqok>-QRk)U0?oh^q@HkOz~;!}~EWbRJBt4<-*V$IH3RzPvYfp+af; z%aS5m-N&u$)la4fb{;E5hG)TE;vJQA>;%Ofy=anc(_iJnd)Z|oMGD%Vt4dX9veE{b z`xAHi@b*60q{?am6|+A-t=_bQ__|}E`VoKUtIuDNu1{XGdEJ_jFO1X9u{AoRHRolt zIC|b|jB;*un7OU8F!7NkV)lex#L)~DX`Dr_;T=MWf1CAI>lA3dPNwfMVI%h-(LObP zX=7!KB7%K_b@uMrjjgbzE1PdwcwpscZ#jcss2y$8c`rqP#1sQ5gAF(;b`=#BI)cAC zMUBa~&{t0hR(E<)aYozgGYrsghqUw17RmEBobnYd+>IlP4)x!QCJ1KSp6gr~(;U`b z^Tx}ph?v)ow|eT1ucMw5H3ojuS6;wX&$Vzwj%NynRFVZr$7ZlpTwtH6B(&KIaNCDD zR7wZ_<(?kPWvjB6b!+Gf%x)KwH6J3lct&`1C!qEkNRB`2?Cj=KVrrymz6Mf=g~DMF zRdPKLnjPjB!Wm6CulZvY25aJOlJP&8`{GVCRFm?=b}0NHPM+)x3-In<<(d#63EWR-P`rOAKjni20A?ir}|27a59FL~}*A8s6jyNC5S zs7LaVIp$fJ|9rWj+It#4%K?VFqnV?edoaPk%DY{<2}wTdKBNR8YpUJ6dHk&qh-AC6 zt<W#EgT-o*${aidwX8c?en5ac!c1zq8q0sSbRCB76RCdaD<6{LR z_g`xyrucc^FcNIGK5QmoEl4caXLL$dDOdcR8_$x4UR?3qLtB3WLDWoNN5=yD++R@V zC=iHU3UJB&ry4Fhu7X56e}*B3qUKlg%syka_v*8f5nC>dbH^8`jwKm8Ti3<+^t;_G zQqCCp)$HHqU4myD{6Ht9aQ9b*WijSiw+ZP^_!Dz_3cqms(STe24J>HO&-0i{5Y`k;c~9(Vm9k`{-ra z%Uu}v{N(xti}+0IR2bSRv59e@SoH}9jjNx3S`oHC}dH0jQ0 zp>{+e1Hnv-MZ!Usi6b#iR{ss5MBFMj4V3W?FZTN~bI}QTDm(btDVvqMl^O7nCA(Os zg&G>aAL%ln;rvx@KX2~spSZv=AbWBbBy|4XlZenJwDld-qj4mv8n;#~SqHE6ccE^U zciK^bpBdE=m$$h6W{N3jZcgVij>|W&pVbDP)joXR6CL<7gaRA}i)pbK3hz-i%;Mc> z%i32O$(4e$H{%N1JptRe=-wF_QPgKwVYFT&B0lhG+96HK4$1SRdj0Wxk!n4EiYta_ z8WRSR$<(u&$i&$YT%WN))pF~B(2df)tUX9?OrPkO(_=%y`ebVLMM(IOeygyPogG1- ziZp{Zh!v{y0`aMMZNT_{s={Wz`9jo=_=M0MksZ1JR5N>Ow#U6WNcp+Q@mLuY%u4dF z?j~+$su9kkL2zw)4*Lt1Y330#U50y>UvQ|#>B>ivU7&J`uX&3tWZM~;t11#0Cxr5p zMS#X^CASXg6AG(68;v*jcCd?{3~-p$#0ycEI~~=gFSo#} zi<#)&!;4a0`DpR{2giTqIT#lIVaL5-M2SM-HC-cxT8D_|ul_oAb7vXnjzNvS@MzAU zdicwxqW=2rFd_;alxo+g`U|lF^w++Gkx;z~NS!wLDXAHi2-no<7(7;45E|ZKtk0u& zlsv!CWgl*FJAF0Xdx#sa z@D*5TR>#3$S;Ro~vGJCBkr^z% zp#uk*8cN2vk$Ic-L#>(HLupiRi9Vb8TJ})f#lGtaHk1;%j~4N1+wdQv{?@sBP*T!X z>XUU_Ni+YJ0TiN3#cWYn&F&C#eHKL#S%1dktqR378* z^P2K5irV2BxPHdHkEK{|vQ^))#Ehsvlgvc`9?AzOsNSWh9`NH`@W+Oaw47nP?LvUj zkPrFd6sG&1aN)U2;RF&hEZ0lF4fuhP$KVduCDb>zRm$AsYim-R9Q&cXqi%_=eW2fu z0jCu;549OJpT;;r;U`PvPC1ZV@Wd=7u2PM|BwB&ZNOR4@<*S{E5seGD`}XE-^skSe zpH|4$KaN81o){@Q?QC?rfpSd-r}XVlPSMdLVEXM6eXdx;6n;&S^f>|Q3wOH;TAy;k z28Vgic8}OPzwNG^m1%3`7nFTWXT;s(&+oO?Ur0o|1qL;kOJU559vE+BWUjzn)xtz! z1FfbNEPc1k*sdbuvm=>enu5M7d4WgEszs2@mwVRrSgPVEKB)h-B;g{%;?>*7q-k4- z!-VMk#yUSWKVNK{`?3B9$k1*=**Pz)f0cXQE#+@U>*w2i0^orFWG{c6b?dxt+)f3O zZ$PWk4oAx9*+m!S#F_EMk)@-V^ln^p+Y)f{5K(WoKw@NKO6a#DG_&L(>khnTqNQD1 zf2{s<#9j3+0zClgdP^14Z0Ri3F?QC9E|p)uB1QH~3l}pIyXVQtKTr4ECa$zHy_*ET znMK|`IF-hATBKg&%uyIIoBwv3k2q@^a7>w0cvo;V|YS{#Mc<7n4_!`E-K?*Q0!|#>{TeKH z6+jIf>pzdkwErCDR*|RY$sGg?@T)r0ma2@KZN|oWhExtst%-1d-5v%LwjE}P^@K^O zRa#0@YeWw{}F2HvLnC7t|Biy{}8GNVKoKI^5l zvfHQOOV2fY1{*Q~!hS;A%m?Mlnfsy@*bfePz5ddn{83$Yg|GP;bf;osIjZFzSd!5rHJkr;bF`9G~l*P9sj?8Jp;*tK>zOv z-AYTm3?Xt>da>~Fv$HPJ?E`+&HosN~q=6Dm|HEU4-1T4`e1QUh#^K$XKVU`rWIs$K z6YI*6`oUhubi3vZbF3SGZV6m#AzMrY3?z3mJjJfvaJgH+picJ%;WNvJ4+rO(6$=W`7{SrGFFvkf;YS-wTdvyB+jEzFJ4oe+y*{0`&IEO71CfY2?tm0UX^55nU4=mP%4$s zns`mZX0;;zT}1BFN2pQk2+~AuQ1!Fu2?-$Jt}w!qb0P~`380zY^j z+s_5*+3~h@8=ZNWoqzS9arA%`58TR3;!5J~>Vf@oVuB(R%O^WrdTU2JNvheEkh5=a zY#~Qq`ctquMp1F5dags~zv6oIB_$`c`1cV;ZN_<|ZVXs#VPU;V6VWB$-I(xPJ@Lnj z`}q8zSHI3}MmkY+@WBvx7kayjro+WRj2&~7aF2K+RvX1j_`<<;I_hm>8- zPyNmx4ENt-Xkw#(MyF=6M&;2Kd`WRjy|$+vUTT2^8dFKqf4R; z#nM@nYbd>YvHFywF(F~ora z?K4UUt>Z%ZeW$UZH*`J4@toHeqh~F_?aS9p^b}p4ul>*IfpSRtB2^9?62Y2@9mEw+ zqfF4oZ(}P5{YfN0V#)7u(}I|WN&rHz_}p(5HR$nfHQ+pRi+5@J4a9~^ABchIZxk&p zSP&f3ua+v7kh4T0Nb>8^&95Iy*gCx*hDz0ZF4g$aH2hclRW_}<4YD`PvHmq#a5eBA z$6meF{;1-rR{!$jMN9Ylj@ME2dFO7s{{b48KqLl4g>(iI$Boi{Lki?{TnN9UF7QCT z7XIo;PswFOl+%hnadp%oqN#g*IFZE4i*8@4?3&_;D=Oj8@2s>3{ARA_&uZ@L!pLxF z7@gi@_Z2A1!UaAu_3E_VMJ5V#T5jy@<44M8bjaQ2mCq(%&2-oP@(|Ht!)UMq7 z4EaNc95Om!nQj+;K_btXSrq{$ZtE~fAQ18i2Q4mny-|=1Wj8e;lSD@f6jM{3Qc>^8 z)+(4zB~MJZ!%MRUDS$EVg~gz=J;fp#YR{EBg*1MiOdLZ>V*og1M8vGy z^_NiXk61cZK?m8v&1$kVy?ixz5=$TQ3oI4K+#Bh;>pmeu8ka7TpBE(>BAQOPp-PN0 zzUa!Gr(AI0U1X5b`uVr-3C%ulI!|5s{#YbQcF=s*;|pLTJ^oJB8(w=+iAq1#`NALr z3jjelP&#v+BhWul@IFF96J)UaPmhnN&6M>4GrrR#cK`V48~SzaIzx z!c#6NoeEsrE59y!>>RQhpGIxeb?h61b(F)O(-22R7rFHvPDJJ)N>O!1`5m9%HcjT_dyFr(fC)#@`5zw~3`y?pU6Xtx2=is(AWK!^&XANV z0&_9qgiuj!q7X-$#-;;oRsZ{L&IVbQPJD!dAR&8%51(N_{8+gb8~`BP6My*+K)Ot? zgJNS=yV1;dIk5qv3Li=Xq2VJ3KZ|cWJ#S1tV9QJ3u&@%RAi<(Dp`CnBj{id4W)C#m ze|XUS9tT%v8c~v&2L+)x-MiYhr+|l|I+(q_TA4Zq1=&Fb*DO0r$0mqg;g7>a8?4rM zl^nzZE(K=}aP*D>h(pe+}(K-|S z#d(KFjm8>l$Eg51ea7A*WSK{!8RdPt=akEiH`S`3@5%H>3W*UFjP~SX=4ZXmuCNZ^ zhTIr#H$y?e#U1!K><|(12FdwLzx}h*#J~d-lMLbj=Xg}f?bkyXw%+D83tYs6~v!#AdaG837Sp+Ti(~l*8#cl9%Y7Jd+ zlgKy-%BYDK{r_9rW8S4A7a%>};@@C*mBm~KPw!*JZKzUO?MdmH*PKl{Cyp$CWRYvp?|z&-=K$v1)66Gb3U$%zqDz zqe{9=RPP|Qjd3Iq%j5%x=X5nmQ~+%Bhg%cS;RTL+*w-|ou;k0qBf-dv?}H{PNd`fZ5kS0mSczPQSHR}z}x400bkI(Ol& zij7*N?VMVisH*CpvMYkbcxzx> zU{FdUD@Ul}Rr$KH((a*xPFVzdQ~Jg{Y4`aIlB{U z+KBUv(16`1lgcIRXf3(h<&hwlp>|j5& zL35w7jm?5}$IcPGGIy)P8;;G(#ck1-_X@!$u>wAjmW#Bj5ZC{eeMPuszx|{uKJ&$# ztnUDtSw;|0nj2t47lRs$iK6v>S$ z`OSCBC)0vKN_f~mZ&&!@AR_FopKq-xjEJ~O)?W6F>djCV_3t_6J%9I|g}sBPw2wKa z4SlV5x-SpvqwLgv9Mf}>ip;4MLQD2GUyAeIYd-79l$N9ZuZn^5<~=lPvRAA&!&}j| z=)p%sAA-8>wHDD-U43qm273?k^t96kpV!vNe9`Or^+bsw#M2knkKkx#$2Mw_wlJp6 z$XKRbPhh`D#(VLQNgj2*_&!G|fzIjSsy@T%ab<8&&c5TmARG_HGq297-T>0}P(qKgS~hFH_-Kw4dRNZ_r7Y zfQaNe@+=xt%c0|s{_XX3$Y!`(NVP?%rGd~Y-WkTDzBhHwAzQKns$(TLn z(yV)9w)iqJjuXlh2gWC`qC+?efYXcMR+<;vnYk1qx8sd|gs;jrCwMsJ;reEg_PAOe z@Z!~&>~oJc3y{f>8hk6EddfhFlp1yqW9Kx#v_8A~X|!|*qRYFm7!V^(#tx`|pY6-> zj)3|lX}Fln-B%k3F)(x8nwJ3VGbq{@fsu&Fk!;I#94|4KLKiw+@lrp;(@aCP2qp2? zmDq_#6oMLr`MDTVHAGC-a~p1DYBa)&@>!@}ZbkS6`Xt87(7pipEB$VJzkhg#qdK?A zE*o$N6!IN!7Q#E1Jb1VKf3Sv`R-=>d0NHT(WhMH?NZ>=W4P;{6h-CC^fn*QZmctRT z_b5ks;d`dsWNJ#y&5t_v$igUB+>0J@e)9WuYbViG-IR}F_}FduR=!>)aG-g|{1`KViy7lwy`P?bnTRxe!FM%o zZ-k&;ec`OcY;@+>G}qn*qJ17Y$<`=*{7h+zyqq)C(AD)rs^!;wDC-IJBfIA~PD)STN_z zLUpydSey%Oe>}(jCHd-q&=^!>1GLUGVRze3$uuX;;rO>`*egln(UD9( zV>>zF&l7fx5>;3eKjUHF{_MbKLB7gj=jib-(9l#cj!t$tK9`odh^|NIgce0|7?Lf7 zyA=FOtN2jw5?@Cx)ra)o60|4hL8l%Ue-5|-x+un1D>Q}G$hl_P=w*2rJxHX2uJzBo zDRNpf4_~%&P-tSyKG=Ovs!KoHnMc9a_yQ&x36s{xcr!kcs7v9fzR}@dDb>AUvn+7J zKeBOJyo|6Jo0%s}@f6`$z9;0$S|1rag-SY7`H$Z+xu29pEgBh@$R@h z<8>{An};mWBs@(8G73b5HGUf_Qvb$d=kP@;oSzwYx0PnbfQA zkC^olqzZd3_-mhMI@)>mxdjCbNhxg+W;oEEb>?x=M#Qm2xJ+9W3`GhGzdY@EFK}&F zKfQHYeCKtav=G1iud_U01qv{oJzmRoump2xP@Em6FtY#Jx&7V_*Cfse0jeTj#;0oZ zc@?Q~_M!dci|veLn!b!O$%;m>Gh*3q`bg1G`&Dpd>yab4az`epVJGxcSRy-xxlnZ2 z`udI>)G}?s%h{|1GUA}v;`zsl7w;ha=n~gZT4Q%6QmWQ}fu~}Qg~J-oIDd=%6bxzn zRHCCg1Mo;4s%jj2=sIv@ot7lSA_9)4?<3O!gd3#E4-n% zInnL?GQXUcbrK>B=OgAtoyT+Y(B$xWNjD944}c15P4{`Xw_l`h*r*IF=NeRUDQfN_ zsrwQ37brW+iR4>|toL|5gXm<^1rcFaaZ-}Zt|EPHPx&-b_pLNv zQsr~B?>}R&7x(qdavD4#nPN=$1{@swVFkrAV55nW>~vkE2eLx0C-av_DSD@b?c39n zczu;8pE0bxjA|f1MvZAqc658l&F%r#*Y|%Rd9HPO(+Z_@karJ{sB(?K!V0?`<2DLW z5Gkre-h7FhOJRZ>1+AF7=BY|(Km4A z*}H*~D0ZA)hl#rTJ<<#J3xU|xm)!y>h9{U8^ym@uhM|GYTNTr|7D3;lpz}O9+SRXB z%$HraOKCdAEd;Moy+vFP&lSyCNxHoSHCCjVM$8g_Ci?THq2G-**N)+}zDgo2Lm&HZ z^sPp52?$p3arJuTK2oT#9sW3Z^+E#H`=~v13W$TAI4_^Qv16?O2!>h&hCw>78cZr? zadt1lP{TaCMh19Y9~-G_j%Xw!fqmy@<4F&=xZtZyy4YShn`q6%B@Hre5V8@?oRbhxE zdv>2p4gp~`@pAtwt3dtX&Zyopstd$Ik}#lg&0ExX1^;@(Som7hFih8@zmJb>cmKBF zV&QKrTA)k^{*fB-;|SAW|OeTv2*4 z-_b|Q-%Fa#;n>H|yH&k53dnH&w!Kp|`EB3MOdKLfu?NT`TH$(x4wm$Voc}ym0r;EW z&$Xb$YkkhfiO_=UsGHyR+b2$lTJ>kdg(JR+9z|KI!08$gNR-Et3idWwn6Ktki zITtanR0}{&Ji_w`7U~xF1bdBBul(bsz`_ZV>IQtzpFbb;K|B6ATtP}7{WJB2^>mGZ z2=;g4b)28cnE{6!%`J{)6oyHm`#xy=sQ<{r-10U4G=4Xqp}P7%U?#4y(Y2j?J*j&a zW51`c_C!Vj>P=(IyX=3}$V zh7-%Oug!X){CTt;%S-eCul4&gcp#pw)!*_-Zl=5lUry=CIvWe zi6HL`2+}I4WG9b zN>8F&?BH4csAigY@xA*-U`M(und7Bx#x3|kLRt%Y2@Y)|XNZ!@+0zw_1)uRGk z9bpn?Q)D`Svo$?|>LUjsW!e0aaB`d=zSM`s>N3D(r&P2R6{TLJDhLLXt;BJcGL5tw z=klF3tFB$~N$BD4vx4EoA8HL4xqR!+S`1k++#^_jq5_Y22RD^{J9Q(msR<+fN7D=h zg`K(siUezg4U4wJC$^;D?6Ih{XB7a|(X-~A`CV(_Ir7|Duv$e7cM+=6wJG7QIyCfo zrcz?W7rFs)yOS(-aHU@(Mm9RiZ6MM1SpVi3TcgbyVQyT%*mYq;8XLnI^)wYyfYYlhZT=2%`i*E-iO}0LF6dnR_#ZZ zK@GVrrn_o9o)gtCpfl0_X=++uGSdDez1wA;W+#%&M0b9N{A8H&clgetu;a&jB)vzs zqEEelB+rQf{9F*oICbohA8_$B{n-AO?%@-*w&dMBGCmq?P7Yo)&UO6Jl|u>Ur@ zQ$_x*o6QEpULxY*3`K@yJcK|9;m@kTffX^NXQ4ccQk|gQEBa!nW_kArF}^Lc!HXgS zqoQ{Sx)O=j1(!kbMODQ5=i@__%=bo`aIqxKblGdpTSB0rZ!x>S`r#HnPk&LAY#QHM zbov;u{6K#g94IEX(G@j{<34hstX`t4&H-fN}Dq$48qvOj@QjwbYgYVlU+W`8a zKURI#i%$3D`DIwW@!G@Z0jyqY7HcJ+yW5fG=BB&)*Dcw>r!{Nq=uc5-_z#tf>EEwI zc~NKYK$nS;pm*A|--d=?oEXL=WJ&t|Se62XE{o~1H?!EX*{Bzx|KKjTr^x3;rbdqX z%L~5yD1hHni9m;dg}-T`3-%*`bodV+;$~G&so2X#&($~F$p_3tJIt0hnsDyUMV)4Q zx<4ykZIkM2ryc#rR&*mBCBav?;d;i2f1U~lW&G`v)Q}D`ErFOd-D_>d3uS7oWM}$i zhOgQQ?7DdbFpF^GVc?W7sd>`z9x8>3sludrsfrJ9 z??#Ql{1dT)V=<3jkvllSmTUyjSnNO{c?JmbEag1;_k0;@p;F?%Si7`q7#Bz7%Z~@g zQbj-`hnRab%)hiF73Jvz($FpnISf_=$e1Zo%8AIu%6p4wpkcf!GW@7 zg@`#%YWP|D#%rp7GdU7Kha%u|_Il^1QhNxU^Lu5}!>TtitudJ(D$*mSX0*1?^mgxd z{R3ylx1aAxZ-Ta0iI2FYmSof64bSOJQrE!}+Z>Prc9z20^Px*3v?}uN%mPh!5|zBn z@4gW3?0m!h$2kvHj(`^mA5M3(@-QgK2(MD1AgVm;m^}F<$eI~ARkAWztfHdoxOd<=wj z2<#Off zlzW& zLXlp|9wtYKw-}z7TC4ikcPt*l{bFra|J~75=#H&giBbOCPW{Zl@Nu^}Ibg>8x;9y5 z>N+H+eT1W+!hcqp-bn0=-|$iL)%XF(9Q-%zUZf`~pnzt`o+mnw1RDEBKyO}-WXGfn z(};LEo;;i_pguS;6<(Txj!u;f8|O*m?E03JFwy65bAs>(9U$RCqx)5+MBemey!#d1 z_3UOS3&;|moB#~T+z^*}HMgJp92&IG?o0UKXN9Q^ziE36EZ6hhZC$hA9kV#{r$TY; zCy|8-26TwZq>##iRp}t_QYw0+GBQIVm zVk2yY5P2fVu5Mqr)O3hORS{mg^sBLO<%j>^RvomR3#Dz5XFu4Rq5I7RD=ScA8MFHX9CfK_fl_7Yl|6f#xc=7`*iV8V zg26m^VoUB%d3hh{*ryC2S$XL~Y)k~@pqa6x$^FdU*!<<5<0p;oEmh(&+-+~~*Ndat zTCutXplZ*blGpWJ1pzqIy8*tmox|5|5nl^c+c%eY${d=cNb&r4-6rF$$gc!Ree+?CpGmPh{Tv(C z!C{S+&drr*?f6SH_svN9T?#G`WN>6h+&3d$l#q$$;N}i1QT$FL;QVlbhz$^FUGHmd z{3<(jEGl=_BMu3HCB2^oZUgTqpsnLCNh3ACy6o=NRP`sncpcyHO$!9?JMT z8p&;%Q9bhK?E=g@g9iD>@ZBtX6mwI`BPJAD2+{>I`3|b0QND!HyF{nY!pRv}s7K%F z#*ciPxD`g9p;@xvEyqOyf5sL?_}E1E_2Rt^Z{xY`&R<(oF&B<0_=Rb%kxkt2ti~XP zk^IH9e&TO=!MH#8j08d7jN$svnuMPl5-JJF79ILCCwz7x~?;2 z*qeFuXk51_F~^I@y7=H<-X-L3;y7w0jFOnfiBGi(OZL~1FW)YRJ(g_S6K4IJnjOX4 zXZbjgrLkXz+9bR<;>urqwcttUzwePtu#0RqdYG?X{w9}YgYLa_R?ECKDfRS;arOtQ zX@hfy#1>0n4DLM}JB^?g4`sZsBvajhP7>S&UDRuT_QWz`kGOn@Eb@yhPEi z8+2DBvRm9B-$5R;UG`QRD$f1@f%WW{=vM9TzZBUh7O2pN2|6}=90ebZ%=P2g7jv5c z<7B_ybD#MRg%c{EgCu6#q7LD*dRoCM(C5>>Q_tvH67keUiM5ynQ)QL9eT`5xFQj6 z5t-eM;5Jt%HBq^Ef0+0Zh+{PDk1rHTGakMVHOaGdflz0^TyLY6yM8vqR!N8>n>?dm zJn^0{oLokKz1Ap%9}_TzQL$-p*Ddv;3I^MKxs>XW``^uxM>pcyu0#sQD5q%grkxH2v44UrNZfTmKJJUl|rv7q*Kiil72YiG;L(fOHStCEX1UAs`G5L!&g(-QCg* zDJ3;@chAr$J>=QE-*?V+e#zyJ*?X_`toy#7T-@oQ5T%Qi;$SG7^~a4tW6bkV1(Tbw zzp_h5HgiTaEJB`7Bv{Z$9zjR_SbF#h7j_?=CpWO-9aa@aCjPbiO+UU@_6A7v0mY#} zHD()p3g5uO<-X3D*ETIL9jB?Osc*+ARQTD(I~`E!pQepx&~{$WWg;B~+3C9wc~0#0 z8;a=AlVz&(r#n_{9!VG9{CHE9ScxoZ)i^9awY{Ea`xii+4{vSMia9v;xHSX+3R+v! zG-cy%_0B;1bU7pN9c>#+{=50QAa0KuRnExGv<(ylVd!yZjW*mB^h4!20)1EC$R#t~ zIoB7{4sBBD^z~FjAZ=~@0s=insL$&y4KhA;POp$|SCSrKBZ(CnuV2)5vWF^Vut_rw zdxo8s{1y&uuR$wUpL^MMvp?6A5f}5tcJ!cYjD27JXr%w}_mEfLOrBU+6tDr0<)`+qGl~@QZ4qJ86&s#<&f9%kX-}R6* zKQHgIt}Y2J-S>;|P>jc6KkP8-olGx$`{JsJz*wR~~H# z`DI=U->%5;FYb2Lv-m~NH3t|2C7U0}^P)Tj^GQ>T$p5|(jE&L?DBQHSC+hL=@Zbk} z`d(gv2#;0sdIo_e%AN$P{)EPZE_P*XF7YfTLc3JWT{|kr%&_ByPO+)v{Fs93XY&R9 z4p3-EilTEq#L|1B&|F|nBra7kE+r@9O`>s@%@DO^GoR0IpDJGAv*r~wu$h^@i|sjN zWS3z+pLE3?&3iU3YmCrFKNL))o9)EzvQIxXVMoKEszNb?M23+I?;#Vu4{fw|3mnf!ut`nQkfy;s52lO{ffVyUek zssT06McNn8fgJQ>w!m34mvxI{txuKd!s#U59#N(}d^Lk%E;j!Hp$MQG{5pEO8#X4^ zKA0hKn8pwja^m~obM&aCUHDyWn8&hi31$2OUQybaAu)(%SQP#_<490M?)C6170U0w ziA0rUIBTcdZ=0C+uS3ZeC_^88{sie0hxL3K!Sd6*Qa0c!m!V<|^>l8{ap;BuzG2*K!sk3m-0gFvHIg^o4yxhU%qi8D znSAZa3$;I4>Xh_ts;j|F4audd+ljHCl!thwE$a~1AGZ&4B*b$FRi~oua2_l{v{sII zdD8zzu;~_oQF|7zMZ3^8%Wd0(Zh?Xaj7E$2Wx&#Zyr@dPb^KG zNa2?j;U!>UkPcv^DWY91F&bl{ZOa#pouIAgo@tQqSes8SDAwo}pHJ@<-S&G<(hlG5 zi{lH?{TdPMb@xx;i;{^ZQ9lU zpIa;|t5`RFMR6ZIKB4x*E25Xni|gQ_dtgWTmT8QcLtWq%5>GNQ9+(&+o&G6XH>dGY z{pcH={2X8~Nd|(H4T&Bm_f?*_{&ONRaFV ztN=9Y%RsEfsOpymQg7fi;XH}H`z6)Qhka5Px+Gk&IE+qq3IYe`(35-xWS%r+BP(vw zaq$KX$jMNMqxo|FqPT_m+%vRRd9vQF&y0+N3zdv++Q};u`R7?ahfWb$PzbR{9k!lu z1EKeN;WKs7vG2efLYbU& zCFr3C+T-fyA`6@q!>_KQjk5?4f*u2D)C+VkWMw(8N-svM zjBceEq=%y6>HeQ9&#|3T2Zl)+)R|QGm-7oQ0eAKE{-cr%FYXp2F6`+;bO7pbHp$du z!Q1$n2R35z>$fDJyuy$Yakdi~xPh>^;(Y~?BGB^Q()Rg_Yz?X_3?ojqyH z`1n(wEh*5*aQRzh++z3*G3NVD92>`d3h4um!bx<%OJFJH1v;DmCgb>Z$obSHsMh4a zr&|{kIVOnhmTBS>khh}lY&(4_S|rT!QBGOBO{2>5560Thc@SxneccyNq))Eg%gUvy zrSDcx9&jRysBO|E@A)1X(E7Vk)NZSbf6@^n`a^p7y{lAJ9>5kBB&;{Cqt^=)3L`W` zs*nMxPqFoIvP?-G(myz+ZD+OB~$|{b$5k$oyNwE{C zLiE4zbKcOT3m=xL)!X5$J_oLG1pszKf4^mJ^G0-1Y2Y;ipqq;z6`FaClaG8uE4|jQ z{0ZQyl=3&0$!tQ0yWr68}w+3B}(HJLj4F0QAD@d0`VriV0D8 zDZ4hP2TgrVlKU^p_awo=!Y)e>7*?THe7mttK2Af@Q*U*6^EQUi&nyZU4`C3dpsbXO z7`L%Hm@W2i;tIO>qLwiGKmZIcoW*XEG7Xx9){K5@FraW6G(S(2(PihUv<&^~LNk5v1k1{qIEx`K0kn0!pI;`&Fg z2zvp!dtlMdcbe=d^#h7bwra~ndvOtM&M8a#6{j2Z`7;od17KzyyO2wGXWaNye=Uc0 z8PIaWX5N|Z_&DH?Z%@A%zJ+nf1Jcda#U&I3X+7f{VJEf{zq6=S#@&qrIsUYl;SfsU z)I3ct9qPox-PJ!>N{Y#;OLb@xq^#|7V_!R4+yWmfg+ac`?Sn!NADB4R8ErL{kPBLQPMNW zVj$@;B&juqh;gK_xx>Us{Vp7kEzO-~(L_CcY&2#B>0YxtblWW5y><7R%vV8pTFvI>wIA1=Q z?Zo#2UX|u(1<|}Cq6Dta&X<#X)om)G&04fIpTQ2GZIAnv4CQr5w?00L5CIVx<`0r$ zP4#9oPkrj`SR^ZB*UkgM`8H;4ZS!3NBbzKc`Fi<=-vA%VX*;2yX|zxaSCw5TsQLhQ zsNewtkD6s#*w}?_HQGkv16D8^pptX?gcqf{`z-%d|6PMYSS#;{Qm@35HLALzNHBgY zdf}V@Ov^tZ7a4em1PJkKD#9vcePUKd**rc*pi%)Cs^I61@VH10FbVP~{Uyl!vBx{R zBCb|THn8chp;ETdyM5>TD{rAO)cGvwTP^F6Upc1DO~oNUcoRDs$VNU~oh3>A7qcUB zaj&&G@tDk7IfVmGQ5-cUWDHE+^BADq4B_;))EIi;;4IVv;@}c4N^F{byQ39djWtm9 z8A-kybq(EI3x+6VFX8U)xwagWM=vn7^CJ6TW5LgPRx3EepAmZ2f7$&OxXFufTh3Bf z%4q-a<_*QerMf#dbKPRCYJb?W)AS72w*0Kq^n(Q^$rjwi@Ac&=?xd}FLJ*G zL2$EW8c^5+3=Ap5JpV{B>@hWpu8nFaNmXJQgHP@+8ZNd7cJ!;r*1f)Uz9SO4N(?jq zYunpQqCc%eJ{5?g$ zNFouc?22wn4_+~-I1N?g?RIsD6ANbI*N)Bcr~f?MG>W4)FuySsyhelip`J?&XOt6k zW(tUV*lKz#dbW_ulTwWD!GVHih4FnG@rK@+$9lPCzru40;e1U=hf$5GRMlS} zOA;tyS`V9MiKk&9Lfz#PO($|rDtFASY~`i9cH4w<#-(h~$s%kjFZ^!ewx@@qvy=QP zOsvZY-_Dkksp4IoUB_mXh&N9gC!)tHOZd6$%ek7QhP8bdJbN!WXxFw92^z8%}^Dy5v zW#LH@fDb^}0`No-@zDag+Nzm+o^W?R-e+vhn>E!%+kTZ3Nj+ix516>roOGqs=8cT` zRJ|nHTza88C*4aq9N&p@xmr&Bkr~p!8^uAOS}ue8hZ}9j>qX-EWy<+Vm zQM+nLtBb)S$5ZZFZ(uwOES)4c<7%SzpvTp#bvItJCD1lVik$OF->K)?Bea_{KT0$a zx)zrM^3*@wuo3XGOt%isnDJ0PMDV#-#`k}X^KlvU*E>$pD>1IdST-ZUCs24t_ zXShreuZUx4D8k7NHl~F6@+ylIX9lk^UiGG0EnG`WmOk1Re|v$G`0LmFJNDqaZ)?_v zT)cG;X7nC=-zZXdpCJiapg)vWn0!b_r7Z8nRBayI3b(J9Nj#^pOhx>2`zHEG(u{$a zR%#;E^(L0Y2$gCVnM%F;>}9{YS69rf&+hJrYxiFF5?90bj`gBx(vLmiHp-(!kz66r zosOTsvMLfR4Y-3yasF#`aW6U?cRUr8KkHcolwjwCLh~Xr$0qel?dTh;jqPRz_n1Qp z>Hk4?-;_~3&UB&69vqNJh^(x|;D?}ud=%(eS-EuZqHPi`UMD$(0B>aSFMGsur{WrP zw9m|cfscBu?BZ;BK6_Vi+=c`)2SosTjeyC6c)<_km7KSpmb;~o_DX2TPxraRMBSkx zlJVTzAu_hY{#Ccbf+}ICnw;bfmIA|r?E3kmLdljqu|tmI&6KJgoHZ2(5@LvOxKAxFKG5N66a25Z&R`x^l8Q)3J1UJT6SC znd`sbd>(N%lG(6XYM05EE(ADmcGWX@l4e4m0PzjRg4NK=YCd6EV- z@w;tDB?JPhr~EhTa4h<9bpR>(xi<=DZs0flAxL3_!EI9Zn z9}N%yB95Tl=`T|U&@X2aBPdE)r7VCBc?OFyCgX(DAMkF0$1e40Cg140MV{9GJ=+@Z z6j`s14LW*&|NR%qFVA2Z#b6>bhV!2XM*{{&$wPXb%4wAefErF)5}@7Xxx6|EBL5x8 z34rnCcR5^nN!QVVpJbZL%%ql@;3zaK=6A>dL7pmQIf~@lQ%un4Yek4fK38$d@*Ms0 z5-ntIDxdA%-QSNpInDr<4n^cIKIl%#vk=SdUASuhbuxrRKpOrCt7ScnO0d)FC#sTrD0Eq2csv7IJM*N>?z+G+e?BL?ACDjKPzHv!kVo(; za{|R)izp5n0^~R)w;8FhbQG zaU8}9T0JFq_u2K9Hf)@Y(?EZTa`g{uZh$4Wy#q>yWx_Re%V>!$jmEWm4idIGjsy`G z$_3SD#)?nPvwGL7;;3YX zEQ0lJba0`G1b)NgQ}P7+m2o?~@_ovi_4Br`yBN*mspL8uT7VaO-ULakV;jXB_>P9i zFRXxF;2N%mZ5iMkXO0K?j=>iOQUCHxgoO7X9m8=N{&rH^K=J$yJ>~GD;FsJ%`_dQ; zg(ZRy`0MMoLY7+0Viiv15(GsI>id5p@|Kd6V&ROniXbltoz8o#~#?2pN6X?$?dd6e_E{t3Tu$O z%9mbY!YP0dK!#2n?Y-?*%d%;#ISZ`s^Ro~(^1x?l*JIiQoz zNrLvV1h++IfOMemrfc{9f+jdSOFH(?I1ue?JbVny)o~cCwQRWwk@BF*O?uE?J8ce( z0u4&y7A{$YFP;X_MFvbPLl8cG>|ljLj>^LuK+)k+TRM#CF78P zN;b?GKM5wcO#QCzk~P5UCYokL*<-+xZFsuX+<6Fj71vQD8CE|xBM29(*419dO&}?q znkOk-T3cQta9FILY!RLRH~C*R(Rv5n)Q?TIKJhG-`q5bs z<1FRx`1J)y)R5uh%r#P51@ov1gS3jIPVv|AGl8tPFJaa*G(CX`3JjAwmWW;0Z35mW>`4!>Xwx>06{l_=Iev@?O9DZrr600KJ-S zlI5=bSp${$(%%^DcS_X*YGUE(%`>Fba?BL;!Ta)4+5F@NHpM#J6(rfh+GRE}O|ph0 z!E^>(O%eUdGAGf0bqsnBE27im0_1nB!@U(Ad|W9u;G}zEc7h-*XuUw_h70&BGRY?2 zv^maH$a%or;Zai|y!|w?qQ*F}v)L|e!=Y}VaoJ7!*G3H#xa~UV%=-C7wwN{uce+&- zcjui0pMTbh5zqyghg329?q7LDQ&OW890Kt0gUwk9zfR}n(cN~Pi|tG2kYslNMsPud zf%2X#O_O1~6B^NAu{5TDnZ*O*C&?zM{!cn9<+SVn&BXmB`=zK&PMAPNfOUGysAmt% zx{DFOJ`vKRAiA4=|Ix<6L*!QnMf^k6h_AMqg~FTM$xwVG+i_auMXhS_t=aq*|C^q> z|4+g7pGQCuAK`0U&#Z$mU_GW|=`*Bg5SN6>(#_MYvybq=qad8XEeDe^&s0`uzUk52 z)h~EwOS??v@AwzrA2S@H_4$7Ag%!Hh5)9;b$4NRTs8ojmp4XvuXq#;cSJbP*h}c?y z@CNzP$p9<+Vp8Fn$%n>1Ebw_0+cUE3wq+g&xG0`)(TvMlj53f3E9$xtPXY1*A z^p(G8ecd3n3e%kJ8QtS<5Yq8s8X|yMqwKw7K-ir&;6Kn(YXX9-v`B9RDc28xk7&L@ z4`_(G`9`^l^Yg3b)$vd*eWV&lbvG7n9_^}MZW_UfkmmWQtm|>$CMDgpcZyCuMT5cB z*qy0*p7omR)=wWit)z8{HwHH3cq{3+Pf#Ze8$ig^s9sV3G+AIbSdclovd_2xC=ij% zgvALB@kO-e<^~9ovn=;-@WoHH zv=jFQ*)fTs2)fKqtj!^9@oF;2X2IIiO}r-5cJo?AF}fB9v15t}zzaky1AltPO3$N7^TNTmz0|N=ZITJ1o={5fx{Cg9~hE1ove6Yq+G@Y>Nh(P5sAxB{eF6* z<5BWVyOA1|QJ(nPc$E zbP>p3@nr}*e-2b%9y$ICZcgTg8O6$l zK6ENiKWVyRf?apJZ!#Q6y@7hd2~M%w+i&jcxW};;9<3ET##w*(xD?+Wj>6{3zns!D z?*!4L`y+O$u^|uB5ud2I#zpS{fmpeB@;V{o(0#X7LzOh@bh09X{t8w!Cy{||bjd?4 zj}k8O)TPSfvq9$Jut4Dk$&bV3$+fOGPATy*JMw^-bYIZX4}1tOmvR!+)1Dg5z zKoJ73`5-YLN5HEL5^bbOGxJMfgh^|b3pE6L{81*lXRKEiPK+f*lkb`U*W@nDt>KSlAtJoP&bh1l|Dxx7_af5Fnw_-wY_ zg!u%^nys7s1kKa>r305%a;%rRtJgC1>FOt1*(1W>(r}`B;p-EDd#T(W0r=LP_QwQejUA}p-M(2W z{QlwkzslOylLOOl*BQeND_;B;{UhFGVH_j~FZdTsv`)V(W3_-Eo8-0!aba#nG6QW* zQ<`|Zh25~L!DmmOZZ5(Aj{QsPN%y_%#AXm?*UcwF9?Z?-tlR{D!&UL2e zGq3+D^du1>fuIsQV=6e{E$ckU3)a0exk;=rLuZCn)5>?rAls z5@K>N%#u4ubQD;I^gT2kKSC5lzZnPpwYFQQRQ+gFW|bJ-G!+>NAwb;T-UdT3FHjh0 z$`**;iK@qxPCk8nV# zj zWp3TfyaF3s*Y7=|PU|s#rn>kD-51!&E@_LU-%PNOAM5OM$+`^Gi1j#Lfc7<6^~ucF3$Kuw>q&-!4!I|F1jUC^?l0-4SOvc zRwrG7b<*lUps+KOeJ4POk)17WA=K2_k!ozWaYSE|4-bNQ`>>V&E|drTXOu%Y^~sr| zm<{xQ9&bM)TP<5Ku7j7LfjEjt%(j znc1M(NthkX`R`}D_3SdaHlqezsgebO%>!h7f??)mC!DeO6n~A6|?FJ}d z*pK+w0UxYW$1g)ltHkPvMB}~|29E>X#a;LInay87ouw)xGzL?(^zCn(R!4ELmykCu z-F(1N7W2O{t}Bn-3K+^KR&hxFs?5^hg_w!&CY`IV9a(It8rHWwT>TtK( z0B*OC%ze$kdT}$8lr0R~sBPdzLe3Z`xx~uFZm|tJJ2;d=NG;n9V;D9GVo1M!WJGk06LQ=q$PPla^nF z7}@VcUbkw~s zx*tWWVJv(-aHv>s3CqP#L&M?s{ZZxhtBc;Tl9a4878*YkS+6*O?{WZEViX9xyFo|u zOnX-^h-Auew^~lr&b*s@s(U3@-G!NIiDZ$0&@0aQCTUxk8#FT!b zk0-kcEvRY0p%}aco_kHoM_awoT)keHY*D8EQNJ%K`J=s!^T`HJaqnHC2^8<+?w(*9KfSZ?H?vmaw7%PfKnMd;Lt^rTb<4_i9O?uw*5%#x+PerAZF9-5 z#ju>hz!Vd#tyar3JteH_U)z`UNi`JVJ?SAHEUTJDxn+Ed9y ziB|+Ef1MiSE!4@{*r${Tm7Dx9+I!yM{4B^FdrP2?JTFS1-<_~Fv{>`z}cz~nu z=noskR|j<$O;+bcaE222+1~?HzB4Hhw)M3{26l9ahV*WzYJMj^MaPaxiyj@BbJ$e4hcFe@WKA^z5B|+?)6?vWw(WUix%0F&}UDgy6FH z@wX#OHQ*85=u=D1P~oLP(^i<$CRu^DJx>slAnfM0hf}rf{-v56S<+3U`}_Jy;k%O{ z=i-*~g)OW@BHP}!fFCD!e4dHiWtm4@EBaSTvV`${p_y$-tSc}=|7&!uPk@Slf?o=7 z)*kHIc(BCWNU?bXxC9BU5C?_UCe;2tDn+i2XVz#kco+pvH=dBp-60?#ASE`$-y<=| zAT(L_oHC7O8nSRGXP75)7wD`|aU|HRBxg&UA&ZC`@ff7;SrWspb@%(zH1CgjifZ&& zV~4S+*qjOYpprIX#q(+(qm#YwE5bRiADgK5%^WR2epDkxRgMv#d+xSyv8HG@n+hm1CBC8qiEor5&7Vi>c zf3FAW1mGj`J>CUVV<9Z3PV#Q+8PHpWXQ6_+%PB3NJjWru%HBxSq0A=(46egs!7^$w zSEZE{il7MQ85kbuiL^__f*1e-3LwOr!04Zv?;7@NS;=mKG!FC=t#SKN3dDG-0yVOVWJkES?f)x8$Ke@(z>K|%|aM~ zuwBA9_ZgA%wDGIYbzUp;Y5GtHogJJ0u5R@Vu#0R|bU1u_#VJLWqKtu*&au>xsfwR3 z+Oh}y>Sxr+pjMn*L$oRK2XXoLHY(=%lg*2Bk`MwWuew$g{+J=&_RG3MspFHl`HHb) z0Y!(l0H&7!Oku%ukw47KqlNtrlW^+G211hrmbew6h}_&!L3)JaA*Lbv0nhdk~hlK$zH1#FV@!aiMh`Avgl`Is=G~GaqB6b zJRfFoSmsa+w^=z$9oj+;Nd~zOrrGeeFtw5s?Bb;Qx5iQv0vlRS96OSB>_GsqG8Qws#Z#$t6`MXlYnzU2rBi@+2a~ zCY6g|2hF>{V@vL-NhnhS%fHEUKtja$_$_~i{JW>O-fB>j-^^lwQwUYhgecEa##$W+ zsfp?JT-qY48N!^)Gju_=71BXhOA^zM{9YLcNRPDBzKb|cYu)}2RnIyQ^W5eCgR1k~ zinm)S!w)YNYKBZ)`IIwmlJ}J$Kn=JRfQCG3;+_;;+({>uwLySlZ0nrR{`slDdR%4W z<=cbQumnBfL@N_s`fk*S_x?G9Nrk`HVBBvP|FdaFw;5=GOyMdiu>0(0Vt1J#xyNpK z4w}&*t!|wO+Xb$iL;%-m=mbi20puy1n0s^+3_ShlL;OK>+>QUNyu6lZ#m;_yem2bsz3C)pw%ceUK`pBy;_{6wshDRbEvE22#740*u2N zNf#Fv)WaPOU&;8=uTfiFdVe)@m71s(>$}~7D^txviM#nO{i3rW?A$4Hx5ZzU>R!y^ zlSE&ToYe&#d~h&k^f(kTXkbOqq=26Di6ej zP#-HhIy4tJ(dY&>u^5r@Q8TFV?vsO(^`cAMa?^^8_AK#uZBq+6^&1kYzO4dNty40L zaBMaOB_vm;iDh@fITu*a3wu^#`e`)gg=9SCu>(FmzHJ3tn40Q`%Cn~`$m!Ski>BsO zRZK$`CO>2PwV5CDS(!~>SuuqTJg}WEu~H9=(D%AZfzXc$U#|dbIi@ zZfv2y3Zu=qN*P-;(I0qf2MSLfj+6j|OsSRYB)G!ra+gEP@71bwS-q8b<&ROYAq$z5 zf#!eEE!>f+{wL=}C#TbR;}Ja76rVuWo%1A|t-YXu>0ePz?{9)~=8T(+`KtpMkvS5 zMnqHqVW&U0POw zA{gOZ`RM@A&_BKQP!!^NFV+2XAO(Z8oo^IT1#lxB)$#1rft%u1&^AhMBlmdw-%Pch zN?DHd`k3Ne=&|R}7SE7{$MphI`f3YLEl!x1JFb{lOP4nWILNDX|3R^HZ6>Uss!-@3 znzsZL(O|t$8Yx_qnzFuVCk%;5DCI4*CAkc7I5FfJU7+5`%~e|$4B{Q}EBMZ@ zX5>*bEdkPNZ`FCz%?}7u*bj`W%qR4 zk_vo=I)|5BJ(sOh%*UPupOjC2G4$~ycj~JrA(iN*IUeZ5<7s^VdABO+EHuxoRN)%# zOqou06MO}?e<#G;JOw5%aXL4J&EO*%h|jSkt>W0oqc%96tz;WQ6s;&SxuZ$tCj&Lp z8XC9->RBoYgVi{zD}`1(uhUtNQ6VM#OdfX4j?JMb=3-!e4o_%ziy?iY0WN}s`5s&C zr%!$1px`gEq4V8!IbgJmub8pntT3*9+z(T1GDYx=B}{6F%L6zZA2VTueyPOICon{( ziKmVOO@w1rs1ZPKvHkYuKiC~;(8hc0pS}h&EuR9Xm2N|3aX4S1BytMf!Kzl;6T}Fs z)N_tFo6y{HNnO7Q02adMwc_+iD%Oe7o)Fc_r^JtHv&an_eKtTi{_e4 zWu2+F0-jN+4LVtSL-{q8Fj0xxVgWd_`y^bw;8)&ePHx&yJx2OaAq^ZYoaI7>>F~xG z)Yp$Cm1e$$f35u*IS-hb-EHd56NRKXqB0inkXuvL!p>6|QLrsmSCA@p{HolHW$1wae@di=T9g5tqe~Xwj-M<_*7C>BATX* z7bZof6P1YFo!_rTd(lUAqEmXI{)M$7e28^eexthGE}wvF#_1f9!LkGVb5kR(%d@}w z5V!a3@_IkE54iLT1y+-!nS7V=(tkWG!lZ`8w>f-9WoDJYl|@Cr<_p$1p0%@i+5LWv zoS2xKz>kj`Mc%wlsN+?m8GiW0vZkw&mNMY-rpVAZpo}H$Yd$wpem#V4N1mm|yCDZb zZ!`erzjoq>Zz&C90{Fr!E2(;}!R!oxtp5!V)T+3KPchvr{ex5+{js>1rNxVuDPF{7 zh!zN4KMs>*i+tRO`JaBKJWZC)?~;)%9nvcR9KXqyq;1m=->Ur^7A&35@0M#Ey}u%I zbZ7}w)Na(PCQbrpfE5{2zoG6`=5HSFs6qH3`nA=_evrGB6~i;-;D2%YRV!$8UA)~*H7l?ngxFAg>n0^fJ<-Z5RyRNZu>d{3)%(L(laO?QYN zqmFwV!LnSv$|6;fxof$x$wb+&5nJOXlNP|P74g|l{8rYUW@1L0nc=yxWhaRZb)yYh z#pm6ZVtaJzbE%a-`;ee z8f~n~a%-Vy9+*(rC&h-4hE_$BYKCW07E&#hXAymKdb;CpYwtm|I=%vKLKJJyH_B=*!$2qIwafQ z`!FG!+EKjLK$lwLWx((HF>;u6E`stT*`71zn6~RqLaiy2Pet-ClVU_f^_s!V$koO8 zID5By0_UXq;2+nr7mF9;maQy_p_k{hVHQ3Yd#KxQ1V|18du;k)Jj8=D^Nv8aw;PrU zg3L(9qmt+C_MDs;dgG${mjwFl3mn5d?3%*hx=kqh< z5RYrAHAhUIuOEvALjoTHeaF|I4QW^-=qZ1Xi6*nQR)y$rqV%S2t`X5`sb7cC6$ z@sJOnh(n;t$4vF;9z8jr4YoXtr^mL%V-7SrcSCNX*K;%^jSRhh_VTch;t@D^n6UcWY zu{x#gdGi{FvKeYfBh6D*TQR&3aNF?1PaZX8)>|SZi{=X?%_CHpm5I;kqiZcv3@L(X z#D1b+&NiDy7cIXDjs2r^&9w4~%QUZuM*xylaD0a)^>xNRiMggBRvZzrAQ@(i!4=vc2;cy#yFc!j~g>g@bynDCvOqG z>t6f|3ek7C;1|H6Ue!H9jo~eS|Fgn8}uSr3>*Jew-Y6Pul$gs^e5GSFeU5g=xD^lv26hV4Cc7~ zx#6ZOcI9;HlG&hTHklw^Ils{;M)qIFF5#eSh2$Ff_RfIal2r6f@4%P0MQw84RkhJ+946av{PwpKo*9^MHCGg|O8OO7#5B)v2V^tA- zyt`}7b6wmf6ykK~y>_NgQX=IO8J5Q0q-wwW@RzCdlk;qn-ur% zi6c)u4&xU`G!ztHSgoAwjGc@(3R+<~ZSmU{CPW;ylu1SAX%1>Jk)+-2S{YqgS9m|1 zb0kMQ>i6LnzYk}xuI1A7l=<=+o1M!RIUU8OU$(rihJI#TppF=~<(y?iFGSW&Cl{5J zI6_~)@|UF|$Nn8_@|V6`J=msOKL}P(DTBVI4>H~+y=>&xoc@Mcv>=lqC+nY#+gj?=Fk!W4%g=Mh939km2SSq zP5`+F!EK(G=0$co?;_%yq*K0L!|T)nq=w|><@wy+Pr|hrgtqI5IaMo)_pc^oca_t} zL0|dGb2sQ&2k$syRou>Uu7k8|JCo6UQpVIl2P9Y|5eP##6*z z_!Yo}O+rr<^-UgRdsHmd`m)s+$VtMyGjnHsg)-FemxI#F{X~Eaab_eUqkj&|)Ohv( zni*HV-C~5-Rq_Fqn#(0|-V8RHEF%j|b(f`5a4yFT8^&vexby*sY9~wWw!f!`*!S0y zHJ)D1`mK<;@v@ccj6WWzzs|xO48s#MJ2F)*Tm(YxN~QG+l=H^!Ly!;XiOe`Eg0Iqi zNrlm(vWf@ht6vz?O@iC(E-f!3@pAR~!<)(g?>1M3vF0(HwnXzDZgH=vj$a0m>S?@! z{~#;+1$w7>cHXvFF@z&{vLCb!t3LWITAJdy*!6~S0%d;$O>9wb7r8sE>pGsSdUK2r z+*s0lo9NT<%Mes`ELUv!nb}o?pnqmyIWoh(!mg^M{=Q1{E5&aAHzum%{2UKd#JC5~ z53#V`9c9~|=`M|jQXY_GZqAyV#&-pkg)ZCNLW_&ORLU9-1>Bb=>PqD4ow%?NmCwyS4(s(rfWcC=b&ump_{9KiSefLG zdyTZA_g;9*vX6ty(%DPrar`LRJjd@IFZ0!6#e23KeR5=n6~g<$9FZABgB#ILbv)Z9 zt)mMs(1@`8?AQ~h3O=v+$~=e$WsKQ!WYb&B#usPFE4j%8CM9qdJRLK2z4*C<91!4$ z0?D97Qxn_rqxJxk%avR0;39VtCJ*l`^>Zd-l7y)HjRx?I8dBa9N;_JZtMcz1p}9Ai zu#u`4W$W#7amhh@fzSv?$-E(Bdi0;LCim^Ondc%o$Oc`NRCtrV*UwGVTP2JLs@qPiCyXps@XpA{DgrmOLB1Jf&A04U1tL^S zSI6vZ(&_0bzC;=mOlpKx(Kd6~=0_)oyD*5^#a?eBrw??fO~ zz;B2rj- z38w2bQly6dB|kPFu1-K;xAU-+T};*w@wk7YU>pFf`zY?56Ln_~6uteQ-roG`>hTDdreLRE7z~HTT4_gOX#$Un53&T=rb~r5ucr^%E6s% z%2xwc=A=Rmz!}Xuz%k=HFC7uhyH7IQ`9E~MbzD^67dCnb1qEqDkQ5O?O6l%Uq*EG2 zk?wAh76FlzZX~6QCnRE6zd+oK?de-x-9ez(@u(^<@ zLwYIvIhK~`1?$81e}A|@>Y3XiV1BjKhmi-Wsm3E*awCMgfq;bNFL~tPb0N>zAE1L* z6SPwZ)_;?*Fx>!!a5D;T=()@v^Y7f6Q84(oq{l<~Z7%U;to6TtcbB}b_C9_y!Bk9f z8+R;Di<>JYzx+zjV_X7i8d6pRFv8kB(!0MxC3w%@Dvt zJNn#C4ICr$5NG|_r8%iW9Ps|^w>E{~UdEZKe4*3yad_+V4xs;Wn~P61L!d=zV3P6w zwOLD4#N(>YNToB|B!Q6D0o0{W{kmf-i~QKjeJ(&eCGf`rkvZoknP6sEwaES5=xFw> zJACA~ z>$a`N$!>h4$KQZ3)6l2go!hh2C)ZfPDJ#3^5x$u_h@rZ=6G2DJe#!YHOqz_G5FQh3 zUtqR4{72y_#iy^BeAN9|fl*WBO=1SzL`ubGz_%vxO)yvDP~MN>;Z7TVIW{oej}|4> zotKw4W9o;7=NcSbpIneORs~*b9|o>b;*{q}SBvg342}xaO3I0C*?PPB+?JY&jnlepJmG zy&WO7&P8TU?4y!gUD04Ogo}xHe>EhbGddZN?Yo`oefX_lahI5(Y)PGkwN46@EO5N~gjc%Imz z>(VAz1|v$uF-i!%1nWyy_-j#L^oMkGNVxVdSNupdbh(VWifr5!TNMl)b%<)R$;ZMd&glvbxk{+%*4+Bh;WFLJ|K-iqr?M0JDgtdls<$0W$ql6;8 z!6)L|#CmeaxR3#$aM`c;MHb>-v{*?@7hEXv2C$70E!)BSiQRw2mrtDSZ^6<&ZSbGu z@o02^hmUiqvtu_LOv5bTj9#`P`2zQ7Eo+&L3qMEu-#04oU3|hgT-$qLgrSkYCl<`F z8B5|D&`Y&RdJlfjeC3#72lvm-^g$f%4sIL|YqVSF-8_qU3Y$Xwd!eHye1ON&M6nvY zM?&mYiBa?T+8~cw2WOF8Wv)88-KG3tz~f$vIrr7%KM|VnW-Qsb-7Gs=)4C%+4i(a%kE7p45&oB}O|V>?@aqYw4UQhmD)IaEXhy3@xH{9cQ`j^-uu0P2A>}2WX4Oc*jJml+ ze{!yR#o_E>+C$j2xNjLd(}$i5*?`gg{D@>3`ycCj z@@D50Q`lT5dmhDP7B~d4hS}wvxac42zTqhM7@24kT$+1^)3~tVB&%@0I$=BN;rec1 z`+HrTcdd8u53NH0UXc9h>A{P&FVi>Yh<3Hqe_^I7G7l&s9%CE_$R<2q0hO=UH4ohU zTvfx(dN|}vq!YydY0i#sbZysIj&)bJoBV;H3UcNtGNOZMwnuyJ+ERY;lC|+h=kKDs zl6d`e#r}r|!TwF#Z%H?Qxf|Hc_Uk5as*9up98g<4R5OHMsO&w4B4({wym&FJj(f1mf3SIOV*`p{mejIz!3nDAL}{@XF5 z$}g#gXWJduNlxI!@I!C0{)vqrI6AF=_w-WtAX!}}YV2Z6x*&Hdu1r}Lk@UDQM(suP#j$2ryPM~E z8-q3>sb!kSkf1XE$MW%z;P&^Gc9~)+;%x0MA#eNJB3M))9}*)QC$HCX)QvF!jb1xa zJn!ZIma$!7LdF1Kty~a4e=^+erQCf1g9-fch^g>avH7`+`AI7wd3!UakkZX_<2E!r zy`t(Ry_Xc)ce60z;YQBPgHS)7MSz#{?}I*~&*>;!M1w1CU{5ehrZF;)6qVu&T|YA` z)?yvoG@m0^l|G9yBS5lHkAU#R6SlVA)xDLPrdlDbTyfF&n|fjcS=3C}f=Dq9Co0XN zpO{De>0;c82&|1X2LtMLLcrUE|P8{wuB>R z1og05$0o+k5B`lmaecY{AepZ5YT2ojlAC)F8>b+1kw(ZusHgGstecZ{reun^wW5uD zkG~lH{NeHAH(xkAN-fHycSwcE(xOeqm#P2=S~6KY(V?gE?>{7z+Ky)H?8TRk5`({g z{{oQy+DG(knhL1mc@*qAoEqqz1k1I@neuD51SciBStZ?)F2E56OA)lcwMt!!&ijo` zbGcwVE_ZNM?HYduyp5PO2|koBtiZJ2<5k%n9cL%-6CKGw`!#Dx)YVFtE8-pnjNVbCnCb5O(zusl@310rW2W!D6e65LOc!bTEqtfy*{C1H#Ds_Vq@CS`tZ-|2dZ-W`U}QGpR& z==bgPiMJj^H1a8kuJyt;h%YA14dazs$Mrl$ul{JYE2Zghn#A6QW1hms%WfSht)O99zHY%8Z zH)^K9U)1ZWz;3KzUN25hF7_^FUr=2QUU;}|aWtI&-uan7>vkdRF1U36gipTl$i|9z zuqS)$iS%0MR}qZlV1&IA&vOpZ(3F@_8MC(JtAa7(Ss`bG5=@=Xb*uQ3pEEM}ht2aa z6S9iU+Uja*reulDQQVt#B1{ML7{rGC7WiwE8hV}dFm0|U6+DJ3Ka9KYiHxhk;G0f6 z0X7Gp(FH@*9qGlnyzvO`aWVF5Kk{!$Q<_RSAGmrXILH3-DK}sg+gpqf44XW)xad_2 zH^b)vXKxvGfEyGks}O!)WtlsT(Y4QHX8I~{LGP8nSb3F)?5JH*!6y{2WlwEj$7zXc|1y7R}h9Gb_= zD{L?wZ`2(de^#4x5n%=!pB+{XABZbpOBhjA`@4d>bNMs7Zq$zm?&uB=w3Aj8c75S# zkIv_;oiJy9T@?~x9kBa787pP&#g8kY;H10(cVt#+_Dh}VHfx|YwVELFZ(Fiaoczqk%vF+Emo);W|b zZp-OPc0j+`Uz*?UCb>wkU+uB4_rg4;$Se}vJ`bbeN#n_l*Xvmx&z1-W)3(bP%X9A{ zziI+*Nf+C>o_88%3Lyv(Fm}}ysbDn;CSU1#O@F%L^tm!o$?$q0%!f)LfZkvihF4s+ zA>I8;pw=RKK<6UPjL$9St4p;x_m2w3(rhYMwOFw9F-dx0TJXzSnBVqzex1&=sqQ!T zvMS|>>wh=r>}SV?*(>VLUUuXN^>EKA6S8Hv7q+5F9>46Zh^;&V=-mu=LRS~6tdn&~*DYqhXvnW3YhZ5J7 z`z{^9D?WHDCiZEIt-h;Ha{q0oJ$6YZ{G4(Y6E-I!Hf!v|%+cJ|#G)y_wTn6mQtog) zn&)cMw3$gv*xc*v!ej|H{pQA?c8d}Eb=&?pIQV{^1sOOBJvOu=nl1_UtnZMNtoz16 zkG5LNLN^A+<;kRaq1%3@FML>hxk{1Txp6i1W_#)8)MC|^}2ghM$taV!0mtO`-`*&VRx(1w)4|WZG7YRURA5*pRP3TmOV z7=dGN$a3@DSL3@28MYzFvD$L%jmu7Zj6k^@rahe3x$5Ezj|PX})v@%o9#@ez?e1qw zK;?70Xcup_U0Y^w$+~zjdA8x{!V=JZ;>m~|^AL`*W}j9t(SR4y-p~{gCKAvhD$5ym zUuW(-J@m<>%FyEZr`vLTs@boKzcR=ighL?oc7LNzjT2$~0T2aJYz!X5;B9^(FBd^W z=Dlc>h)VN4ZNsWV4^HaOzc1vKXFQ(KJwo+*6*c9_PP-r%v8l1cYV~70(2YSCKn)<$ z)W*Q|Lq?ha+l{9GW(x9F>nm%BQZXSFeuB{!nzXO_;{ z8YsKdaqevx;a3fUV~RSZXz6AmKEWjCIil)oYWO~vUO-J5EeR8Xos`>0*WCJUC40De zjrEhJ`tZDt)E_@mX7xG8D7NPb_fjsf5zAUu*9H%JTg}$I zQ(*+C%eDu~W;66}pZ6a5h#DUSJw*}mM6cnGEUUjl%%P2j6ta zRk%29)nG^06e+sC1q-v5a;AE+cI`Xr7=|c(LPh*A=x5J0YKR?ZjYcNK$c?jwn>cW} zFB571*rB4W`uOF9sv|NJKs)vAuBucvGTvZM>N7j=ISvu_+&HW&N*|Xx2Hs}&i$}C; zf8(XTFkIWF@MIdYL#RG@A(G;&^7c$xotW z)P-F_TH?>N83(Yw@*gf%wjOwDN`O*#+KX~2>DEJ_V4)y>cd@pa&ZkhI6fTWuc&6)y zRu`gf=5^X2ysxWOn|3l8UdAxPrPgyFY{%X_6OrpIQZ20UObh$$jm3+A9FaS4xv=md z^&rmde`#Jw*1EXZtGG5}9OzDFZfbwjfX7BP)u%%~IS1UJK--_k?3KQP|pk|T#_7x7XEduK< z0ilzq@t&Ef>6!@+R9KudOW|`p9m4whX1@BHUfzUsN$}Pmlcf%$vyzHBOvKG$UL#Z3 zRng5(&(CA5x%A(R<|ot4pn}Im6of!oeVt*l4M;jSDcju@Inc3ISye_B^__+PH*Pm< zc^mmiA}+-Mv;rjeZm||x_8-18 zOOUgAoWNq%d(+G}MSFrx^+1X7VmZ@3kD-?vRFGU}+44Uty14MtV~coejt_6eS-fsz zFM6~6DX%;``9kS0s%}vt*^xvBjBvfu;xg9#P@F1!cguB(d>6ia)}Q>3V8yKP9SyhT zsf&r3Ez;)}h&r*|rv33w1K-3}e<&;q%lJ?T~}T zSr6N-Wd>dw+gB+mjVDLA-Ndr=lBXq^1tl9BD-B^kY5R>O%(Q6+@z=udNDO!cyVmUj zm&OdQnSlk$RJ-TB-#7YrCXgzGaG<4^kQ(@EhVfWwolSYz6!Ge}$rjD$6;#NRh?(Ws zTgdh@W6ZKop3_Cbbthlz&$O19LjrC8Nd82H*(!UNynlCBAx*BAZsRM5&$X+?X*t9~f-ji(V4)d$nQ_@2cWYLh2(_d|x1j(?Z=(rL1Y z4Q?-^e2pm#+_$b<;-g#^c}ny%5zn+G=ZA&t3i=C~zd+RF{}}qC6&NkDp4IaH*=vzy zHD<0;%}^OY`y@`^b@XUK$eol~1w~XOrPcjyA`|nsuQx-gP8Md-P7#)#{T3gw3Uba^ zAFjYr%mD9YjH~Yr3|9?S_SIf0-h#wuB%mGC_s)+|Awn!tgNXo7hN%bQBQd$#C?i8# z_v=X_>$zT_qYK`ZW~9d=Qp~8trNAfMbkK=4YjY^Aai9i;Ii>Oy8*HzfaHVG?nb_@*UZTX1y_MFlbyUbs{`# z-Uqoixc{O1Z71v|Ti~!ArputuS}^d7MQ_ttL?)lgZT!!2h%$8HV!epSh?3o)1pK(*;RbVs1{w*P59!Cl8Nx z)HC&bUHM;|gAOaQv1YKcpA5aNtL%Uf2eu4tAv;Oq^~kQL?Z!|Op%}OJw0U_J@UAbu z=hN%ni2Kz@jnW8YobWSjS2Ts}(D2v_-W@_%r=)4Mm$OV|nP)TjJ0(&@&n$_Pge;`l zRyVtEQ%KrWj}yVq2$n{GV(>vd%X>?e9N?i$GR#ldZ>h@y5UL2?XKUVr#>Tv!p`*;J z4smhu^Kb1qIBaDv`$!+)?HB-d6&s=pg(i(t`H7R%+dn%8j+#Pt+r~l%pE^NIEMR#b zQU1QDBu@xh^MwFsta)d+}eX`KGM7py&JWhP21~B7o4XtilT)f@<}2Kk~P)t zK87MG0i?w6F>JJDG!P2&xjz9(^XP3c0!SmSR)AdHoA5JwZRMQT#4K0Lotp3OZsvJ| zq-Wxujs+IXV%U?ClKy$JAu)!j0ufmI?b@OxJ(ZEP{n@BB@V_4N=Rq zrBAwb6=|0bk6Fykjcw=t8O>)5-7=MBWoF9$k~pqc9b{V`k=YS>&sIU~4^PbeTWcy{ zp^w789d$npjR#iMFeK9r6dctr8QC4`sJ+GL5&+Br?Fmp?Huupz~G< zfKdo@_fd)q^U?T2>DXK-rqdxw zyJRoEUoKxAhMcpzM~;~73)C2Z;H&6?576u$s*4JG5u5|O7vVq^3RI9`I^QvxEpH-I{Z`xl( zIwfE~1*0?gHZ{cuA&PtKCwRz;9xWZsKi+lHn!w1i#I>_+7zK$@@Q=^x{4uxB`bl0p>^p zp}3bg;Qk+fiBO*7Jz()d(@oosAK!G?4fL$Stjez%J~H(u>DWI#S3`lB~4H&n-kzTM9 zO`n^lr4jG5rEgW_`CPh6N%aYnnh-E#Ek=;U5f&TEpP&r?Y@KVvJjl-D-(a*!R8*9J zGvvKlHB>Lckljlfz}?P^DQUmZfrxP zX+nt6CeLc)wIjf;0ln3g`Do=z04v!w`{C^CXOYpM^-7a$6|-%W2Cmb`BcTcH0*Y$} z3_NdcYDA^?yeOO+1J@7;7%ZmN;*cEvaHm+n;fHaA{xlm+;1GoN7^C)cHeo432iMJZ z6@vRfYP}@_DVD{%$ud3MeE<9a7vJ7Va{#Z&p5?R`<0Rm1LQMCuOggB!(e|r_(-Yk5 zG5gK~!nBbcpEo<*&4re*T@yrS1sZe?j>LBP@ViqCix$O%l5{ibxET#Ncf8C}Z6SnA zK(-+j^x8QZrE{LUL&YEY;a>hdsuoVgvTwjTld>d@;D)g0~=Ma^HM+@&l0FA zIqfAZ$^WswqD;GAE~U!%*6{kPk_9MMo%e#0D05M@6gXD;(w{`avf`>2(Aoa^Kq;yt zmJfU=Rma)U7d~!wn&eq%Rk^Ps?xYR~&wqW(PR z$Abo6Vjdd2;@nj2lldA3(6^%QR)8q3u+QDXq6vVeoWA-Wdt~0NZqQV&D@$=YKB{NZ z2MYIpJC7=&`MWsZ7_-H1j7!cfE`T9wMtSnyI>(O+fxv<9!?_L};=9}HGmFgR_!h!HO>V{3X z|8=QU%taP17cv|`c&gL16j9uNLv;QxSLI!O*qa^5J4rMJOA*FcQ3sO;dS;o z)|1a~+ydQ!77S?dfPYcu;d~Dk7U)AGGC1_Sj3ng;Kg0u(HoN!}owPKYN5W!Juiidv zSUW3rUu~6^{Oj7vnIxsd7y5I1e^jQr;w{kTLWYYqYA;rRyvNqzafzIYRldR>G!#fq zg*q_Bjx8YY-r1=OT%rt6e93reHt(L?*2h#VMv%*wczNoT9O&``eGPRUeeAcW=YB>E ztTh{Su1qn(TSGA-7M~YlP4Mc$XRQIKl>l`upa?%ttk2EVW>~BsDj+a2~c1b!-n=lQLtAUN`yn`;d!0dmG_7 zN|1<47SuCbM*r;D^5q#qeVIG-Ru0h#7WIQD{3sk+x&kg%Vo-*9Vm&4F0D@FgE?^xV zAI(C@c|A)~l3$w&dK(WlEy?@S2;+&eLK!~JgmO;$g8M3Gy=Qv7AA*lL82bkj`RRdT z@?fJgWtzj@y~IK*r_E*k=RjR^G>?Xr3*cqCuL8KoyV3+i_b!n;CiNvk_yf)3FeDAWLS>Q@Moku~g#^W{dG$=nqb*nu zIbXz-5~4sBz9P8T5`!Miof&Mn45gWu0|DnfoQWPabPxow7`tejjn{Y1WHm&qn?c?c zz}5m7{UL!6rT+=TLgQ89z&Uj61pBd@u)V)QTkgvbvP34f2P$ItAoLJmmm8W)5Ko zN*xHATsWyP+%D+bl7M0ht@s{+#srWNU2o4V?|JOaks}LUd%OB*f~q6rJsl)@MIov$ zrEd$)imI6-ee~$FAyHGG%B3C<$b%~P^U>g~eP`rPA?Z7XjkJSA!D!wlY#(Ci_fp_g z=zLYSrngWDj2J%EBM|rYNk0m7Afh6kSX9}l=(l)ZHyj5V z|J74b5mx{+D^QX%JBM0dpUF0`toQjf1~h*+qY4dODmJFak=CU4RqaDhfL;R#A38Gz z)Uu+=n_%@4Efmmr@Y2xL!wO%pz5VX@gAp=6N%Rv07?=q#gI}K+j0OY3LAn`1y zie^xy;Ra`-Kr8NKAm^JTuO{-`Pe?EOe-R@PGv8wau;o(%Wi_>rM_d>XsNyMsSzn(<%4ndd+TK~)OkK$hbNIx<Txge($&TplHU_;s(&6A#ZHlsv z6QDQOJu|1DiXmO#Z9 zv}NP%4+Zf<-eguEKEUQ{2$g%_K>ifM(*l;6jN=bwCEJ>P%K*TEIe;wVvV`n_ANCdo zh*o4o1U|3RP6AWD?)=5>NJSL`>!z-17-*@w^pylOxAAKUlm*>mN=<$}4C??yKIruA zH#2ZL$A)e0ZmnlCDzD>)oW56wnuab-Vo}}S{=3MDIem>ZS(R8=K`&T|e!QT{0qv%v z3Q*8YB*O=ilMzQ2eIYvdl|%R8!A0d9%-ua)zZDvaiUw+Ka^W-b`+Uf=+IppN#qrdi zl#I!A-PUd%`>Vy(r+v9!0YQ3n6vP^$LMm#9XMxfm3e8W3+xvqy#@j<(CjZtLDfJ9p3C*wj=Y*ByD_z(_nE0yj^=0^U$BB z^Ct-87?EmLyC=ZUE)cA|DEw@d{N**Pf^pH&4jbhW4WgQKYE0UCRO zie_k_IZ}Z_Yq+Uv0)(Pv2nYq5XIVdVu<%mvlyRXMZe=BG#QO2QaKJ40JSO<4%m4$t zO;n03aeP1O_rVA9fKs@`K7ndYRE+{zlZ5`vitWc zjCsP|kvms`PLNv&NqIrT-3f>Dd)ZFT&Dymd9qf8KCL$|ute4tMS~T0T4|}e6CMaNc zv(qnY1{}OL(@qSCH^|;$cyGN-HUX)Iy?!eSdHBdjw~T(EsWRRvPv*r%gP@(%_d0jt zgAqC}iuonQ8Px^{v^~a%?XIt2wMo&njpt4IUN^HlRGK}CTSKUHMD&d?bTAf08Ls1p}nN&_{0Rgaeu-e z<;nUd{ZT-4k~A4jabu{PaAk)XRZ;^t{Hyn*? z56{i*x^mrtrtS`deIGj!+ehK$EsFHN(s`XFc#eB^p+7bhij?8jl1DnH<0pLPjX>MK zd+Fu%l(`SswWg$`Xk(@PzqPhdmeD{I5g7HLxERO|!2UESW;6E9U;qC@lMeD`NB?t4 zP>Z{e76}R07oiyVRlv=$^7!WV`TC}^O5 znY2Us0C~_N2vIhG47HGs5_O7l8+fMiMGU}@)h-|ot`^uOdoW;fDJ@Mt`M07yM0bv! zad?a%m0?e>L;^}N!&__eA^)u+>am&_@odt(&7xk#cyi3RkbMV&6g5>vas#TevpY0e z1VSsc5U3$!8+NWYr~f|Be`jW9%%OC+x(BV1p}X!mN6_p&&!XOC^E)GyDn}*?-5`AR zo6mu;p!pZON$PNTj>wqb(BWMyNA@=+C@4ajksLK03U1%%@%^hCKP~xr9=>7#4 zD=UjWlNtHUstLNtq-h1M72R#ZDSYqXUGFRubXN#4#K?Oo`L>voT{61VK|=TAR;mR` z^VqbIh|g%1MeO~ykhFsNvXkZ zhU;uGN7%k@0EZW)HLL~6Q4bP)x5f>P$M~b~P?k1Ln0#cnIsQiNqfYI7_WmXC7J`c5t9sVK+3u?k0CnJY z+pMdKl^}#5Zh&*4K3`KS!?#B=KX=oJys#ABs+{tYIoUjlVL7+|N z-J=W)&K@*~83d+GD$Ms{UAnoY#Q5Y4ujvrk6sqBQY!eNu8Koc=2>==iM$+g&BO0xO zf`*OYZ+h8E_D5;Pt!F`qR}sD zGLxXXb-y;N1oTt#(}SRCNfo~_JIZJG!Ltc*1YbXHJm{GW86|gLvj`!%@YLVP_#ri1 z?oAHy0inY6ycxF72vJYHlrKZ?V+)`(eN&hQ5=<>@5O+=!a~WFbuSBVvnFxWJNspUl zm5{7YlI~&ED}so2y5`)ow5#D(t|9bh&?0HF$y)^Xp{kJm@!lBFd9ydR2Tsl40#Oli z!*!NOz{stv)-@#=UA|&h{}{WNv}*TDn4u?T(#plr;kATkX@%5=?5hEp+N`vo*YulH^W@9xgZtH7dNddTQWsIL3O*p78%U3OAVvS1X z)UV9psCs9<{teIL7{c`S1PjC9j0{y!8z~YC%_!*J3chb!&-GYn(V!$A!yIwF+8N07oH?rEpo?ycdYA^X2krLm>ylt9PtT1>qAW_uv6`oqM%dL9r_)}83E`TC>dU|+4=W2nwi*|9wOm!J#GOo*#CoWgCwwf zOAGV6CkWGL#c6{A5g|dVyk95_IxR}h;o}8SwVrNvpA-%{J(&#W1iC_sAZQNaA~FfOwyw!?Za^b?rWy&;Yh zA0HGsJN<3=?vR!i4V7lGYQxzo4aWGxhytl@N5)#IuJoats9|9Fvmfp4iKup%h||reV&%$bHVoH}&5f<1i;I?5*$~N=7BgBQVwN6DB+7DGsZ> zq-Ru_SQ3n;c3Kk|19g)XJQ`lr=e_tK7nqd_X*oJReuY;WKA>(E^(QBNv({p%W4U$L zjg_An18^J#JQK?L{&u z?r--Bfh9&oOv^ZI=%^0QRn&nkKI@n`1LQd6XjZci*(=_zLx0>LEnrBL?|;YFTH&~R z6b~;xBjcP{JIl1Ef7mmj{6gXlA-h1_gZL*NuA(VO)&$@HmQPu0DC+- zDJIxpt(?E9tjsX%G)uHWcd!zX0W@sL0wAjO#suRpb)&lwROfZ0h>waGsc^Q@8`n1I+MyLd=~?Q_p~|0K5k$(5nFsARVJY)7ULQR(JYx)t>Nav&v{^& zP4}H{R5oG1E|(g>7-WJVaq~)LsFT2CPiIjOtD%YNp34y1BsfdFIlXswa5KI0kMBbK zndT9xtl365DJG@wTD2^m=*eCFx&|N1)4SzYfwyiI8AW;Ju+j5<7Ehs%Y?$5&^IW?+ z0PJ65j8zDJFGT_J*`IJvvf9;<0c8k^2)83*U8Nqxvc!*(+4 z^7Xq>#R2(Vf`V;!6%Q(?vdsmAL585tmiqCxrcOXirBeE2ki?T+;t{Z_E0E3Ppm{6R zSe4YNRfI@c%YO9dHv;iDi*~^MEZrQC22^m9bzdnEQ3$lPVgrG_JDwyf$Qjy7ADY>b zh5nov9o5{-vLJ)JZ$uM}rG>Q8h|OWymuvF*^xyC#F~SB-gu^aeVQ>VG0--z5`d#M^XwQP9|}lxSJlzCkz6>Bf^SIUx>-3);eWwM;Q$uCfHqjhs+C}K!>6ycv{Rh1_mM{Z*~q~6+n;dI_j{hF+#?=9ao6& zM2v{1Q~&^hNHL8Zx7)_UQJxy1N`Y<0VXw`lMwXl10L!0NyRL7NTph!<_^qw~PUzL1 zlewHYO!(;~WGhkewc9q|;gE5rY6YoJ&k*5BAMklD54ZUGM7hji!qZ4+t5$$5M`hN)&rxQn30!#^&Ua3jN)7 zQV43QM5VC(V7QG6N4KR6?q6a2r%|A3$sCA?1OMo!ealEvkD@inbvR;NLsT*SYi5)PsgBdubpo`5KuS5|n}_BHHBkT?FIT zG`++S3e-gZ+3k5}q85gBf#i#|{6*H0ic%FWTwKH$9ap&qleZ>#XJ7ep(IGE@={w}wz!I-NyWP>vb zt2E=^$S!vuD4Vdy1Y_=#K(Uc5pnoT_bRACTiuwQ>d-~ILP0|p!8Yan$^p({ow&`u8 z*pT%X7%A#*3sIg|iZBfXIbWoH>16h%B_bgd_pKYk4{5&z+Lk*C?~VqrP2O=?+yRJTJLtL5Oq0dP z{9^;`DoK8$)6;j3R_7YE?{;+9>BST-#lcV5asZkp>Bnm^1_q1~QAn?jL5l*$dN?11 zKn54UA{F(vw+CE2=7f*31df{SR=kM>I(b$;m6YB@k*ht~JU4@lUrjdWJ4@yBK3ipqeT4`hM9moPt z%LL;5%?bRHB<_vF#JCyk5kTPgP~%q%BM$eOeurNq0tcm4adVXZ&aD^G zeBBzr`&>|-gDlgPpGPz%9C;6gz{86y<(Ua~fJV*}HxErrkOc4krrd4xI?z5?7WT60 z|Gj0ozaffV6Qg7(5B`UqyA2c%cv_iCyG>)*cL0VNnzfn4@5D05Ji(!LU9h`-AVGGa z<7_hw&HAtL^0du>ej~_bHIHv!VGf+FidK>V2XJ4sC(n4@j?GgVM!-gWaH8O;!soe{ zQ1rFPbrCqSe$n-pfl0pN_NM!vksg264Q~qQEiQWXh5L}N9+pEQh)Fy%!m!2IUBAqX zaYGo^5tJle`1uY0RX_gPykUfAHpB1)R>1`FR;WfsMiTwW!n?H=6FG=EkE>q?^)teI zSDrkM2SoVxVG&79sGayniB2y;Kf67y$LPYqH913}IO^)^Z>+3}tSTm1XKnctcwBz? z4t;?8$?Kskcg~clil_ME#vY`b{qA9r0v>QWtE_DFU=ruS0~ftmw*tv{m9`IoqO7Tr z>QljZ)EInwiL`^w`k?v5H3+%qQ!jp~4b6n8&G<6)jxd?&wur9b+n2ndFMw=QWN&{O zgDXBotZ`Rw-UPZNjp)Mn}zr6+>7a0RMp6?3;rhZKJ;QXjUoI@!F;-41`DuEcYW zyh-C{B9C%K4&XinsO1TQzS3(I2_hF3-0P?^_0h@6v~@k;mD@r!-?GXy)YM+$g(FJq z8T$E2{SCwv0>atY*izaTpOb-Ao+JV*JUTk6K9~f)s^sisH`)UO$NznPk*-H5QneZ7 z%+&1zUlp%3)Lhh|&xLH~E!}~W!~8BYfqBj%0p8GVFjlS}&-OL@ z^8^?aw-UiC*|D4b^CSWXRbzA0Y;a#9t&nT|dccopouAT!DSWZ+_bV2Sit_H38a@*% zizp}E+UTD^MT?FlXVQ4P!1pB1zvtRJG1j6%B5M-oz{Wker2w|Fk|z zIc)U_X{axr)HgN?7cu{{bRW2@P^mg%x=D3 ze6y5qQNZ1L1(R1r=}n(OuR%D9`+KrTthgoasK4PoM41{Iwe*?;Sn!lz z)*_I($_FE(Hb%-A1^x3%CqZV|&G}FrmV<>~mfsxSYBOphFAsJ-SVz$9SXh>pmelvF zhK7dfJo_7W&LZ4zCgBuE*~mFX@-KJUNbWb@2?M@2NGkob55)#FD;LQC6H@hvjI3mM z7C|bP%rcHk&c_6*>>7H4&YA$r893Jp{iZ)TZh8gk8ux=b7S$UMfcB$w1U2{}`)H2K z>(}>uQ3CA%sQv`_z?RpkY3op_=qNZ74D{VV+Eo(=fV&a1>=Xuk&i~&%q24dSi00PrWe6ga2SIw~!M%5mk`6Kn(vf*K6(2@vw z(*}}tg;-gvbnqWf(U7iOnF+sR^99LvXRTP3%Ln({Kp!Sx!2qCMR>?2}`r!3EQl$5O zOr|t(Yz_!Z*iwLZ<7g43uB_Z*aH)U1v%(Xc_n>Ld=ly_@h_N?0iX3`0?H(Qq9?El6 zYSh1^f!Oib5_h+;|7t({d69m>)+d9iyE+^L&)xXZbhB7gYJFC)tHYB)B9~Ca1bPI6 z$8N;;Nvdr8^;=;eT{_J3YqbgQBDqh$&XX%$1arY%=)>{R=ESZ(daWi^(Z3c-*aU4i z?cf6Dc;ATzAv`KmB*iXY@#gt33f^X*ZJUehY}=V1^2;q5uc#>#KIkpW_!8G?)#vYq zfp}qv<+KEppyy#-E*1=UYuI$dF@0fS>Zslf!R(u7(={h!xR+D~xRmb6KRQT6cT70$ zK7zmG)z`j{&LzvC;AwT!=Ck3v@=haSS_M6E*1Ianr)m0w1IXv_SJ{+Ue8p4P<7Av% z$e}F};qfK78f|u! z9;)gYcvsiYs#n03u73a8^+SGn>XDP2WxKQmW}QNWK=vMBR&HWm|si|S|8iU1_6))pURe#dwlFJC+PkOM?jDf{@0 zL&fgyZYrIDdAwJ3gQcgy?)6732$~22N3I3h{cS-{96BI>48F*Tgpc5@S^rdIRdM60 zF9r^_ltcx=K9Ef_xZoUN8IJ?8SvkDolul_)5vzZ@ZD(%jiUGxjm9Dy3nF5WDq5nB- zRDKi%ie=f2ryVqW8bPUY7@LJ0zk%|5(v2VL*>c7|T`c zVwz|M4HqNyG8|zSxnp2Xe>#w?BIh8$#m_aaE)fiwXqE$1l@y&|{7@6VTG#d#rhN*@ zdI-y~{<{Z|w{K1@TM-j@tyPSpA)~X$dRpMi`atF_8}p>H4e!22_>!8w=5m{MO^^`QtnkXiwI` z7KI$so<}4H%;)VhX0n9^ogsgNk%|LR_ll;pz7?zbK!sf8nN{8K;SXNCg6ZbG#{KT=1~OiQDfxxF4Q#E|7+J5 zu|hrQ)7pMsf^{@(3N>xDj~}U#td_5U3MV=JsKW4S92aDu_vG(D{OfVY@Bwm z$EXH}%{XfrT=J1YaZJ5|lOu&e{JC-03l-#$u!YA-bn{_2xNM$R)F;?vz)GbkwqGGi$Bpz>uCMv4Q_@y>NZ!V{GINY5x89Teg=+>fbb?(ZP4$=%(y) zgys56(3VPeI-E@_^NN^36&WK|xhzIEC&bYp=cQ#HANT@qJB$BO^ z4=%TuW5e733 z%u^fx?)?6It0!10nXP7{=$rn_X+rr-=OvzUR{Z&MiN7eg0Ax~f|Bp?-P1}Dzj@wiH zdam=Shqapff~&>$Y;ytKM*d9hV|VtVzmeZByUct2r1Sgt6Mk=ZzMr3T=UOpH^BenT z&NqMm&D4L_{bbG`iO{|GmDl`#eYAY;;+PU{s=h zfA|01^tHTl)8EJE@BLx}1^~nEuD@TpKkPrZS^4k%^_SD6f2_}GFA)M3#lr?X{zopr04u-SsQ>@~ literal 0 HcmV?d00001 diff --git a/resources/assets/images/2853457.png b/resources/assets/images/2853457.png new file mode 100644 index 0000000000000000000000000000000000000000..b9107cf8b9c4bc51fa8d971040c54e79ff1377f5 GIT binary patch literal 43878 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

|6w6WKK`?SJEQeiHwk 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 Ks#n3Eg#I6XHgd)Q literal 0 HcmV?d00001 diff --git a/resources/assets/images/2942005.jpg b/resources/assets/images/2942005.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83908287fc7a50d7d1712753d111e356a2e8e0d2 GIT binary patch literal 105176 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

;CRqDf`TmZZ7TiYs+mPiz8p0rZ_rk%GNW5^3Su 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 literal 0 HcmV?d00001 diff --git a/resources/assets/images/3231370.jpg b/resources/assets/images/3231370.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41002f1b1e2df9e76d0ae4190df94649c09ee501 GIT binary patch literal 39936 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 literal 0 HcmV?d00001 diff --git a/resources/assets/images/3568950.png b/resources/assets/images/3568950.png new file mode 100644 index 0000000000000000000000000000000000000000..9003367b4af049c167ce137e28a5299ecbe5a838 GIT binary patch literal 75966 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®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%0D$mw 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 literal 0 HcmV?d00001 diff --git a/resources/assets/images/favicon/android-chrome-192x192.png b/resources/assets/images/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..689afd0fff81618cc1277ea0385b82871b46a2b7 GIT binary patch literal 15724 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 literal 0 HcmV?d00001 diff --git a/resources/assets/images/favicon/android-chrome-512x512.png b/resources/assets/images/favicon/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..c338a460f2645ee7b6d973dee1f7ac9aea84b341 GIT binary patch literal 73717 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%0DTr?SaKJ^6Ng;A8pX4LktHU|u{A3D-HuE0Y>NY zw(6{rnGNsVcJEdasTtM2D zFBo|*Bh_ezv>#ZNr1l?&nOvuTiX`h??iFWimy1Rq1l<3;c=%2IlmlrcPmXcaW;U|U z7ixY%+$!>TdZGPfPH^1WyZ*i8pv(%m+w%bJpt(Vgzs@OCN$H2zygicpDz?NMyG>2p z^>U>5?(o@cITH`?U+_-xW1(~YO-plmRt?ee=$NZ0R+nqos@mHW!L&g=&~eEJ}J`+D7NC6mYY$oROc)F1QtL-zM2J!+3ljU z4wv9u=m_P;2LsonIMu>NB4(e)xwtt}w-);YQ!OMx#>TLy5R9-7g= zo|LbU$1x3qQ`28ggI}x%Nqv9hH;m7j{pP>~HEkRlC{I_uKWoRIT)nhDe97z= zbAiu=tB}A6!9g;>8<|H32(qF~CzS@uYmRxw{<=ksBZ@GNq%3knR$J3wXuOUO7K}_@ zueuC^=KmN&UY})h5rA{z>Z@f~-eQ7K!Oamdg<q;h+VjLEnG#`tUiB1Y?``f_%5 z@1m+|?7)4s7!yN*O`Q@AjhkqOm9yv&8dfY|a7GE|vXS$u#r~tPNnxIR2&B2rSRy3* zkwv_lN}YA)7o#P`CwmW=YT%&&J_W$Iv-ViN-%*U=WOWTvw9pWC#k-LHX+60csr#oI z--~mZPKmrB`JnZN-tvlW;)ZBV-OR-TP8`X`Zhg1f#r zE`NxY9WhAMzgz~<;Zskv?qzIpMQ zOttV(GHVMvI2?k~<6}esmXmxFN9xN+E=$n8zOxF;xc%I@#Ei7#^u~4XMn}0Q?X}iI zLsoIJZI5Xm;63kXy%bPv`6Fe zJfw*Q2ACUfSiN**H}Ir4GP^3VJ{K)X*JaFK+ZIjf4c6^ZW=OLd0&r;Qz>U<=+ey|M z^!QODV#v)rDzM<+5LpKPoUDavkDTM{hR?n3Ydb9;{Pml{^!+@?U$X_PIuoqVVsOF& z@x}GtlqG=j;d!!3-UJDBlWPx-m26q;&T&%b`tR=JEguQFkn_XylU;IT5Ot>!3|YeC zY+C-okVOn+sS7W?t*UKajxoT@rWm&TQD$FNkBH^~9s{j*N_@I}eYx@GsQNu>%_>2+ zafdJ3JFaygUPT@Wd5=>6O@zGXt3LzNvy4I=(F#Ch2#GX7^LRjgv_0p5v_lf=fPrJ=heKM45BKsvN<>j~xZ%am zBx^YbwIs^vb>P^BJ`u!RVvpiHDlbh)QvB1KvfdGywY_t9=Vmd2jFrs7)TPJ17GXsg z#83yrG&qiLETfsP3UgnIGS0O%=-{VBz%TpUGD1l6-4JcxHp@dt@jY8&qc#k27rD`) zIrw@9CLOvBw7Cq5`x1pU&*y3;07Vo{m!{d24DF7zUd$Y8OZfBXV9E7QOt$&01!SGS z!EkYms-IF`eyX~ugTU9{-F%WbL8+XefS^nEv+rm3(l3laAoj+&MDrwVGh!{dX(8W& z{Jk#>Zd(c%g)YA~2d3;sf&d%*LV<@cEi(_dF`LPK-N?^fY5BFy5Nt@W1?tc)zVyaO z+yNth(^dTcH2y6V_m^F$C(GTUNbhP$>5}?AldglG7=gXxvrSGgv%zbZ!@X$N?G1Yn zEXIc0?tpIP08UWxP3n(&n*@)^7kuTN@E$pd*y|g^K?mFJ7Q+44BUt$*9jwvf|MkBp z!bj*3{_?*lI&*^f@_*zx3v-!_Q77ZGGk~LuZGLBl(1!vZg9$_5#@17s@Yg@0q5dTL zfo_PT3j&9r=YBMj1ivlzi@r1OVhW#Kp*{2^I_>=qTO}jr3|DR^k&H(YLr_kI z04z8d(F1%o{s&Tptl||63Bp*Jl705^q6oNnf5kgr^STGJQnG{8>FI9}8WfZn$EMt5Wh}$Q(0A zH1?-ZD1lk8w*h5D~H`MM5VxPJ&h4S!G6%#=$Q*ad-q|AQKP8^gp`PUXbd5 zCT@(lEtYC}_)NjwOTBl_3IUiavJD!y(DI z&0laihL=nh4I$O<@x{5xs_dGqXcRb(!qiaQzCu|v$ieWm~GSRp- zuA&<{U9?o9^x48@LF-?dMp$UP;Kc<|_K}#P;ZcZsF$~rk?8RZWCf8whN`T`hB;cAZ z>`IIcxA%lH02?R+$ zm;3pys?J4EBbRSgpGK?XtD-hoeP5J6ny5XH;%ILpCTYUH*zZ(yK;AYHW9}dGN!&34 zY^1&TVX4(k$dBye(Y?tt`9#A&;mf z%l9WvsHVBH?TZwmD;(uAI$vgFi(8}hL%&PCe>BS!3b@*ry9-ieGZooxcI%3LUrTvc3!|+7HRcga~}*>H#STw zzn|GMNU{#=x^1QTLt5y>Qs;>gM2Ve$Xn;6nB~a>T%itq-qf^z;;7$>ht>Fpvi4e{^ zCk4&hRZmI>;5H|Mm7A^L-`*M|K^#yx`k`*!BKJF7@#FYcDz)`H`$))c6%}bbHS9c) z^?;nQYjUe2obl_>z^UJm2X#(S(d-k`mPD;qJZh~Ug^R!TE_eiVVs`9|%ihFBPu$?A zuK)fto6+sXMtwzs{48kgqAC{rqr~d`_`IgRWsP5%ve9Jid}#fAc{8G&qr}1;BM|H@L_D>4XjRs4+79TzZMs~>M%Ke z^LTQyC%pOAh#4Kk$8xAeKdO;YsbE*N?8gK^4s~D17gv402-&fSn+XOI=e3 z@(FWWD3k(Q`qJykN~;L1gym6^P3^Hs4C&qttR)3sJDez5U!OY;RS#%XMbt94+mFBd z#a%~?)SO(n9tbbxOg$Sde}7&69h(=s#qZQLHVwU7-PiR0lhd4T1t%u^Sv0Wov^S?~ z`z30g9qJ;|R$1R3sgKEasjYrk) zrZWs zsxHT5D~G_j>3DeT<{ENz$7zdq+-v9t!T#}p1A8T$KHVzW#ypMvSI1#LhkbR6O5T5^w=n4*Du&wC4FSW#i54E~^kR=j{#mMI2>;>}kp@pXtB?3$Hf z0I29+|1mOp$3Fulp6g`C-3cK464>!Vn{Q31*D6b0DJv2)yPNJyiA~MC@SM^sMqPpo zrM&lL0JN##arkq|k@2ioH|hkQJ8M)p2%Ya83t zMOa@tX)B;SUKaYx6^qt;xlDPxasOQ6-CQ8x{wl}5dC?jB^UrTP2QSDb3nLI>fpwo^ zzVBfQpA^PXSV1Y2 z)htMN@bWCq896lIizHEwYw^7wzI;6~DytX}k&FP1$`IsZ{eZ>&+#Xz@GED+&l z240NQRW%@+?QiU|=&tA5X%nyKmcz?nPMTQvnoTkt)N3_Y_2NDi8=$CG%BD8u+X~cv zq2XKuPt&w_!7W*(xqRp0mlC)3F7u=@gUXLQ*@qJRf63i1Yh{uFei8Av-7F7$UU zcySNy+xrcWp3FbHiD+ut} zBv))R1`UfqRO82_VAB7^4Sss>d{8H)m@*Kw*iDmS#Y^$QTuTdC|x6bdKic@!o(YD}CX z;zeX8Zbg9kG-KY;9|2fs{skpA5!$G1hL z(k6IXKbqa0&Ly6SaEbm+^ES-~6lB~WAr$_HW!{{n!lbzDf0urKC;Cgph0Bzexe}r_ zUT%r70hSlI2^x7W4z)~`wc}3o&?UHQ;E$qZImj#N`BZsw>`Bd>yeq3!_jYFe#i5}@ zV0wGU*O0(V^XO8>N(^=21`dq|h>rgyUk0uKYQ3&16MJBpv^xNFV@0sS8356@U5GYR zg|pA9ex_t=s$7FQnN@YL`xJSFgyu8d;IYYbl72lIuWsDFUg@<}M&ajmKgelRW74O` zZR=+-*hH#hui!aHF*gEFi0&Z=-v}BdndEHSPOv5J7b zCVOrghFvf={D*PDksgxb7r?}So|SElOtWIpo#ZdIgH@RjR#886^fncx^J}|8S?5>S zD4IXEa|7g~ADax8ZFy6uKHvAoRKW`CNaRM8m?r1)1YXhug8pZYG`;lgUFgjKNDTmg zOg90~DCA3Z8$?O2zfw?vzWmGndxvTGe4@R4-uRkxKK5zRCJP~_q(PL}2d!K2rM|a! z#Y(FWEyBnA89t4$K+gv{q*H!8IrdSzBcTZ0ZWe=u#YXSS%cXU6dTi$k4lD*Ue{+A( zvzcisPv)<(l>94~mCJt^tf2Vg>sjJSax&z@L4pCi`7+U)XKTUxN=mb3^@lv-JGJnj zA&gatlQ`+;FM^#k%Ty*GmAI(MIvN+xCp+rTXH+dkVJ6R{*m5JeD9>rqa4vMe`P?5Z zYjcoD7O|9AC;X@%Dn-tm&#vOl!jE9;hOrWx2 zXb*B)_q*IG&p%}Y1ApYLPi>>-;!v5o&QhKBXm%`Qoiyde89_9}@6S*UXw#vg@TRXZwc7}wXrtHGY7{<SX?dg~B8Eb*t6y32C~E$SpaFz5nDcH|RE)z^&c z4J9;o(#J#osp0w6QICpPo31Qd+ab2bSB^VP9@+lU$K56@G3vK9J75Q|Iy&usDiQn*8CH{?o zPpp-YXPebl8mu+4q%tKx1GT)OC*6TLRi0Hr7sQQiL!>SoHPiJOvu-%(W}o-o_b??7 zdTDa^Yl|`IAHH)2nETD=EbRoT&>;%7x5V}@6m3TT=AB1j=?ouGqbk2jSMrs+AIhDZ z3MzibcbdTdAyPZN*se-L?{xTjR#iX6_i!yb%B`1}9H5|k**)^?Y!qc0m!RP^OOP;- zi3xv%5@7?mm%#g1C(586PToeB@^Qg6xD({ffvn4S1yGpclD&opQ24|w|}VG$TLP6k{HVWKzNQn+eVi19O6EfwQXnIlno!M8&Na&72X2-S7PX8DH9ixz2BPVJD$OWsH`zyha&`hx z?j?e#sd9Q+J`!TeC5vn2qC#|+y5vWe2A~tkDFE!y%bEOf+W=57Idn_TGJ*t06_a^O zBF{H(I{MB7hyvo=?Li z-3F-TUog0*s!9>^;nAi&dBpdknyZ)eEP*i=_*~d+U;Qs77qS?UN!8X`?{?l#yL<8} zSUzRIZl|SqE-4xu|9dnV)VpX%1JHaPDwOF$q6$>1sA?5|aBHaIR)!R0j(NNpKleM} znjk$KC&Q+DnFVdKkGz=*HWU3Vf8RuRLP=MUOaU$^h)zWCW}>q44vaKA+GIv}mVy(p z;j9eCwDy2-en@8hg`@rELb4m1rpv1jJL2|_1;a~&gCFSoy@?#j3-+XU0~yc!mb^mU ze1WIQRgS<>9RQ+mM6Se|KIPXP6}b>s_{|g06qMD-IzM=r0sBMyef3>F&%We8jpSsj z#{!G|*gMmC?}soe!*Wmepg#eUXSvVx+7S*GFc4a6PY?QV``zMKkffXrq%Z)14Gn-9 z7d(qEyomo)b_o$oSw*WdK6 z=eb^U!aK){z8?nezX_Ejkv1~r%Nd_@0R#A?fcc}QfCZNA-~El;x9y&N$EHQL1~zYM zAaqUfd|t%QZM9)h#g|YaUXQ*ck0t05q64_c@opcT^24kA*{X^L-IeSf4_>aUM6@Cq zgMjV12hBxU+K?UL0mUzF7$~ZZ2R0@?n>(1H(ZENiku}O{IJ7*wEM*Soa66!Z5qJ%= ztIz2NpZ3OsI%CBi;GY9q41-Y&F#sHmFld?JuLQ-Rc8%of!j^MW8T>V~ue}JRsEZLf z2O$eAPc;sUQL-g?kg*AHDk+!~{vwzQAkD-0g7(gQvbhtF<^*T=ad zp|)d#S#rCFDaovrJ?kR$fsjxV^6ddxIfmO9xY>oc71>9ZE*uJ>^X}tV2TEr- zZOUAl6$?$@*syFlRA5PjRBRNJBk38{p3~kaWFpG+f=;Ahg=rX_%*Q3*b!>ky{pR@E@0ET@(Vs8?hAMcz+Nkufg_v5=2=<^ zihtxuTsK=xmTGli02XrgSh#@wBsdN?YV!YM>#hHy?7pbsYi8(HkZwduLb^)<0coU5 zknV06Nv|XE)gcnTd2#Hq zPzJ>BAX_0n$hIit)vE;R+82gCd*<`E`l3>3Q}mGp;a~UQZ#;D!jlQpDi}5SH*ag=I zpl5vDfnefe_&dA++gU?MyTfI6x@&Nq)YE?Bsk#8m(|lCJz+b6D>Dd<$7I%_KjUIpe z@RRIIG3ZId>xD=py&>hLE^YDC84X3PnEvmz{mVq{YoyL2fU)IWg|=pEa=0S%c)??+ zM(N4d@Po}ojU;|y_o+d8entYY4wXo}cp&zg@3(H5<8E!Gh2%nUSMo?_|2RQ<6UYI*RHEX> zlD1ep?6Pxk1?x88pCnA%Shv-t)nEd{4-C+**F6iVyjb?wAaxNLtlVy1!3ZRHSQDbP z^yqrxm+tIN2y$BXD`FDr)f_kKm5(1&_ zhMUvk8BH{mw7iA@_%!_tQ|zQ2e=p`5a#?g>?g{faxxyq7cTHSbeMC+AN5t@g65!fO+&|RN@FTPeoR%(bh!Oog{>eh_06zqoW-H;+SGt%LQTC5eB z0*=*&Qp&&k_JbtO=CUM!+dd@g+ND|Rq)WFkq5Ihr#!M83Cuk{TMr>SbIcOYI|3wns zkj#fF74J0v>QcW9j?AL?!Z;a!l=E=}5v|FdTLEf!R^h7#1KwkEe2kjI|3!z=ce%Zac z>zQ<_EqZL9amEc%wE*yBRtq6eX{D-|BX9E6~MBjOe+stT|2;u&{9TILdKcuAA?m+dXPc*MTgyEU5K&kD=i>=1aCGlHsGVTKhdXy%DMALAu7t{M10%Ud&) zg=o(l`_3XTv7o=SF3D%ERRz;F{GuF`XyPU}sv@2C(mVWHYk;1+q`+Wxfx3wbZ5aw+ zA8em}`?ab-OKDEUh|P)rW-L{F%$Pg2bR#=E75ksfm*f}NraiVSQ;3rQ56(LQagP5z z8B=g__VV#(m9?5@g#%l6>^p+T-}Ns$WJ=ZcRAr&N;U*}OnI|i$kfpcxi~uu8QpD`9 z3KF1pHUxfHsdv95LFu;Q?zSichtG%)9N1)V@RnC2Mc-%zV!}s=c;|vgy!Mxb+Cq0Q1E`rN%W;bp4Pio_uq`y&Fmk&Y zHzY|gEQje8NnD_y$K0*Zl@Xet+v&$6^!U5BQC%c&*+9sy9R~(bd-qpYlBb8`#ddP6 zuJG%J#ct;}DXy9+Y!rK$IW~O0da>2YwpCa>wQrL_?IDJB7cq6Ougsza6)M1|)K=+Dm)ghvTqo z9h+tp0Et$92J#3#&bg{8(TPLO7=kRpxf2gNZWH9mRizxdi5@dEBoqhc!dGGo@*Ajb z%FBP!mfY$bd|LBxpZ|h=V4$_L$BoS^!P8R!HRIP=!x6wKI>AcFy_DJ|k#$=b^L*%! zu+h~W)qwAVLLBOQYz2S+M2!UAgAUsQ1sPvfDQG8hai%xUZ$lD#> zk$kILI+l0sj*fw`5-m}AA;7kR{B{f{q+1=+RlHlh)zEeUMnfPbg$!nD0;scae?s-8 z{qLZ(;uCD)t~`OCG~HoonO2|mjYRa>0=XM?M{l|D zcR8&pxCjS<9t^ft4TrlG{F!uRV(vJUo!5qj2$^eT5-lWbGBpwX~H=>$G)iM9na>q=P z-fEgEOFtdN%mWNi|8>m;tJYrfr39MXW9#v;yGPUjL=~sMMFdDJM=U}NV{8UI8Uou3 z?=CB9{yeMwP}8MiW(MSKTr;!ISsgDi)&q=t>JHF<&*;J%o!+fL$*C{qv5{{GCj zYg}#wI#wXkvXPicAmC)&#&cdg2q&WQ!+dA<~E$pBW%0^`FloyX}wP+dWp` zPQdB}A`?f{cY5wnQjYSUaKWOd*KSE6&$pGG0`byYA?CLyCC4PgmHzliPhY(kJ(`i< zltczq$p&#<@tSH;*C0#kwT5k!*TT*dQBm?n#s+Z5r-#0j?Dg+)7mc>&0l!gIhL(08 zGvClt42RG_`^V4G2)JZtb8kSCo7=)FV4D*J|W-MQ6d8p9y_Mr~Eao$Y0j!$`y+$kn5^0Re%|e?B$+n%-~@mOaG9a z%|aKzZimdOZ4XJ!%0vi+b(2L*-;E90YK^lASB{%8er028UzpqP&wWf!)<_;kl1S~z zXfyN)xe~eB^i8N|5#TTHa3(~FBI#%=k@=U{vN_r6gILte{(=N9KuHhh6Y)!`cId0l zxb%{Jo3I!^NQaJdXR=YDW_G98^KW<(0pTt|1SQvGzr_TU3AmBnv(r~idxr~~U&U!L zxzIz5dp#~bUdbq-27R8x;Yt4sOJgp7w z3YFez;X%eYZwXcSKl0SoRMv2ONt>J870;YUSo`B%C_eVA@~N2;swqW)cWN*>Z%P zl{;Q=NoWK}8X~*)U4!(= z1z++QG{`NXyiZDr09Kswpp0#I4`k6H~TCEcwVyG&t3$>JlvD(El z%SN9jXmqVjx;kP}l?%Zh6I4B!SSBTC%*&YGZ>5t1+FYvNU4%ohv9D{trZDe*5FR0+x!TGGio!kkgRLYq62z;E_)1nWN2wV&{G&T@op zI=tg?Bj*(w%5vg>Klmop4!ahk45Q$E9&NqXc;F^Al%JD<1mg2R>|;H4Y5|z6tJQTc z8b=~mkue}QKNU_S^iR0&C^hl;(1xS)Vyd|4oQJ8FD)vLMXsI?Eyp1v|cI2VxZw)9s zjUIYOvM`v__9@>2DW}a?pOSItSu1p>CBVhy7g;tw5}jQgk4R=O){0*u-$Eqj!uD1` z&4OW$Jf4mex!}9s+@_~L4?vRQ9!J+y1`pbQJyx0mMHxjs;q#Wqh6`CINe4}x7pcjh zZ5LS00(s5fry7R>U(CQ<96}uz(p}S&*b|fA)b|$nFzT0G1GjB4E5IfxW)=c0Kb`>Ocf(Gjq`LLNjyBtg~F~5 z_>b{z5!w)FuISfO%!0F=v$AVb7G+_-(2|pn`GTYq_zI*yJ{VZcJqnmGionWXYJ)eE z6MM94V*u=lFK%qM_jPslBhn~(a7vdbhQ$EK4Nxse0`+k%8eu;^=+BF8jpsJD#dQKT z$LEl98pbu&S-yQ-5m3+b^A^L-8oXUOVkb7cPx$*_n?ve6$=5TBShU(zxjuNTQW*ll zFkQQ|Fa~`-)};L6#C)*tAWGbxDEL6ElW4^4z54OnfgS&hZQuI*bffJ7a`P$#=gvi* z{nQ5F`h*!++&kK9mvTD8Of+fA{XRF=hhew&Fo5DT?2|CgY^CukP%I_P0G~6v#%2tZ zLq0uVT>5Pl2);W!SOMU5wR-BHO8&5TXQN;KFRo%>O_|htNndn;e7ZtS@v*XFVR`n0mlaONiqb-rJEeZ za997DGuaow^QW$f7WO{!ZX+c^sDn9CM$o^Tm{2cw$GdWVpcbSj>9{m?cfXQRHoX## zdHA_-g9EIpIa@VrmV36S*F~zUo3OZ$2RSK1llK-q#@Q3DojuGe^z?P=WA{oMRc?ph z0_h?z(SZl*SeiU6n8n+e%1ssbXR=xKSf`kSOy2^fcXGJS8@?Cl<+o`#Y8A|zbQWIU zUW`?Vav2*9fC&ll{=+de8l}aQv90yK7M?pW?RTJ;wkx-=?NSqj_O`utPJ4J%*fp+a zL<)6| zF0q^9u75s^4w|eZrq4;AR=HlSgL)o<10`2M+(kx!4)77$%g?Yo2*4s4Zvdp5D2$P= z`Za!|i)Q6MNqiyqQ8jtagKV|=c~?w?@!R{R#nlf&v5y<-LxtTd;lH{gBR@!p8IL-E zAV7;DB`GseW=yszOH9<&^ER^@n#9{dU;oeg1UGav ziA1ulU4c_J$w3*>lM~)S=HUu{G zHldHxW+HJw8(f!u&flpuNlgGowSnBd6!*HC)=b%Wr zzO~qFkn#I_F+rd$z`OA3A3I8u#F7ifTAwo($6%;N>}mp5fhda8V2R~9kOct5=QbF2 zTz1)EU9aRt6E2fnRAdlDn-&Vl!Sj<6HBCcu>gw&tpwyixaV#LCpjnYE!?XL+M{ zzh+^DYWpUGU?qxEF-y{)%nlM&_)qn_lPmPQwmhBG@FeC@Rp8}*vn)~qV`@8D-Zssi8Nwx|f<4?>s zIiCu6A|D)vPa_Dv8?PzU5l8}H~N0ohn!nnI}KrdRGaZ4hNgyZ|OhN7_Ud+9+^Rzas0? zC^@cxLL%7((CX=!aUF}*rm7)n(%0j*aAcIWCYwBHvD|ML?d^VID%e*VBw z(y~Q)tk5!}aN9n^dJ$Eh78rjemUQZ=Agw?R9?Vcg9^lq)*&Ty6Nv!b?_46mY@fi=c zJ;#N&DR4`iKov%D#;ccC$JY6JhOe)$id`=*s0#~Ows)pPHxRf!BEz>dR5AUY9_v2V zqBi^*9KHQxQh86Zg zZFn0q@1}v)(tvX8uTA4z(8$Qr5OEzrz!lpXNq4PHT7x-#mlV%$d~Z);6GW~kxBLhW znikfhwB1*Kh}u3nIA5h?UjPkRK1LUr;k;uUe;^+kiwy0i1UfF=w}9100Qge0Q+Yj? zR9cS(r5YC&stB~`KjUN{bVggpnfy%r#^Sg0j6$8xWuk`0be*}a(fQ4N=lCzqji8_% zDz&P)2@~~5dUu^%`quVQlz=i{+7pXk60Au5BfC{cZ{nLCeLO&q@M>lnEcm(A!+d4{ zryY|NGlk!3KXvuX8&fQ-TZz`+wGWfCkOeZr-Mg}S>M&J)#k7FD3ls#*a z-R)hT43Ud`1=d4C3`o1P3jNC^S$I#SE_)~PuD~sH?c{y0F&^LoIL(4}eFtCJ4b1nq zUjeguCpTVC?B8(oO243Drd&4D-l5JY+$TPY^hnof`qYivVWiQ<{C`{k2NQQbwiifE zwp{qHonjToaYO$*^Sz9k%ex=5Z2S)>*O(3%$YSEB5(6RRlaS0z)u_bZNAw9ULV^Z+ zJRnxD({Ni6BQ9%iD+`I$~K;gz?EF|C_ctC}Wu zSgGDh23h)`k~lD3E5obm9K!mFNg-~8Kaw}%9l*7pvm6MPP<(n%BnKxHu0>S0ZL*Ou zTnK0(0BHX#T2Cexfk5~+VXM(aWG!|Fp_S*e_dh`cjefa zC7J3l8!E#Zqg>M10=l}^CP{i?B zXkpbcebgZDQWK`32zMQo2pa&?J50Dh((FjeC#Da#EvO_Obcfv&it{>0*zrB9>oPmMty0dYi+-?~)r3fwvC`H^g+NlG#oB&fre~_RXaL z_8aw`iyNe5d?cHmP1NMaCu2#@ztW#rhb=UJ8 zg*wLaSB^%#r=3j^o9H{ktf0g0qe`cY1^De_7QZr;?-#R~x%TYBM{6wyuU`9=e)B*s zMUiVzmRHW9I38B(O{r%-6{XWYHHW+C(2s>CIA_*=nb=@uf4bI1&0|L3uw8)NXC|wv zVB^=fMcaj=HVt!?RVfPp{P-`>vge%VoDN%T{pB6^^|u0?no$>DIlt9fXJTWNl?V;E z;OIL1Duir%7BtEg?4SelooHsTtmh^#rKFf7vDD`(B7bZbSn+|UQ&LiF=nO1~=FoC( ztixCG*tfzv1hAbQ^Gnc_?e!rs6vp6KQ{u__Iq4F!vjB8!NBvBaH^ zwC<*9wz#J?Sr%cE$5NJoZiu&Uf7VIyA9{X16&8-p62>@|_QMauDBI$8EIKsMDg<>Kys_?s@edVjlzsOw{h2Ki9 z!m_h{s-f3tk7I>$6WQ6>z1!1Tb$dS8=J(Qi|Dd$Pr;h&~HuwkCeoKGd4;p7*08vS919&dt@2q8x!o|DCbL}Ia8&G%C>FR(<4*L;K@=&yAQmChP+ zi-j<}LQZzYXnMOO9u{(s4W}^Q_McnI2gZMq!pQ{WQcg+k9SXO&EUF8K6O11Jh0Lx= z!EY~eP|yd^+6mu|o%IM&ypQ!kt?%yq&}xo&c8y-$*%`Mop{DBETj*pODzX*RRDtG| zjGniI(^18Cd7DU1E5R>G-TRKo0>KWu+)vlW{`JH6o#$dm{L<7Ouu9}O{M5S8nDI7H z1T^}?b}N84HqdH#F&Uf^eTEOC6x~_NxZsH7w^4$*gq_Tlo9{7J zLs3;=mDg*9Kl2pkxmz{R<}|7&6`s_qXuqa(z+E*0o5c;lvX) zH?=zG+fBaW{VP5|=PHwR{6ctMxW3(XCLnfBQjetdJ#!1|R?GX`>gQ)|3^NqgZBjea z+S=N-w@O~G8`o34`w;7BNb`p50;<$ zQmkebA1#D{+cf|R5Mq}Pvx47aS0EW@k}9B^cgia4rLUazBBzR`-(xqrH0tR;sg!?& zPrs`sJC!w_dJu_t47~S5JUnfcMa&J5v9SFV%Dcf8$?la|xxNrH=l4ZRy{hoTmfP7m zLbIUIj5R{8tU5xEbN(ta-zYR(x8uF%9xZS-?&8#`9jbI4Yi-$n+MG($9XLxD*Ru!P z;XN6U$DH=Kp{aH+5JM7x2ad01k!ts)}s!O#QX-IN^K37lfP(QzDj$RB!%sv;*p>5PP~7sS;in2Ifynk96aOc`157p@Wt`YW@nDm zSu>u9--8^@)@-wnEVQ{>KQk*nH6;7+%e?-b+xxAXSS#%47WvzcG`|8SKbBg_SlN+a zPgK`5WC&`H@H~xOcV^EHGY6by;z1B}aMIuKOe%Cb0!j1+@r$+RD@rIebq7Zepy!1r>*{oaawzq*Ef zOtWHu6{73`cbrAJ_&GWNri3?iKh|7lrV8wh&~}@%7>r6kT_4A}jn(k&9%au-nw>Ir zT-C4aHIM!kcD=4)xbfITSoH>z(L3v0scTR!j=p2}Yj~k$m_;Fj@|1dXi}3EGRo45TcDcMh#<7x8|Hc#^>%U3R z65iEq{pDUS6i9|Z#e6%==<}}ad;G+%t+E_KP>@j3=Joy)Ltf;iG?Y)uuqj1LeT>Iq6 za6V$N{KlHyy^?rRwn`_C{NM4hg|jQq9!K)Gte z;egz8ar)C|_5aEORE%AK(@y|^{hi9fESdZz?vggDCLP(@bVtMqi`aE^m*?b$MPVJO zjG8*L!%M|INy3>LCU5K2zWZxerUCeXH>+Btb$~NSW=vreuhowMoUhS~RC;FdoUoq?~jC zm@h{^YB!tlEN+36nOQp$>Ln!qor-N5L`YgZ(&24J* zFMlx^TW8oJT8wKU0rNySqW^;o6sNQ?w-zi!NyY&o99M*sfLRy^?1kFCkxIfObXIN?yT3{PE8> z3zN8zu7w~&+BRCZXHw##H$caEUw{=rixMWSo5y&az*`Mvmy9AHk!PQj2Iq7CZ$|p- zn8waFe*ofU#>hI>FZ{*=d4(MU8apJv*-t@ww145<5pw(f&JCLdFTeLG|42s+1dD$; zeUlew4K{t3fMF{?cfIwZ%=@`Xg_NHYK)ZPJMk|;~vI0dLvnuWB3kZ_{5%W)fwaRARJ1O*fLNE>fgI5l)AAK$2+APG z7?{|9L?ieF84JYEZ|S2XZfxS*!5t9;QU@TkWG4u`A$x@q+7`&Cu-+d`B}!rh=RBsL z=-fwa@?&klnlpuEU&kZ_67v1-K(CSQ92(f}9iuC@A2adpQ*Jl;H@28}z3wcX94J9F z8&}Np=w%{)jM5xpgVq|AXWB;Q4xaJE)bEHVJYhd$kN&dx9#QDPtVIJ{n zAtTvC?N~6)aGAYfMwteC9IK{I=2KL#%21E+HA!wS@vnZi6 zO)#8)j`11!9KTpNu>jCLR8oxhANb-wgFn6fg_EZn%mY|#395|!)6@%btr&f1{Qv!l zd&GWV`&Q;&oJKf}+U+waO#r3yNqB*`kXWKz;T0UKV&2{#Fo1;jCcI4>C zs+n;FrGs>fO6h}93(a%HU;q|Xu&{i^l{UI$6atAej}QO;wm4RAfQ1ix=6*X}c=Dgj z#rQV@Bj9KyEkrO*$Mt;VE><`-&dSa2B8KbD8QSyjmUZr3W1q0IS|hhDhS}rwSHJ16 z?!>V!HQLDKvz7B^TFWKf$MQ}J#;j|%FsyP!iqQHpCS#^ZrdK9brQD`Mpp*a#c4$yo zWskul45{S$%~qD|wHZ!m!#E5lVU+hkFJeQGfRqd$g;j%BC@k*u@9F%8ghY-T#tvuwya$K}k-D_}P679eV4AO} zJ^@dh=taE*9TT_rbQmF{YhQ|-3Csxk*X$~kxI5VJx`rF|`0mB=OO`w+=TXCv}kqqZ2NZy@2>AsJ$KI%6NdlX&7} z2&->D{@B8i8!K#C97v8T^fhHX4mu%uHaxB4nEq5{glsy=A^X+2bC7&sQaT%AoenXje{z{$^_&jd1Xi=t`6Zl@(Z%k+Ud5-^FDPd2vE^ydU&5Mg}J%H9}I+HCER~?t-S2G2)9H>7b3CRIV-`Ra^^$Va6>F?vB~5^ij+3K*nf+e9twprE zE_gyMzkB6pIhdOu{s1k@H5KXDT=}g6+K~S{6g47Og7wCvVe(zR`Ug$rJ=WMZ`I6=i zuc%FSuO;G7MBUkd$g`$ezKvUnX&Pf2d`bR|8uFb^T2~cqBw?KEh3E!sCA0<8CTg3J zE*wZ}{!F@BJMmIquLG<*nbUD@q}VD9KqU=fNGh2W+shP2j$m2hO$*6CZAJY0AJ$vv z1h1KsMYnfC_Dzh)y`IDr@qp2lk~=b2Yy%`|_qK+{{rLFMO~!dK`IUUCYgg3hQo#U~ z%3{6~Iz|O9Tn5^w)!*IvgC`bIfeIj3$><(dMSBc8%n*ACVI|f_`YBfA7VfSnAioyH%UR1*?qwkv^lCi^es%{eTjmxOo~@NJ{TxP zNPGq1fP^-89H-#X$OqYi`m3uOo@rEM?KmYPHrj5a&&M5uQ0T}A5k5`He;w*icP_F2y4vR!L4#b8VJ)C2 zcHgW>2p)X?bj>|8a^;9W57dFJUliGo#B|cTs7-z&B$j$zB5yX=7v@_80s?8=UM2hG zs)k1kvb;noZ(M?CX#a+o;AegbRnU`W)PS9QyCt@%+N>$wbtY$O4Cb89h>@+Tsi{fP zM#~C3L7Lh{vvolKBA8?d{Oi}d(4e5*ej64W&Gj-h)gA#pFiG4yWrlNycYiSkpDE1P zQ)oV|)=>1FBtrmX3j~Ys2c|B9-z1;d%AShYt{>k-io4UdO5NaMygaIwxL8M#e#yhB zxzjCk)n2`s@seKS!{L{|xbr7k95VV&|Ee){#SAlLEQe#J^f$*FMXqm`D5*avIdd8%5VQn6$rz20KKMvu3jTU|EUUUQK?2u7Kg1oZ1hFl`1{X# zCPAS1506`(NC&t@9PhOg)y-m`L{V&^$@0QbT|qrX-jjkiAaDs!6oJ?LJ@3#`_sNh} zI6v=t=IfntF@dC$n*LDk-n{;FoAsh&LRt|oqtmxdO{_n%@_JV;|Ao?*;@(gheFj>hj7hI`pk$$_+R8C_y)Cu7oaJ#gLUH>}>>cKI(VaG;(I zpA;q9@6i#B-?4H=mJ)8TE$jcg)Xyb;rAQA{hWhH&V$8(E`Lsf-dIWiLkt#>KY$2iZ zT31Kl>UZ?Kc9l6|MvRn7EohSc&B4DK0)Q)3;@SQKoiVolfcv0CkQHxJoQ#--UdC58 zJFSYCqS?<42N|}?%1VqsfBt;S;r#adPl7%=HtZh?0H(lDUbR=ll?a1on*trQbIdA^ zY&;{mBTQd9m~kj3-h`zx%18P%(tblQp#FAlM+KStbUmsfKXxYPZVqVy05%y+r|k^LZ-?xNcyln=)N;h%$;zA!Ka;u#;0-dr4x zyl+lQ{%)^3l+kyOD(=3iF(Gjk>HD?CtVH$3+MHR5i6VwKe%kNedj4VTNjFf4{j&J- zF~Kia{nEEI^YWOV(m|@{z?3?zelFegCAkDJa;%%X*ksv-A_T~F#XjJu7=M)Aspqvx;}-wv ziTUG7PBi+=VqQ2+eBbqymE^CyQ0K`NQIp4ze-#5b@A%wkE0sH6ASCQle5}g>JcG$^ z?~(Kb)`t7b7ojT#=fSN7mdqnoTKv~C6%h7lPmo=T z$a(|z5Q@tLJG?1ly{~Oljf&Mm)p3`MGFwv*2Vz4MhA{^RlY3bk5O`sh^f}-B`ZdRh z)~pW`GceKlrqrw2wJJuQ)@Y_(zQ6=dLXgMUZW@mJgUl^nn=l6QNBpmDqlm30*}uAX zzw37&uzCk`k9w;}PA3Gm`eix=mSwI`X>Q#S|9B)df-qMCLm3~XT7WdrT!e^6gwv@?B72xvfWEk!(nFIz;i;!kcrzdnvdfRx=7{PqX^AP)vf|& z>cUC=?R$JlT5QxGtdPH$`8=D3hm2@O?D&#e7S^wWG(${(&JtrPfwBs?wiuLjmr+HV z3FP!oN7zru7i=#YtFmZ!N80m|iBjv)IRi5C@nRFiQMb~bYjp4RC)ziEH0Ee;xv;=0 zy!)qwZ@F;x8hfe!aSq=aFbTB1o}-7)F+H^&BCWYcf^myZ$D+-8RwXJ6#QWA6P1*I` zkNxCoA!2Rpk^XrD0e-O3(a&(NRy&p`YzA*tn+(qY&6UVV2BS+%fSpi@mt}<-H)Q@?HYsOyRP?EVBSRzMh<%bRhVS z`R2i-?eHdt1kDK_4NXV!`Amd}qgT-eo-FPMh=~9QSA+Dqc^jxn?|WVts9FyXmUHx) zgtiD3?YD_Z?5`|)&?pEgFi%WxrDlYE9@Dp#(2ng*4a@X=i_9Qh7q;ZKiCc7tF(6|{ z>#BVu``ONK?AuK3s?A^G=SeC(&?0-%zq-FdxhLkoZKbMD8BG&N^6zFov`T$vnGB%F zMVNtAQ1rm_iAfHxlvOXNoEzsP?V0Dx#h>7=Z1|#6E=M&_Ht$%Y!IUz;)G!K7h+{E7 zksha_X-U)PeMh4%LvOm@Q_Mv18vGLe91@9&6%}0f+9l|lJ%j)#6cQe3jqP8QzVjfo zt>TJiL0A5uqb${x)q~7^1w#_f4PCJP2#CEdnfC+RreC}{wo5WBRWu;!I8kD-&j zTu9O3O0$k8(b9A{T>0A)e;=9!5jCU$fsF~N)wEtx*TG9-YiCQ76r+afL9$|px>|je za>K5rh|@bp71U_>gB)G^ zlXQ}-zY3{^r5dN8Wf;z=x7vbhh8~{ncqy@a^7N^x6#}w$7S`o%x+91uA5<|Qf6-1Y z7CW9ea@D2j55n8KOEUT{c*9R4Ir%XIA?s6tR8FD=#T(x`rh@_TeW}kN=uip>b@6o;0 zlAYSqn)`UD&ThMgf*>4}MzmT>`(Tf0={wowOCJz^AB@!JfW3;)jTn1d(z;l=x`W!h zNzd;6OHsyTuW$bn?KG1bKQ-0@p4<2lIU?c@erIcI>ue?#o6$v`+CJ$_*M?t%KDZe| zLn;R`F%LRK`G+~K0J(WVR)Yf!9%i7az0$zJ`5mNyDqdLimxpDcgk@TZ_x)w23sojX zRFoFEm&M5+UE?+LMNV`e^{i@p%Of}Pa{ShH^RyS9-0QNHjhDP##8;x5M zcT}!2xd+_07lGp21~%V%Zek)6#{Ds7h!nuq`M`pncixuG=X5fra-QCmQ8!}}Y24Gn z?3~7IDsg5f$OrmeZWDF9#7jMSD(xXRb_KQyMeDXN|2|HUNR~|s8ss~_QZ&rYMmE~q zm))O=Qis5VuU0Mu`hu#Y>*k#Lc+KBPPae@nG599tcA|bsJ15Pfj$$X=)rxq7K9QUH z+VUt(Lhuy~h z*s0Ti{=}%dfoh$3`QK;9PWANIm^BIH*G@m3DBaJc3dq)V&{lC; zs7x(?Jn#9L14UMY(HY+9zg)aLPuaA{-wP|w`zaTVRh*6u%NVo2^4~M)%rSN6>l+KO z*p#+(P0qSPH41)2-aV#~=@W+bIG8Z*t6|^KGP8$R^lYNn3byn31X<6Al#dSj6(SOY zuQ1>a z378jI4E=#>sjnQa3UKWe%a`+}C+&-zIbv`qzeg$qC>5)@1BLmq2ShCEmyj15MT@%EhmG4Dx@G4J#06)N_v&7=mb?X<xI0sC9zX^! zZva1llcl?l%^_%7GU(2fcaltIFOAhX*g{D=p5ol15m8iS{ zk5aZm@d0MR!=;xb)0AV&SadU;l>kuxPI<~+(8Qqwi8m~pDGajtmR>tp%8Morp@)o_ zq$JAYQZWFq@JOY<3pPgxush@Q z^7dHcOCYyZNMT!3R`E3Y0o_K6u>Qqgcb4#Gd-LsocYU0C`!VjGrR|xS`ucArMXB#D zOXvmg;xe5m^Lby63xdDU;syoLmg1=5?-p-rqi3^e=J9!w1|N)lXKa}7T=uVAC(V)@wUk6r3! znX0|<@GoCV+RDDFQ#MNw;Tb^aH~onoUi)u`!ZBh(ZFyGOu}Y_VTivK|gHOjC_?!Vk z!lmzG(mi0$IKnHoK(#$9U=iI&8uL%oQ&;aZuo!Oi$&$AY?_8V(b*)@_$IW3WhejW|;(sQnWyEcPlQ% z-QC@-xO=byrMMNRxD+YwPNBFBJS~v1N;5P2zEDH z(UCffTK!U?^?|w!$75~%qp_VOWaP2yA@pIshVNDdDi>L!>4(J#x5PALT+{{}^2a_8 zff^@xPAn1EpyV2bwW=b5Z+Ne_CM=C%dwW%Waztl#H*5$@3HbX-i zFxY%j0Zv6NC+L7gKPY4s)QT_x`;eMZBPmar4<7Y@MGtp!>RT@103xB6Fa|Iwcwq+b zp9uvZA^PPMv`X>98g7)pnbd`FTSf3DAUEsW49%KMn}kxXzvkvCerBAAt=8J6F6X;o z()?*&AV&H`Ff#-aLA-QLz-WT50K#ACiUbe~@-@;GutBy5;}yU<>`BJ(3fsM0F7wh0 zxu6=Zz-;Mhh^QTld{TpXw-5(Dm^?~R8qWcHQM5|0N#yXm zLJ&tp9z1ID1q&=&ST-wbQ2XW78Rd)hsThYeL*P^ z;*zKsU)I4KNzoC1lQUsSlBgSTVF2=?{iHWDWNuT`>N0t>SW?m2<>s|?6pD}AH@*2z zD!Y)MVO&|tj))ghH?&g&(SZScJwqSIakH+xH6uBdU;D8s#Hlan_)WDfm&hLwL0Rbk z{Cci}QvsrBxJ@$8_Mgn2o7G;rkSm$*Yw)#ioPV2POyCoYQ=Mm#FkkrAec!nKL1R>q^R2~A^lV}ZCybC{G z3*pKO*@!C5y8l_x)-7r26>r#@TRL<~<5@@O-x;)n2|bfxJ?}s1M^f0km4^^#^);Su z(dff`$k$azzcmUMA~Bu?gFX|Hda-Vmj|Qt^)(`U_0PQhOU4Q-9<>d-C6g1S0RI0Qa znH#en1*WW)imTk)|MTyZ>@~49j%|YD)0S{=zYn^DYazDG__?2<@~m)P+b2naWOk>& z;GY~l23BB1ly~y`AN^YY^jqBl8svfF#m+P#+Es-G|H5QiJ!_DLEyL#*hSOVv6w z#jGBUY(E=j|G7ODgz1VZ9aAn~gWOj=^0}{XCH+0YQC}`=($fn5I6-Qo$RwVy`tU^3 zJi>~`9|ZI(UxmxiyVU_bhym7(TiQ2ldavE{UxV2${ZTdqA1?xNSq5|4?cI3K6ucI| zYiI``VVI}I+zIQ^xwU8OLKtN=jhcYC-g%_-rYp&xXUwwP*f)yZ;2$$PTDP!c!%0M& zI_za)%I4uoWRU+xX1hTikI;(sO<`|-5e#-aXN`8PTSK?=^#47<-$e_L6JjfNaxtHLpX`cxK7YDhXGFD3l}y z2cUG;sO3<-L0v<{s29%dh*mfS+S<6zqUjb=coAoT=ZOa~C7Yz)~Q_)+NJlj(n4`cG$Z;q>M9iSJyi zZ++=Eua;lzA7JmoCI%dckiym~Z-MknJ4CQyj0q9&OXy2@o#;v?0QZwhJcEjI;*sXu zoTkvZer!@igP}RcVm$nYVbut1&X+Aynv+M>+{3SD>a$(bp5(R&My)1ufeR%|fE1=3 zIe&aJWjY}vHl@W{F{U_&T^_&A{XcMt6BxWQiduwcS*Lt@nB!oJb);*?ox+0+wmOk-^s4MA5J zT&4`p!4>FDz-=@6=mHBY(;%+Ko_s88|vay!e#VzhfruS%A>R4Xknl9ezCvDc{Gw5(IOQHQ>p#eiB=iM3ns<2 z{FOF2_Apo<0R=K)fO$jl;FsXwNstYc_zoGr0_wg2=qphHII0SmCGa<(2Zn#n(rBt} zz1D4iLA>&JK0AF{Upx9In2-P$Q!S6>?r1RCr2zEhtwYUaJYLEoC`K6c{Z(lZ#RK`2 z99D@~LYocSOKYEvSTK4tFuT7#I9NR1?AFNr^1JYgkvcE2GxPSmyJDrKWfr@XF#3MS z)(&CoGKHzQi1u#18jwKZtY9*nPqMCnIr2UpFt`#K08-iR9ew}D;1d8~E>8;6rr}?M zv`NIb$HT=QDFv3f8G=UHX8XQrqczp_9fDA<((GkIB zFtyF!pcge+Xc*1QwC=_T7zG%?cQMKjWn%-d7o^kTBAa}1;OwvoO?^7@2W~tr1=ckD zR*O<-l-6jJZ__qu32eVN=7(;$h7mo+bRXW5kQCZx;&M5O65egnM>~iKFEN5}hkqhk zwNi4iB}T;D_eA1wg&nZWu)MEz4pzY--dGuLS6%+eJOZ^82>*tAexjTipH}niF?&aoA#Obc&j2BI9 zMJZzyCZKe+wCA6rv^eDO^?x^!3K=~09==`ATFL1sZ$9E$`G(kd@&m^5@=q7i7;=;5 zzo)|CH%;G-!{va+Zfw+bmSQz*-lZh^9}n0>)oRty#ftx4KRh~jQdCyrX2rQ^*FyZ^ z;qvZXiJJrkgK7t&p9UH+mFc$-ix3J9CY)HHlz{d}mxYA@1^}S8u@sNqC0b9m=NiNu zOkIZPXO{cn*PpILykvVqM!3sL+&pNXIBL2R|E#y)QLaF6K5Ty01L_ZcEn`}9y5-Kk zu&5B`yXBu$<6i~2C=9TG{#LU#ogKi_!K>59~I-f*bZ8WpP=D z-8Q9fCoaV9V^nQo@t@Qz3fk8}Ab*fZQ)5y0sR265+mMw>&3gbC{kF$FWRm1Hd;S@% zH@1C~lDR0_;B+MpkM`3%at73&2Q5@A-JXJ$_Is=!mh@4ynd$X=*U~!oTfeL@6EJ^AUtzrP-zhs5 zY!WWAVLml1m&r0%PR1XUzo~MSwVXQiQ1xxdF@g2u9w6i*O3ra)b1mcKB7fQ& zfNZjxQydD9m}8$^a@P3xo;^3rK50beY_S-S0z=&Up`S&Vn|mDeV6uHzAA-Su(v2zF zhQDBaM1#=scvk1ticOF9LLt=1fcO)&cwy zY;XWhM0jM~Q!gWV-Yt0|ok{nLG`*yXNY<9g++p-}9P@~8Tp7!pjFR!gJI={9@)*DKSlS+l3Q zrhRQMc%w7MB*2fMzRBd@6D(CF!onn2W525NMCPm}csmhH@qt}euzP1c`mg00CMjE0 z=mI|gdPtFniwa|Db#tEAHN=`|EUp$1AhAZ04}?l#BH3wsfDN1()^T zqMgN$A5s1_Mkije(!7DI>)RLF?pM9#%`X?2}*+Mmjd&hric2 z!7KT%jN$k)ZVT5i?~w6W`O-plcY8a#mXK-gh>VO@8<}bZF5=FSyT|8=3f^KDkROB8 z7d8tIQxnGJkZETchOO3SJE=M;_HvIdG|{YI>znMuu$brS<%O{^?6)*oW_exI?hu+D zk;no)wMng>)2Hjxn@WNUkzy1BE79;sjJ1c;FPdzr1@@WRs69g|&&UHqMZ%$%76~-; zwetEwe@WYSVFoKQc^n9H@JpC;mP_Wb91M1ELYrMT>%nYxw4ul2>Y7Z0c7d(!`a`8S z+S(6dY&G-a0aGfO8v#xs5UUUvaXcW*wgXA6Gn{@|Jmujy$~;cmWs&8c?NLqRo-@;A z$^>ntmP6sezl!Y!4yOEf;IVum)6Xh7m6@7*H9mc7`WO5pmDe`7L=!V=@fwpJy$xZ> zqQ5#!?EjZ3(RuzSdB8DsbT1U*-3fsZuNuigWHWo_w!VQ$6NF%kS&Y76iu&*PiJ|mb zYm?IByyqw=mjh2CE9vuz4*VLZ3O&HfbYdb@4yzn(f^w=ZTCk5PlA$mTd*LCrDxUps{NVgBW0WrAu__NW1WF zqz)=kP8OjTRUgGA(aJ4t-fAqxzJ&9c-#~#l4HEqxY7a z>}zH`o8G90)S+Jfboq+^JG=q_P-po|ptr5AuG=W1fsGyI-`>fPm30HsLxtAB9ELswghw`b1c zvGw}A((b`Hi%SMGJM=~-waTyF(4~5Y`N>VwrugV(?R)Nrw_tx~Y$ClhtLU5?XmiNT zW|8~lr&Xc4`p?D1fHPDCyZPs+h$-w8#-HLw5%Ohl^CQ*TI!Nw?N|lvpYQs*FEOVfS z7=V5PV`aV++m|QR2%Vav|A&uPCF=x3wZ2 zHzhac?T}R&a#COb@&gczpmaTpd^hXPgX}%WS@RjFTH1-)Bh+JK)BFB!skm@)x(%t% z2)(a1xKjJ`NwIq4y>&pxR}~Sh7%_cHtI~BnF!e=ZhMg$-}9E5*{VCA{;29jb>+m-7p9q>Ar`h1_e ze^arW=HzrboyZZ^X0$guw#mE?IaT>9a|ulZV?-x#ZmNZaOH+u0=i(in5DYEQdW69& zon@rr${|W-cwbSkS%^N;ZC!@;;a4Y2d`RAE&^5eebI@RrhE{dk>%j>UTC>_-HmneW zbnrtYXm#$MF8p;m#3qS6rfsQPD3qO|S`2VMm?f6%UN};WEbne$n%jMJscA(ZAA6em z-2Ei-HSmo)D%_=;c{kqKNc9;lROF^8&wcQpVYxu=#E^n8avd|&_}fP>n_-i6QcljD zlG2h9gF8Q!-sfD|qDV{UscjfaKuflXIu$-kao=8$p2>T0W+m<>r?|(-m5-7SFiuTJ3u4Mh zvHEZA$`6I~jHPydI>Ump5=}kr?%l`Kc6o2u4KDcRs~esgwvKr8fH`rH1Bt z@5#X{qw%5h&V4KV4-a-e&y_oQ?_x}UgbTbJ?FMVccfvj-6k=}zapqb7FFY4L$erR5Yg4E`KN!&Yq2Md`i5}@;)GJo)JhVx z@=@Ig!z==&zVv?x3N-p;+!5hFjIh=N$~aAp`r)`aq0A#I zjPA!j~{*+)CaV0 zH2VMP4R%ms@D?AMnb%S^3adqwj}3MF`5Ep(lYA1{SAJV6Q?_^t=VHF_dR^42mE-O4 zfN|M=$XiM@JUJM8U~xxJc*8J6oaBndTS5rTWJad+7QZI9$ELuO=mLEG-FQ@ky`I0t z-~Gl@p(j+OrB;nV zw?$sNg6T7`i3gR!I!JmGZS#tEAlX&<%VesT%=2hO#jWJ;TWaidgztlN;qJ^u3^XIy zf@I!hHZyxd6HqVvMFE!XRc{7wykRIsoN7|j(AC@Cy9-Z6)-K(ZgcjX|KbZJ32-4fd zqL;aJ=hHi+!~UVQ=&B$OZkhJiY!T@#RBXzBc~@jXNPGLm)KXC% z7|H-j2GB)t$a%ug{R%30E@!;O5&y-tT0z7DXiGxPg%aAJPlu#bzQ5MjJlJSm%sn~* z)#@s##pBHRORJiwruIw<3kseH8E|%0>$tugh-_e>{Q|x!7YOqO5BaXz2_R5X0pQ5} zB#S%5RwvzYc~UYOD$8^$NiMl_fiIEYqkgGD~emRE7DjywFmFW z0c}GO8(spBm4CaxI_ltvWJ@0T>{_k1`zQ{?CuiD9L5y;6qM#<>JyUzLPmE7B|oYdmAERt4<$UOnCA`vW`(lFC$wYt2(@Wa?WG_S1XCM6ol zjAQu##chycdbyF% zhbBok9m#V6J4vK6D=;zUxH?0DWj-15MCF<^V9u;D$?CmjM8Y@liujxO9k62)flAm$ zC@`aK#+af?%l=N>3Uevz?Zv&5)%jpl&Hn(B>>v&x%w38Zv?a8tUf3yoGUhlpSLXC= z7QJ)RI#RgBVRYJ}`e2H}#L)UlmTZ6naD*2KsAwdWl@JiblP3wUwRdGx8;(|{2}DaMR&1> zFWsesC;)5(sJW#|&;giOwVhn2t#{J2XvfYr3(iWM=$fS0<~@xLh1Q6umG%w-eY;IQF@V$99IW=5p%JR2w3(pZ#dR%r0yd&E_8XW9n zO)^)n!XFt_r-)_;%3XloeZj-Jh)Nf$SVAR;{@QGb2i7Q!;*1v{S$*8KyH5EF9nk;$ za4$3Bw)<~K!Jlx?77wy3J%7$xN*+KNmy=f0pVndW!|Osx2vy*U2{=p}%%D#4GE6Cz z^3D?8Y-4rf{Bbb_V5tXfaLKsD2(_JT;_7$}TkM9gZ9bsx3TkR-8Tub=u2(^Cy_*Go zF+4wdOPbz}vN`v+3aVv(bp*_#U|!Qo{R!tl`K)>BzYINuk>s zlDXW9Dq=o?mL{BcnfECW%-!4D@mY#KC6)Ra;vnO~d=ku@rkWY2s|>s44_un^IYsct z0D`eXgtePe@(JQHW%t&OYIs1KGof3Rgk(;c{e?!=2pY1n-?r2)KU?C;eM$~jbTbkX zqzPa6S&;?7D?k+93A&u8G#4|7Li^Y9(u{&`F!HhoMU)mHvrC_r2sI?psnA*gXr?H% zsTPP{2>6EurbY%KoS}|!ONQ=ana%sZrD501%x~Q1*R`pVC~@A6NS&QR>!@pwO$i^s zELTM`Bwi2xE0bBtcUwi(Zk0iE<+t{`(o&Y$39e;N`e_b<#3`h*wE)XFa0c&*ze3-Z z+=E~t4&QaOO#9u*5zcw99Q%tfq`hg`dN}ax3h`BY!u{53BLu!7usIp)AKOpCDpR`E zgW+PwC?swH`8gmvA4F~Pcoix90vpO=`;v!E;HrconzpSY0rB8)4hUVnU_LVLdtS!n zAfoWgSx{q0Iq^sN=1+8?+B+6M-(f$5Bx!nR0v$~(7)H-4Da`G_ivBK+ua;tfY0VHp zk;$z}g6z4%w7|1|iNZIv(iRRVQyKXNUiVJ?k$Kk`Hsm_($%G#V&ADrqIlr! zT+(APZuS#yh`vq`60eK>pwR^KFkItJjEnDn80?nM_WwX-{Hvt>j*oRw{;z$Y zuS=~p>0482&5GasfU z@q0a9trydU9rvWg4Elw8zJ+nobbTFodFUSRn{1Ig{YTpc_Yj9RMtOA2ud)#BG8<>q zRcY&omhUrq3QxonYqGh)TfIyFpN`TqdY=^Q;FC9M_^hUhn4y%@Onm@H{97}{u1bBm zT@o2vrbM7JWd>XUe>9)YcfWKr=Y`ik+eSOu`K6lQoD(ws{au^fgV#=j^O_Pq#Jr>#r{0_fa z28a0>_9;Nm&GuuVNHLcrv~Q~yOHP!I-mbYbT=daE zwDpa#R4w$|KkQB8n1@Bm>60Snn&#l^jZS`zx4M`K{19@7S8Db0P5W|O8Uq8Yr>Ap) z>qM2=_`mGc!r0~wSVuFJHe~~iPrVI%ZC=p`qE{+3$@R(zwvs5rHONr?!(f)}pgrBU z#`qY)h>DtpAKFNa#Un5K)^{8UtJxYuk4^P2-VUx0&wIR@Kl3&(bvy!p={z4#-0|n# ziw!bSu6r7vhhV2H_I)E$N7NH%e=SV$eI*Mf0NR=-ubfYT7nqWZREPcYe_8? zs7Wj{CnvQj1LS2W$c6p@@gY3eRfJp7juaR#5ymyLnc3li@!;LOsy{ne*8_;Z=ov`^ zLWjC7rXV$(K5rIbo5Ye_{`!0|=`>Ma$nS|#`o1by_KQQiE;72WUKWbPDB7*Iy%dT+ zEu18;w?YzulsNFT;cm$T;mEWA+XAMXhcJsqQY3K`_c%_S1VFf@SW9B*0z1QfX@e7em*VTGwbiu&wxVWPDh9b`&uO2@A?mDk+8HP?z z|Ez-)3dhL|I;5n2_w#Jf&M-|B^vL`i{qNIfMF@Ub>mwhkzI^BoZ(ur`imJMcCIqM&Q)h0^~;F zT<&v?h$3lLQJ2`nMvf<1{uX4$tyP#k2HC|&CcF&n4eBTwcE=E=Tf6BkK09EuvF?JX zE{-Y!qB6Rp!Rc3$8y=blf%v6DVQRoTnWDEPI5Lf03)^+i#NGs_)UhP(@QxG0iw!$C z+j_{W5$4G9!x+kCN+RpQ=JfjC>1@D8VU{=hSS!b9!)9h=^$WM$H|vKL%37)3B+L!< z)n>mqg@^lbvKODD{z-@X0Zyt**m|kx@p1FwnwlS9oYTJz7E~Co(>zL$T}9$PQUG38 zZKF)jPE5J#5xtteb(_QIcbZ8Q0=>je)oSUA>`em{hHL1rnWEmb8gSn1ALF6)IPFiQ z^T6)WTd#edd1zmLa_;X*6XEyogQ@(Tp9<)Ys~|1Lbf=!8H9p=d{V#^PuRFqZ@#i9` zVTF0l*+dLXf)-$DKwaA>x}H~_%;W*jc|7pFW}}a_5YK5Ks7`_d?GbK)xJCNz0pEA8 z&{o^?El@wW@lGbMD)*+xthrql-r9P5B`hprjgNIMhv{K$O?=hhM_f3@;7uZ5Bm5=B zrj|!lWGM5td=Uf;vR1|pMhFDN5u!(bi_%2Vj3_%?_;EP0v1NeeO9tN)232? zqw+&QqcC63zfrw8VGqlmJqkeE#>S6_PuxAvF$U9KW{v}kg;;X@p;1&5rBrQilIDci zxaD(KDkRVmP|ec`V>jXLB4k{JAL;VTKhFQ6QZ;yDIjHR$0A5V?id;Q$3@&q1P&AEu zEZ#+7t}|$>u8`T+h2N_#CCXs^0ZBxA8dtCy6+}qb(txX?S?Ovd0hdh8ii^sNa3mx< zjGu2%>rK%i_h1H=h&=-{bL9JaU;&Yn7KM|$tP{GWjWi!n1AyBR$i{qZY=rwt3OrrZ}2^B>(7a76$$^9yelh22~kWU7_|)IXB{Ar z`a^^h^ltnz-R}3$bEpVEk_#1}iYn=UcZknddpn$rQg>8&5IgYpJ9kA72K&LVPTY^1 zP%EEqW&A3bHyPUe%+s~Vi?dht$g0f+N(I>Q`0ex1juY`0JNCzu4GGMTAjyv<0?;EFy4SHS zwp~N-3klWlfK!MV4#-|S(VOjaH-=og9zgS@XhQMCL`T4LUeucchmecq7-nVfF06N7 z+^0<8*)Hd412HnGi-F;yR0yXnjL2M6a2{WBGAX5{m%1CcG~xdUCAt12a^K{W;(~wX z(G>X6A@#6gkAA2QnrcY!wa!?dlW%(03%d9GR0}qxn0*1(C8=wF#baV3`}gVc8dknN z__yOLZO9ht$H!Or3l@joiWKw@QN9pdR!H9cJ`C!HbW%*1BtKg|zYQI1{4b=2O&#Dj zcOMV9=z40e7o!a=pz{NIXkl3b{2|@f2`0elngV16*YVQ5K2eVDa{jqIYBIn0n~Je| zog<;4VBy(|wN2ROU%a2vrs$P4Ib8q3@Cs0Y&mY{vFac-;W5u$r9!1l4HqxI(+aFpD2z%b+ zJjG{Ub_u*-`QfeUFxoH%i>;}=33m}o1HJ=bl>&J}`a`xNK=UR$)RFH?wCv>*elO*) z&HL+j2{5OWdU03pMokixgB_aq#y2hm=xecD*i*0clEXv(O7K&u5Rsh#=H1|{Vgb-k zMD&0b0ZKK*E*)HC;W=eNp%qgM;F_$m|5b_wGgQX-2VR?g$b&ouydH{HlbMHA#9&>U zo5oW5X*2b7l#caU>a4`UoY)rq*?jdXi**eyW0#y{UdlsY5*3@?AIpu4EH5EqfT)l2F+mrX zyo@-5^vZNeMZ#N{YvH52G@LRbC~-6(N5y}`_ctoAziforAW4+~$QP9Gi4083^GJJl zd6ErZHyQw#+j15gMu;-OG!5xVV$7d*=l}VumYBu4>i&zFy-{t;j|jAhfS-Lp5^%5* z?bwO-yLrUJW#;oL>0(MfdDMu4q9fhY7m}VetVF@M^QN9k$xHG>&3s4p2PX!sLuHU^ z$T1N49-Q#WMW;t!YbKWa%EHe!;tdhqc2_8#%_%bEio09MWs zR=H2;z$!Wqwi}ur{P4+%<13YB<#Ok;#o(!jH(OKu4Zy=RPA|SmnPr6%bTQ;zz_nbs zN)WD64OR7^kXokzCft0YIrbVhT?Mv}V7T3^-R=T9Ca)$veYR9`LyqJ?O(g=@Q#5q; zm%t?It#dcLn|31yybpqOy|U#8Wge2ti4RHR#b?m*7?14NOL%ghRA@VLq5t%){{H0w z_U(ekXE);y(1HZFq#ha25!}yE>`ux|FAfF1#HulmKNE?+n!`Q~A@^L7a83@tt{)ZW zXh=`Ic6q^BPGC}MfW83P=&a8U3X@O1OOO6UYu~{S2}JVbhD%LdC?j2 zV!tVW4+EhlJb&P|SH2tn&5PXpnk3PEBN&!gqc}UH;X*-anhD;w%fJl}U`a*}jvO@H z8Rn-ANN-x5e%L5MT`|t9kt4eW4y#-7K7|EMPhyAY0j*P!Rr??x?l5FEy7BI=9lP6G zy%JkFgaJUl(@O|h!E{7wZj13n`Q4vA`YRz(4*Ff0@OHM)ctC)pk{Aku4W)?EP&b}g zbjOao40;bUjQhxr*3-*xfNfM|NfEq^N;|+66Hs|wlK+gy&=sMgV?medx68Dbn>doi zyYpe}CGL;N$}|G<_qUgW*NNvVYTE|WY^*<>kYw^OU4zRV^L z-krC2#$y4f0MY<`6w%9v$TFYFXBE6_h`7=ls4GgN!$YbW1~clLHFq!QNIF7!?D3B} zZgXUW+k0Cn^AmxoU0r4-RdEB9{n%zpNT0}CsVdOPJIel( zcljmn_bs>Y+vA!uS?}Fuk>=@B6H~JK^2t3l$axuvaTZnYMpIr<(R<0L0FiA@aj^+5 z5&XbhOTW+7pU3RP+WrUwvcSLKbn(fv%gt$XZ;r1nDBRW7#{Hw$2dk5C3v(@D64*F8 zyqn-^&QqH11Sc-uE|oTG5%Jj0+16UJ~8|nEpiICFA=7PA=mfz zxm0*S9l9G_D7yH%uX(>OvzQiFFS7vnC|hAWR-K_*OScBn-uX1zHFS4Fxrna-@W?yN z3VR=%RR&2{Yaz*gl_Y`oRRj|zU;!iVR+s41k$Mue)#nt8_6w}PcK`86t5n$~?upML zzfrDs+@LwAXCc~T;LdPIFck){@a+$r@)_ukc6V#V1_RUNn1OQ_nY%I&wsg%Ck*kP7 zVbf9@W+jt}d*99IA$*gf{o8bh@HSGB%#7&L(volO?d^lsmZI4uh2=PF3!NAAkovi^ zY)}yy@vQp8&eCuqJ*WDe>ryVCTVIfUr~buzz5#{#cpI=+7hn1Nb(=EvAsggkr0C zAo(g|;;*!#mbQ)?lMA4T#Qqss+n4o7qj;E#HPI2mLmft@Rp~VQyhWXcG%-jPjjx6H zf{bZ&i7rmaajs{Z9|wuu$zE|o8n1N>6Jn$5xj!q+kf9p3uiYm3)wb^VXjSH|U4KW;37*XvO+tX7y4CDk}F!PWbY zuSn*&*y3>W6qjG4-X)qvq+>;WX@qns1mZhrPe50K<^@=8nhOz4;d_vKwn&p| za*QxQnCj^ZfO&{cRdBgjX!`XpQEQS%^-UWr_wi@T_Dy+%@)~F7`(lHGM#|Pqjhs$T zL3mo|vdBrYx?P>JGPd3Dq5Oj!ndCY<@a{P@2*%VYWEK!@G`jD$Y3^Ky?+M#R@tMY5 z5!YJCrenuQ^nI`PBR&L0C9MRebHaU?Snn@3= zCsnCS>4$-&2QmPz-pM}A@VDJK2gVngtiQIzgBTsjk?>?un?D&P%Ma*6g47N$#Db?H zOT;m=q5t?^KK?(>^6Gt@Hj2KEP%13i4)H|)B z@o4>*LZ3r&?~L|Q+uB#hMNjJoMvto`6~;e21ee+~<7;~Gey-VxuNHzJybs)KlnKqF zzT`d$-$kKMkUMq8P<(JUKl!p5a(1}rEaPVZLZzB2ski8cC0+8`DR;us%ZkEN(7o%`7=vt1{B=m zP5%2KHmqqj3? ze+5a_(nu{c>g=5L88>jlco+UTJdN&D0E@TTH*Qt7r!1_!l9+Eh#`7-$0$Vv*`S9^7 zYtMP)KSM<_M|4PpP$_bp)3%%YcPI(L|7Dnw1fXuog2aU*@J$g$-B}+BA3GT#OKHyB zQ^D?Lt*-47YH1EiOO=kySqTaf!sN?G&!;x!Q}W-&raSzU*r%e-7xIUgLO{k6%Pg7V zuH7dRla$~ZfopOx3t)@vl;%w(HcUX!RjI!TnjUhp;^4)A zY-jM?L8}*xrIE^7V%ikyI0f=zN|MHjJ}BG805+<-CzZzunQ5=YrK`q~`=_wPvzsJ} zGmqN34HGf=I!D0vmBsd79Oc`))Z1^C#U>ec4Ab29>;8wV0{ZZ@x z-lN_oC-oi{pKM8hEEd+9$z0$cA?(ysXJMo(++9we&l0^NEZQ&1-17Dj<|dAgRmO1E zurTI1x7Dm8GvS5j2;mb7y07osJnIe8xq?%sg4=u|;olyt)Yydk`4nAV?-TVt3bUZ^ zP;?#%Iq$>~s5(S}j`(iE;rYM_{2@X-TUl;VbTjC7Rg1s{tfAqLxb&)@QzJd<+=-Pb>s$*c|rmlU= z$e6wuBDJ9gnBdFYOZ#o->Z`EG`4=ofe8^PzHi1S@sy#@!wo4mI0(eqdPb!M{aox6`pK+=x zT}o%-*i?i!_1kCjcZldqm^+cUn?s*2uGsth5eQq3%=-CUooR|27YYW2h^s!2D)KK+ zi|r9ttz=uMB2Ct^_w0;2_)ayk_k>m5Vn+aZXdP1t(TQBj{hn=}BXucXu!-@Hes3G8 zk{Gyp>M`8kv3AR)A4i%)RSeaZR&9{8qk6`^`*R8CFA-M%nQwOeNi2mRu$WcrCNr>x z=xZRJrn?F<8h)>kh-DWbl6Y&Z14@uWJPlC~sV$%gm0v{}^K(f{(Ypv!9x9NGAc?o+ zEq~7WsqYJE7zT4&tA4cE=tATm-po6lZE-4Wry?6uY-a+9 zKu)rsj5dx25v?y^Jv{9!5k>~IOQW=L`S%Kztu5SVLXue6(5Vd1S@KF*WqBxwQSQ^A zY^wPz19Ay`i`*q`R8}T0;3@EJxSsmxOQNq_HejVOLE2K3Q(uNlz!Z*>apq2**hK8P z1}7HRCz5Ne=)rq}?qdC=_d6;IiGOx9;N8nrcPkctp#kRlHEWwxyg^Z3kv2BJG8=CM zvGcBJF#Sv?bjis5TtC7(nx~F|EiSD~+_Zbr-!OWmzi3J!@at@b{hc{*( z>ht-U7}Do@kT6amCcM4|l0e-uAb0LmLCLHC=+&dc_6azp<8XQs39TfHefL8`_4u8Q z5^=*O$$DFgGtN-+>RMp?6^6Cu+KnJ4po;mW32yz=;pKv|6$SS~orW0rx{7l}@h6Y) zy3~ej;`m`vH>c4z@;&3h;XM8{KoM!P<=;qHlOvG$OYtNA=vg1WV1}r2hp}(spO?kD zdg}*?4+Ay87sSn)kXv5X?HV*GO~wnuPF$MC`P>{r*u=@9Y5Ssx^t9PV+|-&jmzab^ z&RpbpOL}0mENt=DZ%FvL(=ZWc0ch7487ZZNN0c-0^8ea9&#$JoZV#sbh8{YCl%RB^ z2uLrXNDozt3PA;FN|#O&Y7nJ}a8N*c38;XIG$DY(0Xg)dNDC4`KqMe721ssv?|c7% z`~B=MYplJ-{IKUO0}A-D1@HewC5$Z=_kS3K2uCT@cSUEosfz zE*lB2@Wg&W^;%BN^$%y0*lP^V18VluoAGDvHK?$5$GXyy(*=cV4!BMKo5B*Cx=rjo zmsM?-1&pGBtpYiN4|6J&>f%Gx7wa$RoyRHR@|NBb9944SDi)qyLA@V<0{#TVvCX$| z$_Md2_6bw4gka{47!6HuOq6xHQd443Xbj+Y80w@R@w=!44?A(0#HyRbZ7xAEo=36$~GrgCtMTX74xcgReV|7@{K-zbvgpoOr{49 zVKFh1cjux@#%3p1g+~S(6#Jed)Xe17kpDgBubvqUzC$XB9?C=N{iC zP97J0E|xz<$gPe$?`tD3EXD!&g!mDy9*`d=_b|H48--k&7t5N8h$#bV(p`U6Q7-WdC>nC^%*)$ z^@?A?a*b?j)h5blF?paBa~tyrEa=m`nFV;@w3hEywJuGk1(_t{X2#$_a%lU@dleb) z=2(LwLlDblk;7V;8@E_7Qhdz6@VwE?_Ro;duEwLs8mxF5j-L^d{U(cq0e#%|9&PJx>|E zGu5VX4!dHMOx_p9ie>OPf_n+|t>1*FW$%-dY)PiUk)|T5Mw+QjUV+PLhJ!F~NAS)^ zaQUBH){JZ5%i~#LGM&#qVie~&E!%sR>pP%OElMMBQ)N4gcdg6A=W50yUVF@4ITzGG zSKF!Iknu^G+46?mPzE8<+!^@aqcutBvmp;<1AE#wvh6s8V1_nAYCvpZc6^9ds(GGs z3Fe0tV9~`e?2TlEOq5)rkKBe$R!wo7MRj5Dc=eVnd}iUs@u$(lCrlzmHME@utBMMl zX;)c+AMsVm??O!wa(hOT-#Fno_}Q6KOcF+ISa~z|Cc_e-VOXQM;6Hg2RCD_BmzX}3 zjw80~+79{5RXuALrp=2dY!ag)?wZCY51mdtU~7Tyo3UWuGu42Y^s70wo=2{Ug@xTfz{|0|Yd2YJ3EJ z$7usO_9OzQ;m(faY0aD#*rn3vjE0Vs@-yJ8?eOYLhM{9x)?OUwabED!)6{`%K)nB< zfVo(=ejZsJ6pSOT-HrQ$ql$Qd=1JB#1SQcO7y-e9RVTZ`qGXGeBqD)*Yi(w zZpKu(_6=nn9Wmacs4(Co>D+mKY`D;P)ku5m$!ud3+rwbNcF9sVu%v<|$xfiAz~_qN zKR#_BmVu&CRhH*rZ1}|M05b&uL!HDM&;g0djmtq5q8Q+X!I@|0Gm0IjWGt*!H8Xey zuhGu(Ro-U&9%P=V60*(IX$?_<_gs+WDd#}DrFP|rYo4aOy`=Ofqbm@$T4NwD3Pn&n zXGbEx?Z2443tUe}>Lse9qarwR%HkxmwWOmY^`BW;>V*Zi6!TIlVxsR!yFH!A?i$^{ zro)!-PXY!aP0gac6VO?IA+dd5=xjDce<3kqr$By5ROSfQAq^dta|Kng!OucUhG;Jz zLNF|Gk7uBdBcXwq9@(8&I9gV}73Z*sxRMpF7UUa-Lm>%7RkXTWQb|Oyqy7NJVOT+~ zUsJI>6SYaM`JO$Y!NJ`HS>rzyojN;ornHK-ayRZjg?%kIfd7TXD9=367vhBOo2Cp6 z%=n0$j>E(+dXM;7?7w2!(CF*Go_bhc>?5r{J=(f>4N7mW_d(5W2F#*2BR2)*bI3X~ za*Qp1@EwB{7Xy^fjd$i|E8xzi7HcuBol9y+Vgz`yB&T8YZ1&ihuY=m5}1jkNtgOP-e_=@>H7YTRj%(i%&ktq>Y)yeh_0%J(>*PZ?Iw@X z_U(;muZ{O1i)e++EHyW1cY*@1JJTCdyYfNCJxpBR5D8a2dUY+a0&tC~;Ix5qt6*K8 zFRl8gvr!{!j}q{=WTfeCp$sqK)#(bUmbXzPwL8yvX|3e+t4U`Xb6r?Wjx|fIzF$FFAa{2q ziqq$SajXN#_87>~e)W~fQZjMyIv^Ji#eT{+4YAw9e%XajGO;SN4#+3ImF>L3lANSL zU1^}st%-?Jr9N2zrBW`znLQ6d{pGfMS?fsxJ4&$XknDU7dwXd=F zlevl_du-+ToT$9gF3A=5Gq_Ms<4aFFOS6)$0Fn?GRJ{gpz~AvAz@OQ-a+{x>)q}Su zhkhZ7c+pl6Fm%7bQC!`v8#_J>;%0>wx=)&1!A7=hbn=>i8qcPV|F;PQ$_cgXD&ai9kJs9jUf7P?V-cp}TcLLiu#s zn)KNj9du5*Q!zbuvUP^1>Qj8WE^j~9?z`bPV>>1W2Y{=1mAG5f68_RXJlCqG^oKas z_ndgfY`(hPP=Dsq0$uKe^}mqk1t6b=&_4W_aWut+Hm47SY@$NJAA~PlVYKThA#27% z-vWv*hpYz3T%qq%6=dW+?CtZ|(=y?e7x^!-E5|>N#2H_*pbH>g;2o084D^7)nP_15 zy5u_|ee^SmaGA*4kSF?aIHzy#vq#eOH538rR$^RoLCvZU)O`luw(;z| zKM$cYoDv2V4x3|VC{0)ghA1xx4e_(aFx`JWCJsRV%BOWyaWJKvOAIz&$4>8Nv4_!) z3FeI|O*#eZsZrgxvy8!;53c3}Eg4YV`aAss{H`^OEWY}tGwU}QM>__u8bpJ%$VdY1 zKBZ}roFa#e*r_%{#a7lMx~{)RHZ4lciTjI6Pxow$&UV>s#{ptY_wY5JHbnMLibiKi zCO>zA3Zb$-vHCyX9bC>8GMS_dO65V)?k3WYQpX<3Lt;cSBxF&SsIRY#Z_+qD+c?mH=8AC^=acYnd<2%0}6ys^T)y!{1KGJ=eGvs>i_}35sb%BgN}@CqK)bE(xz=$Lo=l}mzi%#zD0w1Xg|IBkSR#vl?(rf} zEbmEwBra|;_=m3aX~&mjX8Q(3X*SDg!z7M1YLjM?2l$P-p!~%4Jo4p)6hBDpK#Yb-zQ) z?UHc7vg7Wc%iu|$b{SYi#p3?#S8encyAwy10c88ft_$(*OU)wQ*G-yDM`fGKA;RIi z+EvZpxWBrdZjiR6shY==Tb9O4IpU=cQ2M7+-^>gos;krdr!&mP&6i&gA3srPXjh+V zG(2R9dyrc`#wQ!24-4?DhUR0#?R|ysS!m05piz@;@NCF=QdKbd0Osv;#8eD zsFbNA14r7=oqC@S>()vU>*bdRL~6rMu_MqC(Fqt+hQ|9~(2^@1FP+&+vyIeil~e}x4A-wvVRv(6~L~aCC#hcdA<}o8^lM` zeYLy1>DNW3cTj6uZu(8Cw2G66eQXu^b_f;N;%p+hxNVVcFX^V3A^CJ3v9nPl;4+}v z(c*p!QltYyqTGZSE!9h%w&1b{GNuml(E@xGPU(o89rtWPLHsr;YKz^#`lxb`yYj<+ za3H~?yT{;n7wzqBf(=+&TT}Za`b;D>*g&u3k<9n7e1ui}-?fyn+au)d{PJIOu;6n% zT4GJJ)Amuzj6}GS--@fndFNXeb?;c@s$^>UuusCvVx&#|MsAO*QFVSAA0Er6brVi( zbWaP>$a&+oY;nb0H6MU$8V_>cvqx3d#1p>!a6VUubACkg5QR0{``h4mUr;>u$7qz_ zPx_T8-T$chuFPldDUt93{cW8@ErN{KL-JUEh^83o*m2RC4mfA)nj|f_Ny$L_^mTqy{M2SpD5{4t|H) z>X+|vMZF;xW%DC)QvB6TYb)i^JxXG%cxo@H=6eTD;PtT(h^_`79_wDdrS^JOpsJ!m zF{IGG{jI>kl@#+%V4P&;h5C|D2Bc%fMN|EfkE*oqJEr>G+ws%TG2UMhMXaC#?H`F8 z&H>z#(A_(#^S`r2r#N^oQkfh@Z z_eUA3-NXC12Fk(vV~~W;6-CE4h7OdhUIzusZ_oh%0G5)XtoG}>`9C)*^6OJ<0+|N@paCe! zO6mHVp9I;ZQv6Cg^`ZM#<-ajkYewUZn=?)e1O*f0#`Hm?%yF!CCwdpD&O`lTH*Vvo z`6bpV91B9H?Be%g&toSRV>5`W@$f-PSc=EhSdn`8k;KOSIxdH$tXlz0Jk?dN*L+LM z9A6giZZj(#EuC|q-^Dt)58iEtMzE4BFiY0qZ^j=TfH*V=SCtk07Lu>Ka`0{tr8yy3 zNe)O2OR<0d^y?OK&CONG3`g+Sb}IitN(~c7W+Xxil+>s?xg^;_SRU#vDT3haE4Ac3 ze+-m-AkEYzJO_$Zw$56_;()0UQldfPP^NkB`6V=JTxf@ zgR#M%U-k`3hGi*7?YlxH_IJs72r*HW|rY|3x zCm?atqmaAl^@}NeZoz5q>AiT#!(u84?}GSqj-qab32GPC;ZTQ48GrHC4r>3VqxbQ} zNQgq#)v85=$~BIz21&#o^Z9#S_YhLktQVECAf8#3*qu#Ix42$2{IxJ-zEF@O(-LQk z#OKEx!hBTAEQmsAt}fNyO0RK{wR_iB4}4I0upcER6It0}}8?Df#Vt%){II zEWpW=fT;PX!;u(QT;w`m=4C&<)7Uu$mg{@TCp1|qB9(;$;OYKdIk`xWWUetTw#gN5 z6?yY6lCqU>unKTosq8?JF{?{M7?2$+U4jKWVqRoz@e$LDdw$m8uVEv)^1~I5vnB(q zpm^e^3}eH}(hwSO5;+hB?JZ?Cl1k4u?~mv#P&FfdR+V*hD2H7}fxHlgV}Rp`ngZAm z0n8F|cm&|fCgKhmkY(qk!_B^zOayP)h}M_`#TT=%oHcmVX#4h~$NufmTrgaxttjGg z-My_;ba8#z{o&*(MY(RcA#=%R!%Rdo1ZjB_pSfKYq616?HAG{9@i6fNlW22N10Vmm&yd+WQ=#lIpaBJWgVuMF=VUXmIEHUY(b3x?ecW{jd&6k6dm34v2 zorA$a&Dw?88i0ZQ`5V9x1{cFyp)yOlYXSPtV^Z6=bR6!uw6!JAp_*b`B{e5vf=@C5 zOC>Ou4%X;GKX1 z;-n2Pq|S{&j_;Ui%G05#_ZF)`6ySo=v>s*1FVF%Ws*Uz3dUByzJK34eIX>TSY`I&< zcdQ+5N44_8s-6AsmF=%qNMyEnw1hMuRxIpFFV^(c_AGR_6e5#_Yv0X!f%q=kuGEfu zSycR6R;&JZ@DhA6=MEOlfXitceH&M98Ut`!n=qbb)jmM%cGMVJH|jMb2~jqmem zSppi|OE21Y=YCtbOo-pCTGmexAf$IMPWy+Uaso7yMwU&X+N55!3aLJC!Ql%z%PJ_} z;e!o@Ck?tOSxaF3NWvJ2Y0z92xN0;TL8)OxP!e4h$S#5-KfX{2GwNLI zt)S*H*4hB^rPJAqsE57P^!_`J+E6M}YznmEne2j(n8@ zvMXAszq&LymGmuL%JifTiDHXuqw-WhKJpjYm09}2)_aFb0pv-AeTyC{EXKV?-&O;D zk+G35(55SBtr>TmrN)3kvP5^6u9yps_V<^H8gzRx(6W%BfnSUEO@xzcDeQ#2xE-D^ zfRVpxng)rxOJ!J>T_2R`Fg|lin*Clhlyg(pOT{RhGoZOggfRy<;HxkbLr2UbyIAL@ zw71=AZ$I0fICLAfixfX|3qZF5X;%qru+!2|?(@bfee=R|iy%vgaTf;-0!Ik`?2_dC z)0rpBVKXJo&pMKGowfC;-#=b`HNZzwQwy$2Pp1n3wrA63;NB(!uIR?w!Vs1XBazYW zF#A!E3?+u2zx%(OPA-Hl{q+EN#_A}@C>#LP5&VQ{V%~D)c8sUxjPD@$t4a>3`aR+H zD1GE@ZYfip%L!oWNG8Qz(bLoOa2gXq2&s>Ti!xWDObE+m^BQhKs6ya$n&t@S4HbnX zE8Yqsc+?*i==$0_8U3(jw zT(Lo9*@AWD3AttpIBP3(kw%}Y)<>$kzh@=G%(p$*=Rx8Ymtcxc&cq2y0yq@~RuqFg zqtD4sEW3-k+iPq0iXBt;R)Lh*)$MIuixHT{!jx^XZ zLDHqs(h2cacj!d0Rkf|yO}pyz^M$dE2ezddQ^**Sdn$n6?PZtN9qi%TL>+Px{U|e_ zkCXPb!Q~9g$NH*h4}1R>g@2W>qOq22lzZLJ5Sc@MHV^1V6uOAA7jrU}1Rq38&pCu_ z-5Fd!BwJ(PekVfJd5KSZ>+yNJvv2ZnbC*exb|=1(8~aSe*xS%*^kBLs0f+|OoEH0a z2(g`tq>$e(qHhuxUX)+6)JyPYgEFJU??B65I+^4>@8-sgyo|3nK|92#J&4c&gsTRG zppN3_^G0=Kg|d&C;DyxJy?g4+W@XAK@<-2FFi4ZlxgYicJ29_!uf< zpuAFG1{}c{CI2+|5s5(V5;Y=pUZ*^LCEf!m*acUV46cgsDZ@RgT+M6@9J#TLQ}OYv9O9H^C#0H z4)9Y-3uT$D$v>pZwn(i6HZ$Rag^!t{HXEuOz?r2Kw&GzKgR~lD_{@T`Zc0X?k|~KA zfF9L8g3%cbuf->)1BDfkkpkikXp**=6=UbyzK9=q zHmJ}JleokFUVj=M5AM!_WDr7fSTqItT7DgyW`P%gGXU3U=0;H{2^x%wvl$>mC_rF} z#Nl#U?4x5Ugxv%`{;7Ruij2{GZDccH|1 zcZG@U179#vn+sHLy(ldjBL(G>m@WLmNN z$LjsEO^@Q1N6WbIZQD1GKt~ng6Smx7pFF(?JE z*9@ElsC~Xqa9A{b@JGm&ph+8u!N;Wnp^1xX zi-ZtEEkZk?=jesc73>c!@t>QCoAh4+popHLRpo^46Jky8NV98PCM@vKKQh(kBsY~7 zJASZmZB`#^SUizhvcWjU*aY8cqw^;I*s*bm(@wV2cc9hjoo=tYb{(RxsVP4TEmUcy zMA;z}jwJ0e6I*w(EO_hIlPfH@Hh%Cn@V_>Gsr(e} z2;1_JHM2aIAAi3*p2nN18n!!6HO9pi22JnhLWpinqD@)n6r@Uc-l`Hs$;_7c)7;D6 z7Ro#>G&P#b1(+EBpjMa7-xl$qhTUn`G;-^DK(A$4+39bIAht3C^j)z?p}UR|>IA~t zj~_5AHV|$@z~cCN-SwVd4pi0*n@VmYI435qQ)^8UWKuC`9t9vCRtG5I7rI1fFo3E^ zL@j;(>~`qGioXRimoBqU{MhxK^9jkf0J61d)}OXO${>T zwxs0V=kB47QjP>MHzx5{vV5@b#ajy|oiWOR-^vP}t3E2b!mAs6IeKS-;~^tZA|DZt zgqdhs8S)G3_eeOseWCbTCM(XJP8xN)?b8cqW3W5gEv5v0eUr64@I)!DX_>00C>X!W zm%?cvSf*7!{*uqy*|-M#XDP4+&)YL-=(2-yvBRr@lmbglO@A$4j2Akuq-^PKXNoR` zfV4AW>1}Hv1f@*o7&Iy5ZvWS8lg`K{c>E1qKBUH=@Vdr`Rzkk;Dpw_M0oRs_LtrzgGm0~AW5N`vNUS5 zH!YpS=&od`?2N)2SjEXnex?|R%?O*o{#$SbfBMh8>$m6TjTfo66dkyl^~OXMr=0xP z2c^=S#luJ-bzX&?MBmYf5ZQR&5Jl-u{op)64p5W~EnMLG@yVivge$1>bz`$4jwLi8 zG8#Wrf2F`;z$#JyH%27e?;xCnFf}#eYs|FY zRHUL4TEQ_aU8ud%8kfuhP%&3y#b^jOQJsqa^G7kd9U8X<9h*3TuOFNzlNvHJ0Z)lsM@fO%wh0-6MQr><%KT7O&OtjyRc zwTi;RP1#zte>6c!lIkG4<9#JByl4RUra46h(uI|@AvEx*(+6x~^5x5hZ{(Z5Cx3xr z#F`%M)XuGJtlpF^4to>|u3^lkl1<98AuIxiUzw9fgzX$9JJ*o#-mdew`C#XjQy^O$ za{BmVA3DEz_EIuigHNY>Ploj?qwl6v5S20Nu_q5tEA$Bf1#~ula9elJHu`x`>)WbJ zBw}RYEG(dSHZmUs>*Dr&Zys!YldEZ2%507?It@5lTZ}J}LDwK0p@!x23UmS-QO*-> z*io8&PJf)pU#tvI`DIoWJ#HMSI0dycb2mM=e;s${{aQB8Mr@}Wsm=TcvWgWp1lUt@ z%gtEH5Ar(m4fQkh;XEw64=sGfDQ-=-czh$!FavJxpHdAKbx$Kg$@icG`dbRiz^K2D zwl}9YZhLu^JMa1@u4`t#mnlde(sLXdr+k+F`VFYxKJ2sQ6;UrO)O=L&ZV{<}cmhYk z$-#p}y3_4q0tFk1ClFhVN*6mq?`m$VN|?{HCVn^$y@{~js4}Yz9ocjIYf%I$x8KG( z{q2Kf>eT5P*+IV;x6iDr;rvvV&LjfLWNUMWq6{Yyw+$^l09-u`@kYI7PTG6hq$Si= zInUxpLP;4>gP)1B{}<3~d)L4=T0U>Y+>IKoqGSYe=NzcLB*WNXRosqLAs$Q*01T)H zo1Yn8hbwa3+n@RTa9GtS-Q0Mt&D~ZNac>DBwXND()oe11G{OTqg&)$k=>#W$e|h1F z-F}$bc&R8h{QPFgG3~VsD^gu@%E~M!T6?mV1^)W}!vfjHB$b;5xNr-3O6zhBC6~RK zThTo0cS%qpBC&Wqs)pU<0fa_of|~)RNo%0 zchkF-I5c!Bpx4s*mcaIwD=Eo*cL9$(Y$@xcD~?=$H<`A<=jXN-v0s)*2PHZN;kJlQ zHYwK?)0Qx5_wz4YVOf~`;R&tdADU;_`kIrnGex?{o;dX4C)l}LRrMoIRajvdL;xa= z(d$+>QnLsl#)Nc)_HyFgVfK0gHU61HlMb9?0ALTuzv!Yzb2f1o>PW}6mES&#tOU1^ zNv!OnNmag~)!(Mqd=eQ7xTg>j>H@p(7^zF@#x z=E`(gr`+wx>=5DRk+ny%3PH&IkI|E493KHeA8Pb~Z|`LGaDM%{dc3Mv88y+OBd*u# z{jT=Q9B_r+pe>|Q2#L29WT3nNlB&n1(3cU?$^>NPtJI~G&f=ckOTIiyy>poXz_Pfs!AgjC)M2GN4DLn0fqQQOQzkBa_ut zlfM*K{`vE~eH8`dSQs>{UVYb^6ZPJE<0_k!YW88}LC~sKFG|2|=-M|RMN?b}QPUaG zJJx%7^|-iSK+bVy&Lw>qHdL@iF?le{bz*xohSGL~*a$w9tou4Vf;;FqxW4QmutH?Q za#^HejOP5iUt(FgUSm>15IO6HK$o?j)&GQ4Kr<7Y)#L2%K%L`fV3uWRR#2I=t zLNum%F!Pa=#=LTJI}-KG1tFDirRpF9`_qkJecsIvPst%bBB1R?dH|lItBdm=;1FE$C`%u97+IYZ?R@#apg+1`82fMuYvq(?nC zhFNHOB8y~9Dku}^l&cbVcSaPVVds|3V0bORce=*-ujH02S3ZTI=}}BVGKJ@1uUf?) z$54lo=n20Gz4s1r5LCh2t7slL2grxN5g6t``dKyV+fXW)VkqB!D zcFREN8PPwIaRwnun=rI^iX4ZJ6lcHq%PxYVTS(I14f9RzSNLFb=FP_!m@e05kdDjl z{7v+ghTzdhIaIE#oPN7U2>KmmQ16P|$5Xb4>s^4mSHf+cRdYG;EMU>HsrCj7=A4vA z>e~H7jFbF@Z%ATl3E+SG%Y92YMHbIMRC#lTyYc7y;FxIFcR&KRo9bk$`9~v{dZkIT z%(MPAwbGWVZ^7|Fc+ejlA$~MvStaix!ej!Z>acq?5Pg%j{bK@~KJ1Q9`sk~#YEQN! z+@F@sbaepS%Lyr31>CrTqNGdfkYGMZ?N+wuhv{4Y-gYkLRaph6LyFa_ zHyzb6DO}us2-!I&%NgR#K90f)Xq(nb;pXY)v+m#dGa?@Ld~bxMz8d_bXTsylj8=>#S&ALYJvb;5KckIc z61>SGG*$k9g`_5v=p-ii@-D@|IagIbwW;9IUY>^ef_>iw(w1wP_jg<+5^sy%9fm;& zW@wO`y}Nm8X?bV$aQ$-^JNxK?n-RJfo}+S&Bw`IzXFa4Oej@ElVa1daBTuD zf3xpWU?3-4s!_g`zG_aMOyH#coz2Aaa9WmZz9vRQoX&DcgxdmuC%K_KxxIGna~SRB zY@!DM4WE|pU;Nv|_T7P3`w;JhZ|^V{7Aa>3`dGfQBis_!)2)YVI-r`3S6s46|%ugDr7-EwtMP-EwiR zH@sJ#kIUY38^>Yqn=FJYAKjBH({owKT3}cLe`Tp?F_>R5X)Ig7%}uompvT|+TgJ@p>Cry*8#YuP%ir{a+4qe5scsKIS;B??Vv)o z%%dNf&6R^k0M_aNy~k}Qd;}2?_pWdk!l+FD{sk?HIJ3M~4*Ojule^*rU!hkez8Bet z!-~$456SGFWLD@YvJW2&Ae(#fc#S*Vgos-X5&5Rdn`=`U>UJ*m zG01-LMLoE^NVK9r#`&tq0Pvr@5xLUH~m^!gfFWLB5=ln!s7ouv0i6eLd3YU zfK$J{vBu|MaDZm}3b*G6qq030!!{ZbyN z$}^&-Et!*`PCc@wyQ*rLLe-C9_I>RWPXN_S_33GVMz|rHBIiv)j|WpXytQm*xhfg? z1TI^8ZiDw(4&oo}kR6l8tm4I*txFq0IufM?G**0G((?5MM`}POsyj{8n`Q9v z=*cSJs5a|S{oDK0sO?-tOEXt6_{lac&8+S2)0TjUdW3R2u9LM%JW_g{VtBQ1p7y3x50Yk~bL~9CZM$7#s;wZs-E_S&LBeRU?M(o4^Bw8<^3ib3z!dk=~fNF^+u4S8-?Y);D=D_CE7U` zEW_!%pjwn=><@-X)bu$Q=&2F_0MX5Vv;b+M=_Yhp#O4xdG6?-p64In8ehMNH<+d;X zpu#(}q%VBP2-YP`xLjV(v~34v;Pnr>?f8=#R*7uCn(PY%Bfq^_b4kqtIX6yU?7cp>u1s%$a_)nSV#ITd5(R@Nw)HkA{5)7D*5GH3g_b zFBOpWE%=<(#c#+s-_Ytg#pm;WNs0KN{!vB=DLG!Ng`#w#8@!KoHPqQF#e|3W$D0ZhaNyd z>HtHoO_whnSi$L@Cyl_WgZ{C1!jpccW`qQI)l*7qo47E44so&%Afbc-9-EvkFeL?% z9HfJI?c559?~r9D@m&ww2-oS6S)3t9)wGA-m!rBiQ!c%0QUepQDf|3R&!E1a zS}V(|VKC>_Ko9jO_{FcVFPC}mc6e?G`0B9Ig-^Wn`R;9kJ6^|6=J&wg*6FfmAfOYr zpeiPPdqV0Jt!Xtd&V#NVswk!wY4%sh^O%7MW!srK zg?!3Sn__RL)z)GyfEnHW9>U28&B?Aw)=)>=N-wxdyc%E20hsEAHXK7EB!-u9AkJi@&k-q; zLpm&u`%ddG+Ss(l_v_;zHVg}ADItn%?OE3<)E8vh7^#$ZIHhvQg(=0kZq|;X<|N9*CU9oA@N%V@Nz~E z}Nm zwzmVYv5rdvN@@$fCiCZ&F6Q|xlCtPYy!bhB;R+d3m@8K}FbiqR9)cgmnl4&nBIsik zakGq*r@X=sA(rp|JJXx@3%LbnKM+XChGM3NCzQ7R0$A))Up?!%Zc3wZO6oc#Feu z@oX_@oSwXIZzNUGHh0W@d(brOK{zdC@?(9Vq^(p*tXh9Unx39#-gt#au;D*F2or)f zFmrWj#8vUTMg8#T~VCcNo3__=NVH2j>PRIK^Hytw+opmlSQ9Od6y_~mDDs7Gl@Bl4=h zM#JuK(}6L{56n>pO(6`fFrL|`IE?hdxPtIX;szDGBZ?DIBC;m);|GZ^o%J-6xjmo0 zl?9wu)x|;cc_a7|$^@!5FE4wqI0ZzvP*KC$LH_eq zl3oT^ctzprzm4lc&jSl{Ft|RAsd+=+k;2Nj9+_wZLsKK5xqI(#P;TCuipHlKKEH0t z<(?h_23$j$0YM;p>{2%VfN76ys*giEmnl@lMt)uHSURy)GLPzXv- zacAh=`eU>f-Cx+flw%w@n7@wPhw*j2gv@NE#pQfUx|ZrSOK?OZSa$+LPXR@v=sZwU zmB*KW1kC=%+fA5{Ke!^Y3*nFiSX0`8ZN6WygTHwhw?hc(;nZ|-{AMLvN`aCMrdPt!mTxTZ1YhJP&TAg~KO@{` z>*T*1TN35#lU#L2RRV))e33;ue># zH>>!-YUtWsCNBz!RG&{Nsq-hvo(;9SPc} zzJzNZFRwj>!#{wISCK{0_wTH5#HsMX9o)%(=vY~`pLTOgveb*TlmB)UEudcX9F_6c z_ymBA92LeBf3gHlB)FB=srIUj7H2QBpp~pgXhrhiEl8FCt-F22aZZ<`QNg@M1djK~ z#CLg-7ax%v)?E(P{ZXr37^GHQ4n3%4DctMJ%+Bvh7OWs%iWHUcn`qBlj|P*gFTdROjpc1rf=B*@CLP4O=PHA^G=r zN;?=)p!^YBwVXVRK0fEn9%C6hoPxja?KoDS?cN!oLsOQ?PdEJwqd5BUHI-#a-|UXa zftoX-hJ{F-m>Nf#Y_2r~-<*6FsyQrI&8lk==mTU(-P!nhSeP{gJ^G{|w1#bft52F&Eut}f5>!O`?r8`1SMz&G#H>jM1(0-zBbRBdZz{zOj zSFPyp(rt44kCj2AM^lzNhunJkx6Q&Wp4T{5d>vl%j#cf9j ziBZlLu96s7D(*C3lD;Ein-l^~93QX1E;?!(u%k8cob;Q|e`Egjfj2N!!t~Kyi6B-3 z-vS4`1y5o!52^)cMw76?yh;QIO&f;dgm)2<#9Mv%#BVV&Zgv5E(xmB z&Qe}AuA!1F9snI-6ZEu*K&XI!5H-=TqlQgrzJrN^+E!Woyj(V}pB)8G8Vb8BN2(m2JQ?ls>iBxl@lv*| z!aHAnfjmu{d3z{B5+wbwdVdy$n>(&hazD?a=;6Ogvve9nboHtBeK^bic)f9t27Q|4 zsK~eGP`Rt|b*X*lUNW*;#}!Yd`J(<62N5~9*2!hz^yguk(O7f@+FXcU_3`raGug-L zo#^|IZ_3KJtQOhceJSNK`ti?D9OZv$!C0cK5JV=kw8Vc;Pk)p9PzfQy|0v{fhuU@z zxxTjf+LQ`k_%syfcj$zVv!rfqW!un7^u3-hckkSUzsXnUmAbLr3AMR)Bd+xTnj^q< zLv|Zj67%Z>ZQ72l_YK)U)-c(*YyS8jQnzB3Xe;2dS}sqJkITHKQdHD%TX1hBZKe{h zALHE%rAnUDob>{Fbop{<-6{}UpkoPv(`f_wbxFzl7&S*-N$Qn0 zfw_e>2{Yl~Zfn1})O=K7e=C!h@~v!7o7G^- z_nt|(#4NQvKoQ%HkyW{mq-1NY1#Ky~GTQ8tcEGs0sP80}7_$5rZT^zgKK?h?S<;m( zN)GY}&3voVd}d4>ql2PpW6{FCXrR&nx3)gBgMh|0{IeyT{zKp=^XKKn1Bxmxi zy&06zPDUH9=Jh#qkv4`Wa3DSOr!G;Sm(FqUFpKhb4s8=+HgAPCj#@JR%rw%=J5gv{ z=7%Pf7U_{3dI4GK!@^*6TS4b8xATi4#CW8O`4X%dM>boacz^0nk^z`hEOo#E%1imUu@B5&&0#|{IlmR6gM67rlSPD)kg1ZoylVU zMi5Me$h8X>3ytJD_1;e$I^<4GRP?HC*7Qxsrb10!bn)^Gw5HWy#K}y78{do#8j-@7 zVrC40P2(yZTdYys*I9ipjO1h@ls?vkAvY|(XxR=Cw1KT8L~D#Q47(mOeG@m!{5rOr z_%@GOjgi|Uqitxcjiegedk7*Vd-Pj1jT(>*v^LHvoUVDn?}b+l9ihZ|{N-3}_Il8+ zA3y5&dUpVvv+#D1&R@1qcx<4E_z@y`Zf-Pc6Qw7VLVrs|qm=;X`v`AtCei<^1f3_6 zx-yCJ-2jO&Pb9_Q!M+Z_CG=mw*k<}a%K(S5lPst5t+;P8!p|dWn{eBcmZ2DLVst+u zS>pcM1KK{?VOV3SZze$>O&gqMU-LU5OV&8!n5I-8`r0+B-2NK90t^wdv=7ZfH$F6tnMYmnYUvq zZ{2Aj+13o)OyAZ}M`+x-oMi=dGXBayez=DGi=BJE{p+F)rfO5|EtXQZ8828u@l1y7 zKMONLv4a1%0RY!h-JkdH)TO4$|0+=7DCTR|8(gb9uG3$2OWzeC0>PYGf|Q_35%gB& zlb4|5a+*(gADcQ1NJ%sYSEK%cJd@vt>_J@uTW9MqKVx$vSlFA8ktOW6s>HCw5`Y)m zC9xa*srEy9gbO`U{*`1P3DS^6x!oE|T|8@6&!Vhps5Ks!SxjTv7(J z(t&eZ*1rD!%jVH*cQ2C6m_qD$xE8fG<@+_IBQdG!i#CnJu2TEf&_jE|6ybSx(q*H0 zaVxcO4)>6OtDLbV zVy48%i#5Upeg^C@Lo<*U=Oz4)G20gUAqMM#b7Lh&Y`Zof|Dhi2=Q&ItoR09zy{zXE zO6=$6#&BYV6bA1M)+490RkIa|5B(K`j2E{pV009=_iR{5c~^<<)aU;N$X`wIlT!`Qc8S@wl*#z}k=eYGHo;1u1N zF>?OLeYD#B*ESvHHQJNn`!P09`f5Rn>J)q){|9}IL?d^7vfBRRLvp(rEHI*ajq*^Y zA2|s!{$oZuUBBfW3w@0)XtFnK{%F5Ck_OhuzkKr3>_zdUlD+6uHT{nlsx4q^iv9oJ c$KAd#2d5&&D`ob*y21cTa_X{m(v~6r1*5lUd;kCd literal 0 HcmV?d00001 diff --git a/resources/assets/images/favicon/favicon-16x16.png b/resources/assets/images/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b96d9badf578de89325286c917bd2e647e965a0d GIT binary patch literal 546 zcmV+-0^R+IP)Pe}i_qf17W)DH;PE9y z?hz7*iUfc{fZC1j%U0&X{hg2a^S6`exqeVyNB_p+VKn+ok#{q31VH2nKt@=_jg%%Y zKdM8z=CcO?>5UqWk;+IU!JmGR0K{YnzZ${RCeU63oJQgzNO*K3Gx}*yF4y72y(DxA zA)P6XrLQ;jAU1n9OT^a<$@?{KPj*z?EzHGE6Q0USz7(EF$_WAA`|1&3x^bS@Q*d3_88&} zB5w+p`%9B!AAhg$1)=L}tkDl1_95WXKZAsFrj)+8P#<*H+}u8E+*>fx83pNoq8!g< kkAcyFD9SB=rd9zz0b-H_RARK#0{{R307*qoM6N<$f@4GSH2?qr literal 0 HcmV?d00001 diff --git a/resources/assets/images/favicon/favicon-32x32.png b/resources/assets/images/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d25a2aee5f468ef1c344a6cdfe36a1987efa07f2 GIT binary patch literal 1200 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 W)xBa}kZ`R)|7(}c{vcg)4F6x|jew2- literal 0 HcmV?d00001 diff --git a/resources/assets/images/icons/pdf.png b/resources/assets/images/icons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7094051fd7f2af96bc12af6e1979bd4b6fdb3c GIT binary patch literal 7901 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 T+jZmsd>t}0HOSsa{_}qT#OjDk literal 0 HcmV?d00001 diff --git a/resources/assets/images/icons/processing-icon.png b/resources/assets/images/icons/processing-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..44ec0ff5ea6e4ac5ae1ba566fb3af6657ce75022 GIT binary patch literal 7860 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 literal 0 HcmV?d00001 diff --git a/resources/assets/images/icons/xlsx.png b/resources/assets/images/icons/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..314df478240d155a2968da8c0c4e472660e1af8b GIT binary patch literal 64553 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'); + return $('#pg-visible-xs').is(':visible'); + }; + + /** @function isVisibleSm + * @description Checks if the screen size is SM - Small Screen i.e Above W480px + * @returns {$Element} - Appends $('#pg-visible-sm') to Body + */ + Pages.prototype.isVisibleSm = function() { + (!$('#pg-visible-sm').length) && this.$body.append('

'); + return $('#pg-visible-sm').is(':visible'); + }; + + /** @function isVisibleMd + * @description Checks if the screen size is MD - Medium Screen i.e Above W1024px + * @returns {$Element} - Appends $('#pg-visible-md') to Body + */ + Pages.prototype.isVisibleMd = function() { + (!$('#pg-visible-md').length) && this.$body.append('
'); + return $('#pg-visible-md').is(':visible'); + }; + + /** @function isVisibleLg + * @description Checks if the screen size is LG - Large Screen i.e Above W1200px + * @returns {$Element} - Appends $('#pg-visible-lg') to Body + */ + Pages.prototype.isVisibleLg = function() { + (!$('#pg-visible-lg').length) && this.$body.append('
'); + return $('#pg-visible-lg').is(':visible'); + }; + + /** @function getUserAgent + * @description Get Current User Agent. + * @returns {string} - mobile | desktop + */ + Pages.prototype.getUserAgent = function() { + return $('body').hasClass('mobile') ? "mobile" : "desktop"; + }; + + /** @function setFullScreen + * @description Make Browser fullscreen. + */ + Pages.prototype.setFullScreen = function(element) { + // Supports most browsers and their versions. + var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullscreen; + + if (requestMethod) { // Native full screen. + requestMethod.call(element); + } else if (typeof window.ActiveXObject !== "undefined") { // Older IE. + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript !== null) { + wscript.SendKeys("{F11}"); + } + } + }; + + /** @function getColor + * @description Get Color from CSS + * @param {string} color - pages color class eg: primary,master,master-light etc. + * @param {int} opacity + * @returns {rgba} + */ + Pages.prototype.getColor = function(color, opacity) { + opacity = parseFloat(opacity) || 1; + + var elem = $('.pg-colors').length ? $('.pg-colors') : $('
').appendTo('body'); + + var colorElem = elem.find('[data-color="' + color + '"]').length ? elem.find('[data-color="' + color + '"]') : $('
').appendTo(elem); + + var color = colorElem.css('background-color'); + + var rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); + var rgba = "rgba(" + rgb[1] + ", " + rgb[2] + ", " + rgb[3] + ', ' + opacity + ')'; + + return rgba; + }; + + /** @function initSidebar + * @description Initialize side bar to open and close + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires ui/sidebar.js + */ + Pages.prototype.initSidebar = function(context) { + $('[data-pages="sidebar"]', context).each(function() { + var $sidebar = $(this); + $sidebar.sidebar($sidebar.data()) + }) + }; + + /** @function initDropDown + * @description Initialize Boot-Strap dropdown Menue + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires bootstrap.js + */ + Pages.prototype.initDropDown = function(context) { + // adjust width of each dropdown to match content width + $('.dropdown-default', context).each(function() { + var btn = $(this).find('.dropdown-menu').siblings('.dropdown-toggle'); + var offset = 0; + + var menuWidth = $(this).find('.dropdown-menu').actual('outerWidth'); + + if (btn.actual('outerWidth') < menuWidth) { + btn.width(menuWidth - offset); + $(this).find('.dropdown-menu').width(btn.actual('outerWidth')); + } else { + $(this).find('.dropdown-menu').width(btn.actual('outerWidth')); + } + }); + }; + + /** @function initFormGroupDefault + * @description Initialize Pages form group input + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + */ + Pages.prototype.initFormGroupDefault = function(context) { + $('.form-group.form-group-default', context).click(function() { + $(this).find('input').focus(); + }); + + if (!this.initFormGroupDefaultRun) { + $('body').on('focus', '.form-group.form-group-default :input', function() { + $('.form-group.form-group-default').removeClass('focused'); + $(this).parents('.form-group').addClass('focused'); + }); + + $('body').on('blur', '.form-group.form-group-default :input', function() { + $(this).parents('.form-group').removeClass('focused'); + if ($(this).val()) { + $(this).closest('.form-group').find('label').addClass('fade'); + } else { + $(this).closest('.form-group').find('label').removeClass('fade'); + } + }); + + // Only run the above code once. + this.initFormGroupDefaultRun = true; + } + + $('.form-group.form-group-default .checkbox, .form-group.form-group-default .radio', context).hover(function() { + $(this).parents('.form-group').addClass('focused'); + }, function() { + $(this).parents('.form-group').removeClass('focused'); + }); + }; + + /** @function initSlidingTabs + * @description Initialize Bootstrap Custom Sliding Tabs + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires bootstrap.js + */ + Pages.prototype.initSlidingTabs = function(context) { + $('a[data-toggle="tab"]', context).on('show.bs.tab', function(e) { + e = $(e.target).parent().find('a[data-toggle=tab]'); + + var hrefCurrent = e.data('target'); + if(hrefCurrent === undefined){ + hrefCurrent = e.attr('href'); + } + + if (!$(hrefCurrent).is('.slide-left, .slide-right')) return; + $(hrefCurrent).addClass('sliding'); + + setTimeout(function() { + $(hrefCurrent).removeClass('sliding'); + }, 100); + }); + }; + /** @function reponsiveTabs + * @description Responsive handlers for Bootstrap Tabs + */ + Pages.prototype.reponsiveTabs = function() { + //Dropdown FX + $('[data-init-reponsive-tabs="dropdownfx"]').each(function() { + var drop = $(this); + drop.addClass("hidden-sm-down"); + var content = ''; + drop.after(content); + var select = drop.next()[0]; + $(select).on('change', function (e) { + var optionSelected = $("option:selected", this); + var valueSelected = this.value; + var tabLink = drop.find('a[data-target="'+valueSelected+'"]'); + if(tabLink.length == 0){ + tabLink = drop.find('a[data-target="'+valueSelected+'"]') + } + tabLink.tab('show') + }); + $(select).wrap(''); + new SelectFx(select); + }); + }; + + /** @function initNotificationCenter + * @description Initialize Pages Header Notifcation Dropdown + */ + Pages.prototype.initNotificationCenter = function() { + $('body').on('click', '.notification-list .dropdown-menu', function(event) { + event.stopPropagation(); + }); + $('body').on('click', '.toggle-more-details', function(event) { + var p = $(this).closest('.heading'); + p.closest('.heading').children('.more-details').stop().slideToggle('fast', function() { + p.toggleClass('open'); + }); + }); + }; + + /** @function initProgressBars + * @description Initialize Pages ProgressBars + */ + Pages.prototype.initProgressBars = function() { + $(window).on('load', function() { + // Hack: FF doesn't play SVG animations set as background-image + $('.progress-bar-indeterminate, .progress-circle-indeterminate, .mapplic-pin').hide().show(0); + }); + }; + + /** @function initInputFile + * @description Initialize File Input for Bootstrap Buttons and Input groups + */ + Pages.prototype.initInputFile = function() { + $(document).on('change', '.btn-file :file', function() { + var input = $(this), + numFiles = input.get(0).files ? input.get(0).files.length : 1, + label = input.val().replace(/\\/g, '/').replace(/.*\//, ''); + input.trigger('fileselect', [numFiles, label]); + }); + + $('.btn-file :file').on('fileselect', function(event, numFiles, label) { + var input = $(this).parents('.input-group').find(':text'), + log = numFiles > 1 ? numFiles + ' files selected' : label; + if( input.length ) { + input.val(log); + } else { + $(this).parent().html(log); + } + }); + }; + /** @function initHorizontalMenu + * @description Initialize Horizontal Dropdown Menu + */ + Pages.prototype.initHorizontalMenu = function(){ + var animationTimer; + + var hMenu = $("[data-pages-init='horizontal-menu']"); + autoHideLi(); + $(document).on('click', '.menu-bar > ul > li', function(){ + if($(this).children("ul").length == 0){ + return; + } + if($(window).width() < 992) { + var menubar = $('.menu-bar'); + var el = $(this); + var li = menubar.find('li'); + var sub = $(this).children('ul'); + + if(el.hasClass("open active")){ + el.find('.arrow').removeClass("open active"); + sub.slideUp(200, function() { + el.removeClass("open active"); + }); + + }else{ + menubar.find('li.open').find('ul').slideUp(200); + menubar.find('li.open').find('a').find('.arrow').removeClass('open active'); + menubar.find('li.open').removeClass("open active"); + el.find('.arrow').addClass("open active"); + sub.slideDown(200, function() { + el.addClass("open active"); + }); + } + } else { + if($(this).hasClass('opening')){ + _hideMenu($(this)); + } + else{ + _showMenu($(this)); + } + } + + }); + + var resizeTimer; + $(window).on('resize', function(e) { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(function() { + autoHideLi(); + }, 250); + }); + + $('.content').on('click', function () { + $('.horizontal-menu .bar-inner > ul > li').removeClass('open'); + $('.menu-bar > ul > li').removeClass('open opening').children("ul").removeAttr("style"); + $("body").find(".ghost-nav-dropdown").remove(); + }); + + $('[data-toggle="horizontal-menu"]').on('click touchstart', function(e) { + e.preventDefault(); + $('body').toggleClass('horizontal-menu-open'); + if(!$('.horizontal-menu-backdrop').length){ + $('.header').append('
'); + $('.horizontal-menu-backdrop').fadeToggle('fast'); + } else { + $('.horizontal-menu-backdrop').fadeToggle('fast', function(){ + $(this).remove(); + }); + } + + $('.menu-bar').toggleClass('open'); + }); + + function autoHideLi(){ + var hMenu = $("[data-pages-init='horizontal-menu']"); + var extraLiHide = parseInt(hMenu.data("hideExtraLi")) || 0; + if(hMenu.length == 0){ + return + } + var hMenuRect = hMenu[0].getBoundingClientRect(); + var liTotalWidth = 0; + var liCount = 0; + hMenu.children('ul').children('li.more').remove(); + hMenu.children('ul').children('li').each(function( index ) { + $(this).removeAttr("style"); + liTotalWidth = liTotalWidth + $(this).outerWidth(true); + liCount++; + }); + + if($(window).width() < 992) { + return; + } + + var possibleLi = parseInt(hMenuRect.width / (liTotalWidth / liCount)) - 1; + possibleLi = possibleLi - extraLiHide; + + if(liCount > possibleLi){ + var wrapper = createWrapperLI(hMenu); + for(var i = possibleLi; i < liCount; i++){ + var currentLi = hMenu.children('ul').children('li').eq(i); + var clone = currentLi.clone(); + clone.children("ul").addClass("sub-menu"); + wrapper.children("ul").append(clone); + currentLi.hide(); + } + } + + } + + function createWrapperLI(hMenu){ + var li =hMenu.children('ul').append("
    • "); + li = hMenu.children('ul').children('li.more'); + return li; + } + + function _hideMenu($el){ + var ul = $($el.children("ul")[0]); + var ghost = $("
      "); + if(ul.length == 0){ + return; + } + var rect = ul[0].getBoundingClientRect(); + ghost.css({ + "width":rect.width+"px", + "height":rect.height+"px", + "z-index":"auto" + }); + $el.append(ghost); + var timingSpeed = ul.children("li").css('transition-duration'); + + timingSpeed = parseInt(parseFloat(timingSpeed) * 1000); + $el.addClass('closing'); + window.clearTimeout(animationTimer); + animationTimer = window.setTimeout(function(){ + ghost.height(0); + $el.removeClass('open opening closing'); + },timingSpeed - 80); + } + function _showMenu($el){ + + var ul = $($el.children("ul")[0]); + var ghost = $("
      "); + $el.children(".ghost-nav-dropdown").remove(); + $el.addClass('open').siblings().removeClass('open opening'); + if(ul.length == 0){ + return; + } + var rect = ul[0].getBoundingClientRect(); + ghost.css({ + "width":rect.width+"px", + "height":"0px" + }); + $el.append(ghost); + ghost.height(rect.height); + var timingSpeed = ghost.css('transition-duration'); + + timingSpeed = parseInt(parseFloat(timingSpeed) * 1000); + window.clearTimeout(animationTimer); + animationTimer = window.setTimeout(function(){ + $el.addClass('opening'); + ghost.remove() + },timingSpeed); + } + }; + /** @function initTooltipPlugin + * @description Initialize Bootstrap tooltip + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires bootstrap.js + */ + Pages.prototype.initTooltipPlugin = function(context) { + $.fn.tooltip && $('[data-toggle="tooltip"]', context).tooltip(); + }; + /** @function initSelect2Plugin + * @description Initialize select2 dropdown + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires select2.js version 4.0.x + */ + Pages.prototype.initSelect2Plugin = function(context) { + $.fn.select2 && $('[data-init-plugin="select2"]', context).each(function() { + $(this).select2({ + minimumResultsForSearch: ($(this).attr('data-disable-search') == 'true' ? -1 : 1) + }).on('select2:open', function() { + $.fn.scrollbar && $('.select2-results__options').scrollbar({ + ignoreMobile: false + }) + }); + }); + }; + /** @function initScrollBarPlugin + * @description Initialize Global Scroller + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @requires jquery-scrollbar.js + */ + Pages.prototype.initScrollBarPlugin = function(context) { + $.fn.scrollbar && $('.scrollable', context).scrollbar({ + ignoreOverlay: false + }); + }; + /** @function initListView + * @description Initialize iOS like List view plugin + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @example data-init-list-view="ioslist" + * @requires jquery-ioslist.js + */ + Pages.prototype.initListView = function(context) { + $.fn.ioslist && $('[data-init-list-view="ioslist"]', context).ioslist(); + $.fn.scrollbar && $('.list-view-wrapper', context).scrollbar({ + ignoreOverlay: false + }); + }; + + /** @function initSwitcheryPlugin + * @description Initialize iOS like List view plugin + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @example data-init-plugin="switchery" + * @requires Switchery.js + */ + Pages.prototype.initSwitcheryPlugin = function(context) { + // Switchery - ios7 switch + window.Switchery && $('[data-init-plugin="switchery"]', context).each(function() { + var el = $(this); + new Switchery(el.get(0), { + color: (el.data("color") != null ? $.Pages.getColor(el.data("color")) : $.Pages.getColor('success')), + size : (el.data("size") != null ? el.data("size") : "default") + }); + }); + }; + + /** @function initSelectFxPlugin + * @description Initialize iOS like List view plugin + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + * @example select[data-init-plugin="cs-select"] + */ + Pages.prototype.initSelectFxPlugin = function(context) { + window.SelectFx && $('select[data-init-plugin="cs-select"]', context).each(function() { + var el = $(this).get(0); + $(el).wrap('
      '); + new SelectFx(el); + }); + }; + /** @function initUnveilPlugin + * @description To load retina images to img tag + * @param {(Element|JQuery)} [context] - A DOM Element, Document, or jQuery to use as context. + */ + Pages.prototype.initUnveilPlugin = function(context) { + // lazy load retina images + $.fn.unveil && $("img", context).unveil(); + }; + + /** @function initValidatorPlugin + * @description Inintialize and Overide exsisting jquery-validate methods. + * @requires jquery-validate.js + */ + Pages.prototype.initValidatorPlugin = function() { + /** + * Open the socket. + * @override + */ + $.validator && $.validator.setDefaults({ + ignore: "", // validate hidden fields, required for cs-select + showErrors: function(errorMap, errorList) { + var $this = this; + $.each(this.successList, function(index, value) { + var parent = $(this).closest('.form-group-attached'); + if (parent.length) return $(value).popover("hide"); + }); + return $.each(errorList, function(index, value) { + + var parent = $(value.element).closest('.form-group-attached'); + if (!parent.length) { + return $this.defaultShowErrors(); + } + var _popover; + _popover = $(value.element).popover({ + trigger: "manual", + placement: "top", + html: true, + container: parent.closest('form'), + content: value.message + }); + var parent = $(value.element).closest('.form-group'); + parent.addClass('has-error'); + $(value.element).popover("show"); + }); + }, + onfocusout: function(element) { + var parent = $(element).closest('.form-group'); + if ($(element).valid()) { + parent.removeClass('has-error'); + parent.next('.error').remove(); + } + }, + onkeyup: function(element) { + var parent = $(element).closest('.form-group'); + if ($(element).valid()) { + $(element).removeClass('error'); + parent.removeClass('has-error'); + parent.next('label.error').remove(); + parent.find('label.error').remove(); + } else { + parent.addClass('has-error'); + } + }, + errorPlacement: function(error, element) { + var parent = $(element).closest('.form-group'); + if (parent.hasClass('form-group-default')) { + parent.addClass('has-error'); + error.insertAfter(parent); + } else { + error.insertAfter(element); + } + } + }); + }; + + /** @function setBackgroundImage + * @description load images to div using data API + */ + Pages.prototype.setBackgroundImage = function() { + $('[data-pages-bg-image]').each(function() { + var _elem = $(this); + var defaults = { + pagesBgImage: "", + lazyLoad: 'true', + progressType: '', + progressColor:'', + bgOverlay:'', + bgOverlayClass:'', + overlayOpacity:0, + }; + var data = _elem.data(); + $.extend( defaults, data ); + var url = defaults.pagesBgImage; + var color = defaults.bgOverlay; + var opacity = defaults.overlayOpacity; + + var overlay = $('
      '); + overlay.addClass(defaults.bgOverlayClass); + overlay.css({ + 'background-color': color, + 'opacity': 1 + }); + _elem.append(overlay); + + var img = new Image(); + img.src = url; + img.onload = function(){ + _elem.css({ + 'background-image': 'url(' + url + ')' + }); + _elem.children('.bg-overlay').css({'opacity': opacity}); + } + + }) + }; + /** @function secondarySidebar + * @description dropdown Toggle and responive toggle for secondary sidebar + */ + Pages.prototype.secondarySidebar =function(){ + $('[data-init="secondary-sidebar"]').each(function() { + $(this).on('click', '.main-menu li a', function(e) { + + if ($(this).parent().children('.sub-menu') === false) { + return; + } + var el = $(this); + var parent = $(this).parent().parent(); + var li = $(this).parent(); + var sub = $(this).parent().children('.sub-menu'); + + if(li.hasClass("open active")){ + el.children('.arrow').removeClass("open active"); + sub.slideUp(200, function() { + li.removeClass("open active"); + }); + + }else{ + parent.children('li.open').children('.sub-menu').slideUp(200); + parent.children('li.open').children('a').children('.arrow').removeClass('open active'); + parent.children('li.open').removeClass("open active"); + el.children('.arrow').addClass("open active"); + sub.slideDown(200, function() { + li.addClass("open active"); + + }); + } + //e.preventDefault(); + }); + + }); + + $('[data-init="secondary-sidebar-toggle"]').each(function() { + $(this).on("click", function(e) { + var toggleRect = $(this).get(0).getBoundingClientRect(); + var menu = $('[data-init="secondary-sidebar"]'); + if(menu.hasClass("open")){ + menu.removeClass("open"); + menu.removeAttr("style"); + } + else{ + menu.addClass("open"); + var menuRect = menu.get(0).getBoundingClientRect(); + menu.css({ + top : toggleRect.bottom, + 'max-height': ($(window).height() - toggleRect.bottom), + left: $(window).width() / 2 - menuRect.width/ 2, + 'visibility': 'visible' + }); + + } + }) + + }); + + }; + /** @function init + * @description Inintialize all core components. + */ + Pages.prototype.init = function() { + // init layout + this.initSidebar(); + this.setBackgroundImage(); + this.initDropDown(); + this.initFormGroupDefault(); + this.initSlidingTabs(); + this.initNotificationCenter(); + this.initProgressBars(); + this.initHorizontalMenu(); + // init plugins + this.initTooltipPlugin(); + this.initSelect2Plugin(); + this.initScrollBarPlugin(); + this.initSwitcheryPlugin(); + this.initSelectFxPlugin(); + this.initUnveilPlugin(); + this.initValidatorPlugin(); + this.initListView(); + this.initInputFile(); + this.reponsiveTabs(); + this.secondarySidebar(); + }; + + $.Pages = new Pages(); + $.Pages.Constructor = Pages; + +})(window.jQuery); + +(function(window) { + + 'use strict'; + + /** + * based on from https://github.com/inuyaksa/jquery.nicescroll/blob/master/jquery.nicescroll.js + */ + function hasParent(e, p) { + if (!e) return false; + var el = e.target || e.srcElement || e || false; + while (el && el != p) { + el = el.parentNode || false; + } + return (el !== false); + } + /** + * extend obj function + */ + function extend(a, b) { + for (var key in b) { + if (b.hasOwnProperty(key)) { + a[key] = b[key]; + } + } + return a; + } + + /** + * SelectFx function + */ + function SelectFx(el, options) { + this.el = el; + this.options = extend({}, this.options); + extend(this.options, options); + this._init(); + } + + /** + * Pure-JS alternative to jQuery closest() + */ + function closest(elem, selector) { + var matchesSelector = elem.matches || elem.webkitMatchesSelector || elem.mozMatchesSelector || elem.msMatchesSelector; + while (elem) { + if (matchesSelector.bind(elem)(selector)) { + return elem; + } else { + elem = elem.parentElement; + } + } + return false; + } + + /** + * jQuery offset() in pure JS + */ + function offset(el) { + return { + left: el.getBoundingClientRect().left + window.pageXOffset - el.ownerDocument.documentElement.clientLeft, + top: el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop + } + + } + + /** + * jQuery after() in pure JS + */ + function insertAfter(newNode, referenceNode) { + referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); + } + /** + * SelectFx options + */ + SelectFx.prototype.options = { + // if true all the links will open in a new tab. + // if we want to be redirected when we click an option, we need to define a data-link attr on the option of the native select element + newTab: true, + // when opening the select element, the default placeholder (if any) is shown + stickyPlaceholder: true, + // default container is body + container: 'body', + // callback when changing the value + onChange: function(el) { + var event = document.createEvent('HTMLEvents'); + event.initEvent('change', true, false); + el.dispatchEvent(event); + } + }; + + /** + * init function + * initialize and cache some vars + */ + SelectFx.prototype._init = function() { + // check if we are using a placeholder for the native select box + // we assume the placeholder is disabled and selected by default + var selectedOpt = document.querySelector('option[selected]'); + this.hasDefaultPlaceholder = selectedOpt && selectedOpt.disabled; + + // get selected option (either the first option with attr selected or just the first option) + this.selectedOpt = selectedOpt || this.el.querySelector('option'); + + // create structure + this._createSelectEl(); + + // all options + this.selOpts = [].slice.call(this.selEl.querySelectorAll('li[data-option]')); + + // total options + this.selOptsCount = this.selOpts.length; + + // current index + this.current = this.selOpts.indexOf(this.selEl.querySelector('li.cs-selected')) || -1; + + // placeholder elem + this.selPlaceholder = this.selEl.querySelector('span.cs-placeholder'); + + // init events + this._initEvents(); + + this.el.onchange = function() { + var index = this.selectedIndex; + var inputText = this.children[index].innerHTML.trim(); + } + + }; + + /** + * creates the structure for the select element + */ + SelectFx.prototype._createSelectEl = function() { + var self = this, + options = '', + createOptionHTML = function(el) { + var optclass = '', + classes = '', + link = ''; + + if (el.selectedOpt && !this.foundSelected && !this.hasDefaultPlaceholder) { + classes += 'cs-selected '; + this.foundSelected = true; + } + // extra classes + if (el.getAttribute('data-class')) { + classes += el.getAttribute('data-class'); + } + // link options + if (el.getAttribute('data-link')) { + link = 'data-link=' + el.getAttribute('data-link'); + } + + if (classes !== '') { + optclass = 'class="' + classes + '" '; + } + + return '
    • ' + el.textContent + '
    • '; + }; + + [].slice.call(this.el.children).forEach(function(el) { + if (el.disabled) { + return; + } + + var tag = el.tagName.toLowerCase(); + + if (tag === 'option') { + options += createOptionHTML(el); + } else if (tag === 'optgroup') { + options += '
    • ' + el.label + '
        '; + [].slice.call(el.children).forEach(function(opt) { + options += createOptionHTML(opt); + }); + options += '
    • '; + } + }); + + var opts_el = '
        ' + options + '
      '; + this.selEl = document.createElement('div'); + this.selEl.className = this.el.className; + this.selEl.tabIndex = this.el.tabIndex; + this.selEl.innerHTML = '' + this.selectedOpt.textContent + '' + opts_el; + this.el.parentNode.appendChild(this.selEl); + this.selEl.appendChild(this.el); + + // backdrop to support dynamic heights of the dropdown + var backdrop = document.createElement('div'); + backdrop.className = 'cs-backdrop'; + this.selEl.appendChild(backdrop); + }; + + /** + * initialize the events + */ + SelectFx.prototype._initEvents = function() { + var self = this; + + // open/close select + this.selPlaceholder.addEventListener('click', function() { + self._toggleSelect(); + }); + + // clicking the options + this.selOpts.forEach(function(opt, idx) { + opt.addEventListener('click', function() { + self.current = idx; + self._changeOption(); + // close select elem + self._toggleSelect(); + }); + }); + + // close the select element if the target it´s not the select element or one of its descendants.. + document.addEventListener('click', function(ev) { + var target = ev.target; + if (self._isOpen() && target !== self.selEl && !hasParent(target, self.selEl)) { + self._toggleSelect(); + } + }); + + // keyboard navigation events + this.selEl.addEventListener('keydown', function(ev) { + var keyCode = ev.keyCode || ev.which; + + switch (keyCode) { + // up key + case 38: + ev.preventDefault(); + self._navigateOpts('prev'); + break; + // down key + case 40: + ev.preventDefault(); + self._navigateOpts('next'); + break; + // space key + case 32: + ev.preventDefault(); + if (self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1) { + self._changeOption(); + } + self._toggleSelect(); + break; + // enter key + case 13: + ev.preventDefault(); + if (self._isOpen() && typeof self.preSelCurrent != 'undefined' && self.preSelCurrent !== -1) { + self._changeOption(); + self._toggleSelect(); + } + break; + // esc key + case 27: + ev.preventDefault(); + if (self._isOpen()) { + self._toggleSelect(); + } + break; + } + }); + }; + + /** + * navigate with up/dpwn keys + */ + SelectFx.prototype._navigateOpts = function(dir) { + if (!this._isOpen()) { + this._toggleSelect(); + } + + var tmpcurrent = typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1 ? this.preSelCurrent : this.current; + + if (dir === 'prev' && tmpcurrent > 0 || dir === 'next' && tmpcurrent < this.selOptsCount - 1) { + // save pre selected current - if we click on option, or press enter, or press space this is going to be the index of the current option + this.preSelCurrent = dir === 'next' ? tmpcurrent + 1 : tmpcurrent - 1; + // remove focus class if any.. + this._removeFocus(); + // add class focus - track which option we are navigating + classie.add(this.selOpts[this.preSelCurrent], 'cs-focus'); + } + }; + + /** + * open/close select + * when opened show the default placeholder if any + */ + SelectFx.prototype._toggleSelect = function() { + var backdrop = this.selEl.querySelector('.cs-backdrop'); + var container = document.querySelector(this.options.container); + var mask = container.querySelector('.dropdown-mask'); + var csOptions = this.selEl.querySelector('.cs-options'); + var csPlaceholder = this.selEl.querySelector('.cs-placeholder'); + + var csPlaceholderWidth = csPlaceholder.offsetWidth; + var csPlaceholderHeight = csPlaceholder.offsetHeight; + var csOptionsWidth = csOptions.scrollWidth; + + if (this._isOpen()) { + if (this.current !== -1) { + // update placeholder text + this.selPlaceholder.textContent = this.selOpts[this.current].textContent; + } + + var dummy = this.selEl.data; + + var parent = dummy.parentNode; + //parent.appendChild(this.selEl); + insertAfter(this.selEl, dummy); + this.selEl.removeAttribute('style'); + + parent.removeChild(dummy); + + // Hack for FF + // http://stackoverflow.com/questions/12088819/css-transitions-on-new-elements + var x = this.selEl.clientHeight; + + // reset backdrop + backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(1,1,1)'; + classie.remove(this.selEl, 'cs-active'); + + mask.style.display = 'none'; + csOptions.style.overflowY = 'hidden'; + csOptions.style.width = 'auto'; + + var parentFormGroup = closest(this.selEl, '.form-group'); + parentFormGroup && classie.removeClass(parentFormGroup, 'focused'); + + } else { + if (this.hasDefaultPlaceholder && this.options.stickyPlaceholder) { + // everytime we open we wanna see the default placeholder text + this.selPlaceholder.textContent = this.selectedOpt.textContent; + } + + var dummy; + if (this.selEl.parentNode.querySelector('.dropdown-placeholder')) { + dummy = this.selEl.parentNode.querySelector('.dropdown-placeholder'); + } else { + dummy = document.createElement('div'); + classie.add(dummy, 'dropdown-placeholder'); + //this.selEl.parentNode.appendChild(dummy); + insertAfter(dummy, this.selEl); + + } + + + dummy.style.height = csPlaceholderHeight + 'px'; + dummy.style.width = this.selEl.offsetWidth + 'px'; + + this.selEl.data = dummy; + + + + this.selEl.style.position = 'absolute'; + var offsetselEl = offset(this.selEl); + + this.selEl.style.left = offsetselEl.left + 'px'; + this.selEl.style.top = offsetselEl.top + 'px'; + + container.appendChild(this.selEl); + + // decide backdrop's scale factor depending on the content height + var contentHeight = csOptions.offsetHeight; + var originalHeight = csPlaceholder.offsetHeight; + + var contentWidth = csOptions.offsetWidth; + var originalWidth = csPlaceholder.offsetWidth; + + var scaleV = contentHeight / originalHeight; + var scaleH = (contentWidth > originalWidth) ? contentWidth / originalWidth : 1.05; + //backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(' + scaleH + ', ' + scaleV + ', 1)'; + backdrop.style.transform = backdrop.style.webkitTransform = backdrop.style.MozTransform = backdrop.style.msTransform = backdrop.style.OTransform = 'scale3d(' + 1 + ', ' + scaleV + ', 1)'; + + if (!mask) { + mask = document.createElement('div'); + classie.add(mask, 'dropdown-mask'); + container.appendChild(mask); + } + + mask.style.display = 'block'; + + classie.add(this.selEl, 'cs-active'); + + var resizedWidth = (csPlaceholderWidth < csOptionsWidth) ? csOptionsWidth : csPlaceholderWidth; + + this.selEl.style.width = resizedWidth + 'px'; + this.selEl.style.height = originalHeight + 'px'; + csOptions.style.width = '100%'; + + setTimeout(function() { + csOptions.style.overflowY = 'auto'; + }, 300); + + } + }; + + /** + * change option - the new value is set + */ + SelectFx.prototype._changeOption = function() { + // if pre selected current (if we navigate with the keyboard)... + if (typeof this.preSelCurrent != 'undefined' && this.preSelCurrent !== -1) { + this.current = this.preSelCurrent; + this.preSelCurrent = -1; + } + + // current option + var opt = this.selOpts[this.current]; + + // update current selected value + this.selPlaceholder.textContent = opt.textContent; + + // change native select element´s value + this.el.value = opt.getAttribute('data-value'); + + // remove class cs-selected from old selected option and add it to current selected option + var oldOpt = this.selEl.querySelector('li.cs-selected'); + if (oldOpt) { + classie.remove(oldOpt, 'cs-selected'); + } + classie.add(opt, 'cs-selected'); + + // if there´s a link defined + if (opt.getAttribute('data-link')) { + // open in new tab? + if (this.options.newTab) { + window.open(opt.getAttribute('data-link'), '_blank'); + } else { + window.location = opt.getAttribute('data-link'); + } + } + + // callback + this.options.onChange(this.el); + }; + + /** + * returns true if select element is opened + */ + SelectFx.prototype._isOpen = function(opt) { + return classie.has(this.selEl, 'cs-active'); + }; + + /** + * removes the focus class from the option + */ + SelectFx.prototype._removeFocus = function(opt) { + var focusEl = this.selEl.querySelector('li.cs-focus'); + if (focusEl) { + classie.remove(focusEl, 'cs-focus'); + } + }; + + /** + * add to global namespace + */ + window.SelectFx = SelectFx; + +})(window); + +/* ============================================================ + * Pages Circular Progress + * ============================================================ */ + +(function($) { + 'use strict'; + // CIRCULAR PROGRESS CLASS DEFINITION + // ====================== + + var Progress = function(element, options) { + this.$element = $(element); + this.options = $.extend(true, {}, $.fn.circularProgress.defaults, options); + + + // start adding to to DOM + this.$container = $('
      '); + + this.$element.attr('data-color') && this.$container.addClass('progress-circle-' + this.$element.attr('data-color')); + this.$element.attr('data-thick') && this.$container.addClass('progress-circle-thick'); + + this.$pie = $('
      '); + + this.$pie.$left = $('
      '); + this.$pie.$right = $('
      '); + + this.$pie.append(this.$pie.$left).append(this.$pie.$right); + + this.$container.append(this.$pie).append('
      '); + + this.$element.after(this.$container); + // end DOM adding + + this.val = this.$element.val(); + var deg = perc2deg(this.val); + + + if (this.val <= 50) { + this.$pie.$right.css('transform', 'rotate(' + deg + 'deg)'); + } else { + this.$pie.css('clip', 'rect(auto, auto, auto, auto)'); + this.$pie.$right.css('transform', 'rotate(180deg)'); + this.$pie.$left.css('transform', 'rotate(' + deg + 'deg)'); + } + + }; + Progress.VERSION = "1.0.0"; + + Progress.prototype.value = function(val) { + if (typeof val == 'undefined') return; + + var deg = perc2deg(val); + + this.$pie.removeAttr('style'); + + this.$pie.$right.removeAttr('style'); + this.$pie.$left.removeAttr('style'); + + if (val <= 50) { + this.$pie.$right.css('transform', 'rotate(' + deg + 'deg)'); + } else { + this.$pie.css('clip', 'rect(auto, auto, auto, auto)'); + this.$pie.$right.css('transform', 'rotate(180deg)'); + this.$pie.$left.css('transform', 'rotate(' + deg + 'deg)'); + } + + }; + + // CIRCULAR PROGRESS PLUGIN DEFINITION + // ======================= + function Plugin(option) { + return this.filter(':input').each(function() { + var $this = $(this); + var data = $this.data('pg.circularProgress'); + var options = typeof option == 'object' && option; + + if (!data) $this.data('pg.circularProgress', (data = new Progress(this, options))); + if (typeof option == 'string') data[option](); + else if (options.hasOwnProperty('value')) data.value(options.value); + }) + } + + var old = $.fn.circularProgress; + + $.fn.circularProgress = Plugin; + $.fn.circularProgress.Constructor = Progress; + + + $.fn.circularProgress.defaults = { + value: 0 + }; + + // CIRCULAR PROGRESS NO CONFLICT + // ==================== + + $.fn.circularProgress.noConflict = function() { + $.fn.circularProgress = old; + return this; + }; + + // CIRCULAR PROGRESS DATA API + //=================== + + $(window).on('load', function() { + $('[data-pages-progress="circle"]').each(function() { + var $progress = $(this); + $progress.circularProgress($progress.data()) + }) + }); + + function perc2deg(p) { + return parseInt(p / 100 * 360); + } + + // TODO: Add API to change size, stroke width, color + +})(window.jQuery); + +/* ============================================================ + * Pages Notifications + * ============================================================ */ + +(function($) { + + 'use strict'; + + var Notification = function(container, options) { + + var self = this; + + // Element collection + self.container = $(container); // 'body' recommended + self.notification = $('
      '); + self.options = $.extend(true, {}, $.fn.pgNotification.defaults, options); + + if (!self.container.find('.pgn-wrapper[data-position=' + this.options.position + ']').length) { + self.wrapper = $('
      '); + self.container.append(self.wrapper); + } else { + self.wrapper = $('.pgn-wrapper[data-position=' + this.options.position + ']'); + } + + self.alert = $('
      '); + self.alert.addClass('alert-' + self.options.type); + + if (self.options.style == 'bar') { + new BarNotification(); + } else if (self.options.style == 'flip') { + new FlipNotification(); + } else if (self.options.style == 'circle') { + new CircleNotification(); + } else if (self.options.style == 'simple') { + new SimpleNotification(); + } else { // default = 'simple' + new SimpleNotification(); + } + + // Notification styles + function SimpleNotification() { + + self.notification.addClass('pgn-simple'); + + self.alert.append(self.options.message); + if (self.options.showClose) { + var close = $('') + .append('') + .append('Close'); + + self.alert.prepend(close); + } + + } + + function BarNotification() { + + self.notification.addClass('pgn-bar'); + self.alert.addClass('alert-' + self.options.type); + + var container = $('
      '); + + container.append('' + self.options.message + ''); + + if (self.options.showClose) { + var close = $('') + .append('') + .append('Close'); + container.append(close) + } + self.alert.append(container); + + } + + function CircleNotification() { + + self.notification.addClass('pgn-circle'); + + var table = '
      '; + if (self.options.thumbnail) { + table += '
      ' + self.options.thumbnail + '
      '; + } + + table += '
      '; + + if (self.options.title) { + table += '

      ' + self.options.title + '

      '; + } + table += '

      ' + self.options.message + '

      '; + table += '
      '; + + if (self.options.showClose) { + table += ''; + } + + + self.alert.append(table); + self.alert.after('
      '); + + } + + function FlipNotification() { + + self.notification.addClass('pgn-flip'); + self.alert.append("" + self.options.message + ""); + if (self.options.showClose) { + var close = $('') + .append('') + .append('Close'); + + self.alert.prepend(close); + } + + } + + self.notification.append(self.alert); + + function alignWrapperToContainer(){ + var containerPosition = self.container.position(); + var containerHeight = self.container.height(); + var containerWidth = self.container.width(); + + var containerTop = containerPosition.top; + var containerBottom = self.container.parent().height() - (containerTop + containerHeight); + var containerLeft = containerPosition.left; + var containerRight = self.container.parent().width() - (containerLeft + containerWidth); + + if(/top/.test(self.options.position)){ + self.wrapper.css('top', containerTop) + } + if(/bottom/.test(self.options.position)){ + self.wrapper.css('bottom', containerBottom) + } + if(/left/.test(self.options.position)){ + self.wrapper.css('left', containerLeft) + } + if(/right/.test(self.options.position)){ + self.wrapper.css('right', containerRight) + } + } + if($('body').hasClass('horizontal-menu')){ + alignWrapperToContainer(); + $(window).on('resize', alignWrapperToContainer) + } + + // bind to Bootstrap closed event for alerts + self.alert.on('closed.bs.alert', function() { + self.notification.remove(); + self.options.onClosed(); + // refresh layout after removal + }); + + return this; // enable chaining + }; + + Notification.VERSION = "1.0.0"; + + Notification.prototype.show = function() { + + // TODO: add fadeOut animation on show as option + this.wrapper.prepend(this.notification); + + this.options.onShown(); + + if (this.options.timeout != 0) { + var _this = this; + // settimeout removes scope. use .bind(this) + setTimeout(function() { + this.notification.fadeOut("slow", function() { + $(this).remove(); + _this.options.onClosed(); + }); + }.bind(this), this.options.timeout); + } + + }; + + $.fn.pgNotification = function(options) { + return new Notification(this, options); + }; + + $.fn.pgNotification.defaults = { + style: 'simple', + message: null, + position: 'top-right', + type: 'info', + showClose: true, + timeout: 4000, + onShown: function() {}, + onClosed: function() {} + } +})(window.jQuery); + +/* ============================================================ + * Pages Cards + * ============================================================ */ + +(function($) { + 'use strict'; + // CARDS CLASS DEFINITION + // ====================== + + var Card = function(element, options) { + this.$element = $(element); + this.options = $.extend(true, {}, $.fn.card.defaults, options); + this.$loader = null; + this.$body = this.$element.find('.card-block'); + }; + Card.VERSION = "1.0.0"; + // Button actions + Card.prototype.collapse = function() { + var icon = this.$element.find('.collapse-icon'); + var heading = this.$element.find('.card-header'); + + this.$body.stop().slideToggle("fast"); + + if (this.$element.hasClass('card-collapsed')) { + this.$element.removeClass('card-collapsed'); + icon.removeClass().addClass('fa-chevron-down'); + $.isFunction(this.options.onExpand) && this.options.onExpand(this); + return + } + this.$element.addClass('card-collapsed'); + icon.removeClass().addClass('fa-chevron-right'); + $.isFunction(this.options.onCollapse) && this.options.onCollapse(this); + }; + + Card.prototype.close = function() { + this.$element.remove(); + $.isFunction(this.options.onClose) && this.options.onClose(this); + }; + + Card.prototype.error = function(error) { + if (error) { + var _this = this; + this.$element.pgNotification({ + style: 'bar', + message: error, + position: 'top', + timeout: 0, + type: 'danger', + onShown: function() { + _this.$loader.find('> div').fadeOut() + }, + onClosed: function() { + _this.refresh(false) + } + }).show(); + } + }; + + // CARD PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function() { + var $this = $(this); + var data = $this.data('pg.card'); + var options = typeof option == 'object' && option; + + if (!data) $this.data('pg.card', (data = new Card(this, options))); + if (typeof option == 'string') data[option](); + else if (options.hasOwnProperty('refresh')) data.refresh(options.refresh); + else if (options.hasOwnProperty('error')) data.error(options.error); + }) + } + + var old = $.fn.card; + + $.fn.card = Plugin; + $.fn.card.Constructor = Card; + + + $.fn.card.defaults = { + progress: 'circle', + progressColor: 'master', + refresh: false, + error: null, + overlayColor: '255,255,255', + overlayOpacity: 0.8, + refreshButton: '[data-toggle="refresh"]', + maximizeButton: '[data-toggle="maximize"]', + collapseButton: '[data-toggle="collapse"]', + closeButton: '[data-toggle="close"]' + + // onRefresh: function(portlet) {}, + // onCollapse: function(portlet) {}, + // onExpand: function(portlet) {}, + // onMaximize: function(portlet) {}, + // onRestore: function(portlet) {}, + // onClose: function(portlet) {} + }; + + // CARD NO CONFLICT + // ==================== + + $.fn.card.noConflict = function() { + $.fn.card = old; + return this; + } + +})(window.jQuery); + +/* ============================================================ + * Pages Mobile View + * ============================================================ */ +(function($) { + 'use strict'; + + var MobileView = function(element, options) { + var self = this; + self.options = $.extend(true, {}, $.fn.pgMobileViews.defaults, options); + self.element = $(element); + self.element.on('click', function(e) { + e.preventDefault(); + var data = self.element.data(); + var el = $(data.viewPort); + var toView = data.toggleView; + if (data.toggleView != null) { + el.children().last().children('.view').hide(); + $(data.toggleView).show(); + } + else{ + toView = el.last(); + } + el.toggleClass(data.viewAnimation); + self.options.onNavigate(toView, data.viewAnimation); + return false; + }); + return this; // enable chaining + }; + $.fn.pgMobileViews = function(options) { + return new MobileView(this, options); + }; + + $.fn.pgMobileViews.defaults = { + //Returns Target View & Animation Type + onNavigate: function(view, animation) {} + }; + // MOBILE VIEW DATA API + //=================== + + $(window).on('load', function() { + $('[data-navigate="view"]').each(function() { + var $mobileView = $(this); + $mobileView.pgMobileViews(); + }) + }); +})(window.jQuery); +/* ============================================================ + * Pages Quickview Plugin + * ============================================================ */ + +(function($) { + 'use strict'; + // QUICKVIEW CLASS DEFINITION + // ====================== + + var Quickview = function(element, options) { + this.$element = $(element); + this.options = $.extend(true, {}, $.fn.quickview.defaults, options); + this.bezierEasing = [.05, .74, .27, .99]; + var _this = this; + + $(this.options.notes).on('click', '.list > ul > li', function(e) { + var note = $(this).find('.note-preview'); + var note = $(this).find('.note-preview'); + $(_this.options.noteEditor).html(note.html()); + $(_this.options.notes).toggleClass('push'); + }); + $(this.options.notes).on('click', '.list > ul > li .checkbox', function(e) { + e.stopPropagation(); + }); + $(this.options.notes).on('click', _this.options.backButton, function(e) { + $(_this.options.notes).find('.toolbar > li > a').removeClass('active'); + $(_this.options.notes).toggleClass('push'); + }); + $(this.options.deleteNoteButton).click(function(e) { + e.preventDefault(); + $(this).toggleClass('selected'); + $(_this.options.notes).find('.list > ul > li .checkbox').fadeToggle("fast"); + $(_this.options.deleteNoteConfirmButton).fadeToggle("fast").removeClass('hide'); + }); + $(this.options.newNoteButton).click(function(e) { + e.preventDefault(); + $(_this.options.noteEditor).html(''); + }); + + $(this.options.deleteNoteConfirmButton).click(function() { + var checked = $(_this.options.notes).find('input[type=checkbox]:checked'); + checked.each(function() { + $(this).parents('li').remove(); + }); + }); + $(this.options.notes).on('click', '.toolbar > li > a', function(e) { + //e.preventDefault(); + var command = $(this).attr('data-action'); + document.execCommand(command, false, null); + $(this).toggleClass('active'); + }); + + }; + Quickview.VERSION = "1.0.0"; + + // QUICKVIEW PLUGIN DEFINITION + // ======================= + function Plugin(option) { + return this.each(function() { + var $this = $(this); + var data = $this.data('pg.quickview'); + var options = typeof option == 'object' && option; + + if (!data) $this.data('pg.quickview', (data = new Quickview(this, options))); + if (typeof option == 'string') data[option](); + }) + } + + var old = $.fn.quickview; + + $.fn.quickview = Plugin; + $.fn.quickview.Constructor = Quickview; + + + $.fn.quickview.defaults = { + notes: '#note-views', + alerts: '#alerts', + chat: '#chat', + notesList: '.list', + noteEditor: '.quick-note-editor', + deleteNoteButton: '.delete-note-link', + deleteNoteConfirmButton: '.btn-remove-notes', + newNoteButton: '.new-note-link', + backButton: '.close-note-link' + }; + + // QUICKVIEW NO CONFLICT + // ==================== + + $.fn.quickview.noConflict = function() { + $.fn.quickview = old; + return this; + }; + + // QUICKVIEW DATA API + //=================== + + $(window).on('load', function() { + + $('[data-pages="quickview"]').each(function() { + var $quickview = $(this); + $quickview.quickview($quickview.data()) + }) + }); + + + $(document).on('click.pg.quickview.data-api touchstart', '[data-toggle="quickview"]', function(e) { + var elem = $(this).attr('data-toggle-element'); + $(elem).toggleClass('open'); + e.preventDefault(); + }) + +})(window.jQuery); + + /* ============================================================ + * Pages Sidebar + * ============================================================ */ + + (function($) { + 'use strict'; + // SIDEBAR CLASS DEFINITION + // ====================== + + var Sidebar = function(element, options) { + this.$element = $(element); + this.$body = $('body'); + this.options = $.extend(true, {}, $.fn.sidebar.defaults, options); + + this.bezierEasing = [.05, .74, .27, .99]; + this.cssAnimation = true; + this.css3d = true; + + this.sideBarWidth = this.$element.width(); + this.sideBarWidthCondensed = - this.$element.offset().left; + + + this.$sidebarMenu = this.$element.find(".sidebar-menu > ul"); + this.$pageContainer = $(this.options.pageContainer); + + + if (!this.$sidebarMenu.length) return; + + // apply perfectScrollbar plugin only for desktops + ($.Pages.getUserAgent() == 'desktop') && this.$sidebarMenu.scrollbar({ + ignoreOverlay: false, + disableBodyScroll :(this.$element.data("disableBodyScroll") == true)? true : false + }); + + + if (!Modernizr.csstransitions) + this.cssAnimation = false; + if (!Modernizr.csstransforms3d) + this.css3d = false; + + // Bind events + // Toggle sub menus + // In Angular Binding is done using a pg-sidebar directive + (typeof angular === 'undefined') && $(document).on('click', '.sidebar-menu a', function(e) { + + if ($(this).parent().children('.sub-menu') === false) { + return; + } + var el = $(this); + var parent = $(this).parent().parent(); + var li = $(this).parent(); + var sub = $(this).parent().children('.sub-menu'); + + if(li.hasClass("open active")){ + el.children('.arrow').removeClass("open active"); + sub.slideUp(200, function() { + li.removeClass("open active"); + }); + + }else{ + parent.children('li.open').children('.sub-menu').slideUp(200); + parent.children('li.open').children('a').children('.arrow').removeClass('open active'); + parent.children('li.open').removeClass("open active"); + el.children('.arrow').addClass("open active"); + sub.slideDown(200, function() { + li.addClass("open active"); + + }); + } + //e.preventDefault(); + }); + + // Toggle sidebar + $('.sidebar-slide-toggle').on('click touchend', function(e) { + e.preventDefault(); + $(this).toggleClass('active'); + var el = $(this).attr('data-pages-toggle'); + if (el != null) { + $(el).toggleClass('show'); + } + }); + + var _this = this; + + function sidebarMouseEnter(e) { + + var menuOpenCSS = (this.css3d == true ? 'translate3d(' + _this.sideBarWidthCondensed + 'px, 0,0)' : 'translate(' + _this.sideBarWidthCondensed + 'px, 0)'); + + if ($.Pages.isVisibleSm() || $.Pages.isVisibleXs()) { + return false + } + if ($('.close-sidebar').data('clicked')) { + return; + } + if (_this.$body.hasClass('menu-pin')) + return; + + _this.$element.css({ + 'transform': menuOpenCSS + }); + _this.$body.addClass('sidebar-visible'); + } + + function sidebarMouseLeave(e) { + var menuClosedCSS = (_this.css3d == true ? 'translate3d(0, 0,0)' : 'translate(0, 0)'); + + if ($.Pages.isVisibleSm() || $.Pages.isVisibleXs()) { + return false + } + if (typeof e != 'undefined') { + var target = $(e.target); + if (target.parent('.page-sidebar').length) { + return; + } + } + if (_this.$body.hasClass('menu-pin')) + return; + + if ($('.sidebar-overlay-slide').hasClass('show')) { + $('.sidebar-overlay-slide').removeClass('show'); + $("[data-pages-toggle]").removeClass('active') + + } + + _this.$element.css({ + 'transform': menuClosedCSS + }); + _this.$body.removeClass('sidebar-visible'); + } + + + this.$element.bind('mouseenter mouseleave', sidebarMouseEnter); + this.$pageContainer.bind('mouseover', sidebarMouseLeave); + + function toggleMenuPin(){ + var width = $(window).width(); + if(width < 1200){ + if($('body').hasClass('menu-pin')){ + $('body').removeClass('menu-pin'); + $('body').addClass('menu-unpinned') + } + } else { + if($('body').hasClass('menu-unpinned')){ + $('body').addClass('menu-pin') + } + } + } + + $(document).bind('ready', toggleMenuPin); + $(window).bind('resize', toggleMenuPin); + + }; + + // Toggle sidebar for mobile view + Sidebar.prototype.toggleSidebar = function(toggle) { + var timer; + var bodyColor = $('body').css('background-color'); + $('.page-container').css('background-color', bodyColor); + if (this.$body.hasClass('sidebar-open')) { + this.$body.removeClass('sidebar-open'); + timer = setTimeout(function() { + this.$element.removeClass('visible'); + }.bind(this), 400); + } else { + clearTimeout(timer); + this.$element.addClass('visible'); + setTimeout(function() { + this.$body.addClass('sidebar-open'); + }.bind(this), 10); + setTimeout(function(){ + // remove background color + $('.page-container').css({'background-color': ''}); + },1000); + + } + + }; + + Sidebar.prototype.togglePinSidebar = function(toggle) { + if (toggle == 'hide') { + this.$body.removeClass('menu-pin'); + } else if (toggle == 'show') { + this.$body.addClass('menu-pin'); + } else { + this.$body.toggleClass('menu-pin'); + } + + }; + + + // SIDEBAR PLUGIN DEFINITION + // ======================= + function Plugin(option) { + return this.each(function() { + var $this = $(this); + var data = $this.data('pg.sidebar'); + var options = typeof option == 'object' && option; + + if (!data) $this.data('pg.sidebar', (data = new Sidebar(this, options))); + if (typeof option == 'string') data[option](); + }) + } + + var old = $.fn.sidebar; + + $.fn.sidebar = Plugin; + $.fn.sidebar.Constructor = Sidebar; + + + $.fn.sidebar.defaults = { + pageContainer: '.page-container' + }; + + // SIDEBAR PROGRESS NO CONFLICT + // ==================== + + $.fn.sidebar.noConflict = function() { + $.fn.sidebar = old; + return this; + }; + + // SIDEBAR PROGRESS DATA API + //=================== + + $(document).on('click.pg.sidebar.data-api', '[data-toggle-pin="sidebar"]', function(e) { + var $this = $(this); + var $target = $('[data-pages="sidebar"]'); + $target.data('pg.sidebar').togglePinSidebar(); + return false; + }); + $(document).on('click.pg.sidebar.data-api touchstart', '[data-toggle="sidebar"]', function(e) { + var $this = $(this); + var $target = $('[data-pages="sidebar"]'); + $target.data('pg.sidebar').toggleSidebar(); + return false + }) + + })(window.jQuery); + + +(function($) { + 'use strict'; + // Initialize layouts and plugins + (typeof angular === 'undefined') && $.Pages.init(); +})(window.jQuery); \ No newline at end of file diff --git a/resources/assets/js/pdfThumbnail.js b/resources/assets/js/pdfThumbnail.js new file mode 100644 index 00000000..3ef6c079 --- /dev/null +++ b/resources/assets/js/pdfThumbnail.js @@ -0,0 +1,90 @@ +/** + * Find all img elements with data-pdf-thumbnail-file attribute, + * then load pdf file given in the attribute, + * then use pdf.js to draw the first page on a canvas, + * then convert it to base64, + * then set it as the img src. + */ +var createPDFThumbnails = function(){ + + var worker = null; + var loaded = false; + var renderQueue = []; + + // select all img elements with data-pdf-thumbnail-file attribute + var nodesArray = Array.prototype.slice.call(document.querySelectorAll('img[data-pdf-thumbnail-file]')); + + if (!nodesArray.length) { + // No PDF found, don't load PDF.js + return; + } + + if (!loaded && typeof(pdfjsLib) === 'undefined') { + var src = document.querySelector('script[data-pdfjs-src]').getAttribute('data-pdfjs-src'); + + if (!src) { + throw Error('PDF.js URL not set in "data-pdfjs-src" attribute: cannot load PDF.js'); + } + + var script = document.createElement('script'); + script.src = src; + document.head.appendChild(script).onload = renderThumbnails; + loaded = true; + } + else { + renderThumbnails(); + } + + function renderThumbnails() { + if (!pdfjsLib) { + throw Error("pdf.js failed to load. Check data-pdfjs-src attribute."); + } + + nodesArray.forEach(function(element) { + if (null === worker) { + worker = new pdfjsLib.PDFWorker(); + } + + var filePath = element.getAttribute('data-pdf-thumbnail-file'); + var imgWidth = element.getAttribute('data-pdf-thumbnail-width'); + var imgHeight = element.getAttribute('data-pdf-thumbnail-height'); + + pdfjsLib.getDocument({url: filePath, worker: worker}).promise.then(function (pdf) { + pdf.getPage(1).then(function (page) { + var canvas = document.createElement("canvas"); + var viewport = page.getViewport({scale: 1.0}); + var context = canvas.getContext('2d'); + + if (imgWidth) { + viewport = page.getViewport({scale: imgWidth / viewport.width}); + } else if (imgHeight) { + viewport = page.getViewport({scale: imgHeight / viewport.height}); + } + + canvas.height = viewport.height; + canvas.width = viewport.width; + + page.render({ + canvasContext: context, + viewport: viewport + }).promise.then(function () { + element.src = canvas.toDataURL(); + }); + }).catch(function() { + console.log("pdfThumbnails error: could not open page 1 of document " + filePath + ". Not a pdf ?"); + }); + }).catch(function() { + console.log("pdfThumbnails error: could not find or open document " + filePath + ". Not a pdf ?"); + }); + }); + } +}; + +if ( + document.readyState === "complete" || + (document.readyState !== "loading" && !document.documentElement.doScroll) +) { + createPDFThumbnails(); +} else { + document.addEventListener("DOMContentLoaded", createPDFThumbnails); +} \ No newline at end of file diff --git a/resources/assets/js/scripts.js b/resources/assets/js/scripts.js new file mode 100644 index 00000000..64282038 --- /dev/null +++ b/resources/assets/js/scripts.js @@ -0,0 +1,56 @@ +$(function() { + $('.page-container').scrollbar().addClass('scrollbar-macosx'); + $('.scrollable').scrollbar().addClass('scrollbar-macosx'); + $.fn.selectListTrigger = function(eventName) { + return this.each(function() { + var el = $(this).get(0); + triggerNativeEvent(el, eventName); + }); + }; + + function triggerNativeEvent(el, eventName){ + if (el.fireEvent) { // < IE9 + (el.fireEvent('on' + eventName)); + } else { + var evt = document.createEvent('Events'); + evt.initEvent(eventName, true, false); + el.dispatchEvent(evt); + } + } + + $('[data-init-plugin="select2"]').on('select2:select', function (e) { + $(this).selectListTrigger('change'); + }); + + $('body').on('click', '.requestModal', function () { + let type = $(this).attr('data-type'); + if(type){ $(this).closest('.parentContainer').find('.modalContainer[data-type="'+type+'"]').modal('show'); } + }); + + $('body').on('click', '.tabButton', function(){ + let tabName = $(this).attr('tab-name'); + $(this).closest('.tabsContainer').find('.tabButton').not($(this).closest('.tabsContainer').find('.tabsContainer .tabButton')).removeClass('active'); + $(this).addClass('active'); + + $(this).closest('.tabsContainer').find('.tabContent:not(.hide)').not($(this).closest('.tabsContainer').find('.tabsContainer .tabContent')).addClass('hide'); + $(this).closest('.tabsContainer').find('.tabContent[tab-name="'+tabName+'"]').not($(this).closest('.tabsContainer').find('.tabsContainer .tabContent')).removeClass('hide'); + }); + + $('.scrollable').scrollbar().addClass('scrollbar-macosx'); + + if($('#maintenanceContainer').length >0 ){ + VANTA.BIRDS({ + el: "#maintenanceContainer", + backgroundColor: 0xf9f9f9, + wingSpan: 40.00, + separation: 100.00, + alignment: 100.00, + cohesion: 100.00, + quantity: 2.00 + }) + } + + $.fn.select2.defaults.set( "theme", "bootstrap" ); + $.fn.select2.defaults.set( "containerCssClass", "form-control" ); + +}); \ No newline at end of file diff --git a/resources/assets/js/three.r92.min.js b/resources/assets/js/three.r92.min.js new file mode 100644 index 00000000..0d8b21ea --- /dev/null +++ b/resources/assets/js/three.r92.min.js @@ -0,0 +1,927 @@ +// threejs.org/license +(function(k,xa){"object"===typeof exports&&"undefined"!==typeof module?xa(exports):"function"===typeof define&&define.amd?define(["exports"],xa):xa(k.THREE={})})(this,function(k){function xa(){}function A(a,b){this.x=a||0;this.y=b||0}function K(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0b&&(b=a[c]);return b}function I(){Object.defineProperty(this,"id",{value:Bf+=2});this.uuid=R.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange= +{start:0,count:Infinity}}function Kb(a,b,c,d,e,f){M.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new nb(a,b,c,d,e,f));this.mergeVertices()}function nb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,k,O,G,Lb){var q=f/O,u=g/G,x=f/2,N=g/2,v=k/2;g=O+1;var y=G+1,C=f=0,F,A,z=new p;for(A=0;Am;m++){if(n=d[m])if(h=n[0],l=n[1]){w&&e.addAttribute("morphTarget"+m,w[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=l;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Nf(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function bb(a,b,c,d,e,f,g,h,l,m){a= +void 0!==a?a:[];X.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,l,m);this.flipY=!1}function Ob(a,b,c){var d=a[0];if(0>=d||0/gm,function(a,c){a=W[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Vd(a)})}function Te(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g, +function(a,c,d,e){a="";for(c=parseInt(c);c 0 ) {\n\t\tfloat fogFactor = 0.0;\n\t\tif ( fogType == 1 ) {\n\t\t\tfogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t\t} else {\n\t\t\tconst float LOG2 = 1.442695;\n\t\t\tfogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );\n\t\t\tfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n\t\t}\n\t\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n\t}\n}"].join("\n")); +b.compileShader(Da);b.compileShader(D);b.attachShader(T,Da);b.attachShader(T,D);b.linkProgram(T);ha=T;N=b.getAttribLocation(ha,"position");O=b.getAttribLocation(ha,"uv");f=b.getUniformLocation(ha,"uvOffset");g=b.getUniformLocation(ha,"uvScale");h=b.getUniformLocation(ha,"rotation");l=b.getUniformLocation(ha,"center");m=b.getUniformLocation(ha,"scale");w=b.getUniformLocation(ha,"color");n=b.getUniformLocation(ha,"map");t=b.getUniformLocation(ha,"opacity");r=b.getUniformLocation(ha,"modelViewMatrix"); +k=b.getUniformLocation(ha,"projectionMatrix");u=b.getUniformLocation(ha,"fogType");x=b.getUniformLocation(ha,"fogDensity");y=b.getUniformLocation(ha,"fogNear");v=b.getUniformLocation(ha,"fogFar");C=b.getUniformLocation(ha,"fogColor");b.getUniformLocation(ha,"fogDepth");F=b.getUniformLocation(ha,"alphaTest");T=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");T.width=8;T.height=8;Da=T.getContext("2d");Da.fillStyle="white";Da.fillRect(0,0,8,8);z=new Cc(T)}c.useProgram(ha);c.initAttributes(); +c.enableAttribute(N);c.enableAttribute(O);c.disableUnusedAttributes();c.disable(b.CULL_FACE);c.enable(b.BLEND);b.bindBuffer(b.ARRAY_BUFFER,A);b.vertexAttribPointer(N,2,b.FLOAT,!1,16,0);b.vertexAttribPointer(O,2,b.FLOAT,!1,16,8);b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,ob);b.uniformMatrix4fv(k,!1,Lb.projectionMatrix.elements);c.activeTexture(b.TEXTURE0);b.uniform1i(n,0);Da=T=0;(D=p.fog)?(b.uniform3f(C,D.color.r,D.color.g,D.color.b),D.isFog?(b.uniform1f(y,D.near),b.uniform1f(v,D.far),b.uniform1i(u,1),Da= +T=1):D.isFogExp2&&(b.uniform1f(x,D.density),b.uniform1i(u,2),Da=T=2)):(b.uniform1i(u,0),Da=T=0);D=0;for(var J=q.length;Db||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+").");return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height* +b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height,a);return c}return a}function l(a){return R.isPowerOfTwo(a.width)&&R.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==a.minFilter&&1006!==a.minFilter}function w(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function n(b){return 1003===b||1004=== +b||1005===b?a.NEAREST:a.LINEAR}function t(b){b=b.target;b.removeEventListener("dispose",t);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}b.isVideoTexture&&delete C[b.id];g.memory.textures--}function k(b){b=b.target;b.removeEventListener("dispose",k);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&& +b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.memory.textures--}function q(b,n){var k=d.get(b);if(b.isVideoTexture){var r=b.id,q=g.render.frame;C[r]!==q&&(C[r]=q,b.update())}if(0p;p++)q[p]=n||r?r?b.image[p].image:b.image[p]:h(b.image[p],e.maxCubemapSize);var x=q[0],v=l(x),N=f.convert(b.format),y=f.convert(b.type);u(a.TEXTURE_CUBE_MAP,b,v);for(p=0;6>p;p++)if(n)for(var C,F=q[p].mipmaps,O=0,A=F.length;Ot;t++)e.__webglFramebuffer[t]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);u(a.TEXTURE_CUBE_MAP,b.texture,n);for(t=0;6>t;t++)p(e.__webglFramebuffer[t],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+t);m(b.texture,n)&&w(a.TEXTURE_CUBE_MAP,b.texture,b.width,b.height);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),u(a.TEXTURE_2D,b.texture,n),p(e.__webglFramebuffer, +b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,n)&&w(a.TEXTURE_2D,b.texture,b.width,b.height),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture"); +d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);q(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e, +0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),y(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),y(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=l(b);if(m(e,f)){f=b.isWebGLRenderTargetCube? +a.TEXTURE_CUBE_MAP:a.TEXTURE_2D;var g=d.get(e).__webglTexture;c.bindTexture(f,g);w(f,e,b.width,b.height);c.bindTexture(f,null)}}}function Ve(a,b){return{convert:function(c){if(1E3===c)return a.REPEAT;if(1001===c)return a.CLAMP_TO_EDGE;if(1002===c)return a.MIRRORED_REPEAT;if(1003===c)return a.NEAREST;if(1004===c)return a.NEAREST_MIPMAP_NEAREST;if(1005===c)return a.NEAREST_MIPMAP_LINEAR;if(1006===c)return a.LINEAR;if(1007===c)return a.LINEAR_MIPMAP_NEAREST;if(1008===c)return a.LINEAR_MIPMAP_LINEAR; +if(1009===c)return a.UNSIGNED_BYTE;if(1017===c)return a.UNSIGNED_SHORT_4_4_4_4;if(1018===c)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===c)return a.UNSIGNED_SHORT_5_6_5;if(1010===c)return a.BYTE;if(1011===c)return a.SHORT;if(1012===c)return a.UNSIGNED_SHORT;if(1013===c)return a.INT;if(1014===c)return a.UNSIGNED_INT;if(1015===c)return a.FLOAT;if(1016===c){var d=b.get("OES_texture_half_float");if(null!==d)return d.HALF_FLOAT_OES}if(1021===c)return a.ALPHA;if(1022===c)return a.RGB;if(1023===c)return a.RGBA; +if(1024===c)return a.LUMINANCE;if(1025===c)return a.LUMINANCE_ALPHA;if(1026===c)return a.DEPTH_COMPONENT;if(1027===c)return a.DEPTH_STENCIL;if(100===c)return a.FUNC_ADD;if(101===c)return a.FUNC_SUBTRACT;if(102===c)return a.FUNC_REVERSE_SUBTRACT;if(200===c)return a.ZERO;if(201===c)return a.ONE;if(202===c)return a.SRC_COLOR;if(203===c)return a.ONE_MINUS_SRC_COLOR;if(204===c)return a.SRC_ALPHA;if(205===c)return a.ONE_MINUS_SRC_ALPHA;if(206===c)return a.DST_ALPHA;if(207===c)return a.ONE_MINUS_DST_ALPHA; +if(208===c)return a.DST_COLOR;if(209===c)return a.ONE_MINUS_DST_COLOR;if(210===c)return a.SRC_ALPHA_SATURATE;if(33776===c||33777===c||33778===c||33779===c)if(d=b.get("WEBGL_compressed_texture_s3tc"),null!==d){if(33776===c)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===c)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===c)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===c)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===c||35841===c||35842===c||35843===c)if(d=b.get("WEBGL_compressed_texture_pvrtc"), +null!==d){if(35840===c)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===c)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===c)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===c)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===c&&(d=b.get("WEBGL_compressed_texture_etc1"),null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(37808===c||37809===c||37810===c||37811===c||37812===c||37813===c||37814===c||37815===c||37816===c||37817===c||37818===c||37819===c||37820===c||37821===c)if(d=b.get("WEBGL_compressed_texture_astc"), +null!==d)return c;if(103===c||104===c)if(d=b.get("EXT_blend_minmax"),null!==d){if(103===c)return d.MIN_EXT;if(104===c)return d.MAX_EXT}return 1020===c&&(d=b.get("WEBGL_depth_texture"),null!==d)?d.UNSIGNED_INT_24_8_WEBGL:0}}}function Y(a,b,c,d){Qa.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function qd(a){Y.call(this); +this.cameras=a||[]}function We(a){function b(){if(null!==d&&!0===d.isPresenting){var b=d.getEyeParameters("left"),e=b.renderWidth;b=b.renderHeight;u=a.getPixelRatio();q=a.getSize();a.setDrawingBufferSize(2*e,b,1)}else c.enabled&&a.setDrawingBufferSize(q.width,q.height,u)}var c=this,d=null,e=null,f=null,g=new K,h=new K;"undefined"!==typeof window&&"VRFrameData"in window&&(e=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",b,!1));var l=new K,m=new ia,w=new p,n=new Y;n.bounds= +new da(0,0,.5,1);n.layers.enable(1);var t=new Y;t.bounds=new da(.5,0,.5,1);t.layers.enable(2);var k=new qd([n,t]);k.layers.enable(1);k.layers.enable(2);var q,u;this.enabled=!1;this.userHeight=1.6;this.getDevice=function(){return d};this.setDevice=function(a){void 0!==a&&(d=a)};this.setPoseTarget=function(a){void 0!==a&&(f=a)};this.getCamera=function(a){if(null===d)return a;d.depthNear=a.near;d.depthFar=a.far;d.getFrameData(e);var b=d.stageParameters;b?g.fromArray(b.sittingToStandingTransform):g.makeTranslation(0, +c.userHeight,0);b=e.pose;var r=null!==f?f:a;r.matrix.copy(g);r.matrix.decompose(r.position,r.quaternion,r.scale);null!==b.orientation&&(m.fromArray(b.orientation),r.quaternion.multiply(m));null!==b.position&&(m.setFromRotationMatrix(g),w.fromArray(b.position),w.applyQuaternion(m),r.position.add(w));r.updateMatrixWorld();if(!1===d.isPresenting)return a;n.near=a.near;t.near=a.near;n.far=a.far;t.far=a.far;k.matrixWorld.copy(a.matrixWorld);k.matrixWorldInverse.copy(a.matrixWorldInverse);n.matrixWorldInverse.fromArray(e.leftViewMatrix); +t.matrixWorldInverse.fromArray(e.rightViewMatrix);h.getInverse(g);n.matrixWorldInverse.multiply(h);t.matrixWorldInverse.multiply(h);a=r.parent;null!==a&&(l.getInverse(a.matrixWorld),n.matrixWorldInverse.multiply(l),t.matrixWorldInverse.multiply(l));n.matrixWorld.getInverse(n.matrixWorldInverse);t.matrixWorld.getInverse(t.matrixWorldInverse);n.projectionMatrix.fromArray(e.leftProjectionMatrix);t.projectionMatrix.fromArray(e.rightProjectionMatrix);k.projectionMatrix.copy(n.projectionMatrix);a=d.getLayers(); +a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&n.bounds.fromArray(a.leftBounds),null!==a.rightBounds&&4===a.rightBounds.length&&t.bounds.fromArray(a.rightBounds));return k};this.getStandingMatrix=function(){return g};this.submitFrame=function(){null!==d&&!0===d.isPresenting&&d.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",b)}}function Xd(a){function b(){la=new Hf(E);la.get("WEBGL_depth_texture");la.get("OES_texture_float"); +la.get("OES_texture_float_linear");la.get("OES_texture_half_float");la.get("OES_texture_half_float_linear");la.get("OES_standard_derivatives");la.get("OES_element_index_uint");la.get("ANGLE_instanced_arrays");ja=new Ve(E,la);Ra=new Ff(E,la,a);aa=new Eg(E,la,ja);aa.scissor(S.copy(Z).multiplyScalar(U));aa.viewport(W.copy(P).multiplyScalar(U));fb=new Kf(E);Ba=new tg;ca=new Fg(E,la,aa,Ba,Ra,ja,fb);qa=new yf(E);ra=new If(E,qa,fb);sa=new Nf(ra,fb);va=new Mf(E);oa=new sg(T,la,Ra);ta=new xg;pa=new Cg;ma= +new Df(T,aa,ra,O);wa=new Ef(E,la,fb);xa=new Jf(E,la,fb);ya=new Dg(T,E,aa,ca,Ra);fb.programs=oa.programs;T.context=E;T.capabilities=Ra;T.extensions=la;T.properties=Ba;T.renderLists=ta;T.state=aa;T.info=fb}function c(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");I=!0}function d(){console.log("THREE.WebGLRenderer: Context Restored.");I=!1;b()}function e(a){a=a.target;a.removeEventListener("dispose",e);f(a);Ba.remove(a)}function f(a){var b=Ba.get(a).program;a.program=void 0; +void 0!==b&&oa.releaseProgram(b)}function g(a,b,c){a.render(function(a){T.renderBufferImmediate(a,b,c)})}function h(){var a=na.getDevice();a&&a.isPresenting?a.requestAnimationFrame(l):window.requestAnimationFrame(l)}function l(a){!1!==ua&&(za(a),h())}function m(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)B.pushLight(a),a.castShadow&&B.pushShadow(a);else if(a.isSprite)a.frustumCulled&&!ia.intersectsSprite(a)||B.pushSprite(a);else if(a.isImmediateRenderObject)c&&Pb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(pd), +z.push(a,null,a.material,Pb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||ia.intersectsObject(a)){c&&Pb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(pd);var d=sa.update(a),e=a.material;if(Array.isArray(e))for(var f=d.groups,g=0,h=f.length;ga.matrixWorld.determinant();aa.setMaterial(e,h);h=k(c,b.fog,e,a);Q="";g(a,h,e)}else T.renderBufferDirect(c,b.fog,d,e,a,f);a.onAfterRender(T,b,c,d,e,f);B=pa.get(b,Mb||c)}function t(a,b,c){var d=Ba.get(a),g=B.state.lights;c=oa.getParameters(a,g.state,B.state.shadowsArray,b,Y.numPlanes,Y.numIntersection,c);var h=oa.getProgramCode(a,c),l=d.program,m=!0;if(void 0===l)a.addEventListener("dispose",e);else if(l.code!==h)f(a);else{if(d.lightsHash!==g.state.hash)Ba.update(a, +"lightsHash",g.state.hash);else if(void 0!==c.shaderID)return;m=!1}m&&(c.shaderID?(l=rb[c.shaderID],d.shader={name:a.type,uniforms:Ca.clone(l.uniforms),vertexShader:l.vertexShader,fragmentShader:l.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader,T),l=oa.acquireProgram(a,d.shader,c,h),d.program=l,a.program=l);c=l.getAttributes();if(a.morphTargets)for(h=a.numSupportedMorphTargets=0;he.matrixWorld.determinant();aa.setMaterial(d,g);var h=k(a,b,d,e);a=c.id+"_"+h.id+"_"+(!0===d.wireframe);var l=!1;a!==Q&&(Q=a,l=!0);e.morphTargetInfluences&& +(va.update(e,c,d,h),l=!0);g=c.index;var m=c.attributes.position;b=1;!0===d.wireframe&&(g=ra.getWireframeAttribute(c),b=2);a=wa;if(null!==g){var n=qa.get(g);a=xa;a.setIndex(n)}if(l){if(c&&c.isInstancedBufferGeometry&&null===la.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{aa.initAttributes();l=c.attributes;h=h.getAttributes();var w=d.defaultAttributeValues; +for(F in h){var t=h[F];if(0<=t){var r=l[F];if(void 0!==r){var q=r.normalized,p=r.itemSize,u=qa.get(r);if(void 0!==u){var x=u.buffer,v=u.type;u=u.bytesPerElement;if(r.isInterleavedBufferAttribute){var y=r.data,C=y.stride;r=r.offset;y&&y.isInstancedInterleavedBuffer?(aa.enableAttributeAndDivisor(t,y.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=y.meshPerAttribute*y.count)):aa.enableAttribute(t);E.bindBuffer(E.ARRAY_BUFFER,x);E.vertexAttribPointer(t,p,v,q,C*u,r*u)}else r.isInstancedBufferAttribute? +(aa.enableAttributeAndDivisor(t,r.meshPerAttribute),void 0===c.maxInstancedCount&&(c.maxInstancedCount=r.meshPerAttribute*r.count)):aa.enableAttribute(t),E.bindBuffer(E.ARRAY_BUFFER,x),E.vertexAttribPointer(t,p,v,q,0,0)}}else if(void 0!==w&&(q=w[F],void 0!==q))switch(q.length){case 2:E.vertexAttrib2fv(t,q);break;case 3:E.vertexAttrib3fv(t,q);break;case 4:E.vertexAttrib4fv(t,q);break;default:E.vertexAttrib1fv(t,q)}}}aa.disableUnusedAttributes()}null!==g&&E.bindBuffer(E.ELEMENT_ARRAY_BUFFER,n.buffer)}n= +Infinity;null!==g?n=g.count:void 0!==m&&(n=m.count);g=c.drawRange.start*b;m=null!==f?f.start*b:0;var F=Math.max(g,m);f=Math.max(0,Math.min(n,g+c.drawRange.count*b,m+(null!==f?f.count*b:Infinity))-1-F+1);if(0!==f){if(e.isMesh)if(!0===d.wireframe)aa.setLineWidth(d.wireframeLinewidth*(null===L?U:1)),a.setMode(E.LINES);else switch(e.drawMode){case 0:a.setMode(E.TRIANGLES);break;case 1:a.setMode(E.TRIANGLE_STRIP);break;case 2:a.setMode(E.TRIANGLE_FAN)}else e.isLine?(d=d.linewidth,void 0===d&&(d=1),aa.setLineWidth(d* +(null===L?U:1)),e.isLineSegments?a.setMode(E.LINES):e.isLineLoop?a.setMode(E.LINE_LOOP):a.setMode(E.LINE_STRIP)):e.isPoints&&a.setMode(E.POINTS);c&&c.isInstancedBufferGeometry?0=Ra.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+Ra.maxTextures);Wd+=1;return a};this.setTexture2D=function(){var a=!1;return function(b, +c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ca.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ca.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ca.setTextureCube(b,c):ca.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return L};this.setRenderTarget=function(a){(L=a)&&void 0===Ba.get(a).__webglFramebuffer&&ca.setupRenderTarget(a);var b=null,c=!1;a?(b=Ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),W.copy(a.viewport),S.copy(a.scissor),V=a.scissorTest):(W.copy(P).multiplyScalar(U),S.copy(Z).multiplyScalar(U), +V=ea);J!==b&&(E.bindFramebuffer(E.FRAMEBUFFER,b),J=b);aa.viewport(W);aa.scissor(S);aa.setScissorTest(V);c&&(c=Ba.get(a.texture),E.framebufferTexture2D(E.FRAMEBUFFER,E.COLOR_ATTACHMENT0,E.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=Ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==J&&(E.bindFramebuffer(E.FRAMEBUFFER,g),h=!0);try{var l=a.texture,m=l.format,n=l.type;1023!==m&&ja.convert(m)!== +E.getParameter(E.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||ja.convert(n)===E.getParameter(E.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(la.get("OES_texture_float")||la.get("WEBGL_color_buffer_float"))||1016===n&&la.get("EXT_color_buffer_half_float")?E.checkFramebufferStatus(E.FRAMEBUFFER)===E.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&E.readPixels(b,c,d,e, +ja.convert(m),ja.convert(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&E.bindFramebuffer(E.FRAMEBUFFER,J)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width, +e=b.image.height,f=ja.convert(b.format);this.setTexture2D(b,0);E.copyTexImage2D(E.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ja.convert(c.format),h=ja.convert(c.type);b=b.isDataTexture?b.image.data:b.image;this.setTexture2D(c,0);E.texSubImage2D(E.TEXTURE_2D,d||0,a.x,a.y,e,f,g,h,b)}}function Qb(a,b){this.name="";this.color=new L(a);this.density=void 0!==b?b:2.5E-4}function Rb(a,b,c){this.name="";this.color=new L(a);this.near= +void 0!==b?b:1;this.far=void 0!==c?c:1E3}function rd(){B.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function gb(a){Q.call(this);this.type="SpriteMaterial";this.color=new L(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Dc(a){B.call(this);this.type="Sprite";this.material=void 0!==a?a:new gb;this.center=new A(.5,.5)}function Ec(){B.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0, +value:[]}})}function Fc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;ac;c++){var n=w[h[c]];var t=w[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m= +g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){l=a.attributes.position;w=a.index;var k=a.groups;0===k.length&&(k=[{start:0,count:w.count,materialIndex:0}]);a=0;for(e=k.length;ac;c++)n=w.getX(m+c),t=w.getX(m+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n], +h.fromBufferAttribute(l,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(l,m.index2),b.push(h.x,h.y,h.z)}else for(l=a.attributes.position,m=0,d=l.count/3;mc;c++)g=3*m+c,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(l,g),b.push(h.x,h.y,h.z);this.addAttribute("position",new z(b,3))}function Hc(a,b,c){M.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Vb(a,b,c));this.mergeVertices()} +function Vb(a,b,c){I.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,l=new p,m=new p,w=new p,n=new p,t,k,q=b+1;for(t=0;t<=c;t++){var u=t/c;for(k=0;k<=b;k++){var x=k/b;a(x,u,l);e.push(l.x,l.y,l.z);0<=x-1E-5?(a(x-1E-5,u,m),w.subVectors(l,m)):(a(x+1E-5,u,m),w.subVectors(m,l));0<=u-1E-5?(a(x,u-1E-5,m),n.subVectors(l,m)):(a(x,u+1E-5,m),n.subVectors(m,l));h.crossVectors(w,n).normalize();f.push(h.x,h.y,h.z);g.push(x,u)}}for(t=0;t< +c;t++)for(k=0;kd&&1===a.x&&(l[b]=a.x-1);0===c.x&&0===c.z&&(l[b]=d/2/Math.PI+.5)}I.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],l=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;he&&(.2>b&&(l[a+0]+=1),.2>c&&(l[a+2]+=1),.2>d&&(l[a+4]+=1))})(); +this.addAttribute("position",new z(h,3));this.addAttribute("normal",new z(h.slice(),3));this.addAttribute("uv",new z(l,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Jc(a,b){M.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Wb(a,b));this.mergeVertices()}function Wb(a,b){ma.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}} +function Kc(a,b){M.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new sb(a,b));this.mergeVertices()}function sb(a,b){ma.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b){M.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Xb(a,b));this.mergeVertices()} +function Xb(a,b){var c=(1+Math.sqrt(5))/2;ma.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Mc(a,b){M.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Yb(a,b));this.mergeVertices()} +function Yb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ma.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry"; +this.parameters={radius:a,detail:b}}function Nc(a,b,c,d,e,f){M.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Zb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Zb(a,b,c,d,e){function f(e){w=a.getPointAt(e/b,w);var f=g.normals[e];e=g.binormals[e];for(k=0;k<=d;k++){var m= +k/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);l.x=m*f.x+n*e.x;l.y=m*f.y+n*e.y;l.z=m*f.z+n*e.z;l.normalize();q.push(l.x,l.y,l.z);h.x=w.x+c*l.x;h.y=w.y+c*l.y;h.z=w.z+c*l.z;r.push(h.x,h.y,h.z)}}I.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,l=new p,m=new A,w=new p,n,k,r=[],q=[],u=[], +x=[];for(n=0;n=b;e-=d)f=Ye(e,a[e],a[e+1],f);f&&tb(f,f.next)&&(Qc(f),f=f.next);return f} +function Rc(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!tb(a,a.next)&&0!==sa(a.prev,a,a.next))a=a.next;else{Qc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}function Sc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=Zd(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,w,n,k,r=1;do{l=h;var q=h=null;for(w=0;l;){w++;var p=l;for(m=n=0;mn.x?w.x>r.x?w.x:r.x:n.x>r.x?n.x:r.x,C=w.y>n.y?w.y>r.y?w.y:r.y:n.y>r.y?n.y:r.y;m=Zd(w.x=m;){if(x!==q.prev&&x!==q.next&&wd(w.x,w.y,n.x,n.y,r.x,r.y,x.x,x.y)&&0<=sa(x.prev,x,x.next)){q=!1;break a}x=x.prevZ}q=!0}}else a:if(q=a,w=q.prev,n=q,r=q.next,0<=sa(w,n,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(wd(w.x,w.y,n.x,n.y,r.x,r.y,m.x,m.y)&&0<=sa(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(p.i/c),Qc(a),h=a=p.next;else if(a=p,a===h){if(!g)Sc(Rc(a),b,c,d,e,f,1);else if(1=== +g){g=b;h=c;l=a;do p=l.prev,q=l.next.next,!tb(p,q)&&Ze(p,l,l.next,q)&&Tc(p,q)&&Tc(q,p)&&(g.push(p.i/h),g.push(l.i/h),g.push(q.i/h),Qc(l),Qc(l.next),l=a=q),l=l.next;while(l!==a);a=l;Sc(a,b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;p=h;if(q=l.next.i!==p.i&&l.prev.i!==p.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==p.i&&q.next.i!==p.i&&Ze(q,q.next,l,p)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q=q&&Tc(l,p)&&Tc(p,l)){q=l;w=!1;n=(l.x+p.x)/2;p=(l.y+p.y)/ +2;do q.y>p!==q.next.y>p&&q.next.y!==q.y&&n<(q.next.x-q.x)*(p-q.y)/(q.next.y-q.y)+q.x&&(w=!w),q=q.next;while(q!==l);q=w}l=q}if(l){a=$e(g,h);g=Rc(g,g.next);a=Rc(a,a.next);Sc(g,b,c,d,e,f);Sc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Hg(a,b){return a.x-b.x}function Ig(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h= +c.x=c.x&&c.x>=g&&d!==c.x&&wd(eh.x)&&Tc(c,a)&&(h=c,m=k)}c=c.next}return h}function Zd(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b| +b<<1)&1431655765)<<1}function Jg(a){var b=a,c=a;do b.xsa(a.prev,a,a.next)?0<=sa(a,b, +a.next)&&0<=sa(a,a.prev,b):0>sa(a,b,a.prev)||0>sa(a,a.next,b)}function $e(a,b){var c=new $d(a.i,a.x,a.y),d=new $d(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Ye(a,b,c,d){a=new $d(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Qc(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function $d(a,b,c){this.i=a;this.x=b;this.y= +c;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function af(a){var b=a.length;2Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new A(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new A(f/e,d/ +e)}function h(a,b){for(P=a.length;0<=--P;){var c=P;var f=P-1;0>f&&(f=a.length-1);var g,h=v+2*G;for(g=0;gk;k++){var n=m[f[k]];var t=m[f[(k+1)%3]];d[0]=Math.min(n,t);d[1]=Math.max(n,t);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position",new z(c,3))}function xb(a,b,c,d,e,f,g,h){M.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a, +radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Za(a,b,c,d,e,f,g,h));this.mergeVertices()}function Za(a,b,c,d,e,f,g,h){function l(c){var e,f=new A,l=new p,w=0,u=!0===c?a:b,v=!0===c?1:-1;var z=q;for(e=1;e<=d;e++)n.push(0,x*v,0),t.push(0,v,0),r.push(.5,.5),q++;var B=q;for(e=0;e<=d;e++){var D=e/d*h+g,H=Math.cos(D);D=Math.sin(D);l.x=u*D;l.y=x*v;l.z=u*H;n.push(l.x,l.y,l.z);t.push(0,v,0);f.x=.5*H+.5;f.y=.5*D*v+.5;r.push(f.x,f.y); +q++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Md(a){this.manager=void 0!==a?a:va;this.textures={}}function ee(a){this.manager=void 0!==a?a:va}function lc(){}function fe(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:va;this.withCredentials=!1}function ff(a){this.manager=void 0!==a?a:va;this.texturePath=""} +function ge(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");this.manager=void 0!==a?a:va;this.options=void 0}function he(){this.type="ShapePath";this.color=new L;this.subPaths=[];this.currentPath=null}function ie(a){this.type="Font";this.data=a}function gf(a){this.manager=void 0!==a?a:va}function je(a){this.manager=void 0!==a?a:va}function hf(){this.type= +"StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Y;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Y;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function fd(a,b,c){B.call(this);this.type="CubeCamera";var d=new Y(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new Y(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new Y(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new Y(90, +1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new Y(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var l=new Y(90,1,a,b);l.up.set(0,-1,0);l.lookAt(new p(0,0,-1));this.add(l);this.renderTarget=new Ib(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b, +d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=m;c.activeCubeFace=5;a.render(b,l,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function ke(){B.call(this);this.type="AudioListener";this.context=le.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination); +this.filter=null}function mc(a){B.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function me(a){mc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function ne(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize= +void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function oe(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function jf(a,b,c){c=c||ra.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b, +c)}function ra(a,b,c){this.path=b;this.parsedPath=c||ra.parseTrackName(b);this.node=ra.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function kf(){this.uuid=R.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length}, +get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function lf(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop= +2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function pe(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Nd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function qe(){I.call(this); +this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function re(a,b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function nc(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function se(a,b,c){nc.call(this,a,b);this.meshPerAttribute=c||1}function te(a,b,c){H.call(this,a,b);this.meshPerAttribute=c||1}function mf(a,b,c,d){this.ray=new qb(a,b);this.near=c||0;this.far=d||Infinity; +this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function nf(a,b){return a.distance-b.distance}function ue(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;c++,d++){var e= +c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new z(b,3));b=new S({fog:!1});this.cone=new V(a,b);this.add(this.cone);this.update()}function rf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;ca?-1:0b;b++)a[b]=(16>b?"0":"")+b.toString(16);return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return(a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>>16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+ +a[f>>24&255]).toUpperCase()}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))}, +randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*R.DEG2RAD},radToDeg:function(a){return a*R.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/Math.LN2))}};Object.defineProperties(A.prototype,{width:{get:function(){return this.x},set:function(a){this.x= +a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(A.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y; +default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a, +b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/= +a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a= +new A,b=new A;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x): +Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&& +(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x=== +this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y; +return this}});Object.assign(K.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,l,m,k,n,t,r,q,p){var w=this.elements;w[0]=a;w[4]=b;w[8]=c;w[12]=d;w[1]=e;w[5]=f;w[9]=g;w[13]=h;w[2]=l;w[6]=m;w[10]=k;w[14]=n;w[3]=t;w[7]=r;w[11]=q;w[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new K).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6]; +b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c= +this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c); +var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c* +h,k=c*e,b[0]=g*h,b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y, +e=a._z,f=a._w,g=c+c,h=d+d,l=e+e;a=c*g;var m=c*h;c*=l;var k=d*h;d*=l;e*=l;g*=f;h*=f;f*=l;b[0]=1-(k+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+k);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f, +c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e= +c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],n=c[2],t=c[6],r=c[10],q=c[14],p=c[3],x=c[7],y=c[11];c=c[15];var v=d[0],C=d[4],F=d[8],N=d[12],O=d[1],G=d[5],z=d[9],A=d[13],B=d[2],D=d[6],H=d[10],I=d[14],L=d[3],J=d[7],K=d[11];d=d[15];b[0]=a*v+e*O+f*B+g*L;b[4]=a*C+e*G+f*D+g*J;b[8]=a*F+e*z+f*H+g*K;b[12]=a*N+e*A+f*I+g*d;b[1]=h*v+l*O+m*B+k*L;b[5]=h*C+l*G+m*D+k*J;b[9]=h*F+l*z+m*H+k*K;b[13]=h*N+l*A+m*I+k*d;b[2]=n*v+t*O+r*B+q*L;b[6]=n*C+t*G+r*D+q*J;b[10]=n*F+t*z+r*H+q*K;b[14]=n*N+t*A+r*I+q*d;b[3]=p*v+x*O+y* +B+c*L;b[7]=p*C+x*G+y*D+c*J;b[11]=p*F+x*z+y*H+c*K;b[15]=p*N+x*A+y*I+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var m=1/l;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=l;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs."); +var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements; +a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(ia,{slerp:function(a,b,c,d){return c.copy(a).slerp(b, +d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],l=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var k=e[f+1],n=e[f+2];e=e[f+3];if(c!==e||h!==d||l!==k||m!==n){f=1-g;var t=h*d+l*k+m*n+c*e,p=0<=t?1:-1,q=1-t*t;q>Number.EPSILON&&(q=Math.sqrt(q),t=Math.atan2(q,t*p),f=Math.sin(f*t)/q,g=Math.sin(g*t)/q);p*=g;h=h*f+d*p;l=l*f+k*p;m=m*f+n*p;c=c*f+e*p;f===1-g&&(g=1/Math.sqrt(h*h+l*l+m*m+c*c),h*=g,l*=g,m*=g,c*=g)}a[b]=h;a[b+1]=l;a[b+2]=m;a[b+3]=c}});Object.defineProperties(ia.prototype,{x:{get:function(){return this._x}, +set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(ia.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z, +this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),l=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"YXZ"===a?(this._x=c*l*f+ +h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"ZXY"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f-c*d*e):"ZYX"===a?(this._x=c*l*f-h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f+c*d*e):"YZX"===a?(this._x=c*l*f+h*d*e,this._y=h*d*f+c*l*e,this._z=h*l*e-c*d*f,this._w=h*l*f-c*d*e):"XZY"===a&&(this._x=c*l*f-h*d*e,this._y=h*d*f-c*l*e,this._z=h*l*e+c*d*f,this._w=h*l*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, +b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],l=b[6];b=b[10];var m=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(l-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= +.25*c,this._z=(g+l)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+l)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*= +-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a, +b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();return this}, +slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=Math.sqrt(1-g*g);if(.001>Math.abs(a))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+ +this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= +a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x; +case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this}, +addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z= +a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new ia;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); +return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new ia;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+ +a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},project:function(){var a=new K;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new K;return function(b){a.multiplyMatrices(b.matrixWorld, +a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x= +Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x= +Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x= +-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x- +this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b= +a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(R.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x- +a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y= +a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a= +[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(oa.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)}, +copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c= +this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var xf=0;X.DEFAULT_IMAGE=void 0;X.DEFAULT_MAPPING=300;X.prototype=Object.assign(Object.create(xa.prototype),{constructor:X,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name= +a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY= +a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format, +minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=R.generateUUID());if(!b&&void 0===a.images[d.uuid]){var e=a.images,f=d.uuid,g=d.uuid;if(d instanceof HTMLCanvasElement)var h=d;else{h=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");h.width=d.width;h.height=d.height;var l=h.getContext("2d");d instanceof ImageData?l.putImageData(d,0,0):l.drawImage(d,0,0,d.width,d.height)}h= +2048a.x||1a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.defineProperty(X.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(da.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this}, +setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z, +this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a, +b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*= +a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/ +b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var l=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-l)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+l)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+l)/4;b>f&&b>m?.01>b?(l=0,c=h=.707106781):(l=Math.sqrt(b),h=c/l,c=d/l):f>m?.01>f?(l=.707106781,h=0,c=.707106781): +(h=Math.sqrt(f),l=c/h,c=g/h):.01>m?(h=l=.707106781,c=0):(c=Math.sqrt(m),l=d/c,h=g/c);this.set(l,h,c,a);return this}a=Math.sqrt((l-g)*(l-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(l-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z, +a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new da,b=new da);a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b, +c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y): +Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+ +Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0=== +b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});ib.prototype=Object.assign(Object.create(xa.prototype),{constructor:ib,isWebGLRenderTarget:!0, +setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}}); +Ib.prototype=Object.create(ib.prototype);Ib.prototype.constructor=Ib;Ib.prototype.isWebGLRenderTargetCube=!0;jb.prototype=Object.create(X.prototype);jb.prototype.constructor=jb;jb.prototype.isDataTexture=!0;Object.assign(Va.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.length;h +e&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,l=a.count;he&&(e=m);k>f&&(f=k);n>g&&(g=n)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x- +this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center,a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0=a.constant},intersectsTriangle:function(){function a(a){var e;var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),l=b.dot(h),k=c.dot(h), +n=d.dot(h);if(Math.max(-Math.max(l,k,n),Math.min(l,k,n))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,l=new p,m=new p,k=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(l);m.subVectors(this.max,l);b.subVectors(h.a,l);c.subVectors(h.b,l);d.subVectors(h.c,l);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h=[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0, +0,1];if(!a(h))return!1;k.crossVectors(e,f);h=[k.x,k.y,k.z];return a(h)}}(),clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){void 0===b&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),b=new Ga); +this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a=[new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b); +a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b);a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&& +a.max.equals(this.max)}});Object.assign(Ga.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Va;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=c=0,f=b.length;e= +this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a); +void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Va);a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this}, +translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ha.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d= +a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)- +a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=new p;return function(b,c){void 0===c&&(console.warn("THREE.Plane: .intersectLine() target is now required"),c=new p);var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/ +e,!(0>e||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],m=c[7],k=c[8],n=c[9],p=c[10],r=c[11],q=c[12],u=c[13],x=c[14];c=c[15];b[0].setComponents(f-a,m-g,r-k,c-q).normalize();b[1].setComponents(f+a,m+g,r+k,c+q).normalize();b[2].setComponents(f+d,m+h,r+n,c+u).normalize();b[3].setComponents(f-d,m-h,r-n,c- +u).normalize();b[4].setComponents(f-e,m-l,r-p,c-x).normalize();b[5].setComponents(f+e,m+l,r+p,c+x).normalize();return this},intersectsObject:function(){var a=new Ga;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Ga;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(), +intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0 +g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var W={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n", +aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n", +clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n", +cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", +defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n", +emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", +envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", +fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n", +gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", +lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", +lights_pars_begin:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n", +lights_pars_maps:"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", +lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", +lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n", +lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n", +lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n", +logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n", +map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n", +metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif", +morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", +normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", +shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n", +distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n",shadow_vert:"#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"}, +Ca={merge:function(a){for(var b={},c=0;c>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b, +c,d){b=R.euclideanModulo(b,1);c=R.clamp(c,0,1);d=R.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= +Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/ +360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0=h?l/(e+f):l/(2-e-f);switch(e){case b:g=(c-d)/l+(cMath.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,l),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)? +(this._y=Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-k,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-k,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(k,-1,1)),.99999>Math.abs(k)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,l))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,l),this._y=Math.atan2(-k,a)):(this._x= +0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new K;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x, +a.y,a.z,b||this._order)},reorder:function(){var a=new ia;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a? +a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Sd.prototype,{set:function(a){this.mask=1<g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;cthis.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation);1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new p,b=new p,c=new p;return function(d, +e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),l=-this.direction.dot(b),m=c.dot(this.direction),k=-c.dot(b),n=c.lengthSq(),p=Math.abs(1-l*l);if(0=-r?e<=r?(h=1/p,d*=h,e*=h,l=d*(d+l*e+2*m)+e*(l*d+e+2*k)+n):(e=h,d=Math.max(0,-(l*e+m)),l=-d*d+e*(e+2*k)+n):(e=-h,d=Math.max(0,-(l*e+m)),l=-d*d+e*(e+2*k)+n):e<=-r?(d=Math.max(0,-(-l*h+m)),e=0b)return null;b=Math.sqrt(b-e);e= +d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)* +b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(da||h>c)return null;if(h>g||g!==g)g=h;if(a +c?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,l){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+ +g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,l)}}(),applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(Nb.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0=== +a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new p);return a.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new p);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b= +new p);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=R.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new p);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a); +this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});Object.assign(ja,{getNormal:function(){var a=new p;return function(b,c,d,e){void 0===e&&(console.warn("THREE.Triangle: .getNormal() target is now required"),e=new p);e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0=a.x+a.y}}()});Object.assign(ja.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b); +this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),getMidpoint:function(a){void 0===a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"), +a=new p);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return ja.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new p);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return ja.getBarycoord(a,this.a,this.b,this.c,b)},containsPoint:function(a){return ja.containsPoint(a,this.a,this.b,this.c)},intersectsBox:function(a){return a.intersectsTriangle(this)}, +closestPointToPoint:function(){var a=new Ha,b=[new Nb,new Nb,new Nb],c=new p,d=new p;return function(e,f){void 0===f&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),f=new p);var g=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))f.copy(c);else for(b[0].set(this.a,this.b),b[1].set(this.b,this.c),b[2].set(this.c,this.a),e=0;ec.far?null:{distance:b,point:y.clone(),object:a}}function c(c,d,e,f,m,k,n,p){g.fromBufferAttribute(f,k); +h.fromBufferAttribute(f,n);l.fromBufferAttribute(f,p);if(c=b(c,c.material,d,e,g,h,l,x))m&&(t.fromBufferAttribute(m,k),r.fromBufferAttribute(m,n),q.fromBufferAttribute(m,p),c.uv=a(x,g,h,l,t,r,q)),m=new Wa(k,n,p),ja.getNormal(g,h,l,m.normal),c.face=m,c.faceIndex=k;return c}var d=new K,e=new qb,f=new Ga,g=new p,h=new p,l=new p,m=new p,k=new p,n=new p,t=new A,r=new A,q=new A,u=new p,x=new p,y=new p;return function(p,w){var u=this.geometry,v=this.material,y=this.matrixWorld;if(void 0!==v&&(null===u.boundingSphere&& +u.computeBoundingSphere(),f.copy(u.boundingSphere),f.applyMatrix4(y),!1!==p.ray.intersectsSphere(f)&&(d.getInverse(y),e.copy(p.ray).applyMatrix4(d),null===u.boundingBox||!1!==e.intersectsBox(u.boundingBox)))){var C;if(u.isBufferGeometry){v=u.index;var z=u.attributes.position;u=u.attributes.uv;var A;if(null!==v)for(y=0,A=v.count;yf||(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}, +copy:function(a){B.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});Ec.prototype=Object.assign(Object.create(B.prototype),{constructor:Ec,copy:function(a){B.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;for(;ef||(k.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(k),ud.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}else for(g=0,q=r.length/3-1;gf||(k.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(k), +ud.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(l=g.vertices,m=l.length,g=0;gf||(k.applyMatrix4(this.matrixWorld),u=d.ray.origin.distanceTo(k),ud.far||e.push({distance:u,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry, +this.material)).copy(this)}});V.prototype=Object.assign(Object.create(pa.prototype),{constructor:V,isLineSegments:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[],f=0,g=d.count;fd.far||e.push({distance:a,distanceToRay:Math.sqrt(f),point:n.clone(),index:c,face:null,object:g}))}var g=this,h=this.geometry,l=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere(); +c.copy(h.boundingSphere);c.applyMatrix4(l);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(l);b.copy(d.ray).applyMatrix4(a);m/=(this.scale.x+this.scale.y+this.scale.z)/3;var k=m*m;m=new p;var n=new p;if(h.isBufferGeometry){var t=h.index;h=h.attributes.position.array;if(null!==t){var r=t.array;t=0;for(var q=r.length;t=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Tb.prototype=Object.create(X.prototype);Tb.prototype.constructor=Tb;Tb.prototype.isCompressedTexture=!0;Gc.prototype=Object.create(X.prototype);Gc.prototype.constructor=Gc;Gc.prototype.isDepthTexture=!0;Ub.prototype= +Object.create(I.prototype);Ub.prototype.constructor=Ub;Hc.prototype=Object.create(M.prototype);Hc.prototype.constructor=Hc;Vb.prototype=Object.create(I.prototype);Vb.prototype.constructor=Vb;Ic.prototype=Object.create(M.prototype);Ic.prototype.constructor=Ic;ma.prototype=Object.create(I.prototype);ma.prototype.constructor=ma;Jc.prototype=Object.create(M.prototype);Jc.prototype.constructor=Jc;Wb.prototype=Object.create(ma.prototype);Wb.prototype.constructor=Wb;Kc.prototype=Object.create(M.prototype); +Kc.prototype.constructor=Kc;sb.prototype=Object.create(ma.prototype);sb.prototype.constructor=sb;Lc.prototype=Object.create(M.prototype);Lc.prototype.constructor=Lc;Xb.prototype=Object.create(ma.prototype);Xb.prototype.constructor=Xb;Mc.prototype=Object.create(M.prototype);Mc.prototype.constructor=Mc;Yb.prototype=Object.create(ma.prototype);Yb.prototype.constructor=Yb;Nc.prototype=Object.create(M.prototype);Nc.prototype.constructor=Nc;Zb.prototype=Object.create(I.prototype);Zb.prototype.constructor= +Zb;Oc.prototype=Object.create(M.prototype);Oc.prototype.constructor=Oc;$b.prototype=Object.create(I.prototype);$b.prototype.constructor=$b;Pc.prototype=Object.create(M.prototype);Pc.prototype.constructor=Pc;ac.prototype=Object.create(I.prototype);ac.prototype.constructor=ac;var Mg={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Xe(a,0,e,c,!0),g=[];if(!f)return g;var h;if(d){var l=c;d=[];var m;var k=0;for(m=b.length;k80*c){var r=h=a[0];var q=d=a[1];for(l=c;lh&&(h=k),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}Sc(f,g,c,r,q,h);return g}},Ya={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;eYa.area(a)},triangulateShape:function(a, +b){var c=[],d=[],e=[];af(a);bf(c,a);var f=a.length;b.forEach(af);for(a=0;aMath.abs(g-l)?[new A(a,1-c),new A(h,1-d),new A(m,1-e),new A(n,1-b)]:[new A(g,1-c),new A(l,1-d),new A(k,1-e),new A(p,1-b)]}};Uc.prototype=Object.create(M.prototype);Uc.prototype.constructor=Uc;cc.prototype=Object.create(Xa.prototype);cc.prototype.constructor=cc;Vc.prototype=Object.create(M.prototype);Vc.prototype.constructor=Vc;ub.prototype= +Object.create(I.prototype);ub.prototype.constructor=ub;Wc.prototype=Object.create(M.prototype);Wc.prototype.constructor=Wc;dc.prototype=Object.create(I.prototype);dc.prototype.constructor=dc;Xc.prototype=Object.create(M.prototype);Xc.prototype.constructor=Xc;ec.prototype=Object.create(I.prototype);ec.prototype.constructor=ec;vb.prototype=Object.create(M.prototype);vb.prototype.constructor=vb;vb.prototype.toJSON=function(){var a=M.prototype.toJSON.call(this);return cf(this.parameters.shapes,a)};wb.prototype= +Object.create(I.prototype);wb.prototype.constructor=wb;wb.prototype.toJSON=function(){var a=I.prototype.toJSON.call(this);return cf(this.parameters.shapes,a)};fc.prototype=Object.create(I.prototype);fc.prototype.constructor=fc;xb.prototype=Object.create(M.prototype);xb.prototype.constructor=xb;Za.prototype=Object.create(I.prototype);Za.prototype.constructor=Za;Yc.prototype=Object.create(xb.prototype);Yc.prototype.constructor=Yc;Zc.prototype=Object.create(Za.prototype);Zc.prototype.constructor=Zc; +$c.prototype=Object.create(M.prototype);$c.prototype.constructor=$c;gc.prototype=Object.create(I.prototype);gc.prototype.constructor=gc;var ua=Object.freeze({WireframeGeometry:Ub,ParametricGeometry:Hc,ParametricBufferGeometry:Vb,TetrahedronGeometry:Jc,TetrahedronBufferGeometry:Wb,OctahedronGeometry:Kc,OctahedronBufferGeometry:sb,IcosahedronGeometry:Lc,IcosahedronBufferGeometry:Xb,DodecahedronGeometry:Mc,DodecahedronBufferGeometry:Yb,PolyhedronGeometry:Ic,PolyhedronBufferGeometry:ma,TubeGeometry:Nc, +TubeBufferGeometry:Zb,TorusKnotGeometry:Oc,TorusKnotBufferGeometry:$b,TorusGeometry:Pc,TorusBufferGeometry:ac,TextGeometry:Uc,TextBufferGeometry:cc,SphereGeometry:Vc,SphereBufferGeometry:ub,RingGeometry:Wc,RingBufferGeometry:dc,PlaneGeometry:Ac,PlaneBufferGeometry:pb,LatheGeometry:Xc,LatheBufferGeometry:ec,ShapeGeometry:vb,ShapeBufferGeometry:wb,ExtrudeGeometry:bc,ExtrudeBufferGeometry:Xa,EdgesGeometry:fc,ConeGeometry:Yc,ConeBufferGeometry:Zc,CylinderGeometry:xb,CylinderBufferGeometry:Za,CircleGeometry:$c, +CircleBufferGeometry:gc,BoxGeometry:Kb,BoxBufferGeometry:nb});yb.prototype=Object.create(Q.prototype);yb.prototype.constructor=yb;yb.prototype.isShadowMaterial=!0;yb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);return this};hc.prototype=Object.create(za.prototype);hc.prototype.constructor=hc;hc.prototype.isRawShaderMaterial=!0;Sa.prototype=Object.create(Q.prototype);Sa.prototype.constructor=Sa;Sa.prototype.isMeshStandardMaterial=!0;Sa.prototype.copy=function(a){Q.prototype.copy.call(this, +a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; +this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals= +a.morphNormals;return this};zb.prototype=Object.create(Sa.prototype);zb.prototype.constructor=zb;zb.prototype.isMeshPhysicalMaterial=!0;zb.prototype.copy=function(a){Sa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Ja.prototype=Object.create(Q.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isMeshPhongMaterial=!0;Ja.prototype.copy=function(a){Q.prototype.copy.call(this, +a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale= +a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Ab.prototype= +Object.create(Ja.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isMeshToonMaterial=!0;Ab.prototype.copy=function(a){Ja.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};Bb.prototype=Object.create(Q.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isMeshNormalMaterial=!0;Bb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; +this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Cb.prototype=Object.create(Q.prototype);Cb.prototype.constructor=Cb;Cb.prototype.isMeshLambertMaterial=!0;Cb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity= +a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin; +this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Db.prototype=Object.create(S.prototype);Db.prototype.constructor=Db;Db.prototype.isLineDashedMaterial=!0;Db.prototype.copy=function(a){S.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Ng=Object.freeze({ShadowMaterial:yb,SpriteMaterial:gb,RawShaderMaterial:hc,ShaderMaterial:za,PointsMaterial:Ia,MeshPhysicalMaterial:zb,MeshStandardMaterial:Sa, +MeshPhongMaterial:Ja,MeshToonMaterial:Ab,MeshNormalMaterial:Bb,MeshLambertMaterial:Cb,MeshDepthMaterial:db,MeshDistanceMaterial:eb,MeshBasicMaterial:ya,LineDashedMaterial:Db,LineBasicMaterial:S,Material:Q}),Hb={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},va=new ae,ab={};Object.assign(Ka.prototype,{load:function(a,b,c,d){void 0===a&&(a= +"");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=Hb.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==ab[a])ab[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":var m=new Uint8Array(g.length); +for(h=0;hg)e=a+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(R.clamp(d[l-1].dot(d[l]),-1,1)),e[l].applyMatrix4(h.makeRotationAxis(g, +c))),f[l].crossVectors(d[l],e[l]);if(!0===b)for(c=Math.acos(R.clamp(e[0].dot(e[a]),-1,1)),c/=a,0d;)d+=c;for(;d>c;)d-=c;de&&(e=1);1E-4>d&&(d=e);1E-4>l&&(l=e);ye.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,l);ze.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,l);Ae.initNonuniformCatmullRom(f.z, +g.z,h.z,c.z,d,e,l)}else"catmullrom"===this.curveType&&(ye.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),ze.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),Ae.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(ye.calc(a),ze.calc(a),Ae.calc(a));return b};ca.prototype.copy=function(a){J.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;bc.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(ef(d,e.x,f.x,g.x, +c.x),ef(d,e.y,f.y,g.y,c.y));return b};Oa.prototype.copy=function(a){J.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[], +b=0,c=0,d=this.curves.length;c=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=qa.arraySlice(c,e,f),this.values=qa.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;b=this.values; +var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&qa.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this, +f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;gk.opacity&&(k.transparent=!0);d.setTextures(l);return d.parse(k)}}()});var Be={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;cf;f++){var z=h[r++];var B=C[2*z];z=C[2*z+1];B=new A(B,z);2!==f&&c.faceVertexUvs[e][u].push(B);0!==f&&c.faceVertexUvs[e][u+1].push(B)}}x&&(x=3*h[r++],q.normal.set(k[x++],k[x++],k[x]),v.normal.copy(q.normal));if(y)for(e=0;4>e;e++)x=3*h[r++],y=new p(k[x++],k[x++],k[x]),2!==e&&q.vertexNormals.push(y), +0!==e&&v.vertexNormals.push(y);n&&(n=h[r++],n=w[n],q.color.setHex(n),v.color.setHex(n));if(l)for(e=0;4>e;e++)n=h[r++],n=w[n],2!==e&&q.vertexColors.push(new L(n)),0!==e&&v.vertexColors.push(new L(n));c.faces.push(q);c.faces.push(v)}else{q=new Wa;q.a=h[r++];q.b=h[r++];q.c=h[r++];u&&(u=h[r++],q.materialIndex=u);u=c.faces.length;if(e)for(e=0;ef;f++)z=h[r++],B=C[2*z],z=C[2*z+1],B=new A(B,z),c.faceVertexUvs[e][u].push(B);x&&(x=3*h[r++],q.normal.set(k[x++], +k[x++],k[x]));if(y)for(e=0;3>e;e++)x=3*h[r++],y=new p(k[x++],k[x++],k[x]),q.vertexNormals.push(y);n&&(n=h[r++],q.color.setHex(w[n]));if(l)for(e=0;3>e;e++)n=h[r++],q.vertexColors.push(new L(w[n]));c.faces.push(q)}}d=a;r=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;gNumber.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<= +a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Ya.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new hb;h.curves=g.curves;b.push(h);return b}var l=!e(f[0].getPoints());l=a?!l:l;h=[];var k=[],p=[],n=0;k[n]=void 0;p[n]=[];for(var t=0,r=f.length;td&&this._mixBufferRegion(c,a,3*b,1-d,b);d=b;for(var f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){ia.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d, +e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(jf.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_, +c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(ra,{Composite:jf,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new ra.Composite(a,b,c):new ra(a,b,c)},sanitizeNodeName:function(){var a=/[\[\]\.:\/]/g;return function(b){return b.replace(/\s/g,"_").replace(a,"")}}(),parseTrackName:function(){var a="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",b=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]");a=/(WCOD+)?/.source.replace("WCOD",a);var c=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", +"[^\\[\\]\\.:\\/]"),d=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),e=new RegExp("^"+b+a+c+d+"$"),f=["material","materials","bones"];return function(a){var b=e.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==f.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName= +d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==c)return c}if(a.children){var d=function(a){for(var c=0;c=b){var p=b++,n=a[p];c[n.uuid]=k;a[k]=n;c[l]=p;a[p]=h;h=0;for(l=e;h!==l;++h){n= +d[h];var t=n[k];n[k]=n[p];n[p]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var l=arguments[g].uuid,k=d[l];if(void 0!==k)if(delete d[l],kb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0]; +b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200===d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1=== +e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c);b-=c*f;e+=Math.abs(f);var g=this.repetitions-e;0>=g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time= +b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});pe.prototype=Object.assign(Object.create(xa.prototype), +{constructor:pe,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===k&&(k={},h[g]=k);for(h=0;h!==e;++h){var m=d[h],p=m.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new oe(ra.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),m.ValueTypeName,m.getValueSize());++n.referenceCount; +this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b= +a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length}, +get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&athis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new A);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/ +(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new A);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new A;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min); +this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});gd.prototype=Object.create(B.prototype);gd.prototype.constructor=gd;gd.prototype.isImmediateRenderObject=!0;hd.prototype=Object.create(V.prototype);hd.prototype.constructor=hd;hd.prototype.update=function(){var a=new p,b=new p,c=new oa;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld); +var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,m=g=0,p=k.length;mMath.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.lookAt(this.plane.normal);B.prototype.updateMatrixWorld.call(this,a)};var Pd,we;Gb.prototype=Object.create(B.prototype);Gb.prototype.constructor=Gb;Gb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999c.y?this.quaternion.set(1, +0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Gb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Gb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};nd.prototype=Object.create(V.prototype);nd.prototype.constructor=nd;J.create=function(a, +b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(J.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign($a.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead."); +a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new M,c=0,d=a.length;ce[Math.floor(Math.random()*e.length)];function s(e,t){return null==e&&(e=0),null==t&&(t=1),e+Math.random()*(t-e)}function a(e,t){return null==e&&(e=0),null==t&&(t=1),Math.floor(e+Math.random()*(t-e+1))}var l=e=>document.querySelector(e);const u=e=>"number"==typeof e?"#"+("00000"+e.toString(16)).slice(-6):e,h=(e,t=1)=>{const n=u(e),i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(n),r=i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null;return"rgba("+r.r+","+r.g+","+r.b+","+t+")"}},function(e,t,n){"use strict";n.d(t,"a",function(){return r});var i=n(0);window&&!window.VANTA&&(window.VANTA={version:"0.3.1"});const r=window.VANTA||{};r.register||(r.register=((e,t)=>{r[e]=(e=>new t(e))}));var o=function(){return Array.prototype.unshift.call(arguments,"[VANTA]"),console.error.apply(this,arguments)};r.VantaBase=class{constructor(e={}){var t,n,s,a;if(r.current=this,this.onMouseMoveWrapper=this.onMouseMoveWrapper.bind(this),this.resize=this.resize.bind(this),this.animationLoop=this.animationLoop.bind(this),this.restart=this.restart.bind(this),this.options=Object(i.c)({},this.defaultOptions),e instanceof HTMLElement||"string"==typeof e?Object(i.c)(this.options,{el:e}):Object(i.c)(this.options,e),this.el=this.options.el,null==this.el)o('Instance needs "el" param!');else if(!(this.options.el instanceof HTMLElement||(a=this.el,this.el=Object(i.e)(a),this.el)))return void o("Cannot find element",a);for(s=0;s=0&&i>=0&&!this.options.mouseEase&&this.triggerMouseMove(n,i)}triggerMouseMove(e,t){this.uniforms&&(this.uniforms.u_mouse.value.x=e/this.scale,this.uniforms.u_mouse.value.y=t/this.scale);const n=e/this.width,i=t/this.height;"function"==typeof this.onMouseMove&&this.onMouseMove(n,i)}setSize(){this.scale||(this.scale=1),Object(i.d)()&&this.options.scaleMobile?this.scale=this.options.scaleMobile:this.options.scale&&(this.scale=this.options.scale),this.width=this.el.offsetWidth||window.innerWidth,this.height=this.el.offsetHeight||window.innerHeight}resize(){var e,t;this.setSize(),null!=(e=this.camera)&&(e.aspect=this.width/this.height),null!=(t=this.camera)&&"function"==typeof t.updateProjectionMatrix&&t.updateProjectionMatrix(),this.renderer&&(this.renderer.setSize(this.width,this.height),this.renderer.setPixelRatio(window.devicePixelRatio/this.scale)),"function"==typeof this.onResize&&this.onResize()}animationLoop(){var e,t,n,i,r,o,s,a;return this.t||(this.t=0),this.t+=1,this.t2||(this.t2=0),this.t2+=null!=(o=this.options.speed)?o:1,this.uniforms&&(this.uniforms.u_time.value=.016667*this.t2),e=this.el.offsetHeight,t=this.el.getBoundingClientRect(),a=null!=(s=window.pageYOffset)?s:(document.documentElement||document.body.parentNode||document.body).scrollTop,i=(r=t.top+a)-window.innerHeight,n=r+e,this.options.mouseEase&&(this.mouseEaseX=this.mouseEaseX||this.mouseX||0,this.mouseEaseY=this.mouseEaseY||this.mouseY||0,Math.abs(this.mouseEaseX-this.mouseX)+Math.abs(this.mouseEaseY-this.mouseY)>.1&&(this.mouseEaseX=this.mouseEaseX+.05*(this.mouseX-this.mouseEaseX),this.mouseEaseY=this.mouseEaseY+.05*(this.mouseY-this.mouseEaseY),this.triggerMouseMove(this.mouseEaseX,this.mouseEaseY))),i<=a&&a<=n&&("function"==typeof this.onUpdate&&this.onUpdate(),this.scene&&this.camera&&(this.renderer.render(this.scene,this.camera),"transparent"==this.options.backgroundColor?this.renderer.setClearColor(this.options.backgroundColor,0):this.renderer.setClearColor(this.options.backgroundColor,this.options.backgroundAlpha)),this.fps&&this.fps.update&&this.fps.update()),this.req=window.requestAnimationFrame(this.animationLoop)}restart(){if(this.scene)for(;this.scene.children.length;)this.scene.remove(this.scene.children[0]);"function"==typeof this.onRestart&&this.onRestart(),this.init()}init(){"function"==typeof this.onInit&&this.onInit()}destroy(){"function"==typeof this.onDestroy&&this.onDestroy(),this.el.removeEventListener("mousemove",this.onMouseMoveWrapper),window.removeEventListener("scroll",this.onMouseMoveWrapper),window.removeEventListener("resize",this.resize),window.cancelAnimationFrame(this.req),this.renderer&&(this.el.removeChild(this.renderer.domElement),this.renderer=null,this.scene=null)}},t.b=r.VantaBase},,,function(e,t,n){"use strict";n.r(t);var i=n(1);let r=32,o=r*r;const s=800,a=s/2,l="uniform float time;\nuniform float delta;\n\nvoid main() {\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec4 tmpPos = texture2D( texturePosition, uv );\n vec3 position = tmpPos.xyz;\n vec3 velocity = texture2D( textureVelocity, uv ).xyz;\n\n float phase = tmpPos.w;\n\n phase = mod( ( phase + delta +\n length( velocity.xz ) * delta * 3. +\n max( velocity.y, 0.0 ) * delta * 6. ), 62.83 );\n\n gl_FragColor = vec4( position + velocity * delta * 15. , phase );\n\n}",u="uniform float time;\nuniform float testing;\nuniform float delta; // about 0.016\nuniform float separationDistance; // 20\nuniform float alignmentDistance; // 40\nuniform float cohesionDistance;\nuniform float speedLimit;\nuniform float freedomFactor;\nuniform vec3 predator;\n\nconst float width = resolution.x;\nconst float height = resolution.y;\n\nconst float PI = 3.141592653589793;\nconst float PI_2 = PI * 2.0;\n// const float VISION = PI * 0.55;\n\nfloat zoneRadius = 40.0;\nfloat zoneRadiusSquared = 1600.0;\n\nfloat separationThresh = 0.45;\nfloat alignmentThresh = 0.65;\n\nconst float UPPER_BOUNDS = BOUNDS;\nconst float LOWER_BOUNDS = -UPPER_BOUNDS;\n\nfloat rand(vec2 co){\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n}\n\nvoid main() {\n\n zoneRadius = separationDistance + alignmentDistance + cohesionDistance;\n separationThresh = separationDistance / zoneRadius;\n alignmentThresh = ( separationDistance + alignmentDistance ) / zoneRadius;\n zoneRadiusSquared = zoneRadius * zoneRadius;\n\n\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec3 birdPosition, birdVelocity;\n\n vec3 selfPosition = texture2D( texturePosition, uv ).xyz;\n vec3 selfVelocity = texture2D( textureVelocity, uv ).xyz;\n\n float dist;\n vec3 dir; // direction\n float distSquared;\n\n float separationSquared = separationDistance * separationDistance;\n float cohesionSquared = cohesionDistance * cohesionDistance;\n\n float f;\n float percent;\n\n vec3 velocity = selfVelocity;\n\n float limit = speedLimit;\n\n dir = predator * UPPER_BOUNDS - selfPosition;\n dir.z = 0.;\n // dir.z *= 0.6;\n dist = length( dir );\n distSquared = dist * dist;\n\n float preyRadius = 150.0;\n float preyRadiusSq = preyRadius * preyRadius;\n\n // move birds away from predator\n if (dist < preyRadius) {\n\n f = ( distSquared / preyRadiusSq - 1.0 ) * delta * 100.;\n velocity += normalize( dir ) * f;\n limit += 5.0;\n }\n\n // if (testing == 0.0) {}\n // if ( rand( uv + time ) < freedomFactor ) {}\n\n // Attract flocks to the center\n vec3 central = vec3( 0., 0., 0. );\n dir = selfPosition - central;\n dist = length( dir );\n\n dir.y *= 2.5;\n velocity -= normalize( dir ) * delta * 5.;\n\n for (float y=0.0;y zoneRadiusSquared ) continue;\n\n percent = distSquared / zoneRadiusSquared;\n\n if ( percent < separationThresh ) { // low\n\n // Separation - Move apart for comfort\n f = (separationThresh / percent - 1.0) * delta;\n velocity -= normalize(dir) * f;\n\n } else if ( percent < alignmentThresh ) { // high\n\n // Alignment - fly the same direction\n float threshDelta = alignmentThresh - separationThresh;\n float adjustedPercent = ( percent - separationThresh ) / threshDelta;\n\n birdVelocity = texture2D( textureVelocity, ref ).xyz;\n\n f = ( 0.5 - cos( adjustedPercent * PI_2 ) * 0.5 + 0.5 ) * delta;\n velocity += normalize(birdVelocity) * f;\n\n } else {\n\n // Attraction / Cohesion - move closer\n float threshDelta = 1.0 - alignmentThresh;\n float adjustedPercent = ( percent - alignmentThresh ) / threshDelta;\n\n f = ( 0.5 - ( cos( adjustedPercent * PI_2 ) * -0.5 + 0.5 ) ) * delta;\n\n velocity += normalize(dir) * f;\n\n }\n }\n }\n\n // this make tends to fly around than down or up\n // if (velocity.y > 0.) velocity.y *= (1. - 0.2 * delta);\n\n // Speed Limits\n if ( length( velocity ) > limit ) {\n velocity = normalize( velocity ) * limit;\n }\n\n gl_FragColor = vec4( velocity, 1.0 );\n\n}",h="attribute vec2 reference;\nattribute float birdVertex;\n\nattribute vec3 birdColor;\n\nuniform sampler2D texturePosition;\nuniform sampler2D textureVelocity;\n\nvarying vec4 vColor;\nvarying float z;\n\nuniform float time;\n\nvoid main() {\n\n vec4 tmpPos = texture2D( texturePosition, reference );\n vec3 pos = tmpPos.xyz;\n vec3 velocity = normalize(texture2D( textureVelocity, reference ).xyz);\n\n vec3 newPosition = position;\n\n if ( birdVertex == 4.0 || birdVertex == 7.0 ) {\n // flap wings\n newPosition.y = sin( tmpPos.w ) * 5.;\n }\n\n newPosition = mat3( modelMatrix ) * newPosition;\n\n velocity.z *= -1.;\n float xz = length( velocity.xz );\n float xyz = 1.;\n float x = sqrt( 1. - velocity.y * velocity.y );\n\n float cosry = velocity.x / xz;\n float sinry = velocity.z / xz;\n\n float cosrz = x / xyz;\n float sinrz = velocity.y / xyz;\n\n mat3 maty = mat3(\n cosry, 0, -sinry,\n 0 , 1, 0 ,\n sinry, 0, cosry\n );\n\n mat3 matz = mat3(\n cosrz , sinrz, 0,\n -sinrz, cosrz, 0,\n 0 , 0 , 1\n );\n newPosition = maty * matz * newPosition;\n newPosition += pos;\n z = newPosition.z;\n\n vColor = vec4( birdColor, 1.0 );\n gl_Position = projectionMatrix * viewMatrix * vec4( newPosition, 1.0 );\n}",c="varying vec4 vColor;\nvarying float z;\nuniform vec3 color;\nvoid main() {\n // Fake colors for now\n float rr = 0.2 + ( 1000. - z ) / 1000. * vColor.x;\n float gg = 0.2 + ( 1000. - z ) / 1000. * vColor.y;\n float bb = 0.2 + ( 1000. - z ) / 1000. * vColor.z;\n gl_FragColor = vec4( rr, gg, bb, 1. );\n}",d=function(e){const t=e.image.data;let n=0;const i=t.length;return(()=>{const e=[];for(;n{const e=[];for(;n1&&(e=1),this.last=this.now,this.positionUniforms.time.value=this.now,this.positionUniforms.delta.value=e,this.velocityUniforms.time.value=this.now,this.velocityUniforms.delta.value=e,this.birdUniforms.time.value=this.now,this.birdUniforms.delta.value=e,this.velocityUniforms.predator.value.set(this.mouseX,-this.mouseY,0),this.mouseX=1e4,this.mouseY=1e4,this.gpuCompute.compute(),this.birdUniforms.texturePosition.value=this.gpuCompute.getCurrentRenderTarget(this.positionVariable).texture,this.birdUniforms.textureVelocity.value=this.gpuCompute.getCurrentRenderTarget(this.velocityVariable).texture}onMouseMove(e,t){return this.mouseX=e-.5,this.mouseY=t-.5}onDestroy(){}onResize(){}}m.initClass(),i.a.register("BIRDS",m)}]); \ No newline at end of file diff --git a/resources/assets/sass/_color.scss b/resources/assets/sass/_color.scss new file mode 100644 index 00000000..810b63f1 --- /dev/null +++ b/resources/assets/sass/_color.scss @@ -0,0 +1,543 @@ +// Import the Compass Plugin +//-------------------------------- +// Normal +//-------------------------------- +@function blend-normal ($foreground, $background) { + $opacity: opacity($foreground); + $background-opacity: opacity($background); + + // calculate opacity + $bm-red: red($foreground) * $opacity + red($background) * $background-opacity * (1 - $opacity); + $bm-green: green($foreground) * $opacity + green($background) * $background-opacity * (1 - $opacity); + $bm-blue: blue($foreground) * $opacity + blue($background) * $background-opacity * (1 - $opacity); + @return rgb($bm-red, $bm-green, $bm-blue); +} + +//-------------------------------- +// Multiply +//-------------------------------- +@function blend-multiply ($foreground, $background) { + $bm-red: red($background) * red($foreground) / 255; + $bm-green: green($background) * green($foreground) / 255; + $bm-blue: blue($background) * blue($foreground) / 255; + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Lighten +//-------------------------------- +@function blend-lighten ($foreground, $background) { + $bm-red: blend-lighten-color(red($foreground), red($background)); + $bm-green: blend-lighten-color(green($foreground), green($background)); + $bm-blue: blend-lighten-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-lighten-color($foreground, $background) { + @if $background > $foreground { + $foreground: $background; + } + @return $foreground; +} + +//-------------------------------- +// Darken +//-------------------------------- +@function blend-darken ($foreground, $background) { + $bm-red: blend-darken-color(red($foreground), red($background)); + $bm-green: blend-darken-color(green($foreground), green($background)); + $bm-blue: blend-darken-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-darken-color($foreground, $background) { + @if $background < $foreground { + $foreground: $background; + } + @return $foreground; +} + +//-------------------------------- +// Darker Color +//-------------------------------- +@function blend-darkercolor ($foreground, $background) { + $bm-red: red($foreground); + $bm-green: green($foreground); + $bm-blue: blue($foreground); + $background-red: red($background); + $background-green: green($background); + $background-blue: blue($background); + + @if $background-red * 0.3 + $background-green * 0.59 + $background-blue * 0.11 <= $bm-red * 0.3 + $bm-green * 0.59 + $bm-blue * 0.11 { + $bm-red: $background-red; + $bm-green: $background-green; + $bm-blue: $background-blue; + } + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Lighter Color +//-------------------------------- +@function blend-lightercolor ($foreground, $background) { + $bm-red: red($foreground); + $bm-green: green($foreground); + $bm-blue: blue($foreground); + $background-red: red($background); + $background-green: green($background); + $background-blue: blue($background); + + @if $background-red * 0.3 + $background-green * 0.59 + $background-blue * 0.11 > $bm-red * 0.3 + $bm-green * 0.59 + $bm-blue * 0.11 { + $bm-red: $background-red; + $bm-green: $background-green; + $bm-blue: $background-blue; + } + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Linear Dodge +//-------------------------------- +@function blend-lineardodge ($foreground, $background) { + $bm-red: blend-lineardodge-color(red($foreground), red($background)); + $bm-green: blend-lineardodge-color(green($foreground), green($background)); + $bm-blue: blend-lineardodge-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-lineardodge-color($foreground, $background) { + @if $background + $foreground > 255 { + $foreground: 255; + } @else { + $foreground: $background + $foreground; + } + @return $foreground; +} + +//-------------------------------- +// Linear Burn +//-------------------------------- +@function blend-linearburn ($foreground, $background) { + $bm-red: blend-linearburn-color(red($foreground), red($background)); + $bm-green: blend-linearburn-color(green($foreground), green($background)); + $bm-blue: blend-linearburn-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-linearburn-color($foreground, $background) { + @if $background + $foreground < 255 { + $foreground: 0; + } @else { + $foreground: $background + $foreground - 255; + } + @return $foreground; +} + +//-------------------------------- +// Difference +//-------------------------------- +@function blend-difference ($foreground, $background) { + $bm-red: abs(red($background) - red($foreground)); + $bm-green: abs(green($background) - green($foreground)); + $bm-blue: abs(blue($background) - blue($foreground)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Screen +//-------------------------------- +@function blend-screen ($foreground, $background) { + $bm-red: blend-screen-color(red($foreground), red($background)); + $bm-green: blend-screen-color(green($foreground), green($background)); + $bm-blue: blend-screen-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-screen-color($foreground, $background) { + @return (255 - ( ( (255 - $foreground) * (255 - $background)) / 256)); +} + +//-------------------------------- +// Exclusion +//-------------------------------- +@function blend-exclusion ($foreground, $background) { + $bm-red: blend-exclusion-color(red($foreground), red($background)); + $bm-green: blend-exclusion-color(green($foreground), green($background)); + $bm-blue: blend-exclusion-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-exclusion-color($foreground, $background) { + @return $background - ($background * (2 / 255) - 1) * $foreground; +} + +//-------------------------------- +// Overlay +//-------------------------------- +@function blend-overlay ($foreground, $background) { + $bm-red: blend-overlay-color(red($foreground), red($background)); + $bm-green: blend-overlay-color(green($foreground), green($background)); + $bm-blue: blend-overlay-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-overlay-color($foreground, $background) { + @if $background <= 255 / 2 { + $foreground: (2 * $background * $foreground) / 255; + } @else { + $foreground: 255 - (255 - 2 * ($background - (255 / 2))) * (255 - $foreground) / 255; + } + @return $foreground; +} + +//-------------------------------- +// Soft Light +//-------------------------------- +@function blend-softlight ($foreground, $background) { + $bm-red: blend-softlight-color(red($foreground), red($background)); + $bm-green: blend-softlight-color(green($foreground), green($background)); + $bm-blue: blend-softlight-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-softlight-color($foreground, $background) { + @if $background < 128 { + $foreground: (($foreground / 2) + 64) * $background * (2 / 255); + } @else { + $foreground: 255 - (191 - ($foreground / 2)) * (255 - $background) * (2 / 255); + } + @return $foreground; +} + +//-------------------------------- +// Hard Light +//-------------------------------- +@function blend-hardlight ($foreground, $background) { + $bm-red: blend-hardlight-color(red($foreground), red($background)); + $bm-green: blend-hardlight-color(green($foreground), green($background)); + $bm-blue: blend-hardlight-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-hardlight-color($foreground, $background) { + $tmp-blend: $foreground; + @if $tmp-blend < 128 { + $foreground: $background * $tmp-blend * (2 / 255); + } @else { + $foreground: 255 - (255-$background) * (255-$tmp-blend) * (2 / 255); + } + @return $foreground; +} + +//-------------------------------- +// Color Dodge +//-------------------------------- +@function blend-colordodge ($foreground, $background) { + $bm-red: blend-colordodge-color(red($foreground), red($background)); + $bm-green: blend-colordodge-color(green($foreground), green($background)); + $bm-blue: blend-colordodge-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-colordodge-color($foreground, $background) { + $tmp: $background * 256 / (255 - $foreground); + @if $tmp > 255 or $foreground == 255 { + $foreground: 255; + } @else { + $foreground: $tmp; + } + @return $foreground; +} + +//-------------------------------- +// Color Burn +//-------------------------------- +@function blend-colorburn ($foreground, $background) { + $bm-red: blend-colorburn-color(red($foreground), red($background)); + $bm-green: blend-colorburn-color(green($foreground), green($background)); + $bm-blue: blend-colorburn-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-colorburn-color($foreground, $background) { + $tmp: (255 - ((255 - $background) * 255) / $foreground); + + // TODO: hacked to replicate photoshop + @if $foreground == 0 { + $foreground: 255; + } @else if $tmp < 0 { + $foreground: 0; + } @else { + $foreground: $tmp; + } + @return $foreground; +} + +//-------------------------------- +// Linear Light +//-------------------------------- +@function blend-linearlight ($foreground, $background) { + $bm-red: blend-linearlight-color(red($foreground), red($background)); + $bm-green: blend-linearlight-color(green($foreground), green($background)); + $bm-blue: blend-linearlight-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-linearlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-linearburn-color($background, 2 * $foreground); + } @else { + $foreground: blend-lineardodge-color($background, 2 * ($foreground - 128)); + } + @return $foreground; +} + +//-------------------------------- +// Vivid Light +//-------------------------------- +@function blend-vividlight ($foreground, $background) { + $bm-red: blend-vividlight-color(red($foreground), red($background)); + $bm-green: blend-vividlight-color(green($foreground), green($background)); + $bm-blue: blend-vividlight-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-vividlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-colorburn-color(2 * $foreground, $background); + } @else { + $foreground: blend-colordodge-color(2 * ($foreground - 128), $background); + } + @return $foreground; +} + +//-------------------------------- +// Pin Light +//-------------------------------- +@function blend-pinlight ($foreground, $background) { + $bm-red: blend-pinlight-color(red($foreground), red($background)); + $bm-green: blend-pinlight-color(green($foreground), green($background)); + $bm-blue: blend-pinlight-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-pinlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-darken-color($background, 2 * $foreground); + } @else { + $foreground: blend-lighten-color($background, 2 * ($foreground - 128)); + } + @return $foreground; +} + +//-------------------------------- +// Hard Mix +//-------------------------------- +@function blend-hardmix ($foreground, $background) { + $bm-red: blend-hardmix-color(red($foreground), red($background)); + $bm-green: blend-hardmix-color(green($foreground), green($background)); + $bm-blue: blend-hardmix-color(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-hardmix-color($foreground, $background) { + $tmp: blend-vividlight-color($foreground, $background); + @if $tmp < 128 { + $foreground: 0; + } @else { + $foreground: 255; + } + @return $foreground; +} + +// Unique to Photoshop + +//-------------------------------- +// Color Blend +//-------------------------------- +@function blend-colorblend ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + + $bm-hsv: nth($foreground-hsv, 1), nth($foreground-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Dissolve +//-------------------------------- +@function blend-dissolve ($foreground, $background) { + // The Dissolve blend mode acts on transparent and partially transparent pixels + // it treats transparency as a pixel pattern and applies a diffusion dither pattern. + // @see http://photoblogstop.com/photoshop/photoshop-blend-modes-explained + @return $foreground; +} + +//-------------------------------- +// Divide +//-------------------------------- +@function blend-divide ($foreground, $background) { + $bm-red: blend-divide-colors(red($foreground), red($background)); + $bm-green: blend-divide-colors(green($foreground), green($background)); + $bm-blue: blend-divide-colors(blue($foreground), blue($background)); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-divide-colors($foreground, $background) { + @return min((($background / 255) / ($foreground / 255)) * 255, 255); +} + +//-------------------------------- +// Hue +//-------------------------------- +@function blend-hue ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + + $bm-hsv: nth($foreground-hsv, 1), nth($background-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Luminosity +//-------------------------------- +@function blend-luminosity ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + + $bm-hsv: nth($background-hsv, 1), nth($background-hsv, 2), nth($foreground-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Saturation +//-------------------------------- +@function blend-saturation ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + + $bm-hsv: nth($background-hsv, 1), nth($foreground-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Subtract +//-------------------------------- +@function blend-subtract ($foreground, $background) { + $bm-red: max(red($background) - red($foreground), 0); + $bm-green: max(green($background) - green($foreground), 0); + $bm-blue: max(blue($background) - blue($foreground), 0); + + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// HSL and HSV +//-------------------------------- +// @see https://gist.github.com/1069204 +@function hsv-to-hsl($h, $s: 0, $v: 0) { + @if type-of($h) == 'list' { + $v: nth($h, 3); + $s: nth($h, 2); + $h: nth($h, 1); + } + + @if unit($h) == 'deg' { + $h: 3.1415 * 2 * ($h / 360deg); + } + @if unit($s) == '%' { + $s: 0 + ($s / 100%); + } + @if unit($v) == '%' { + $v: 0 + ($v / 100%); + } + + $ss: $s * $v; + $ll: (2 - $s) * $v; + + @if $ll <= 1 and $ll != 0 { + $ss: $ss / $ll; + } @else if ($ll == 2) { + $ss: 0; + } @else { + $ss: $ss / (2 - $ll); + } + + $ll: $ll / 2; + + @return 360deg * $h / (3.1415 * 2), percentage(max(0, min(1, $ss))), percentage(max(0, min(1, $ll))); +} + +@function hsl-to-hsv($h, $ss: 0, $ll: 0) { + @if type-of($h) == 'list' { + $ll: nth($h, 3); + $ss: nth($h, 2); + $h: nth($h, 1); + } @else if type-of($h) == 'color' { + $ll: lightness($h); + $ss: saturation($h); + $h: hue($h); + } + + @if unit($h) == 'deg' { + $h: 3.1415 * 2 * ($h / 360deg); + } + @if unit($ss) == '%' { + $ss: 0 + ($ss / 100%); + } + @if unit($ll) == '%' { + $ll: 0 + ($ll / 100%); + } + + $ll: $ll * 2; + + @if $ll <= 1 { + $ss: $ss * $ll; + } @else { + $ss: $ss * (2 - $ll); + } + + $v: ($ll + $ss) / 2; + $s: if($ll + $ss == 0, 0, (2 * $ss) / ($ll + $ss)); + + @return 360deg * $h / (3.1415 * 2), percentage(max(0, min(1, $s))), percentage(max(0, min(1, $v))); +} + +@function color-to-hsv($color) { + @return hsl-to-hsv($color); +} + +@function hsv-to-color($h, $s: 0, $v: 0) { + $hsl: hsv-to-hsl($h, $s, $v); + @return hsl(nth($hsl, 1), nth($hsl, 2), nth($hsl, 3)); +} + +@function fade($color, $opacity) { + @return fade-in($color, $opacity/100%) +} \ No newline at end of file diff --git a/resources/assets/sass/_mixins.scss b/resources/assets/sass/_mixins.scss new file mode 100644 index 00000000..7a4aba5c --- /dev/null +++ b/resources/assets/sass/_mixins.scss @@ -0,0 +1,903 @@ +@mixin clearfix() { + &:before, + &:after { + content: " "; /* 1 */ + display: table; /* 2 */ + } + &:after { + clear: both; + } +} + +// Webkit-style focus +@mixin tab-focus() { + // Default + outline: thin dotted #000; + outline-offset: -2px; +} + +// Center-align a block level element +@mixin center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} + +// Sizing shortcuts +@mixin size($width, $height) { + width: $width; + height: $height; +} + +@mixin square($size) { + @include size($size, $size); +} + +@mixin flexbox() { + display: flex; +} + +@mixin flex-inline() { + display: inline-flex; +} + +@mixin align-items($argument) { + align-items: $argument; +} + +@mixin flex-column { + flex-direction: column; +} + +@mixin flex-row { + flex-direction: row; +} + +// Placeholder text +@mixin placeholder($color: $input-color-placeholder) { + &.placeholder { + color: $color; + } +} + +// Placeholder text +@mixin selected($color, $background) { + &::selection { + background: $background; /* Safari */ + color: $color; + } +} + +@mixin placeholder-height($height) { + &.placeholder { + line-height: $height; + } +} + +// Text overflow +// Requires inline-block or block for proper styling +@mixin text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// CSS image replacement +@mixin text-hide() { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +@mixin invisible() { + visibility: hidden; +} + +//Padding Helper Classes +@mixin generate-paddings-options-prefix($prefix,$n, $j: 0) { + @if $j <= $n { + @for $i from $j through $n { + $step: $i*5; + .#{$prefix}-p-t-#{$step} { + margin-top: ($step*1px) !important; + } + .#{$prefix}-p-r-#{$step} { + margin-right: ($step*1px) !important; + } + .#{$prefix}-p-l-#{$step} { + margin-left: ($step*1px) !important; + } + .#{$prefix}-p-b-#{$step} { + margin-bottom: ($step*1px) !important; + } + //@include generate-margin-options($n, ($i + 1)); + } + } +} + +//Margins Helper Classes +@mixin generate-margin-options-prefix($prefix,$n, $j: 0) { + @if $j <= $n { + @for $i from $j through $n { + $step: $i*5; + .#{$prefix}-m-t-#{$step} { + margin-top: ($step*1px) !important; + } + .#{$prefix}-m-r-#{$step} { + margin-right: ($step*1px) !important; + } + .#{$prefix}-m-l-#{$step} { + margin-left: ($step*1px) !important; + } + .#{$prefix}-m-b-#{$step} { + margin-bottom: ($step*1px) !important; + } + //@include generate-margin-options($n, ($i + 1)); + } + } +} + +// CSS3 PROPERTIES +// -------------------------------------------------- +@mixin mask($arguments) { + mask: $arguments; +} + +@mixin box_scale($scale) { + transform: scale($scale); +} + +// Single side border-radius +@mixin border-top-radius($radius) { + border-top-right-radius: $radius; + border-top-left-radius: $radius; +} + +@mixin border-right-radius($radius) { + border-bottom-right-radius: $radius; + border-top-right-radius: $radius; +} + +@mixin border-bottom-radius($radius) { + border-bottom-right-radius: $radius; + border-bottom-left-radius: $radius; +} + +@mixin border-left-radius($radius) { + border-bottom-left-radius: $radius; + border-top-left-radius: $radius; +} + +@mixin border-radius($radius) { + border-radius: $radius; +} + +// Drop shadows +@mixin box-shadow($shadow) { + box-shadow: $shadow; +} + +@mixin animation($properties) { + animation: $properties; +} + +// Transitions +@mixin transition($transition) { + transition: $transition; +} + +@mixin transition-property($transition-property) { + transition-property: $transition-property; +} + +@mixin transition-delay($transition-delay) { + transition-delay: $transition-delay; +} + +@mixin transition-duration($transition-duration) { + transition-duration: $transition-duration; +} + +@mixin transition-transform($transition) { + transition: transform $transition; +} + +// Transformations +@mixin rotate($degrees) { + transform: rotate($degrees); +} + +@mixin scale($ratio) { + transform: scale($ratio); +} + +@mixin translate($x, $y) { + transform: translate($x, $y); +} + +@mixin translateY($y) { + transform: translateY($y); +} + +@mixin translateX($x) { + transform: translateX($x); +} + +@mixin skew($x, $y) { + transform: skew($x, $y); +} + +@mixin translate3d($x, $y, $z) { + transform: translate3d($x, $y, $z); +} + +@mixin rotateX($degrees) { + transform: rotateX($degrees); +} + +@mixin rotateY($degrees) { + transform: rotateY($degrees); +} + +@mixin perspective($perspective) { + perspective: $perspective; +} + +@mixin perspective-origin($perspective) { + perspective-origin: $perspective; +} + +@mixin transform-origin($origin) { + transform-origin: $origin; +} + +@mixin transform-style($style) { + transform-style: $style; +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden` +// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples +@mixin backface-visibility($visibility) { + backface-visibility: $visibility; +} + +// Background clip +@mixin background-clip($clip: border-box) { + background-clip: $clip; +} + +// Box sizing +@mixin box-sizing($boxmodel) { + box-sizing: $boxmodel; +} + +// User select +// For selecting text on the page +@mixin user-select($select) { + user-select: $select; +} + +// Resize anything +@mixin resizable($direction) { + resize: $direction; // Options: horizontal, vertical, both + overflow: auto; // Safari fix +} + +// CSS3 Content Columns +@mixin content-columns($column-count, $column-gap: $grid-gutter-width) { + column-count: $column-count; + column-gap: $column-gap; +} + +// Optional hyphenation +@mixin hyphens($mode: auto) { + word-wrap: break-word; + hyphens: $mode; +} + +// Opacity +@mixin opacity($opacity) { + opacity: $opacity; + // IE8 filter + $opacity-ie: ($opacity * 100); + filter: alpha(opacity=$opacity-ie); +} + +// GRADIENTS +// -------------------------------------------------- +@mixin linear-gradient($from, $to) { + background: $to; + background: linear-gradient(to bottom, $from 0%, $to 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=#{$from}, endColorstr=#{$to}) +} + +#gradient { + // Horizontal gradient, from left to right + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + @mixin horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) { + // Standard, IE10 + background: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent) repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down + } + // Vertical gradient, from top to bottom + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + @mixin vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) { + // Standard, IE10 + background: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent) repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down + } + @mixin directional($start-color: #555, $end-color: #333, $deg: 45deg) { + // Standard, IE10 + background: linear-gradient($deg, $start-color, $end-color) repeat-x; + } + @mixin horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) { + background: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color) no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback + } + @mixin vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) { + background: linear-gradient($start-color, $mid-color $color-stop, $end-color) no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback + } + @mixin radial($inner-color: #555, $outer-color: #333) { + background: radial-gradient(circle, $inner-color, $outer-color) no-repeat; + } + @mixin striped($color: rgba(255,255,255,.15), $angle: 45deg) { + background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); + } +} + +// Reset filters for IE +// +// When you need to remove a gradient background, do not forget to use this to reset +// the IE filter for IE9 and below. +@mixin reset-filter() { + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} + +// Retina images +// +// Short retina mixin for setting background-image and -size +@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) { + background-image: url("${file-1x}"); + @media only screen and (min-device-pixel-ratio: 2), + only screen and (min-resolution: 192dpi), + only screen and (min-resolution: 2dppx) { + background-image: url("${file-2x}"); + background-size: $width-1x $height-1x; + } +} + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. +@mixin img-responsive($display: block) { + display: $display; + max-width: 100%; // Part 1: Set a maximum relative to the parent + height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching +} + +@mixin keyframe ($animation_name) { + @-webkit-keyframes #{$animation_name} { + @content; + } + + @-moz-keyframes #{$animation_name} { + @content; + } + + @-o-keyframes #{$animation_name} { + @content; + } + + @keyframes #{$animation_name} { + @content; + } +} + +// Import the Compass Plugin +//-------------------------------- +// Normal +//-------------------------------- +@function blend-normal ($foreground, $background) { + $opacity: opacity($foreground); + $background-opacity: opacity($background); + // calculate opacity + $bm-red: red($foreground) * $opacity + red($background) * $background-opacity * (1 - $opacity); + $bm-green: green($foreground) * $opacity + green($background) * $background-opacity * (1 - $opacity); + $bm-blue: blue($foreground) * $opacity + blue($background) * $background-opacity * (1 - $opacity); + @return rgb($bm-red, $bm-green, $bm-blue); +} + +//-------------------------------- +// Multiply +//-------------------------------- +@function blend-multiply ($foreground, $background) { + $bm-red: red($background) * red($foreground) / 255; + $bm-green: green($background) * green($foreground) / 255; + $bm-blue: blue($background) * blue($foreground) / 255; + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Lighten +//-------------------------------- +@function blend-lighten ($foreground, $background) { + $bm-red: blend-lighten-color(red($foreground), red($background)); + $bm-green: blend-lighten-color(green($foreground), green($background)); + $bm-blue: blend-lighten-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-lighten-color($foreground, $background) { + @if $background > $foreground { + $foreground: $background; + } + @return $foreground; +} + +//-------------------------------- +// Darken +//-------------------------------- +@function blend-darken ($foreground, $background) { + $bm-red: blend-darken-color(red($foreground), red($background)); + $bm-green: blend-darken-color(green($foreground), green($background)); + $bm-blue: blend-darken-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-darken-color($foreground, $background) { + @if $background < $foreground { + $foreground: $background; + } + @return $foreground; +} + +//-------------------------------- +// Darker Color +//-------------------------------- +@function blend-darkercolor ($foreground, $background) { + $bm-red: red($foreground); + $bm-green: green($foreground); + $bm-blue: blue($foreground); + $background-red: red($background); + $background-green: green($background); + $background-blue: blue($background); + @if $background-red * 0.3 + $background-green * 0.59 + $background-blue * 0.11 <= $bm-red * 0.3 + $bm-green * 0.59 + $bm-blue * 0.11 { + $bm-red: $background-red; + $bm-green: $background-green; + $bm-blue: $background-blue; + } + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Lighter Color +//-------------------------------- +@function blend-lightercolor ($foreground, $background) { + $bm-red: red($foreground); + $bm-green: green($foreground); + $bm-blue: blue($foreground); + $background-red: red($background); + $background-green: green($background); + $background-blue: blue($background); + @if $background-red * 0.3 + $background-green * 0.59 + $background-blue * 0.11 > $bm-red * 0.3 + $bm-green * 0.59 + $bm-blue * 0.11 { + $bm-red: $background-red; + $bm-green: $background-green; + $bm-blue: $background-blue; + } + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Linear Dodge +//-------------------------------- +@function blend-lineardodge ($foreground, $background) { + $bm-red: blend-lineardodge-color(red($foreground), red($background)); + $bm-green: blend-lineardodge-color(green($foreground), green($background)); + $bm-blue: blend-lineardodge-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-lineardodge-color($foreground, $background) { + @if $background + $foreground > 255 { + $foreground: 255; + } @else { + $foreground: $background + $foreground; + } + @return $foreground; +} + +//-------------------------------- +// Linear Burn +//-------------------------------- +@function blend-linearburn ($foreground, $background) { + $bm-red: blend-linearburn-color(red($foreground), red($background)); + $bm-green: blend-linearburn-color(green($foreground), green($background)); + $bm-blue: blend-linearburn-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-linearburn-color($foreground, $background) { + @if $background + $foreground < 255 { + $foreground: 0; + } @else { + $foreground: $background + $foreground - 255; + } + @return $foreground; +} + +//-------------------------------- +// Difference +//-------------------------------- +@function blend-difference ($foreground, $background) { + $bm-red: abs(red($background) - red($foreground)); + $bm-green: abs(green($background) - green($foreground)); + $bm-blue: abs(blue($background) - blue($foreground)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// Screen +//-------------------------------- +@function blend-screen ($foreground, $background) { + $bm-red: blend-screen-color(red($foreground), red($background)); + $bm-green: blend-screen-color(green($foreground), green($background)); + $bm-blue: blend-screen-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-screen-color($foreground, $background) { + @return (255 - ( ( (255 - $foreground) * (255 - $background)) / 256)); +} + +//-------------------------------- +// Exclusion +//-------------------------------- +@function blend-exclusion ($foreground, $background) { + $bm-red: blend-exclusion-color(red($foreground), red($background)); + $bm-green: blend-exclusion-color(green($foreground), green($background)); + $bm-blue: blend-exclusion-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-exclusion-color($foreground, $background) { + @return $background - ($background * (2 / 255) - 1) * $foreground; +} + +//-------------------------------- +// Overlay +//-------------------------------- +@function blend-overlay ($foreground, $background) { + $bm-red: blend-overlay-color(red($foreground), red($background)); + $bm-green: blend-overlay-color(green($foreground), green($background)); + $bm-blue: blend-overlay-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-overlay-color($foreground, $background) { + @if $background <= 255 / 2 { + $foreground: (2 * $background * $foreground) / 255; + } @else { + $foreground: 255 - (255 - 2 * ($background - (255 / 2))) * (255 - $foreground) / 255; + } + @return $foreground; +} + +//-------------------------------- +// Soft Light +//-------------------------------- +@function blend-softlight ($foreground, $background) { + $bm-red: blend-softlight-color(red($foreground), red($background)); + $bm-green: blend-softlight-color(green($foreground), green($background)); + $bm-blue: blend-softlight-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-softlight-color($foreground, $background) { + @if $background < 128 { + $foreground: (($foreground / 2) + 64) * $background * (2 / 255); + } @else { + $foreground: 255 - (191 - ($foreground / 2)) * (255 - $background) * (2 / 255); + } + @return $foreground; +} + +//-------------------------------- +// Hard Light +//-------------------------------- +@function blend-hardlight ($foreground, $background) { + $bm-red: blend-hardlight-color(red($foreground), red($background)); + $bm-green: blend-hardlight-color(green($foreground), green($background)); + $bm-blue: blend-hardlight-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-hardlight-color($foreground, $background) { + $tmp-blend: $foreground; + @if $tmp-blend < 128 { + $foreground: $background * $tmp-blend * (2 / 255); + } @else { + $foreground: 255 - (255-$background) * (255-$tmp-blend) * (2 / 255); + } + @return $foreground; +} + +//-------------------------------- +// Color Dodge +//-------------------------------- +@function blend-colordodge ($foreground, $background) { + $bm-red: blend-colordodge-color(red($foreground), red($background)); + $bm-green: blend-colordodge-color(green($foreground), green($background)); + $bm-blue: blend-colordodge-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-colordodge-color($foreground, $background) { + $tmp: $background * 256 / (255 - $foreground); + @if $tmp > 255 or $foreground == 255 { + $foreground: 255; + } @else { + $foreground: $tmp; + } + @return $foreground; +} + +//-------------------------------- +// Color Burn +//-------------------------------- +@function blend-colorburn ($foreground, $background) { + $bm-red: blend-colorburn-color(red($foreground), red($background)); + $bm-green: blend-colorburn-color(green($foreground), green($background)); + $bm-blue: blend-colorburn-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-colorburn-color($foreground, $background) { + $tmp: (255 - ((255 - $background) * 255) / $foreground); + // TODO: hacked to replicate photoshop + @if $foreground == 0 { + $foreground: 255; + } @else if $tmp < 0 { + $foreground: 0; + } @else { + $foreground: $tmp; + } + @return $foreground; +} + +//-------------------------------- +// Linear Light +//-------------------------------- +@function blend-linearlight ($foreground, $background) { + $bm-red: blend-linearlight-color(red($foreground), red($background)); + $bm-green: blend-linearlight-color(green($foreground), green($background)); + $bm-blue: blend-linearlight-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-linearlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-linearburn-color($background, 2 * $foreground); + } @else { + $foreground: blend-lineardodge-color($background, 2 * ($foreground - 128)); + } + @return $foreground; +} + +//-------------------------------- +// Vivid Light +//-------------------------------- +@function blend-vividlight ($foreground, $background) { + $bm-red: blend-vividlight-color(red($foreground), red($background)); + $bm-green: blend-vividlight-color(green($foreground), green($background)); + $bm-blue: blend-vividlight-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-vividlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-colorburn-color(2 * $foreground, $background); + } @else { + $foreground: blend-colordodge-color(2 * ($foreground - 128), $background); + } + @return $foreground; +} + +//-------------------------------- +// Pin Light +//-------------------------------- +@function blend-pinlight ($foreground, $background) { + $bm-red: blend-pinlight-color(red($foreground), red($background)); + $bm-green: blend-pinlight-color(green($foreground), green($background)); + $bm-blue: blend-pinlight-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-pinlight-color($foreground, $background) { + @if $foreground < 128 { + $foreground: blend-darken-color($background, 2 * $foreground); + } @else { + $foreground: blend-lighten-color($background, 2 * ($foreground - 128)); + } + @return $foreground; +} + +//-------------------------------- +// Hard Mix +//-------------------------------- +@function blend-hardmix ($foreground, $background) { + $bm-red: blend-hardmix-color(red($foreground), red($background)); + $bm-green: blend-hardmix-color(green($foreground), green($background)); + $bm-blue: blend-hardmix-color(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-hardmix-color($foreground, $background) { + $tmp: blend-vividlight-color($foreground, $background); + @if $tmp < 128 { + $foreground: 0; + } @else { + $foreground: 255; + } + @return $foreground; +} + +// Unique to Photoshop +//-------------------------------- +// Color Blend +//-------------------------------- +@function blend-colorblend ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + $bm-hsv: nth($foreground-hsv, 1), nth($foreground-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Dissolve +//-------------------------------- +@function blend-dissolve ($foreground, $background) { + // The Dissolve blend mode acts on transparent and partially transparent pixels + // it treats transparency as a pixel pattern and applies a diffusion dither pattern. + // @see http://photoblogstop.com/photoshop/photoshop-blend-modes-explained + @return $foreground; +} + +//-------------------------------- +// Divide +//-------------------------------- +@function blend-divide ($foreground, $background) { + $bm-red: blend-divide-colors(red($foreground), red($background)); + $bm-green: blend-divide-colors(green($foreground), green($background)); + $bm-blue: blend-divide-colors(blue($foreground), blue($background)); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +@function blend-divide-colors($foreground, $background) { + @return min((($background / 255) / ($foreground / 255)) * 255, 255); +} + +//-------------------------------- +// Hue +//-------------------------------- +@function blend-hue ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + $bm-hsv: nth($foreground-hsv, 1), nth($background-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Luminosity +//-------------------------------- +@function blend-luminosity ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + $bm-hsv: nth($background-hsv, 1), nth($background-hsv, 2), nth($foreground-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Saturation +//-------------------------------- +@function blend-saturation ($foreground, $background) { + $foreground-hsv: color-to-hsv($foreground); + $background-hsv: color-to-hsv($background); + $bm-hsv: nth($background-hsv, 1), nth($foreground-hsv, 2), nth($background-hsv, 3); + $bm-color: hsv-to-color($bm-hsv); + @return blend-normal(rgba(red($bm-color), green($bm-color), blue($bm-color), opacity($foreground)), $background); +} + +//-------------------------------- +// Subtract +//-------------------------------- +@function blend-subtract ($foreground, $background) { + $bm-red: max(red($background) - red($foreground), 0); + $bm-green: max(green($background) - green($foreground), 0); + $bm-blue: max(blue($background) - blue($foreground), 0); + @return blend-normal(rgba($bm-red, $bm-green, $bm-blue, opacity($foreground)), $background); +} + +//-------------------------------- +// HSL and HSV +//-------------------------------- +// @see https://gist.github.com/1069204 +@function hsv-to-hsl($h, $s: 0, $v: 0) { + @if type-of($h) == 'list' { + $v: nth($h, 3); + $s: nth($h, 2); + $h: nth($h, 1); + } + @if unit($h) == 'deg' { + $h: 3.1415 * 2 * ($h / 360deg); + } + @if unit($s) == '%' { + $s: 0 + ($s / 100%); + } + @if unit($v) == '%' { + $v: 0 + ($v / 100%); + } + $ss: $s * $v; + $ll: (2 - $s) * $v; + @if $ll <= 1 and $ll != 0 { + $ss: $ss / $ll; + } @else if ($ll == 2) { + $ss: 0; + } @else { + $ss: $ss / (2 - $ll); + } + $ll: $ll / 2; + @return 360deg * $h / (3.1415 * 2), percentage(max(0, min(1, $ss))), percentage(max(0, min(1, $ll))); +} + +@function hsl-to-hsv($h, $ss: 0, $ll: 0) { + @if type-of($h) == 'list' { + $ll: nth($h, 3); + $ss: nth($h, 2); + $h: nth($h, 1); + } @else if type-of($h) == 'color' { + $ll: lightness($h); + $ss: saturation($h); + $h: hue($h); + } + @if unit($h) == 'deg' { + $h: 3.1415 * 2 * ($h / 360deg); + } + @if unit($ss) == '%' { + $ss: 0 + ($ss / 100%); + } + @if unit($ll) == '%' { + $ll: 0 + ($ll / 100%); + } + $ll: $ll * 2; + @if $ll <= 1 { + $ss: $ss * $ll; + } @else { + $ss: $ss * (2 - $ll); + } + $v: ($ll + $ss) / 2; + $s: if($ll + $ss == 0, 0, (2 * $ss) / ($ll + $ss)); + @return 360deg * $h / (3.1415 * 2), percentage(max(0, min(1, $s))), percentage(max(0, min(1, $v))); +} + +@function color-to-hsv($color) { + @return hsl-to-hsv($color); +} + +@function hsv-to-color($h, $s: 0, $v: 0) { + $hsl: hsv-to-hsl($h, $s, $v); + @return hsl(nth($hsl, 1), nth($hsl, 2), nth($hsl, 3)); +} + + diff --git a/resources/assets/sass/_modules.scss b/resources/assets/sass/_modules.scss new file mode 100644 index 00000000..964102c1 --- /dev/null +++ b/resources/assets/sass/_modules.scss @@ -0,0 +1,96 @@ +// Structure +// -------------------------------------------------- + +//Z-indexes +@import "modules/z_index"; + +//Main Layout +@import "modules/layout"; + +//View +@import "modules/view"; + +//Chat +@import "modules/chat"; + +//Cards +@import "modules/cards"; + +//Typography +@import "modules/typography"; + +//Buttons +@import "modules/buttons"; + +//Alerts +@import "modules/alerts"; + +//Notification +@import "modules/notifications"; + +//Progress indicators +@import "modules/progress_indicators"; + +//Modals +@import "modules/modals"; + +//Tabs & Accordians +@import "modules/tabs_accordian"; + +//Sliders +@import "modules/sliders"; + +//Tree View +@import "modules/treeview"; + +//Nestables +@import "modules/nestables"; + +//Form Elements +@import "modules/form_elements"; + +//Tables +@import "modules/tables"; + +//Charts +@import "modules/charts"; + +//List +@import "modules/list"; + +//Social +@import "modules/social"; + +//Email +@import "modules/email"; + +//Calender +@import "modules/calendar"; + +//Login +@import "modules/login"; + +//Lock screen +@import "modules/lock_screen"; + +//Timeline +@import "modules/timeline"; + +//Gallery +@import "modules/gallery"; + +//Vector map +@import "modules/vector_map"; + +// Widgets +@import "modules/widgets"; + +//Misc +@import "modules/misc"; + +//Print +@import "modules/print"; + +//Print +@import "modules/animation"; + diff --git a/resources/assets/sass/_responsive.scss b/resources/assets/sass/_responsive.scss new file mode 100644 index 00000000..622c734a --- /dev/null +++ b/resources/assets/sass/_responsive.scss @@ -0,0 +1,1187 @@ +.visible-xlg { + display: none; +} + +.hidden-xlg { + display: block; +} + +/*** Large screens ***/ +@media (min-width: 1824px) { + + .visible-xlg { + display: block !important; + } + .hidden-xlg { + display: none !important; + } + + .quickview-wrapper .tab-content #quickview-notes > .inner { + width: 570px; + } + + .container-fluid { + &.container-fixed-lg { + width: $layout-container-fixed-lg; + margin-right: auto; + margin-left: auto; + } + } + .menu-pin .container-fluid.container-fixed-lg { + width: $layout-container-fixed-lg - $layout-sidepanel-pin-width; + } + // .visible-xlg { + // display: block !important; + // } + // .hidden-xlg { + // display: none !important; + // } + + .col-xlg-1, .col-xlg-2, .col-xlg-3, .col-xlg-4, .col-xlg-5, .col-xlg-6, .col-xlg-7, .col-xlg-8, .col-xlg-9, .col-xlg-10, .col-xlg-11 { + // float: left; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + position: relative; + } + .col-xlg-12 { + // float: left; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; + position: relative; + // width: 100%; + flex: 0 0 100%; + max-width: 100%; + } + .col-xlg-11 { + // width: 91.6667%; + flex: 0 0 91.6667%; + max-width: 91.6667%; + } + .col-xlg-10 { + width: 83.3333%; + flex: 0 0 83.3333%; + max-width: 83.3333%; + } + .col-xlg-9 { + // width: 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xlg-8 { + // width: 66.6667%; + flex: 0 0 66.6667%; + max-width: 66.6667%; + } + .col-xlg-7 { + // width: 58.3333%; + flex: 0 0 58.3333%; + max-width: 58.3333%; + } + .col-xlg-6 { + // width: 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xlg-5 { + // width: 41.6667%; + flex: 0 0 41.6667%; + max-width: 41.6667%; + } + .col-xlg-4 { + // width: 33.3333%; + flex: 0 0 33.3333%; + max-width: 33.3333%; + } + .col-xlg-3 { + // width: 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xlg-2 { + // width: 16.6667%; + flex: 0 0 16.6667%; + max-width: 16.6667%; + } + .col-xlg-1 { + // width: 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-xlg-pull-12 { + right: 100%; + } + .col-xlg-pull-11 { + right: 91.6667%; + } + .col-xlg-pull-10 { + right: 83.3333%; + } + .col-xlg-pull-9 { + right: 75%; + } + .col-xlg-pull-8 { + right: 66.6667%; + } + .col-xlg-pull-7 { + right: 58.3333%; + } + .col-xlg-pull-6 { + right: 50%; + } + .col-xlg-pull-5 { + right: 41.6667%; + } + .col-xlg-pull-4 { + right: 33.3333%; + } + .col-xlg-pull-3 { + right: 25%; + } + .col-xlg-pull-2 { + right: 16.6667%; + } + .col-xlg-pull-1 { + right: 8.33333%; + } + .col-xlg-pull-0 { + right: 0; + } + .col-xlg-push-12 { + left: 100%; + } + .col-xlg-push-11 { + left: 91.6667%; + } + .col-xlg-push-10 { + left: 83.3333%; + } + .col-xlg-push-9 { + left: 75%; + } + .col-xlg-push-8 { + left: 66.6667%; + } + .col-xlg-push-7 { + left: 58.3333%; + } + .col-xlg-push-6 { + left: 50%; + } + .col-xlg-push-5 { + left: 41.6667%; + } + .col-xlg-push-4 { + left: 33.3333%; + } + .col-xlg-push-3 { + left: 25%; + } + .col-xlg-push-2 { + left: 16.6667%; + } + .col-xlg-push-1 { + left: 8.33333%; + } + .col-xlg-push-0 { + left: 0; + } + .col-xlg-offset-12 { + margin-left: 100%; + } + .col-xlg-offset-11 { + margin-left: 91.6667%; + } + .col-xlg-offset-10 { + margin-left: 83.3333%; + } + .col-xlg-offset-9 { + margin-left: 75%; + } + .col-xlg-offset-8 { + margin-left: 66.6667%; + } + .col-xlg-offset-7 { + margin-left: 58.3333%; + } + .col-xlg-offset-6 { + margin-left: 50%; + } + .col-xlg-offset-5 { + margin-left: 41.6667%; + } + .col-xlg-offset-4 { + margin-left: 33.3333%; + } + .col-xlg-offset-3 { + margin-left: 25%; + } + .col-xlg-offset-2 { + margin-left: 16.6667%; + } + .col-xlg-offset-1 { + margin-left: 8.33333%; + } + .col-xlg-offset-0 { + margin-left: 0; + } + +} + +/*** Desktops ***/ +@media (min-width: 1600px) { +} + +/*** Medium Size Screen ***/ +@media only screen and (max-width: 1400px) { + + .page-sidebar .page-sidebar-inner .sidebar-slide { + .sidebar-menu { + bottom: 50px; + } + .sidebar-widgets { + display: none + } + } + .footer-widget { + padding: 11px 21px !important; + } +} + +@media only screen and (max-width: 1199px) { + .visible-xl-down { + display: block !important; + } +} + +/*** Desktops & Laptops ***/ +@media only screen and (min-width: 980px) { + body { + &.ie9.menu-pin { + .page-sidebar { + transform: none !important; + + } + } + &.menu-pin { + .header .brand { + width: 245px; + } + .page-container { + padding-left: 0; + .page-content-wrapper { + .content { + padding-left: $layout-sidepanel-pin-width; + } + .footer { + left: $layout-sidepanel-pin-width; + } + } + } + [data-toggle-pin="sidebar"] { + & > i:before { + content: "\f192"; + } + } + .page-sidebar { + transform: translate($layout-sidepanel-width - $layout-sidepanel-width-collapsed, 0) !important; + width: $layout-sidepanel-pin-width; + .sidebar-header .sidebar-header-controls { + transform: translateX(18px); + } + .menu-items .icon-thumbnail { + transform: translate3d(-14px, 0, 0); + } + } + } + &.menu-behind { + .page-sidebar { + //z-index: $zIndex-navbar - 1; + } + .header .brand { + width: 200px; + text-align: left; + padding-left: 32px; + } + } + &.box-layout { + background-color: $color-white; + & > .container { + height: 100%; + padding: 0; + background-color: $color-master-lightest; + } + .header { + background-color: transparent; + border: 0; + padding: 0; + & > .container { + background-color: #fff; + border-bottom: 1px solid rgba(230, 230, 230, 0.7); + padding: 0 20px 0 0; + height: 100%; + } + } + .page-sidebar { + left: auto; + transform: none !important; + + } + .page-container .page-content-wrapper .footer { + width: auto; + } + + } + } + + .header { + .brand { + position: relative; + } + .dropdown-menu { + top: $layout-header-height - 20px; + } + .user-info-wrapper { + .user-details { + .user-name { + font-size: 16px; + } + .user-other { + font-size: 10px; + } + } + .user-pic { + position: relative; + top: -6px; + } + } + } + + .notification-panel { + width: 400px; + } + +} + +/*** General Small Screen Desktops ***/ + +/*** General tablets and phones ***/ +@media (max-width: 991px) { + + .hidden-lg-down { + display: none !important; + } + + .page-container { + padding-left: 0; + } + + .d-flex-lg-down { + display: flex; + } + .justify-between-lg-down { + + justify-content: space-between; + } + + body { + &.sidebar-open { + .page-container { + @include translate3d(250px, 0, 0); + overflow: hidden; + position: fixed; + } + } + &.box-layout { + & > .container { + padding: 0; + height: 100%; + } + .header { + & > .container { + padding: 0; + .pull-right .sm-action-bar { + right: 0; + } + } + } + } + &.horizontal-app-menu { + .header { + & > .container { + padding: 0; + } + } + .secondary-sidebar { + margin-left: 0; + } + } + } + .header { + padding: 0 15px; + width: 100%; + border-bottom: 1px solid rgba(0, 0, 0, .07); + background: #fff !important; + .header-inner { + text-align: center; + .toggle-sidebar { + display: block; + left: 23px; + } + .mark-email { + left: 45px; + position: absolute; + top: 23px; + } + .quickview-link { + position: absolute; + right: 0; + top: 12px; + } + } + .brand { + width: auto; + } + .dropdown-menu { + top: $layout-mobile-header-height - 20px; + } + .notification-list, .search-link { + display: none; + } + + & > .pull-left, & > .pull-right { + position: relative; + } + & > .pull-right { + .sm-action-bar { + right: 0; + } + } + } + .sm-action-bar { + position: absolute; + top: 50%; + + transform: translateY(-50%); + z-index: 10; + & > a { + padding: 10px; + display: inline-block; + } + } + .pace .pace-activity { + top: 60px; + } + .page-sidebar { + width: 250px; + z-index: auto; + left: 0 !important; + + transform: translate3d(0, 0px, 0px) !important; + .sidebar-menu .menu-items > li ul.sub-menu > li { + padding: 0 30px 0 36px; + } + } + + .page-container { + padding-left: 0; + // z-index: 100; + position: relative; + transition: transform .25s ease; + + .page-content-wrapper .content { + overflow-x: hidden; + height: auto; // minimizes address bar on scroll + } + } + + .icon-thumbnail { + margin-right: 24px; + } + .page-sidebar { + display: none; + z-index: auto; + &.visible { + display: block; + } + .page-sidebar-inner { + z-index: 1; + left: 0 !important; + width: 260px; + .sidebar-slide { + .sidebar-menu { + overflow: scroll; + + top: 40px; + bottom: 0; + ul > li > a > .badge { + display: inline-block; + } + } + } + } + } + .secondary-sidebar { + float: none; + height: auto; + left: 50%; + margin-left: -125px; + padding: 20px; + position: absolute; + right: 0; + top: 60px; + z-index: 9999; + display: none; + border-radius: 10px; + .btn-compose { + display: none; + } + } + .horizontal-app-menu .secondary-sidebar { + display: inline-block; + position: relative; + top: inherit; + left: inherit; + right: inherit; + padding: 20px 0; + border-radius: 0; + float: left; + height: 100%; + } + .inner-content, .horizontal-app-menu .inner-content { + margin: 0; + } + .breadcrumb { + padding-left: 15px; + padding-right: 15px; + } + .copyright { + padding-left: 15px; + padding-right: 15px; + } + + // Pages Notification customizations + body > .pgn-wrapper[data-position="top"] { + top: $layout-mobile-header-height; + left: 0; + } + body > .pgn-wrapper[data-position="bottom"] { + left: 0; + } + + body > .pgn-wrapper[data-position$='-left'] { + left: 20px; + right: auto; + } + + .sm-table { + display: table; + width: 100%; + } + .user-profile-wrapper { + position: absolute; + right: 50px; + top: -9px; + } + + .container { + width: 100%; + } + + //Table Block + .table-responsive-block { + table, thead, tbody, th, td, tr { + display: block; + } + thead tr { + position: absolute; + top: -9999px; + left: -9999px; + + } + tr { + border: 1px solid rgba(230, 230, 230, 0.7); + margin-bottom: 15px; + } + td { + /* Behave like a "row" */ + border: none; + border-bottom: 1px solid #eee; + position: relative; + padding-left: 50%; + white-space: normal; + text-align: left; + &:last-child { + border-bottom: 0; + } + &:before { + /* Now like a table header */ + position: absolute; + /* Top/left values mimic padding */ + top: 6px; + left: 6px; + width: 45%; + padding-right: 10px; + white-space: nowrap; + text-align: left; + font-weight: bold; + } + &:before { + content: attr(data-title); + } + } + + } + .kill-pull-md-down { + position: relative; + display: block; + width: inherit; + .toggle-secondary-sidebar { + display: inline-block; + font-size: 18px; + } + } + + //set a min hieght for dropdown tabs + .nav-tabs-header.nav-tabs-linetriangle { + height: 61px; + } + + .overlay { + padding-left: 15px; + } +} + +/* Landscape view of all tablet devices */ +@media (min-width: 768px) and (max-width: 1024px) and (orientation: landscape) { + .page-sidebar .sidebar-menu .menu-items ul { + + } + .page-container { + .page-content-wrapper { + .content { + padding-top: $layout-header-height; + } + } + } + body.box-layout > .container { + width: 100%; + } + .error-page { + .error-container { + width: auto; + } + } +} + +// Resolution specific borders +@media (max-width: 991px) { + .sm-b-r, + .sm-b-l, + .sm-b-t, + .sm-b-b { + border-width: 0; + } + .sm-b-r { + border-right-width: 1px; + } + .sm-b-l { + border-left-width: 1px; + } + .sm-b-t { + border-top-width: 1px; + } + .sm-b-b { + border-bottom-width: 1px; + } + .sidebar-menu { + .icon-thumbnail { + margin-right: 15px; + } + } +} + +// Make all columns equal height +// (Not applied for resolutions lowers than mentioned ex:lg,md,sm +// because they stack up) +@media (min-width: 1200px) { + .row-same-height { + overflow: hidden; + & > [class*="col-lg"] { + margin-bottom: -99999px; + padding-bottom: 99999px; + } + } +} + +@media (max-width: 1199px) and (min-width: 992px) { + //@TODO : Old Media Query current BS4 doesnt not allow this. + .visible-md { + display: block !important; + } +} + +@media (min-width: 992px) { + .row-same-height { + overflow: hidden; + & > [class*="col-md"] { + margin-bottom: -99999px; + padding-bottom: 99999px; + } + } +} + +@media (min-width: 768px) { + .row-same-height { + overflow: hidden; + & > [class*="col-sm"] { + margin-bottom: -99999px; + padding-bottom: 99999px; + } + } + .box-layout .container .jumbotron, .container-fluid .jumbotron { + padding: 0; + } + .d-flex-md-up { + display: flex; + } + + .navbar-toggle { + display: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .dataTables_wrapper.form-inline .checkbox input[type=checkbox], .form-inline .radio input[type=radio] { + position: absolute; + } + .justify-end-md-up { + + justify-content: flex-end; + } +} + +@media (min-width: 700px) { + .dd { + float: none; + } +} + +/* Portrait view of all tablet devices */ +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) { + + .page-sidebar .sidebar-menu .menu-items > li { + & > a { + padding-left: 27px; + } + ul.sub-menu > li { + padding: 0 27px 0 31px; + } + } + + .icon-thumbnail { + margin-right: 21px; + } + .error-page { + .error-container { + width: auto; + } + } +} + +//MD Screen +@media (max-width: 991px) and (min-width: 768px) { + //OLD BS classes Remove later + .visible-sm { + display: block; + } + .hidden-sm { + display: none; + } + .visible-sm-inline-block { + display: inline-block !important; + } + //New Screen Prefix padding and margin + @include generate-paddings-options-prefix("md", 3); + @include generate-paddings-options-prefix("md", 3); +} + +@media (max-width: 979px) { + .toggle-secondary-sidebar { + + font-size: 18px; + position: static; + display: block; + & ~ .brand { + display: none !important; + } + } + + .secondary-sidebar { + float: none; + height: auto; + left: 50%; + margin-left: -125px; + padding: 20px; + position: absolute; + right: 0; + top: $layout-header-height; + z-index: 9999; + display: none; + border-radius: 10px; + .btn-compose { + display: none; + } + } + + .split-view { + .split-list { + width: 100%; + height: auto; + bottom: 50px; + left: 0; + top: 0; + position: absolute; + z-index: 1000; + float: none; + .item { + padding: 8px; + .inline { + margin-left: 5px; + width: 188px; + } + } + } + + .split-details { + margin-left: 0; + width: 100%; + + .email-content-wrapper { + overflow: auto; + padding: 0; + height: calc(100% - 50px); + .email-content { + width: 90%; + } + } + } + + } + + .compose-wrapper { + display: block !important; + .btn-compose { + display: block !important; + } + } +} + +@media (max-width: 767px) { + + .header { + height: $layout-mobile-header-height; + .notification-list, .search-link { + display: none; + } + .header-inner { + height: $layout-mobile-header-height; + } + } + .header .user-info-wrapper { + display: none; + } + .header .search-link { + height: 19px; + width: 16px; + overflow: hidden; + } + + .jumbotron, .container-fluid { + padding-left: 0; + padding-right: 0; + + } + + .page-container .page-content-wrapper .content { + padding-top: $layout-mobile-header-height; + padding-bottom: 100px; + } + .page-sidebar .sidebar-header { + padding: 0 12px; + } + + .page-sidebar .sidebar-menu .menu-items > li { + & > a { + padding-left: 20px; + } + ul.sub-menu > li { + padding: 0 25px 0 28px; + } + } + + .icon-thumbnail { + margin-right: 20px; + } + + .sm-pull-bottom, .sm-pull-up { + position: relative !important; + } + + //Generate Margin and Paddings. + @include generate-paddings-options-prefix("sm", 10); + @include generate-paddings-options-prefix("sm", 10); + + .sm-no-margin { + margin: 0; + } + .sm-no-padding { + padding: 0; + } + .sm-text-right { + text-align: right !important; + } + .sm-text-left { + text-align: left !important; + } + .sm-text-center { + text-align: center !important; + } + .sm-pull-right { + float: right !important; + } + .sm-pull-left { + float: left !important; + } + .sm-pull-reset { + float: none !important; + } + .sm-block { + display: block; + } + + .error-container { + width: auto; + } + .sm-image-responsive-height { + width: 100%; + height: auto; + } + .email-composer { + padding-left: 30px; + padding-right: 30px; + } + + .sm-padding-10 { + padding: 10px !important; + } + + .lock-box { + align-items: flex-start; + height: auto; + } + .login-box { + padding-right: 15px; + padding-left: 15px; + } + + .visible-xs-inline-block { + display: inline-block !important; + } + + .nav-tabs-linetriangle { + &.nav-cust { + flex-direction: column; + } + li { + a.active:after, a.active:before { + display: none; + } + } + } + + //View Port Heights + .sm-vh-25 { + height: 25vh; + } + .sm-vh-50 { + height: 50vh; + } + .sm-vh-75 { + height: 75vh; + } + .sm-vh-100 { + height: 100vh; + } +} + +/*** Phones ***/ +@media (max-width: 480px) { + body { + width: 100%; + .header { + width: 100%; + height: $layout-mobile-header-height; + border-bottom: 1px solid rgba(0, 0, 0, .07); + .header-inner { + height: $layout-mobile-header-height; + text-align: center; + .toggle-email-sidebar { + font-size: 16px; + top: 12px; + } + .toggle-sidebar { + left: 14px; + } + .mark-email { + left: 35px; + top: 14px; + } + .quickview-link { + top: 14px; + } + + } + .notification-list, .search-link { + display: none; + } + + .dropdown-submenu { + top: 12px; + } + .notification-list, .search-link { + display: none; + } + + } + + #overlay-search { + font-size: 48px; + height: 118px; + line-height: 46px; + } + } + .page-sidebar .sidebar-header { + height: $layout-mobile-header-height; + line-height: $layout-mobile-header-height; + } + .panel { + .panel-heading { + padding-left: 15px; + } + .panel-body { + padding: 0 15px 15px; + } + } + .error-page { + padding: 15px; + .error-container { + margin-top: 30px; + width: auto; + } + .pull-bottom { + position: relative; + } + } + + .map-controls { + left: 10px; + } + .register-container { + height: auto !important; + } + .error-container-innner { + width: auto; + } +} + +/*** Retina Display Images **/ +@media only screen and (min-device-pixel-ratio: 2.0) { + .editor-icon { + background-image: url("#{$base-img-url}/editor_tray_2x.png"); + background-size: 480px 40px; + } + .alert .close { + background: transparent url("#{$base-img-url}/icons/noti-cross-2x.png") no-repeat scroll -9px -10px; + width: 10px; + height: 9px; + position: relative; + opacity: 0.8; + background-size: 114px 29px; + } + +} + +.hidden { + display: none; +} + +.visible-sm, .visible-xs { + display: none; +} + +@media (max-width: 767px) { + .visible-xs { + display: block; + } + .hidden-xs { + display: none; + } +} + + +.upload-box { + width: 250px; + /*margin: auto;*/ + position: relative; +} + +.file-container { + overflow: hidden; + position: relative; +} + +.file-container [type=file] { + cursor: inherit; + display: block; + filter: alpha(opacity=0); + min-height: 100%; + min-width: 100%; + opacity: 0; + position: absolute; + right: 0; + text-align: right; + top: 0; +} + +.file-container { + text-align: center; + border: 1px dashed #d9d9d9; + background: #f3f3f4; + /*border-radius: 10px;*/ + /* float: left; */ + padding: .5em; +} + +.file-container:hover { + border-color: #1AB394; +} + +.file-container [type=file] { + cursor: pointer; +} + +.upload-img { + margin: 0 !important; +} + +.upload-img img { + width: 100%; + border: 1px solid #d9d9d9; + border-top: none; + pointer-events: none; +} \ No newline at end of file diff --git a/resources/assets/sass/_var.scss b/resources/assets/sass/_var.scss new file mode 100644 index 00000000..6c0da668 --- /dev/null +++ b/resources/assets/sass/_var.scss @@ -0,0 +1,168 @@ +// Pages Default Theme +// -------------------------------------------------- +// Copyright Reserved Revox - 2014 +// -------------------------------------------------- + +$base-img-url: "../images" !default; +$assets-url: "../../assets" !default; + +// Global Color +// -------------------------------------------------- +// Base Grey Guided Color * change only $base-light +// -------------------------------------------------- + +//Base Grey Color +$color-master: #3a3a3a !default; + +// Lighter Grey colors +$color-master-light:mix($color-master, #fff, 16%) !default; +$color-master-lighter:mix($color-master, #fff, 9.5%) !default; +$color-master-lightest:mix($color-master, #fff, 3%) !default; + +// Darker Grey colors +$color-master-dark:mix($color-master, #000, 45%) !default; +$color-master-darker:mix($color-master, #000, 27%) !default; +$color-master-darkest:mix($color-master, #000, 18%) !default; + +$color-white: #fff !default; +$color-black: #000 !default; + +$color-success: #1ac86f !default; +$color-complete : #009add !default; +$color-primary: #00baa4 !default; +$color-warning: #ffca00 !default; +$color-danger: #ed5335 !default; +$color-info: #4d6286 !default; + +$base-font-family: wf_segoe-ui_light,wf_segoe-ui_normal,"Helvetica Neue", Helvetica, Arial, sans-serif !default; + +// Menu Vars +// -------------------------------------------------- +//Menu Animation Curve +$menu-bezier:.05, .74, .27, .99 !default; +$menu-icon-size:40px !default; +$color-menu :#2a2e35 !default; +$color-menu-dark :mix($color-menu, #000, 77%) !default; +$color-menu-darker :mix($color-menu, #000, 90%) !default; + +//Generating Menu font color +$menu-mix-temp : mix($color-menu, #fff, 92%) !default; +$menu :blend-hardlight($menu-mix-temp,#fff) !default; +$color-menu-light :$menu !default; +//Menu Font Color +$color-menu-link-hover:#fff !default; + +// Body +// -------------------------------------------------- +$body-background: $color-master-lightest !default; +$body-color: $color-master !default; +$body-font-family : $base-font-family !default; +$body-font-size : 13px !default; + +// Layout +// -------------------------------------------------- +$layout-header-height:60px !default; +$layout-mobile-header-height:48px !default; +$layout-mobile-logo-scale:0.8 !default; +$layout-sidepanel-width-collapsed : 70px !default; +$layout-sidepanel-width:280px !default; +$layout-sidepanel-pin-width:250px !default; +$layout-right-quickview-width: 285px !default; +$layout-user-profile-margin:25px !default; +$layout-container-fixed-lg: 1700px !default; + +$layout-gutter-sm : 5px !default; + +//Horizontal Dropdown +//--------------------------------------------------- +$navbar-width:45px; +$menu-padding:25px; + +$header-lg-height:75px; +$header-md-height:51px; +$header-sm-height:50px; + +// Panels +$panel-border-color: rgba(0, 0, 0, 0.07) !default; +$panel-padding: 20px !default; +$panel-heading-padding: $panel-padding $panel-padding 7px $panel-padding !default; +$panel-heading-min-height: 48px !default; +$panel-condensed-heading-padding: 13px 13px 0 13px !default; +$panel-condensed-body-padding: 13px !default; +$panel-condensed-heading-min-height: 48px !default; + +//Forms +$form-group-height: 54px !default; +$form-control-border-color: rgba($color-black, .07) !default; + +//Dashboard +$dashboard-background : #f5f5f5 !default; + +//Mixing Color varriable for creating both light and dark colors +$mix-percentage-dark: 81% !default; +$mix-percentage-darker: 60% !default; +$mix-percentage-light: 80% !default; +$mix-percentage-lighter: 20% !default; + +//Lighter colors +$color-success-light: mix($color-success, $color-white, $mix-percentage-light) !default; +$color-success-lighter: mix($color-success, $color-white, $mix-percentage-lighter) !default; + +$color-complete-light: mix($color-complete, $color-white, $mix-percentage-light) !default; +$color-complete-lighter: mix($color-complete, $color-white, $mix-percentage-lighter) !default; + +$color-primary-light: mix($color-primary, $color-white, $mix-percentage-light) !default; +$color-primary-lighter: mix($color-primary, $color-white, $mix-percentage-lighter) !default; + +$color-warning-light: mix($color-warning, $color-white, $mix-percentage-light) !default; +$color-warning-lighter: mix($color-warning, $color-white, $mix-percentage-lighter) !default; + +$color-danger-light: mix($color-danger, $color-white, $mix-percentage-light) !default; +$color-danger-lighter: mix($color-danger, $color-white, $mix-percentage-lighter) !default; + +$color-info-light: mix($color-info, $color-white, $mix-percentage-light) !default; +$color-info-lighter: mix($color-info, $color-white, $mix-percentage-lighter) !default; + +//Darker colors +$color-success-dark: mix($color-success, $color-black, $mix-percentage-dark) !default; +$color-success-darker: mix($color-success, $color-black, $mix-percentage-darker) !default; + +$color-complete-dark: mix($color-complete, $color-black, $mix-percentage-dark) !default; +$color-complete-darker: mix($color-complete, $color-black, $mix-percentage-darker) !default; + +$color-primary-dark: mix($color-primary, $color-black, $mix-percentage-dark) !default; +$color-primary-darker: mix($color-primary, $color-black, $mix-percentage-darker) !default; + +$color-warning-dark: mix($color-warning, $color-black, $mix-percentage-dark) !default; +$color-warning-darker: mix($color-warning, $color-black, $mix-percentage-darker) !default; + +$color-danger-dark: mix($color-danger, $color-black, $mix-percentage-dark) !default; +$color-danger-darker: mix($color-danger, $color-black, $mix-percentage-darker) !default; + +$color-info-dark: mix($color-info, $color-black, $mix-percentage-dark) !default; +$color-info-darker: mix($color-info, $color-black, $mix-percentage-darker) !default; + +// Email colors +// $sidebar-background-color : $color-menu-dark !default; +$_sidebar-background-color: blend-multiply($color-menu-light, $color-menu-light); +$sidebar-background-color : mix($_sidebar-background-color , #000, 80%); + +$secondary-sidebar-width : 250px; +// Components +// -------------------------------------------------- +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). + +//$padding-base-vertical: 6px !default; +$padding-base-horizontal: 17px !default; + +// $padding-lg-vertical: 28px !default; +$padding-lg-horizontal: 28px !default; + +// $padding-sm-vertical: 5px !default; +$padding-sm-horizontal: 16px !default; + +$padding-sm-vertical: 2px !default; +$padding-sm-horizontal: 16px !default; + +$padding-xs-vertical: 2px !default; +$padding-xs-horizontal: 9px !default; diff --git a/resources/assets/sass/main.scss b/resources/assets/sass/main.scss new file mode 100644 index 00000000..6c8a8703 --- /dev/null +++ b/resources/assets/sass/main.scss @@ -0,0 +1,40 @@ +/*------------------------------------------------------------------ +[Table of contents] + +1. Layouts +2. Cards +3. Typography +4. Buttons +5. Alerts +6. Notifications +7. Progress Indicators +8. Modals +9. Tabs & Accordians +10. Form Elements +11. Tables & Datatables +12. Lists +13. Misc +14. Login +15. Products +16. Pricing Table +17. Chat +18. Email +19. Drag & Drop +20. Animation +-------------------------------------------------------------------*/ +// Color functions +@import "color"; +// Import Vars +@import "var"; +// Mixins tools +@import "mixins"; +// Includes of Modules +@import "modules"; +// Responsive Util +@import "responsive"; + + + + + + diff --git a/resources/assets/sass/modules/_alerts.scss b/resources/assets/sass/modules/_alerts.scss new file mode 100644 index 00000000..aecd1a83 --- /dev/null +++ b/resources/assets/sass/modules/_alerts.scss @@ -0,0 +1,93 @@ + +/*------------------------------------------------------------------ +[7. Alerts] +*/ +.alert { + background-image: none; + box-shadow: none; + text-shadow: none; + padding: 9px 19px 9px 15px; + border-radius: 3px; + font-size: 13px; + border-width:0; + @include transition(all 0.2s linear 0s); + &.bordered{ + border-width: 1px; + } + .link { + color: #ce8f22; + font-weight: bold; + } + .alert-heading { + color: #ce8f22 !important; + margin-bottom: 5px; + font-weight: 600; + } + .btn-small { + position: relative; + top: -3.5px; + } + .button-set { + .btn { + position: relative; + top: 8px; + } + } + .close { + background: url("#{$base-img-url}/icons/noti-cross.png") no-repeat scroll 0 0 transparent; + background-position: -9px -10px; + width: 10px; + height: 9px; + position: relative; + opacity: 0.8; + top: 4.5px; + margin-left: 20px; + font-size: 0; + &:hover { + opacity: 1; + } + } + +} + +/* Alert : Color Options +------------------------------------ +*/ +.alert-danger, +.alert-error{ + background-color: $color-danger-lighter; + color: $color-danger-darker; + border-color: $color-danger-darker; + .close { + background-position: -95px -10px !important; + } +} +.alert-warning{ + background-color: $color-warning-lighter; + color: $color-warning-darker; + border-color: $color-warning-darker; +} +.alert-info{ + background-color: $color-complete-lighter; + color: $color-complete-darker; + border-color: $color-complete-darker; + .close { + background-position: -67px -10px !important; + } +} +.alert-success{ + background-color: $color-success-lighter; + color: $color-success-darker; + border-color: $color-success-darker; + .close { + background-position: -38px -10px !important; + } +} +.alert-default{ + background-color: #fff; + color: $color-master; + border-color: $color-master-light; + .close { + background-position: -67px -10px !important; + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_animation.scss b/resources/assets/sass/modules/_animation.scss new file mode 100644 index 00000000..ebcb576a --- /dev/null +++ b/resources/assets/sass/modules/_animation.scss @@ -0,0 +1,112 @@ +@include keyframe(slide-out-up) { + 0% { + transform: translate(0,0); + } + + 100% { + transform: translate(0,-300%); + } +} + +@include keyframe(slide-out-down) { + 0% { + transform: translate(0,0); + } + + 100% { + transform: translate(0,300%); + } +} + +@include keyframe(slide-out-left) { + 0% { + transform: translate(0,0); + } + + 100% { + transform: translate(-300%,0); + } +} + +@include keyframe(slide-out-right) { + 0% { + transform: translate(0,0); + } + + 100% { + transform: translate(300%,0); + } +} + +@include keyframe(slide-in-up) { + 0% { + transform: translate(0,-100%); + } + + 100% { + transform: translate(0,0); + } +} + +@include keyframe(slide-in-down) { + 0% { + transform: translate(0,100%); + } + + 100% { + transform: translate(0,0); + } +} + +@include keyframe(slide-in-left) { + 0% { + transform: translate(-100%,0); + } + + 100% { + transform: translate(0,0); + } +} + +@include keyframe(slide-in-right) { + 0% { + transform: translate(100%,0); + } + + 100% { + transform: translate(0,0); + } +} + +@include keyframe(fade-in) { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@include keyframe(fade-out) { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@each $type in ('in', 'out') { + @each $direction in ('up', 'down', 'left', 'right') { + + .slide-#{$type}-#{$direction}{ + @include animation(slide-#{$type}-#{$direction}); + } + } +} + +@each $type in ('in', 'out') { + .fade-#{$type} { + @include animation(fade-#{$type} ease-in); + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_buttons.scss b/resources/assets/sass/modules/_buttons.scss new file mode 100644 index 00000000..e4c1e5b4 --- /dev/null +++ b/resources/assets/sass/modules/_buttons.scss @@ -0,0 +1,679 @@ +/*------------------------------------------------------------------ +[6. Buttons] +*/ + +/* +[Buttons Base Styles] +*/ + +// Mixins +// -------------------------------------------------- + +// Creates contextual buttons +@mixin button($text-color, $background-color, $border-color) { + &, + &:focus{ + color: $text-color; + background-color: $background-color; + border-color: $border-color; + } + + &.active, + &:active, + &.active:focus, + &:active:focus, + &:active:hover, + .show .dropdown-toggle#{&} { + background-color: mix($background-color, $color-black, $mix-percentage-dark) !important; + border-color: mix($background-color, $color-black, $mix-percentage-dark) !important; + color:$text-color; + } + &.hover, + &:hover, + .show .dropdown-toggle#{&} + { + background-color: mix($background-color, $color-white, $mix-percentage-light); + border-color: mix($background-color, $color-white, $mix-percentage-light); + color: $text-color; + } + &.active:hover{ + background: mix($background-color, #000, 86%) ; + border-color: mix($background-color, #000, 86%) ; + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &:active, + &.active { + background-color: $background-color; + border-color: $border-color; + } + } + + .badge { + color: $background-color; + background-color: $text-color; + } +} +.btn { + font-family: Arial, sans-serif; + font-size: 14px; + font-weight: normal; + letter-spacing: 0.01em; + -webkit-font-smoothing:antialiased; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + margin-bottom: 0; + border: 1px solid $color-master-lighter; + text-align: center; + vertical-align: middle; + cursor: pointer; + @include border-radius(3px); + background-image: none !important; + color: $color-master; + background-color: $color-white ; + text-shadow: none; + box-shadow: none; + line-height: 21px; + position: relative; + transition: color 0.1s linear 0s,background-color 0.1s linear 0s,opacity 0.2s linear 0s !important; + padding: 6px $padding-base-horizontal; + &:hover{ + background-color: #fafafa; + border: 1px solid fade-out($color-master,.73); + color: #333; + } + &.active{ + border-color: $color-master-light; + background: #fff; + color: #333; + } + &:focus, + &:active:focus, + &.active:focus { + outline: none !important; + outline-style: none; + color: #333; + } + .caret { + margin-left: 3px; + &.single { + margin-left: 0px; + } + } + &:hover, + &:focus, + &:active, + &.active, + &.disabled, + &[disabled] { + box-shadow: none; + } +} +// Fix for chrome's button outline on focus +button:focus{ + outline: none !important; +} +/* +Alternate buttons +-------------------------------------------------- +*/ + +.btn-primary { + @include button($color-white, $color-primary, $color-primary); +} +.btn-success { + @include button($color-white, $color-success, $color-success); +} +.btn-complete{ + @include button($color-white, $color-complete, $color-complete); +} +.btn-info { + @include button($color-white, $color-info, $color-info); +} +.btn-warning { + @include button($color-white, $color-warning, $color-warning); +} +.btn-danger { + @include button($color-white, $color-danger, $color-danger); +} + +.btn-outline-primary { + @include button($color-primary, transparent, $color-primary); + &:hover{ + @include button($color-white, $color-primary, $color-primary); + } +} +.btn-outline-success { + @include button($color-success, transparent, $color-success); + &:hover{ + @include button($color-white, $color-success, $color-success); + } +} +.btn-outline-complete{ + @include button($color-complete, transparent, $color-complete); + &:hover{ + @include button($color-white, $color-complete, $color-complete); + } +} +.btn-outline-info { + @include button($color-info, transparent, $color-info); + &:hover{ + @include button($color-white, $color-info, $color-info); + } +} +.btn-outline-warning { + @include button($color-warning, transparent, $color-warning); + &:hover{ + @include button($color-white, $color-warning, $color-warning); + } +} +.btn-outline-danger { + @include button($color-danger, transparent, $color-danger); + &:hover{ + @include button($color-white, $color-danger, $color-danger); + } +} +.btn-default, .btn-default:focus{ + color: #5e5e5e; + background-color: $color-white; + border-color: $color-master-lighter; +} +.btn-default { + &.active, &:active, &.active:focus, &:active:focus, &:active:hover{ + background-color: $color-master-lighter; + border-color: $color-master-light; + color:$color-master-dark; + } + &.hover, &:hover{ + background-color: $color-master-lightest; + border-color: fade-out($color-master,.73); + color: $color-master-darker; + } + &.active:hover{ + background: mix($color-white, #000, 94%) ; + } +} + +// Link button +.btn-link{ + color: #5e5e5e; + background-color: transparent; + border: none; + &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] { + background-color: transparent; + border: none; + text-decoration: none; + outline: none; + } +} +//File Input Btn +.btn-file { + position: relative; + overflow: hidden; +} +.btn-file input[type=file] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + filter: alpha(opacity=0); + opacity: 0; + background: red; + cursor: inherit; + display: block; +} +/* +Button Sizes +-------------------------------------------------- +*/ + +.btn-lg, .btn-group-lg > .btn{ + padding-left: $padding-lg-horizontal; + padding-right: $padding-lg-horizontal; + line-height: 22px; + padding-top: 10px; + padding-bottom: 10px; +} +.btn-sm, .btn-group-sm > .btn{ + padding-left: $padding-sm-horizontal; + padding-right: $padding-sm-horizontal; + font-size: 11.9px; + line-height: 20px; +} +.btn-xs, .btn-group-xs > .btn{ + padding: $padding-xs-vertical $padding-xs-horizontal; + font-size: 10.5px; +} +.btn-cons { + margin-right: 5px; + min-width: 120px; +} + +/* +Rounded buttons +-------------------------------------------------- +*/ +.btn-rounded{ + border-radius: 100px !important; +} + +/* + Dropdown menus +-------------------------------------------------- +*/ +.show{ + .btn-group#{&} .dropdown-toggle, + & .dropdown-toggle, + &.dropdown-default .dropdown-toggle{ + box-shadow: none; + } + +} + +/* Pages default dropdown */ +.dropdown-default{ + display: inline-block; + &.toggle-only{ + padding-left: 9px; + padding-right: 9px; + &:after{ + position: initial; + } + } + &.show{ + & > .btn { + &.dropdown-toggle { + border-color: transparent !important; + background: transparent !important; + z-index: $zIndex-navbar - 9 !important; + } + } + .dropdown-menu { + opacity: 1; + transform: scale(1, 1); + z-index: $zIndex-dropdown; + .dropdown-item { + visibility: visible; + } + } + &.dropup { + & > .btn-primary + .dropdown-menu:after, + & > .btn-success + .dropdown-menu:after, + & > .btn-complete + .dropdown-menu:after, + & > .btn-warning + .dropdown-menu:after, + & > .btn-danger + .dropdown-menu:after, + & > .btn-info + .dropdown-menu:after{ + top: auto; + bottom: 0; + } + } + & > .btn-primary + .dropdown-menu:after, + & > .btn-success + .dropdown-menu:after, + & > .btn-complete + .dropdown-menu:after, + & > .btn-warning + .dropdown-menu:after, + & > .btn-danger + .dropdown-menu:after, + & > .btn-info + .dropdown-menu:after{ + top:0; + height: 42px; + } + & > .btn-primary + .dropdown-menu:after{ + background-color: $color-primary; + } + & > .btn-success + .dropdown-menu:after{ + background-color: $color-success; + } + & > .btn-complete + .dropdown-menu:after{ + background-color: $color-complete; + } + & > .btn-warning + .dropdown-menu:after{ + background-color: $color-warning; + } + & > .btn-danger + .dropdown-menu:after{ + background-color: $color-danger; + } + & > .btn-info + .dropdown-menu:after{ + background-color: $color-info; + } + } + + + &.dropup { + .btn.dropdown-toggle{ + &.btn-lg{ + & + .dropdown-menu{ + margin-bottom: -47px; + padding-bottom: 49px; + &:after{ + bottom: 49px; + } + } + } + &.btn-sm{ + & + .dropdown-menu{ + margin-bottom: -34px; + padding-bottom: 36px; + &:after{ + bottom: 36px; + } + } + } + &.btn-xs{ + & + .dropdown-menu{ + margin-bottom: -29px; + padding-bottom: 31px; + &:after{ + bottom: 31px; + } + } + } + } + .dropdown-menu{ + margin-bottom: -40px; + padding: 0 3px 44px 0 !important; + transform-origin: center bottom 0; + &:after{ + bottom: 43px; + top: auto !important; + } + } + } + .btn.dropdown-toggle{ + text-align: left; + padding-right: $padding-base-horizontal + 10px; + &.btn-lg{ + padding-right: $padding-lg-horizontal + 14px; + &:after{ + right: 26px; + } + & + .dropdown-menu{ + margin-top: -47px; + padding-top: 49px; + &:after{ + top: 49px; + } + } + } + &.btn-sm{ + padding-right: $padding-sm-horizontal + 10px; + &:after{ + right: 16px; + } + & + .dropdown-menu{ + margin-top: -34px; + padding-top: 36px; + &:after{ + top: 36px; + } + } + } + &.btn-xs{ + padding-right: $padding-xs-horizontal + 12px; + &:after{ + right: 8px; + } + & + .dropdown-menu{ + margin-top: -29px; + padding-top: 31px; + &:after{ + top: 31px; + } + } + } + &:after{ + position: absolute; + right: 15px; + top:50%; + margin-top: -2px; + } + } + .btn-rounded{ + padding-left: 17px; + padding-right: 17px; + } + .btn-rounded + .dropdown-menu{ + border-radius: 17px; + } + .dropdown-menu { + margin-top: -40px; + padding-top: 42px; + overflow: hidden; + backface-visibility: hidden; + display: block; + opacity: 0; + transform: scale(1, 0); + transform-origin: center top 0; + @include transition(all 170ms cubic-bezier(.05, .74, .27, .99) 0s); + z-index: -1; + &:after{ + content: ""; + position: absolute; + height: 1px; + left: 0; + top: 42px; + background: $color-master-light; + width: 100%; + } + .dropdown-item { + visibility: hidden; + } + } +} + +.dropdown-toggle{ + &:after{ + position: absolute; + right: 15px; + top: 50%; + margin-top: -2px; + } +} + +.dropdown-menu { + position: absolute; + display: none; + float: left; + list-style: none; + text-shadow: none; + @include box-shadow(0px 0px 5px fade-out($color-master, .8)); + border: none; + border-radius: 3px; + font-size: 13px; + margin: 0; + background:$color-master-lightest; + min-width: 50px; + z-index: $zIndex-dropdown !important; + .divider { + background-color: $color-master-light; + height: 1px; + margin: 3px 0; + border-bottom: 0px; + } + & > .dropdown-item { + padding-left: 0px; + line-height: 35px; + color: $color-master; + padding: 0 20px; + border-radius: 3px; + display: block; + clear: both; + white-space: nowrap; + text-align:left; + &:hover, &:focus{ + color: $color-master-darker; + text-decoration: none; + } + &:first-child{ + padding-top: 9px; + } + &:last-child{ + padding-bottom: 9px; + } + &.dropdown-header{ + padding: 3px 20px; + } + &.active { + &, + &:hover, + &:focus{ + color: $color-master-darker; + text-decoration: none; + background-color: $color-master-lighter; + } + } + &.disabled { + &, + &:hover, + &:focus{ + color: lighten($color-master, 20%); + } + &:hover, &:focus{ + text-decoration: none; + cursor: default; + } + } + } +} + +.dropdown-backdrop{ + z-index: $zIndex-dropdownMask; +} +/* +Animated buttons +-------------------------------------------------- +*/ + +.btn-animated{ + overflow: hidden; + @include backface-visibility(hidden); + @include transform-style(preserve-3d); + & > span { + display: inline-block; + width: 100%; + height: 100%; + @include backface-visibility(hidden); + @include transition(all 0.2s ease-in-out); + @include transform-style(preserve-3d); + } + &:before { + position: absolute; + height: 100%; + width: 100%; + font-size: 100%; + line-height: 2.5; + @include transition(all 0.2s ease-in-out); + } + &:after{ + content: ''; + position: absolute; + z-index: -1; + @include transition(all 0.2s ease-in-out); + } + &.from-top{ + &:before{ + left: 0; + top: -100%; + } + &:hover, &.show-icon{ + &:before{ + top: 0; + } + & > span{ + @include translateY(300%); + } + } + } + &.from-left{ + &:before{ + left: -100%; + top: 0; + } + &:hover, &.show-icon{ + &:before{ + left: 0; + } + & > span{ + @include translateX(200%); + } + } + } + &.fa{ + &:before { + font-family: FontAwesome; + } + } + &.pg{ + &:before { + font-family: "pages-icon"; + } + } +} + +/* +Tag buttons +-------------------------------------------------- +*/ + +.btn-tag{ + line-height: 17px; + border-radius: 17px 3px 3px 17px; + padding: 5px 19px; + &:hover, &.hover{ + border-color:transparent; + } + &.btn-tag-light{ + background: #fafdff; + color: #5b8ca5; + border:1px solid #cbe4f0; + &:hover{ + background: #fff; + } + } + &.btn-tag-dark{ + background: $color-master-light; + color:$color-master; + &:hover{ + background: lighten($color-master-light, 2%); + } + } + &.btn-tag-rounded{ + border-radius: 17px; + } +} + +/* +Misc buttons +-------------------------------------------------- +*/ +.btn-toolbar .btn{ + padding-left:14px; + padding-right: 14px; +} + +.pager .disabled{ + > button, + > button:hover, + > button:focus, + > span{ + cursor: not-allowed; + opacity: .5; + } +} + +.modal-content{ + a.btn-primary:not([href]):not([tabindex]){ + color: #fff; + &:hover, &:focus { + color: #fff; + } + } +} diff --git a/resources/assets/sass/modules/_calendar.scss b/resources/assets/sass/modules/_calendar.scss new file mode 100644 index 00000000..e2cf1da5 --- /dev/null +++ b/resources/assets/sass/modules/_calendar.scss @@ -0,0 +1,719 @@ +/*------------------------------------------------------------------ +[21. Calendar App] +*/ + +$cell-height : 80; +body.overflow-hidden{ + overflow: hidden; +} + +/* +Calendar +-------------------------------------------------- +Header / .calendar-header +Years / .years .year +Months / .months +Weeks / .weeks-wrapper .week +Grid / .calendar-container +Events / .event-container +*/ +.calendar{ + height: 100%; + .drager{ + overflow: hidden; + .scroll-element{ + display: none; + } + } + &.month{ + padding-left:5px; + .options .date{ + margin-bottom: 22px; + } + .week-dragger{ + display: none; + } + .calendar-container{ + border-top: 1px solid $color-master-light; + padding-top: 0; + height:calc(100% - 169px); + .view .tble{ + width: 100%; + .thead .tcell .weekday{ + margin-left: 10px; + } + } + } + } + .calendar-header{ + height: 43px; + background-color:$color-master-lightest; + line-height: 43px; + padding-left:60px; + & > .drager{ + width:calc(100% - 141px); + border-right:1px solid rgba(0, 0, 0, 0.33); + line-height: 35px; + } + .years{ + width: auto; + list-style: none; + white-space: nowrap; + margin-top: 5px; + .year{ + display: inline-block; + width: 69px; + text-align: center; + white-space: nowrap; + font-family: "Segoe UI","Helvetica Neue", Helvetica, Arial, sans-serif; + & > a{ + color: rgba(0, 0, 0, 0.5); + position: relative; + &.active{ + color: #000; + } + &.has-event{ + &:before{ + position: absolute; + content: '\25CF'; + width: 100%; + font-size: 8px; + line-height: 6px; + text-align: center; + color: rgba(0, 0, 0, 0.44); + } + } + } + } + } + } + .options{ + padding-left:60px; + margin-top: 15px; + .months{ + width: auto; + white-space: nowrap; + height: 43px; + line-height: 43px; + .month{ + min-width: 30px; + max-width: 100px; + padding: 0 10px; + display: inline-block; + & > a{ + position: relative; + color: rgba(0, 0, 0, 0.28); + &:hover{ + color: rgba(0, 0, 0, 0.33); + } + &.active{ + color: rgba(0, 0, 0, 1); + } + &.has-event{ + &:before{ + position: absolute; + content: '\25CF'; + top: -6px; + width: 100%; + font-size: 8px; + line-height: 6px; + text-align: center; + color: rgba(0, 0, 0, 0.33); + } + } + } + } + } + .date{ + margin-bottom: 20px; + } + } + .week-dragger{ + border-bottom: 1px solid #e6e6e6; + margin-left:-20px; + } + .weeks-wrapper{ + width: auto; + white-space: nowrap; + padding-left:10px; + padding-bottom: 12px; + margin-bottom: 5px; + margin-left: 20px; + .week{ + display: inline-block; + position: relative; + padding-left:30px; + padding-right:30px; + &:first-child{ + padding-left:4px; + } + &:last-child{ + padding-left:0px; + } + &:before{ + content: ''; + position: absolute; + right:-20px; + bottom: 6px; + height: 20px; + width: 20px; + border-left:1px dotted rgba(0, 0, 0, 0.3); + } + &.active{ + .day-wrapper .week-date{ + .day{ + & > a{ + color: rgba(0, 0, 0, 0.6); + } + } + + } + } + .day-wrapper{ + display: inline-block; + .week-date{ + text-align: center; + width: 21px; + height: 21px; + margin: 6px; + border-radius:99px; + &.current-date{ + background-color: $color-master-light; + } + &.active{ + background-color: $color-success; + .day > a{ + font-weight: bold; + opacity: 1; + color: #fff; + } + } + .day > a{ + letter-spacing: -0.01em; + } + } + .week-day{ + text-align: center; + } + .day{ + display: inline-block; + text-align: center; + position: relative; + z-index: 10; + padding: 1px 0; + font-size: 12px; + color: rgba(0, 0, 0, 0.3); + & > a{ + position: relative; + width: 100%; + display: block; + text-align: center; + color: rgba(0, 0, 0, 0.3); + opacity: 0.7; + font-weight: 600; + &.has-event{ + &:before{ + position: absolute; + content: '\25CF'; + top: -10px; + width: 100%; + font-size: 8px; + line-height: 6px; + text-align: center; + color:$color-success; + } + } + } + + &.week-header{ + text-transform: uppercase; + text-align: center; + font-size: 10px; + letter-spacing: 0.06em; + font-size: 10.5px; + } + } + } + } + } + .calendar-container{ + position: relative; + height: calc(100% - 200px); + padding-top: 10px; + .view{ + &.month-view{ + .tble .trow .tcell{ + position: relative; + height: 20%; + clear: both; + .cell-inner{ + .holder{ + position: absolute; + top: 37px; + left: 0; + right: 0; + bottom: 0; + } + } + &.active{ + background: #fff; + .cell-inner{ + background-color: #fef8e7; + } + } + &.not{ + background-color: $color-master-lightest; + } + &.drop-target{ + .cell-inner{ + background-color: $color-master-lightest; + } + } + .cell-inner:only-child, .cell-inner{ + height: 100%; + border-bottom: 1px solid $color-master-light; + position: relative; + } + .month-date{ + position: relative; + text-align: center; + margin-top: 10px; + margin-right: 6px; + width: 25px; + height: 25px; + padding-top: 2px; + margin: 6px; + float: right; + display: block; + z-index:1; + border-radius:99px; + &.current-date{ + background-color: $color-master-light; + } + &.active{ + background-color: $color-success; + font-weight: bold; + opacity: 1; + color: #fff; + } + } + .event-container{ + height: 30px; + position: relative !important; + min-height: 30px !important; + .event-inner{ + padding: 8px; + } + } + } + .ghost-element{ + height: 30px; + position: relative; + width: 100%; + } + .grid .tble{ + height: 100%; + width: 100%; + } + .event-container .event-title{ + font-size: 12px; + } + } + &.day-view .tble{ + white-space: nowrap; + .thead{ + white-space: nowrap; + overflow: hidden; + display: inline-block; + } + .tcell{ + display: none; + max-width: 100%; + width: 100%; + &.active{ + display: inline-block; + } + } + .trow{ + display: block; + height: 80px; + .tcell.active{ + background-color:#fff; + } + } + } + width: 100%; + height: 100%; + white-space: nowrap; + -moz-user-select: none; -webkit-user-select: none; -ms-user-select:none; user-select:none; + //DEFAULT WEEKVIEW WITH 30 min Slot + .tble{ + display: inline-table; + width: calc(100% - 50px); + vertical-align: top; + position: relative; + .thead{ + display: table-row; + width: 100%; + background: #fff; + .tcell{ + padding: 10px; + height: $cell-height/2 * 1px; + position: relative; + .weekday{ + font-size: 12px; + display: inline-block; + color: rgba(0, 0, 0, 0.51); + } + .weekdate{ + font-size: 14px; + display: inline-block; + margin-right:10px; + color: rgba(0, 0, 0, 0.77); + } + &.active{ + .weekdate, .weekday{ + color:rgba(0, 0, 0, 1); + } + } + &:before{ + content: ''; + border-bottom: 1px solid $color-master-light; + width: calc(100% - 18px); + position: absolute; + bottom: 0; + } + .event-bubble{ + display: inline-block; + width: 8px; + height: 8px; + margin-left:5px; + float:right; + border-radius:30px; + } + } + } + .tcell{ + display: table-cell; + height: $cell-height * 1px; + max-width: 14.2857%; + width: 14.2857%; + } + .trow{ + display:table-row; + .tcell{ + background: #fff; + padding: 0 10px; + .cell-inner{ + height: $cell-height/2 * 1px; + position: relative; + &:first-child{ + border-bottom: 1px dotted $color-master-light; + } + &:last-child{ + border-bottom: 1px solid $color-master-light; + } + &:only-child{ + height: 40px; + border-bottom: 0; + } + } + &.active{ + background-color: #fef8e7; + & > *{ + border-color: rgba(0, 0, 0, 0.1) !important; + } + } + &.disable{ + background-color: $color-master-lightest; + } + } + } + .loading{ + left: 10px; + } + } + } + .loading{ + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.5); + z-index: 100; + } + .pgn-wrapper{ + position: absolute; + } + .even-holder{ + position: absolute; + display: table; + width: calc(100% - 50px); + height: calc(100% - 25px); + .event-placeholder{ + height: 100%; + width: 14.2857%; + display: table-cell; + } + } + .event-container{ + width: 100%; + height: 40px; + position: absolute !important; + z-index: 10; + overflow: hidden; + margin-bottom: 5px; + min-height: 40px !important; + transition:width .16s ease; + .event-inner{ + padding: 15px; + &:before{ + position: absolute; + width: 8px; + height: 8px; + content: ''; + background-color: rgba(255, 255, 255,0.8); + border-radius: 999px; + right:14px; + top: 11px; + } + } + .time-wrap{ + line-height: 12px; + text-align:left; + color: rgba(0, 0, 0, 0.77); + overflow: hidden; + text-overflow: ellipsis; + } + .event-start-time, .event-end-time{ + font-size: 12px; + color: rgba(0, 0, 0, 0.44); + } + .event-title{ + font-size: 14px; + line-height: 15px; + margin-bottom: 8px; + overflow: hidden; + text-overflow: ellipsis; + } + .resizable-handle{ + position: absolute; + opacity: 1; + z-index: 3; + left: 0; + right: 0; + bottom: 0; + height: 8px; + overflow: hidden; + line-height: 8px; + font-size: 11px; + font-family: monospace; + text-align: center; + cursor: s-resize; + &:after { + content: "="; + color: rgba(0, 0, 0, 0.44); + } + } + &.dragging{ + z-index: 100; + } + } + .grid{ + display: block; + overflow: scroll; + height: calc(100% - 40px); + -webkit-overflow-scrolling: touch; + //Time Slots + &.slot-60{ + .tble .trow .tcell .cell-inner{ + height: $cell-height * 1px; + border-bottom: 1px solid $color-master-light; + } + } + &.slot-15{ + .tble .trow .tcell { + height: 100/4 * 1px; + .cell-inner{ + height: 100/4 * 1px; + border-bottom: 1px dotted $color-master-light; + &:last-child{ + border-bottom: 1px solid $color-master-light; + } + } + } + .time-slot-wrapper .time-slot{ + height: 100px; + } + } + } + .allday-cell{ + height: $cell-height/2 * 1px; + display: inline-block; + width: 50px; + float:left; + } + } + .time-slot-wrapper{ + display: inline-block; + width: 50px; + float:left; + height: 100%; + .time-slot{ + display: block; + height: $cell-height*1px; + width: 100%; + background: #fff; + &:first-child{ + span{ + display: none; + } + } + & > span{ + float:right; + font-size: 12px; + position: relative; + top: -15%; + color: rgba(0, 0, 0, 0.46); + font-weight: bold; + font-size: 11px; + letter-spacing: 0.06em; + font-size: 10.5px; + font-family: 'Montserrat'; + right:5px; + } + } + } + +} +.calendar-event{ + width: 330px; + right:-330px; + .scrollable{ + height: 100%; + } +} +.date-selector{ + cursor: pointer; +} + +/* +Responsive Util +*/ +@media (max-width: 991px) { +.calendar{ + background-color: #fff; + .calendar-header{ + display: none; + } + .options{ + margin-top:0; + padding-left:10px; + .months{ + line-height: 21px; + padding-top: 14px; + } + .date{ + margin-bottom: 10px; + } + } + .calendar-container { + height:100%; + .view.week-view .tble{ + white-space: nowrap; + .thead{ + white-space: nowrap; + overflow: hidden; + display: inline-block; + } + .tcell{ + display: none; + max-width: 100%; + width: 100%; + &.active{ + display: inline-block; + background-color:#fff; + } + } + .trow{ + display: block; + height: 80px; + } + } + .view.month-view { + .allday-cell{ + display: none; + } + .grid .tble{ + padding-left: 0; + } + .tble { + .thead .tcell{ + padding: 3px; + padding-top: 10px; + } + .trow .tcell{ + padding: 0 6px; + } + } + .tble .trow .tcell .event-container{ + @include border-radius(99px); + position: absolute !important; + height: 16px !important; + width: 16px !important; + min-height: 16px !important; + margin: 0 auto; + left: 0; + right: 0; + .event-inner{ + display: none; + } + } + } + &.month{ + height: calc(100% - 101px); + } + } + .weeks-wrapper{ + margin-bottom: 0; + } + &.month{ + padding-left:0; + .calendar-container{ + height: calc(100% - 108px); + } + } +} +.calendar-event{ + width: 240px; + right:-240px; +} +.months-drager{ + margin-left:16px; + margin-right:36px; + border-right:1px solid $color-master-light; + padding-top: 0; +} +.horizontal-app-menu { + .months-drager{ + margin-left:0; + margin-right:0; + width: 100%; + } +} +} +@media (max-width: 640px) { + .calendar.month .calendar-container .view .tble .thead .tcell { + text-align: center; + &:before{ + width: 100%; + } + .weekday{ + width: 11px; + overflow: hidden; + letter-spacing: 4px; + font-weight: bold; + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_cards.scss b/resources/assets/sass/modules/_cards.scss new file mode 100644 index 00000000..7ff21749 --- /dev/null +++ b/resources/assets/sass/modules/_cards.scss @@ -0,0 +1,410 @@ +/*------------------------------------------------------------------ +[4. Cards] +*/ + +.card{ + @include box-shadow(none); + @include border-radius(1px); + @include transition(all .2s ease); + position: relative; + background-color: #fff; + margin-bottom: 20px; + width: 100%; + .card-header{ + background: transparent; + border-radius:0px; + border-bottom:0px; + padding: $panel-heading-padding; + position: relative; + z-index: 3; + min-height: 48px; + &.separator:after { + content:""; + height:1px; + background:rgba(0,0,0,0.08); + left:16px; + right:16px; + position:absolute; + bottom:0; + } + & + .card-block{ + padding-top: 0; + } + .card-title{ + text-transform: uppercase; + display: inline-block; + letter-spacing: 0.06em; + font-size: 12px; + font-weight: 500; + margin: 0; + padding: 0; + line-height: normal; + overflow: hidden; + text-overflow: ellipsis; + -webkit-text-stroke:0px; + filter: alpha(opacity=40); + @include transition(opacity .3s ease); + & + .card-block{ + + } + } + .card-controls{ + float: right; + margin-top: -3px; + ul{ + margin: 0; + padding: 0; + li{ + display: inline-block; + list-style: none; + line-height: 0; + } + } + &:after{ + content:""; + display:table; + clear:both; + } + } + &.card-header-hover{ + .card-title{ + opacity: .4; + } + &:hover{ + .card-title{ + opacity: 1; + } + } + } + } + &.card-default{ + border:1px solid $panel-border-color; + //Used for colored panels + & >.card-header{ + color: #333; + } + } + &.card-bordered{ + border:1px solid fade-out($color-master-light, .3); + } + &.card-borderless{ + border:none; + } + &.card-condensed{ + .card-header{ + padding: $panel-condensed-heading-padding; + min-height: 30px; + .card-title{ + opacity: .4; + } + } + .card-block{ + padding: $panel-condensed-body-padding; + } + } + &.card-hover{ + .card-header .card-title{ + opacity: .4; + } + &:hover{ + .card-header .card-title{ + opacity: 1; + } + } + } + &.card-transparent{ + background: transparent; + border:none; + @include box-shadow(none); + .card-block{ + background: transparent; + } + } + &.full-height{ + height: 100%; + .card-block{ + height: auto; + width: 100%; + height: 100%; + } + } + &.card-featured { + @include box-shadow(-1px 1px 3px 0px rgba(121, 129, 135, 0.14)); + width: calc(100% - 50px); + float: right; + .card-title { + h4 { + font-family: 'Montserrat'; + font-size: 16px; + text-transform: uppercase; + color: $color-master-lighter; + + } + } + .card-block { + h3 { + line-height: 34px; + font-size: 26px; + } + } + .footer { + .username { + line-height: 8px; + padding-top: 10px; + font-size: 16px; + } + .buttons { + li { + display: inline; + list-style: none; + font-weight: bold; + margin-left: 20px; + &:first-child { + margin-left: 0; + } + } + .heart { + color: $color-danger; + + } + .comment { + color: $color-master; + } + } + } + .ribbon { + width: 38px; + height: 38px; + margin-left: -39px; + float: left; + @include box-shadow( inset -3px 0px 3px 0px rgba(0,0,0,0.14) ); + &.green { + background: $color-complete; + + } + &.blue { + background: $color-success; + + } + } + } + &.hover-fill:hover{ + background:$color-master-lighter; + } + &.hover-stroke{ + &:hover{ + border:1px solid $color-master-light; + } + } + .card-block{ + padding: $panel-padding; + //overflow-y: auto; + &.no-padding{ + .row{ + margin-left: 0; + margin-right: 0; + } + } + &.no-bottom-padding{ + padding-bottom: 0; + } + &.no-top-padding{ + padding-top: 0; + } + .title{ + margin-top:0px; + } + &.scrollable{ + margin-bottom: $panel-padding; + } + } +} + + +/* Portlets +------------------------------------ +*/ +.card-progress{ + background: rgba(255,255,255,.8); + bottom: 0; + left: 0; + position: absolute !important; + right: 0; + top: 0; + display: none; + z-index: 2; +} +.card-progress > .progress, +.card-progress > .progress.progress-small{ + height: 3px; +} +.card-progress > .progress-circle-indeterminate, +.card-progress > .card-bar-indeterminate{ + display: block; + left: 50%; + margin-left: -17px; + margin-top: -17px; + position: absolute; + top: 50%; +} +.card-progress > .progress-circle-indeterminate{ + width: 35px; + height: 35px; +} +.card-maximized{ + position: fixed !important; + left: $layout-sidepanel-width-collapsed; + top: $layout-header-height - 1px; + bottom: 0; + right: 0; + z-index: $zIndex-portlet; + margin: 0; +} + +/* Pages notification holder */ +.card .pgn-wrapper{ + position: absolute; + z-index: $zIndex-portlet + 2; +} + +.card-header a:not(.btn){ + color: $color-master !important; + opacity: .4; + &.card-refresh{ + @include transition(opacity .3s ease); + &.refreshing{ + opacity: 1; + } + + } +} +.card-header { + .dropdown-menu { + margin-top: 5px; + .dropdown-item{ + padding: 0 20px !important; + &:hover{ + opacity: 1; + background-color: transparent; + } + } + } + a[data-toggle]:hover{ + opacity: 1; + } +} + + +.card-icon{ + -moz-osx-font-smoothing: grayscale; + font-family: "pages-icon"; + font-style: normal; + font-variant: normal; + font-weight: normal; + line-height: 1; + text-transform: none; +} +.card-icon-close:before{ + content: "\e60a"; +} +.card-icon-maximize:before{ + content: "\e634"; +} +.card-icon-refresh:before{ + content: "\e600"; +} +.card-icon-collapse:before{ + content: "\e62c"; +} + +.card-icon-settings:before{ + content: "\e655"; +} +.card-icon-refresh-lg-master, +.card-icon-refresh-lg-white{ + width: 15px; + height: 15px; + display: block; + background-size: cover; + @include transition(opacity .3s ease); + &.fade{ + opacity: 0.1; + } +} +.card-icon-refresh-lg-master{ + background-image:url('#{$base-img-url}/progress/progress-circle-lg-master-static.svg'); +} + +.card-icon-refresh-lg-white{ + background-image:url('#{$base-img-url}/progress/progress-circle-lg-white-static.svg'); +} + +.card-icon-refresh-lg-master-animated, +.card-icon-refresh-lg-white-animated{ + width: 15px; + height: 15px; + display: block; + background-size: cover; + opacity: 0; + @include transition(opacity .3s ease); + &.active{ + opacity: 1 + } +} +.card-icon-refresh-lg-master-animated{ + background-image:url('#{$base-img-url}/progress/progress-circle-lg-master.svg'); +} +.card-icon-refresh-lg-white-animated{ + background-image:url('#{$base-img-url}/progress/progress-circle-lg-white.svg'); +} + + +/* For demo purpose only */ +.card-scroll{ + height: 100px; +} +.sortable .card-header { + cursor: move; +} +/* To prevent lag while dragging */ +.ui-sortable-handle{ + transition: max-height 0.3s ease 0s; +} +.sortable .grid .grid-title { + cursor: move; +} +.ui-sortable { + min-height: 0px !important; +} +.ui-sortable-placeholder { + border: 1px dotted black; + visibility: visible !important; + height: 100% !important; + * { + visibility: hidden; + } +} +.sortable-box-placeholder { + background-color: $color-master-lighter; + border: 1px dashed $color-master-light; + display: block; + margin-top: 0px !important; + margin-bottom: 24px !important; + * { + visibility: hidden; + } +} +.sortable .card{ + transition: none; +} +.sortable-column{ + padding-bottom: 100px; +} +.demo-card-scrollable{ + height:158px +} + + +.card-block { + padding: 15px; +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_charts.scss b/resources/assets/sass/modules/_charts.scss new file mode 100644 index 00000000..efe7c803 --- /dev/null +++ b/resources/assets/sass/modules/_charts.scss @@ -0,0 +1,367 @@ +/*------------------------------------------------------------------ +[17. Charts] +*/ +.line-chart{ + .nvd3 line.nv-guideline{ + /* Vertical bar on hover in interactive chart */ + stroke-width:30px; + stroke-opacity:.04; + stroke : #000; + } + + .nvd3 .nv-groups path.nv-area{ + /* filled area */ + fill-opacity : .1; + } + .nvd3 .nv-groups path.nv-line{ + /* Line */ + stroke-opacity:.3; + } + .nvd3 .nv-axis line{ + /* grid lines */ + stroke-opacity: .5; + } + + &[data-x-grid="false"]{ + .nv-x .tick line { + display: none; + } + } + &[data-y-grid="false"]{ + .nv-y .tick line { + display: none; + } + } + .domain{ + /* domain */ + opacity: 0; + } + + &[data-points="true"]{ + .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + /* Toggle points */ + fill-opacity: 1; + stroke-opacity: .5; + } + } + + .nvtooltip table td.legend-color-guide div{ + border-radius: 100px; + } + thead .nv-pointer-events-none strong{ + color: lighten($color-master,30%); + } + .nv-pointer-events-none{ + + font-size: 12px; + + .value.nv-pointer-events-none{ + font-weight: normal; + font-size: 11px; + color: lighten($color-master,30%); + } + } + .nvtooltip table{ + margin: 12px 10px 14px 15px; + } + .nvtooltip.xy-tooltip.nv-pointer-events-none{ + border-color : rgba(0, 0, 0, 0.12); + box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); + } + + &[data-stroke-width="1"]{ + .nvd3 .nv-groups path.nv-line{ + /* Line widths */ + stroke-width:1px; + } + .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{ + /* Line widths */ + stroke-width:2px; + } + } + &[data-stroke-width="2"]{ + .nvd3 .nv-groups path.nv-line{ + stroke-width:2px; + } + .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{ + stroke-width:3px; + } + } + &[data-stroke-width="3"]{ + .nvd3 .nv-groups path.nv-line{ + stroke-width:3px; + } + .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{ + stroke-width:4px; + } + } + + .tick text, .nvd3 .nv-axis .nv-axisMaxMin text{ + fill: fade($color-master, 50%); + font-family: "Montserrat"; + font-size: 11px; + text-transform: uppercase; + font-weight: normal; + } + + + .nvd3.nv-scatter .nv-groups .nv-point.hover, + .nvd3 .nv-groups .nv-point.hover{ + fill: inherit !important; + stroke: inherit !important; + } +} + + +/* Line widths +------------------------------------ +*/ +.nvd3 line.nv-guideline, +.nvd3 .nv-groups path.nv-line, +.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + .line-chart[data-line-color="master"] &{ + stroke: $color-master; + } + .line-chart[data-line-color="success"] &{ + stroke: $color-success; + } + .line-chart[data-line-color="primary"] &{ + stroke: $color-primary; + } + .line-chart[data-line-color="info"] &{ + stroke: $color-info; + } + .line-chart[data-line-color="complete"] &{ + stroke: $color-complete; + } + .line-chart[data-line-color="warning"] &{ + stroke: $color-warning; + } + .line-chart[data-line-color="danger"] &{ + stroke: $color-danger; + } + .line-chart[data-line-color="white"] &{ + stroke: #fff; + } + .line-chart[data-line-color="black"] &{ + stroke: #000; + } +} + + +/* Area Fill colors +------------------------------------ +*/ +.nvd3 .nv-groups path.nv-area{ + .line-chart[data-area-color="master"] &{ + fill: $color-master; + } + .line-chart[data-area-color="success"] &{ + fill: $color-success; + } + .line-chart[data-area-color="info"] &{ + fill: $color-info; + } + .line-chart[data-area-color="complete"] &{ + fill: $color-complete; + } + .line-chart[data-area-color="primary"] &{ + fill: $color-primary; + } + .line-chart[data-area-color="warning"] &{ + fill: $color-warning; + } + .line-chart[data-area-color="danger"] &{ + fill: $color-danger; + } + .line-chart[data-area-color="white"] &{ + fill: #fff; + } + .line-chart[data-area-color="black"] &{ + fill: #000; + } +} + +/* Point fill colors +------------------------------------ +*/ + .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{ + .line-chart[data-point-color="master"] &{ + fill : $color-master; + } + .line-chart[data-point-color="success"] &{ + fill : $color-success; + } + .line-chart[data-point-color="info"] &{ + fill : $color-info; + } + .line-chart[data-point-color="complete"] &{ + fill : $color-complete; + } + .line-chart[data-point-color="primary"] &{ + fill : $color-primary; + } + .line-chart[data-point-color="warning"] &{ + fill : $color-warning; + } + .line-chart[data-point-color="danger"] &{ + fill : $color-danger; + } + .line-chart[data-point-color="white"] &{ + fill : #fff; + } + } + +#nvd3-line, +#nvd3-line2, +#nvd3-area{ + svg{ + height: 500px; + } +} +/* Rickshaw Charts +------------------------------------ +*/ +.rickshaw-chart{ + &.rickshaw_graph .detail{ + padding-left: 15px; + transform: translateX(-15px); + width: 30px; + background: rgba(0,0,0,.04); + right: -15px; + + .item, .x_label{ + transform: translateX(15px); + } + &:after{ + content: ""; + width: 1px; + background: rgba(0,0,0,.2); + height: 100%; + display: block; + } + } + .y_grid .tick.major line{ + stroke-dasharray: 3px, 5px; + opacity: .7; + } + +} + +.rickshaw-chart { + &.rickshaw_graph { + + .detail .x_label { display: none } + .detail .item { line-height: 1.4; padding: 0.5em } + .detail_swatch { float: right; display: inline-block; width: 10px; height: 10px; margin: 0 4px 0 0 } + .detail .date { font-size:11px; color: #a0a0a0; opacity: .5; } + + } +} + +#tab-rickshaw-realtime{ + #rickshaw-realtime{ + + } + #rickshaw-realtime_y_axis { + position: absolute; + top: 0; + background: rgba(255,255,255,.8); + bottom: 0; + width: 40px; + left: 0; + z-index: 1; + .rickshaw_graph .y_ticks path, .rickshaw_graph .x_ticks_d3 path{ + fill: none; + stroke: none; + } + .rickshaw_graph .y_ticks text, .rickshaw_graph .x_ticks_d3 text{ + opacity: 0.35; + font-family: 'Montserrat'; + font-size: 11px; + + } + } +} + +#tab-rickshaw-bars{ + #rickshaw-stacked-bars{ + + &.rickshaw_graph .detail .dot{ + border-radius: 50px; + } + &.rickshaw_graph .detail .x_label { display: none } + &.rickshaw_graph .detail .item { line-height: 1.4; padding: 0.5em } + .detail_swatch { float: right; display: inline-block; width: 10px; height: 10px; margin: 0 4px 0 0 } + &.rickshaw_graph .detail .date { font-size:11px; color: #a0a0a0; opacity: .5; } + } +} + +#tab-rickshaw-slider{ + + #rickshaw-slider{ + height:500px + } + .rickshaw_graph .x_grid_d3 .tick{ + stroke-opacity: 0; + } + .rickshaw_graph .y_ticks path, .rickshaw_graph .x_ticks_d3 path{ + stroke: none; + } + .rickshaw_graph .y_ticks text, .rickshaw_graph .x_ticks_d3 text{ + font-size: 11px; + } + .rickshaw_range_slider_preview { + .frame{ + opacity: 0; + } + .left_handle, .right_handle{ + fill: #000; + fill-opacity: 0.1 !important; + } + } + .slider{ + position: absolute; + top:0; + height:93px; + overflow: hidden; + } + .chart{ + position: absolute; + bottom: 40px; + top: 150px; + left: 33px; + right: 0; + width: auto; + .x_tick.plain .title{ + font-family: 'Montserrat'; + font-size: 11px; + } + } + .y_axis{ + bottom: 0; + position: absolute; + top: 150px; + width: 40px; + left: -6px; + } + + .rickshaw_graph .x_tick{ + border-color: transparent; + .title{ + bottom: -24px; + left: -15px; + } + } +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 0; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_chat.scss b/resources/assets/sass/modules/_chat.scss new file mode 100644 index 00000000..cd656096 --- /dev/null +++ b/resources/assets/sass/modules/_chat.scss @@ -0,0 +1,81 @@ +/*------------------------------------------------------------------ +[3. Chat] +*/ + +/* Chat Components +-------------------------------------------------- +*/ + +$chat-list-height:60px; +$alert-list-height:45px; +.chat-view{ + .chat-inner{ + padding: 15px; + overflow-x: hidden; + height: calc(100% - 103px); + } + .message{ + margin-bottom: 10px; + line-height: 30px; + } + .profile-img-wrapper{ + height: 28px; + width: 28px; + } + .chat-bubble{ + position:relative; + border-radius:12px; + padding: 4px 12px; + font-size: 14px; + line-height: 16px; + margin: 5px 0px 0 5px; + max-width: 60%; + white-space: normal; + & > p{ + margin: 0; + } + &.from-me { + background:$color-complete-lighter; + color:$color-master-dark; + opacity: 0.8; + float: right; + border: 1px solid rgba(0, 0, 0, 0.07); + } + &.from-them { + color:$color-master-dark; + opacity: 0.8; + background:$color-master-lighter; + position:relative; + opacity: 0.8; + float: left; + border: 1px solid mix($color-complete-darker, #fff, 7%); + + } + } + .chat-input{ + border: 0; + height: 45px; + &:focus,&:active{ + background-color: #fff; + } + } + .user-controls{ + padding-top:12px; + } +} +/* Chat User List +-------------------------------------------------- +*/ +.chat-user-list{ + & > a { + height: $chat-list-height; + } +} +/* Alert List +-------------------------------------------------- +*/ +.alert-list{ + & > a { + height: $alert-list-height; + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_email.scss b/resources/assets/sass/modules/_email.scss new file mode 100644 index 00000000..0ffa7936 --- /dev/null +++ b/resources/assets/sass/modules/_email.scss @@ -0,0 +1,150 @@ +/*------------------------------------------------------------------ +[20. Email App] +*/ + + +/* Email Components +-------------------------------------------------- +*/ +.compose-wrapper{ + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 50px; + background: $color-white; + border-top: 1px solid $color-master-lighter; + z-index: 101; + .compose-email{ + font-size: 24px; + } +} + +.email-composer{ + margin-left: 250px; + position: relative; + overflow: auto; + height: 100%; + background: #fff; + .email-toolbar-wrapper .wysihtml5-toolbar{ + background: $color-master-lighter; + border-bottom:1px solid $color-master-light; + position: relative; + border-top: none; + } + .email-body-wrapper{ + border-bottom:1px solid $color-master-light; + margin-bottom: 20px; + } + .bootstrap-tagsinput{ + margin: 0; + padding: 0; + } + & > .row{ + margin-left: -30px; + margin-right: -30px; + } +} + +.split-view .split-details .email-content-wrapper{ + background: #fff; + height: 100%; + width: auto; + overflow: auto; + + .actions-wrapper{ + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 50px; + z-index: $zIndex-navbar - 1; + } + .email-content{ + margin:0 auto; + width: 600px; + display: block; + padding-top: 62px; + padding-bottom: 70px; + padding-left: 20px; + padding-right: 20px; + .email-content-header{ + .sender{ + .name{ + font-size: 15px; + color: $color-info; + } + .datetime{ + color: $color-master; + opacity: .45; + font-family: arial; + } + } + .subject{ + font-family: arial; + color: $color-info; + font-size:15.2px; + line-height: 17px; + } + .fromto{ + .btn-xs{ + border-radius: 13px; + } + } + } + .email-content-body p{ + line-height: 23px; + color: $body-color; + letter-spacing: 0.001em; + } + .email-reply{ + min-height:200px; + } + .editor-wrapper{ + border: 1px solid rgba(0,0,0,.05); + .wysihtml5-sandbox{ + max-height: 150px; + min-height: 130px !important; + width: 100% !important; + } + } + + } +} +/* Email App Top Header +-------------------------------------------------- +*/ +.header-wrapper-email{ + font-size: 14.92px; + .dropdown > .btn{ + color:$color-complete; + } + .btn:hover{ + text-decoration: none; + } +} + +/* Responsive Handler : Email App +-------------------------------------------------- +*/ + + + +@media (max-width: 1024px){ + .email-composer{ + margin-left: 0; + } +} + + +.email-composer{ + .email-toolbar-wrapper{ + .dropdown{ + .dropdown-toggle{ + &::after{ + display: none; + } + } + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_form_elements.scss b/resources/assets/sass/modules/_form_elements.scss new file mode 100644 index 00000000..e242894f --- /dev/null +++ b/resources/assets/sass/modules/_form_elements.scss @@ -0,0 +1,2142 @@ +/*------------------------------------------------------------------ +[15. Form Elements] +*/ + +// Mixins +// -------------------------------------------------- + +// Form validation states +@mixin form-control-validation($text-color, $border-color, $background-color) { + // Color the label and help text + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline { + color: $text-color; + } + // Set the border and box shadow on specific inputs to match + .form-control { + border-color: $border-color; + @include box-shadow(none); // Redeclare so transitions work + &:focus { + border-color: darken($border-color, 10%); + //$shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%); + @include box-shadow(none); + } + } + // Set validation states also for addons + .input-group-addon { + background: $color-master-lighter; + border: 1px solid $form-control-border-color; + color: rgba($color-master, .47); + } + // Optional feedback icon + .form-control-feedback { + color: $text-color; + } +} + +// Placeholder text +@mixin placeholder($color, $opacity) { + &::-moz-placeholder { + color: $color; // Firefox + opacity: $opacity; + } // See https://github.com/twbs/bootstrap/pull/11526 + &:-ms-input-placeholder { + color: $color; + opacity: $opacity; + } // Internet Explorer 10+ + &::-webkit-input-placeholder { + color: $color; + opacity: $opacity; + } // Safari and Chrome +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input[type="radio"], +input[type="checkbox"] { + margin-top: 1px 0 0; + line-height: normal; + cursor: pointer; + @include box-sizing(border-box); +} + +select[multiple], +select[size] { + height: auto !important; +} + +input:focus, +select:focus, +textarea:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: none; + @include box-shadow(none); +} + +form legend { + margin: 15px 0px 10px 0px; +} + +.form-control { + background-color: $color-white; + background-image: none; + border: 1px solid $form-control-border-color; + font-family:Arial, sans-serif; + -webkit-appearance: none; + color: $color-master-dark; + outline: 0; + height: 35px; + padding: 9px 12px; + line-height: normal; + font-size: 14px; + font-weight: normal; + vertical-align: middle; + min-height: 35px; + @include transition(all 0.12s ease); + @include box-shadow(none); + @include border-radius(2px); + @include transition(background 0.2s linear 0s); + &:focus{ + border-color: rgba($color-black, .10); + background-color:$color-master-lighter; + outline: 0 !important; + @include box-shadow(none); + @include placeholder(inherit, .7); + } + @include placeholder(inherit, .33); + &[disabled], + &[readonly], + fieldset[disabled] &{ + background: mix($color-master-lighter, #fff, 50%); + color: rgba($color-master, .23); + } +} + + +/* Input Sizes +-------------------------------------------------- +*/ + +.input-sm, +.form-horizontal .form-group-sm .form-control { + font-size: 13px; + min-height: 32px; + height: 32px; + padding: 8px 9px; +} + +.input-lg, +.form-horizontal .form-group-lg .form-control { + border-radius: 3px; + font-size: 18px; + height: 45px; + padding: 11px 13px; +} + +.input-xlg{ + height: 51px; + font-size: 18px; + line-height: 22px; +} + + +/* Checkboxes and Radio buttons +-------------------------------------------------- +*/ + +.radio, +.checkbox { + margin-bottom: 10px; + margin-top: 10px; + padding-left: 0px; + label{ + display: inline-block; + cursor: pointer; + position: relative; + padding-left: 25px; + min-width: 17px; + min-height: 17px; + margin-right: 15px; + font-size: 13px; + &:before{ + -webkit-box-sizing: inherit; + box-sizing: border-box; + content:""; + display: inline-block; + width: 17px; + height: 17px; + margin-right: 10px; + position: absolute; + left: 0px; + background-color: $color-white; + border: 1px solid mix($color-master, #fff, 30%); + } + } +} + +.radio { + label { + margin-bottom: 6px; + &:before { + bottom: 2.5px; + border-radius: 99px; + @include transition(border .3s 0s cubic-bezier(0.455, 0.030, 0.215, 1.330)); + } + } + input[type=radio]:checked { + & + label { + &:before { + border-width: 5px; + } + } + } + input[type="radio"]:focus{ + & + label{ + color:$color-master-dark; + &:before{ + background-color: $color-master-light; + } + } + } + input[type=radio] { + opacity: 0; + width: 0; + height: 0; + } + input[type=radio][disabled] { + & + label { + opacity: 0.65; + } + } + +} +input[type=radio]:checked + label:before{ + .radio.radio-success &{ + border-color: $color-success; + } + .radio.radio-primary &{ + border-color: $color-primary; + } + .radio.radio-info &{ + border-color: $color-info; + } + .radio.radio-warning &{ + border-color: $color-warning; + } + .radio.radio-danger &{ + border-color: $color-danger; + } + .radio.radio-complete &{ + border-color: $color-complete; + } +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing +} + +.checkbox { + input[type=radio][disabled] { + & + label { + &:after { + background-color: $color-master-light; + } + } + } + label { + transition: border 0.2s linear 0s, color 0.2s linear 0s; + white-space: nowrap; + &:before { + top: 1.4px; + border-radius: 3px; + transition: border 0.2s linear 0s, color 0.2s linear 0s; + } + &::after { + display: inline-block; + width: 16px; + height: 16px; + position: absolute; + left: 3.5px; + top: 0px; + font-size: 11px; + transition: border 0.2s linear 0s, color 0.2s linear 0s; + } + &:after { + border-radius: 3px; + } + } + input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; + } + &.checkbox-circle { + label { + &:after { + border-radius: 99px; + } + &:before { + border-radius: 99px; + } + } + } + input[type=checkbox]:checked { + & + label { + //color: #4d5056; + &:before { + border-width: 8.5px; + } + &::after { + font-family:'FontAwesome'; + content:"\F00C"; + color: #fff; + } + } + } + input[type="checkbox"]:focus{ + & + label{ + color:$color-master-dark; + &:before{ + background-color: $color-master-light; + } + } + } + input[type=checkbox][disabled] { + & + label { + opacity: 0.65; + &:before { + background-color: #eceff3; + } + } + } + &.right { + label { + margin-right: 35px; + padding-left:0 !important; + &:before { + right:-35px; + left:auto; + + } + } + input[type=checkbox]:checked { + & + label { + position: relative; + // margin-right: 0; + &::after { + font-family:'FontAwesome'; + content:"\F00C"; + position: absolute; + right: -27px; + left: auto; + } + } + } + } +} + +input[type=checkbox]:checked + label{ + .checkbox.check-success &:before{ + border-color: $color-success; + } + .checkbox.check-primary &:before{ + border-color: $color-primary; + } + .checkbox.check-complete &:before{ + border-color: $color-complete; + } + .checkbox.check-warning &:before{ + border-color: $color-warning; + } + .checkbox.check-danger &:before{ + border-color: $color-danger; + } + .checkbox.check-info &:before{ + border-color: $color-info; + } + + .checkbox.check-success &::after, + .checkbox.check-primary &::after, + .checkbox.check-complete &::after, + .checkbox.check-warning &::after, + .checkbox.check-danger &::after, + .checkbox.check-info &::after { + color: $color-white; + } + +} + +.input-group{ + &.transparent{ + .input-group-addon{ + background-color: transparent; + border-color:$form-control-border-color; + } + } +} + +/* Form layouts +-------------------------------------------------- +*/ +@media only screen and (min-width: 768px) { + form{ + .row { + margin-left: 0; + margin-right: 0; + } + .row [class*='col-']{ + + &:not(:first-child), + &:not(:last-child) { + padding-right: 7px; + padding-left: 7px; + } + + &:first-child{ + padding-left: 0; + } + &:last-child{ + padding-right: 0; + } + } + } +} +@media (min-width: 768px) and (max-width: 991px){ + // form .row [class*="col-md-"]:not(:first-child), + // form .row [class*="col-md-"]:not(:last-child){ + // padding-right: 0; + // padding-left: 0; + // } +} +/* Form layouts : Horizontal +-------------------------------------------------- +*/ +.form-horizontal { + .form-group{ + border-bottom: 1px solid $color-master-light; + padding-top: 19px; + padding-bottom: 19px; + margin-bottom: 0; + &:last-child{ + border-bottom: none; + } + &:hover .control-label{ + opacity: .6; + } + &.focused .control-label{ + opacity: 1; + } + .control-label{ + text-align: left; + opacity: .42; + @include transition(opacity ease .3s); + } + } + .radio{ + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; + } + .control-label { + padding-top: 7px; + margin-bottom: 0; + } +} +/* Form layouts : Attached +-------------------------------------------------- +*/ +.form-group-attached{ + .form-group.form-group-default{ + border-radius: 0; + margin-bottom: 0; + } + & > div{ + margin: 0; + &:first-child{ + &.row > [class*='col-']{ + &:first-child .form-group-default{ + border-top-left-radius: 2px; + } + &:last-child .form-group-default{ + border-top-right-radius: 2px; + } + } + &.form-group-default{ + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } + } + + &:last-child{ + &.row > [class*='col-']{ + &:first-child .form-group-default{ + border-bottom-left-radius: 2px; + } + &:last-child .form-group-default{ + border-bottom-right-radius: 2px; + } + } + &.form-group-default{ + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + } + &.row > [class*='col-']{ + padding-right: 0 !important; + padding-left: 0 !important; + } + &.row > [class*='col-']:not(:only-child):not(:last-child) > .form-group-default{ + border-right-color: transparent; + } + &:not(:last-child) .form-group-default, + &:not(:last-child).form-group-default{ + border-bottom-color: transparent; + } + + } +} + +/* Form layouts : Responsive Handlers +-------------------------------------------------- +*/ +@media (max-width: 767px) { + .form-group-attached .form-group-default{ + border-right-color: $form-control-border-color !important; + } +} + +@media only screen and (min-width: 768px) { + .form-group-attached > div.row{ + & > [class*='col-']{ + .form-group{ + height: 100%; + width: 100%; + } + } + } +} +/* Form Groups +-------------------------------------------------- +*/ +.form-group { + margin-bottom: 10px; + label:not(.error){ + font-size: 10.5px; + letter-spacing: 0.06em; + text-transform: uppercase; + font-weight: 500; + } + label .help{ + margin-left: 8px; + + } + .help { + font-size: 12px; + color: rgba($color-master, .55); + } +} + +.form-group-default { + background-color: #fff; + position: relative; + border: 1px solid $form-control-border-color; + border-radius: 2px; + padding-top: 7px; + padding-left: 12px; + padding-right: 12px; + padding-bottom: 4px; + overflow: hidden; + width: 100%; + @include transition(background-color .2s ease); + &.required:after { + color: $color-danger; + content:"*"; + font-family: arial; + font-size: 20px; + position: absolute; + right: 15px; + top: 9px; + } + &.disabled { + input { + opacity: .6; + } + background:mix($color-master-lighter,#fff,50%); + color: rgba($color-master, .23); + &.focused { + background:mix($color-master-lighter,#fff,50%); + label { + opacity: 1; + } + } + } + &.focused { + border-color:rgba(0, 0, 0, 0.1) !important; + background-color:$color-master-lighter; + label { + opacity: .4; + @include backface-visibility(hidden); + } + } + &.has-error{ + background-color: rgba($color-danger,.10); + } + &.has-success, &.has-error{ + .form-control-feedback{ + display: none !important; + } + } + &.has-success .form-control, + &.has-success .form-control:focus, + &.has-error .form-control, + &.has-error .form-control:focus{ + border: none; + box-shadow: none; + } + &.input-group{ + padding: 0; + & > label{ + margin-top: 6px; + padding-left: 12px; + &.inline{ + margin-top: 6px; + float: left; + } + } + & > .form-control{ + margin-top: -2px; + margin-bottom: 3px; + padding-left: 12px; + } + .input-group-addon{ + height: calc(#{$form-group-height} - 4px); + min-width:calc(#{$form-group-height} - 4px); + border-radius: 0; + border:none; + } + &.focused { + .input-group-addon{ + border-color: rgba(0, 0, 0, 0.1); + } + } + } + & .form-control{ + border:none; + height: 25px; + min-height: 25px; + padding: 0; + margin-top: -4px; + background: none; + &.error{ + color: $color-master-dark; + } + &:focus{ + background: none; + } + } + & textarea.form-control{ + padding-top: 5px; + } + label { + margin: 0; + display: block; + opacity: 1; + @include transition(opacity .2s ease); + &.label-lg { + font-size: 13px; + left: 13px; + top: 9px; + } + &.label-sm { + font-size: 11px; + left: 11px; + top: 6px; + } + &.highlight{ + opacity: 1; + } + &.fade{ + opacity: .5; + @include backface-visibility(hidden); + } + } + & > .input-lg { + height: 29px; + min-height: 29px; + padding-left: 1px; + } + & > .input-sm { + min-height: 18px; + height: 18px; + } + &.form-group-default-select{ + overflow: visible; + .ui-select-container.ui-select-bootstrap.dropdown { + .ui-select-match{ + padding-top: 6px; + height: 23px; + } + } + } + &.form-group-default-select2{ + padding: 0; + & > label{ + position: absolute; + z-index: 10; + padding:7px 12px 0 12px; + &.label-lg{ + left:0; + top: 0; + } + &.label-sm{ + left:0; + top: 0; + } + } + .select2-container{ + .select2-selection--single{ + padding-top: 20px; + height: 52px; + .select2-arrow b:before{ + top: 20px; + } + .select2-chosen{ + padding-left:3px; + padding-top: 1px; + } + } + .select2-selection--multiple{ + padding-top: 20px; + height: 52px; + border:0px; + .select2-selection__rendered .select2-selection__choice{ + margin-top:4px; + } + } + } + & > .input-lg{ + height: auto; + padding: 0; + .select2-choice{ + padding-top: 20px; + height: 56px; + } + } + & > .input-sm{ + height: auto; + padding: 0; + .select2-choice{ + padding-top: 20px; + height: 46px; + } + } + } + &.form-group-default-selectFx{ + padding: 0; + & > label{ + position: absolute; + z-index: 10; + padding: 7px 12px 0 12px; + &.label-lg{ + left: 0; + top: 0; + } + &.label-sm{ + left: 0; + top: 0; + } + } + .cs-wrapper{ + .cs-placeholder{ + padding-top: 28px; + height: 52px; + padding-left: 12px; + } + .cs-select{ + height: auto; + > span:after, + .cs-selected span:after { + top: 39px; + } + &.input-lg .cs-placeholder{ + height: 60px; + } + &.input-sm .cs-placeholder{ + height: 50px; + } + } + .dropdown-placeholder{ + vertical-align: top; + } + } + } +} + +/* Form validation +-------------------------------------------------- +*/ +.has-success { + @include form-control-validation($color-success-dark, $color-success-dark, $color-success); +} +.has-warning { + @include form-control-validation($color-warning-dark, $color-warning-dark, $color-warning); +} +.has-error { + @include form-control-validation($color-danger, $color-danger, $color-danger); +} +.error { + font-size: 12px; + color: $color-danger; + display: block; +} + +/* Addon inputs +-------------------------------------------------- +*/ +.input-group-addon { + background: $color-master-lighter; + border: 1px solid $form-control-border-color; + color: rgba($color-master, .47); + font-size: 14px; + padding: 6px 9px; + display: table-cell; + border-radius: 3px; + transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s, color 0.2s linear 0s, box-shadow 0.2s linear 0s, background 0.2s linear 0s; + i { + position: relative; + top: 1px; + } + &.primary { + background-color: $color-primary; + border: 1px solid $color-primary; + color: $color-white; + background-color: $color-primary; + border: 1px solid $color-primary; + color: $color-white; + .arrow { + color: $color-primary; + } + } + &.success { + background-color: #0090d9; + color: $color-white; + .arrow { + color: #0090d9; + } + } + &.info { + background-color: #1f3853; + color: $color-white; + .arrow { + color: #1f3853; + } + } + &.warning { + background-color: #fbb05e; + color: $color-white; + background-color: #fbb05e; + color: $color-white; + .arrow { + color: #fbb05e; + } + } + &.danger { + background-color: #f35958; + color: $color-white; + .arrow { + color: #f35958; + } + } + .arrow { + position: relative; + right: -6px; + color: #D1DADE; + z-index: 100; + &:before { + font-family:'FontAwesome'; + content:"\f0da"; + font-size: 23px; + position: absolute; + left: 17px; + top: -2px; + } + } + &:last-child { + .arrow { + &:before { + font-family:'FontAwesome'; + content:"\f0d9"; + font-size: 23px; + position: absolute; + left: -23px; + top: -2px; + } + } + input { + border-left: 0px; + } + } +} + + + + + +/* Plugins +-------------------------------------------------- +Datepicker +https://github.com/eternicode/bootstrap-datepicker +*/ +.datepicker { + padding: 16px 25px; + border-radius: 2px; + font-size: 12px; + &:after{ + border-bottom-color: $color-master-lightest; + } + thead { + tr { + .datepicker-switch { + color: #6f7b8a; + font-size: 13px; + } + .next, + .prev{ + color: $color-primary; + content:''; + font-size: 0px; + &:before { + color: $color-primary; + font-family:'FontAwesome'; + font-size: 10px; + } + } + .prev:before { + content:"\f053"; + } + .next:before { + content:"\f054"; + } + .dow { + color: $color-primary; + text-transform: uppercase; + font-size: 11px; + } + th{ + width: 31px; + height: 29px; + } + } + } + tbody { + tr { + .odd { + color: #d0d3d8; + } + } + } + table { + tr { + td { + width: 31px; + height: 29px; + &.old, + &.new{ + color: $color-master-light; + } + &.day { + &:hover { + background: $color-master-lighter; + } + } + &.active{ + background-color:$color-primary !important; + &, + &:hover, + &.disabled, + &.disabled:hover { + background-image: none; + text-shadow: none; + font-weight: 600; + } + } + &.today{ + &, + &:hover, + &.disabled, + &.disabled:hover { + background-color: $color-master-lighter; + background-image: none; + color: $color-white; + } + } + span { + border-radius: 4px; + width: 42px; + height: 42px; + line-height: 42px; + &.active{ + background-color: $color-primary !important; + } + &.active, + &.active:hover, + &.active.disabled, + &.active.disabled:hover { + background-image: none; + border: none; + text-shadow: none; + } + } + } + } + } + &.dropdown-menu{ + border-color: $color-master-light; + color:$color-master; + } + &.datepicker-dropdown.datepicker-orient-bottom:before{ + border-color: $color-master-light; + } +} + +.datepicker-inline { + width: auto; +} +.input-daterange .input-group-addon{ + text-shadow: none; + border:0; + margin: 0; +} + +/* Timepicker +https://github.com/m3wolf/bootstrap3-timepicker +*/ + +.bootstrap-timepicker-widget{ + table td a i{ + font-size: 12px; + } + a.btn, .bootstrap-timepicker-widget input{ + @include border-radius(2px); + } + &.dropdown-menu{ + background: #fff; + } +} + + +/* Daterangepicker +http://www.dangrossman.info/ +*/ + +.daterangepicker{ + background: #fff; + .calendar{ + .calendar-date{ + border: 1px solid $form-control-border-color; + } + .prev, .next, th{ + color: $color-primary; + text-transform: uppercase; + font-size: 11px; + } + .month{ + color: #6f7b8a; + font-size: 13px; + } + } + td.active, td.active:hover{ + background-color: $color-primary; + border-color: $color-primary; + } + td.in-range{ + background:$color-primary-lighter; + } +} +/* Select2 +http://ivaynberg.github.io/select2/ +*/ + +.form-group-default .select2-container .select2-selection, +.select2-container-multi .select2-choices{ + border-color: transparent !important; +} +select.full-width + .select2-container { + width: 100% !important; +} +.select2-container { + //Chrome outline fix + *:focus { + outline: none; + } + .select2-selection { + background-image: none; + border-radius: 2px; + border: 1px solid $form-control-border-color !important; + padding: 2px 9px; + transition: border 0.2s linear 0s; + .select2-selection__rendered { + padding: 0; + padding-left: 2px; + margin-top: 20px; + } + .select2-selection__arrow { + top: auto; + bottom: 5px; + right: 10px !important; + left:auto; + background: transparent; + border-left: 0px; + @include transition(all 0.3s ease); + } + &.select2-selection--single { + height: 35px; + } + & > .select2-chosen{ + margin-right:26px; + margin-left:0; + } + } + &.select2-drop-above { + .select2-choice { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + } + } +} +.select2-container--default { + .select2-results__option[aria-selected="true"] { + background-color: transparent; + } + .select2-results__group{ + color: $color-master-dark; + } +} +.select2-search input, +.select2-search-choice-close, +.select2-container .select2-choice abbr, +.select2-container .select2-choice .select2-arrow b{ + background-image: none !important; +} +.select2-dropdown-open.select2-drop-above .select2-choice, +.select2-dropdown-open.select2-drop-above .select2-choices { + background-image: none !important; + border: 1px solid $form-control-border-color; + background: $color-master-lighter; +} +.select2-dropdown-open { + .select2-choice { + .select2-arrow { + @include scale(scale(1, -1)); + + } + } +} +.select2-dropdown { + border: 1px solid $form-control-border-color; + border-bottom: none; + border-radius: 2px; + padding-top: 0px; + &.select2-drop-above { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + box-shadow: none; + // &.select2-drop-active { + // } + } +} +.select2-container--open .select2-selection { + box-shadow: none; + border: 1px solid $form-control-border-color; + background: transparent; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} +.select2-container--default .select2-selection--single { + background: transparent !important; +} +.select2-search--dropdown { + padding-left: 8px; + padding-right: 8px; + padding-top: 4px; + input { + background: $color-white !important; + vertical-align: baseline; + line-height: 28px; + border-radius: 2px; + border: none; + font-size: 12px; + border: 1px solid $form-control-border-color !important; + } +} +.select2-results { + margin: 3px 8px 10px 8px; + li { + color: $color-master; + &.select2-result-with-children { + & > .select2-result-label { + color: $color-master-dark; + &:first-child{ + padding-top: 8px; + } + } + } + } + .select2-results__option--highlighted { + background-color: $color-master-lighter !important; + border-radius: 3px; + color: $color-master !important; + } + .select2-no-results, + .select2-searching, + .select2-selection-limit { + background: none; + color: $color-master; + font-size: 12px; + padding-left:8px; + padding-top: 0px; + position: relative; + top: -5px; + } +} + +.select2-dropdown { + border: 1px solid $form-control-border-color; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + padding-top: 5px; + z-index: $zIndex-navbar - 10; + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); +} +.select2-container--open .select2-selection--multiple .select2-selection__choice { + background-color: $color-white !important; +} +.select2-selection--multiple { + .select2-selection__rendered { + background-image: none; + .select2-selection__choice { + background-color: $color-master-light; + background-image: none; + border: none; + box-shadow: none; + color: inherit; + border-radius: 8px; + margin: 6px -5px 0px 10px; + padding: 0 8px 0 7px; + line-height: 21px; + &:first-child { + margin-left: 0; + } + .select2-selection__choice__remove { + color: #626262; + font-weight: 900; + margin-right: 4px; + } + } + .select2-search--inline { + margin-left: 8px; + } + } + &.select2-container-active { + .select2-choices { + border: 1px solid $form-control-border-color; + box-shadow: none; + } + } + .select2-search-choice-close { + left:6px; + } +} +.select2-search-choice-close { + background: none; + top: 4px; + right:0; + &:hover { + text-decoration: none; + } +} +.select2-drop-multi .select2-results { + .select2-no-results, + .select2-searching, + .select2-selection-limit { + top: 0px; + } +} +.select2 { + &.form-control { + padding: 0; + box-shadow: none; + border: 0; + } +} + +.select2-drop-mask{ + z-index: 700; +} + +.ui-select-bootstrap .ui-select-choices-row.active > a{ + background: $color-master-lighter; + border-radius: 3px; + color: $color-master; +} +.ui-select-bootstrap > .ui-select-choices{ + background-color: #fff; + // box-shadow: 0px 4px 5px rgba(0,​ 0,​ 0,​ 0.15); +} +.ui-select-choices-group-label{ + color: $color-master-dark; + font-weight: bold; +} +.modal-open{ + .select2-drop-active{ + z-index: 1051; + } + .datepicker.dropdown-menu{ + z-index: 1051 !important; + } + .select2-drop-mask{ + z-index: 1050; + } + .cs-skin-slide.cs-active{ + z-index: 1050; + } +} + +.dropdown-placeholder{ + display: inline-block; + vertical-align: middle; +} +.dropdown-mask{ + bottom: 0; + display: none; + left: 0; + outline: 0 none; + overflow: hidden; + position: fixed; + right: 0; + top: 0; + z-index: $zIndex-dropdownMask; +} +/* Bootstrap Tags input +https://github.com/timschlechter/bootstrap-tagsinput +*/ + +.form-group-default { + .bootstrap-tagsinput{ + border:0px; + padding-left:0; + margin-bottom: 5px; + padding-top: 0; + vertical-align: top; + padding-bottom: 0px; + padding-left:0; + margin-top: 5px; + .tag{ + padding: 2px 9px; + line-height: 18px; + margin-bottom: 2px; + [data-role="remove"] { + display: inline-block; + vertical-align: top; + } + margin-left: 0; + margin-right: 2px; + } + input{ + min-height: 20px; + &:first-child{ + margin-left: 0; + } + } + } +} +.bootstrap-tagsinput { + @include flexbox(); + @include flex-row(); + -webkit-flex-wrap:wrap; + -ms-flex-wrap: wrap; + -ms-flex-flow: wrap; + flex-flow: wrap; + background-color: transparent; + border: 1px solid $form-control-border-color; + border-radius: 4px; + padding: 0; + padding-top: 5px; + padding-right:5px; + @include box-shadow(none); + width: 100%; + @include transition(background 0.2s linear 0s); + &.active-element { + background-color: $color-master-light; + } + input { + border: none; + margin: 5px; + margin-top: 0; + margin-right:0; + min-height: 25px; + min-width: 10em !important; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + //Older browsers + -webkit-flex-shrink:0; + -webkit-flex-grow: 1; + -webkit-flex-basis: auto; + } + .tag { + padding: 3px 9px; + padding-right:6px; + border-radius: 3px; + line-height: 18px; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + margin: 5px; + margin-top: 0; + margin-right:0; + //Older browsers + -webkit-flex-shrink:0; + -webkit-flex-grow: 1; + -webkit-flex-basis: auto; + } + .tag [data-role="remove"]{ + margin-left: 4px; + float: right; + vertical-align: middle; + } + .tag[data-role="remove"]:hover:active, + .tag [data-role="remove"]:hover { + box-shadow: none; + } + .tag [data-role="remove"]:after{ + font-family: 'FontAwesome'; + content: "\f00d"; + padding: 0; + } +} + +/* Bootstrap3 wysihtml5 +https://github.com/Waxolunist/bootstrap3-wysihtml5-bower +*/ +.wysiwyg5-wrapper { + position: relative; + .wysihtml5-toolbar { + position: absolute; + bottom: 0; + left: 0; + right: 0; + /*height: 50px;*/ + background: $color-master-lighter; + border-top:1px solid $color-master-light; + .btn { + background: none repeat scroll 0 0 rgba(0, 0, 0, 0); + border-color:transparent; + border-right-color: $color-master-light; + color: #A5A5A5; + font-size: 16px; + font-weight: 600; + height: 50px; + line-height: 50px; + padding: 0 5px; + border-width: 1px; + border-radius: 0 !important; + box-shadow: none !important; + &:hover .editor-icon { + opacity: .8; + } + &.active .editor-icon { + opacity: 1; + } + &.dropdown-toggle { + padding-left: 10px; + padding-right: 20px; + .current-font { + opacity: .5; + font-size: 14px; + } + } + } + & > li { + margin:0; + padding: 0; + } + } + .wysiwyg { + width: 100%; + min-height: 200px; + font-size: 14px; + line-height: 18px; + padding-bottom:50px !important; + border: 0; + &:focus{ + background-color:$color-master-lightest; + outline: 0 !important; + @include box-shadow(none); + } + } + .expand-wysiwyg { + bottom: 0; + color: #A5A5A5; + font-size: 20px; + font-weight: 600; + height: 50px; + line-height: 50px; + padding: 0 15px; + position: absolute; + right: 0; + } + .wysihtml5-sandbox{ + border: none !important; + padding: 16px 16px 50px !important; + width: 100% !important; + &.expanded{ + height: 100% !important; + } + } +} +.toggle-wysiwyg { + position: absolute; + right: 15px; + top: 0; + li { + display: inline-block; + font-weight: 600; + } +} +.editor-icon { + background-image: url("#{$base-img-url}/editor_tray.png"); + display: inline-block; + height: 40px; + margin-top: 5px; + opacity: 0.4; + vertical-align: top; + width: 40px; + &-headline { + background-position: 0 0; + width:31px; + } + &-bold { + background-position: -40px 0; + } + &-italic { + background-position: -80px 0; + } + &-underline { + background-position: -120px 0; + } + &-link { + background-position: -160px 0; + } + &-quote { + background-position: -200px 0; + } + &-ul { + background-position: -240px 0; + } + &-ol { + background-position: -280px 0; + } + &-outdent { + background-position: -320px 0; + } + &-indent { + background-position: -360px 0; + } + &-image { + background-position: -400px 0; + } + &-html { + background-position: -440px 0; + } +} + +/* Summernote +https://github.com/HackerWins/summernote +*/ +.summernote-wrapper{ + .note-editor{ + border-color:$color-master-light; + .note-toolbar{ + padding: 0; + background-color: $color-master-lighter; + border-bottom: none; + .btn-group{ + margin: 0 -1px 0 0; + .btn{ + font-size: 12px; + font-weight: 600; + height: 50px; + min-width: 47px; + line-height: 50px; + padding: 0 5px; + border-radius: 0; + background-color: $color-master-lighter; + border-color: transparent; + border-right-color: $color-master-light; + border-bottom-color: $color-master-light; + color: $color-master; + &.active, &:active{ + background-color: $color-master-light; + } + &.dropdown-toggle{ + min-width: 61px; + } + &:not(:last-child), &:not(:only-child){ + margin-right: 1px; + } + } + } + } + .note-statusbar { + background-color: transparent; + .note-resizebar{ + border-top-color: transparent; + .note-icon-bar{ + border-top: 1px solid $color-master-light; + } + } + } + } + .note-popover .popover .popover-content .dropdown-menu li a i, .note-toolbar .dropdown-menu li a i{ + color: $color-primary; + } +} + + + +// Webkit fixes +input, input:focus{ + -webkit-transition: none !important; +} +input:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #fff inset !important; +} +input:-webkit-autofill:focus { + -webkit-box-shadow: 0 0 0 1000px $color-master-lighter inset !important; +} +input.error:-webkit-autofill, +input.error:-webkit-autofill:focus, +.has-error input:-webkit-autofill { + -webkit-box-shadow: 0 0 0 1000px #F9E9E9 inset !important; +} + + +/* Pages SelectFx */ + +/* Default custom select styles */ +div.cs-select { + display: inline-block; + vertical-align: middle; + position: relative; + text-align: left; + background: #fff; + width: 100%; + max-width: 500px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.cs-select:focus { + outline: none; /* For better accessibility add a style for this in your skin */ +} + +.cs-select select { + display: none; +} + +.cs-select span { + display: block; + position: relative; + cursor: pointer; + padding: 1em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Placeholder and selected option */ +.cs-select > span { + padding-right: 3em; +} + +.cs-select > span::after, +.cs-select .cs-selected span::after { + speak: none; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.cs-select > span::after { + content: '\25BE'; + right: 1em; +} + +.cs-select .cs-selected span::after { + content: '\2713'; + margin-left: 1em; +} + +.cs-select.cs-active > span::after { + -webkit-transform: translateY(-50%) rotate(180deg); + transform: translateY(-50%) rotate(180deg); +} + +/* Options */ +.cs-select .cs-options { + position: absolute; + overflow: hidden; + width: 100%; + background: #fff; + visibility: hidden; +} + +.cs-select.cs-active .cs-options { + visibility: visible; +} + +.cs-select ul { + list-style: none; + margin: 0; + padding: 0; + width: 100%; +} + +.cs-select ul span { + padding: 1em; +} + +.cs-select ul li.cs-focus span { + background-color: #ddd; +} + +/* Optgroup and optgroup label */ +.cs-select li.cs-optgroup ul { + padding-left: 1em; +} + +.cs-select li.cs-optgroup > span { + cursor: default; +} + + + + +div.cs-skin-slide { + color: #fff; + /*font-size: 1.5em;*/ + width: 300px; +} + +@media screen and (max-width: 30em) { + div.cs-skin-slide { font-size: 1em; width: 250px; } +} + +div.cs-skin-slide::before { + content: ''; + background: #282b30; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; +} + +.cs-skin-slide.cs-active::before { + -webkit-transform: scale3d(1.1,3.5,1); + transform: scale3d(1.1,3.5,1); +} + +.cs-skin-slide > span { + height: 80px; + line-height: 32px; + -webkit-transition: text-indent 0.3s, opacity 0.3s; + transition: text-indent 0.3s, opacity 0.3s; +} + +@media screen and (max-width: 30em) { + .cs-skin-slide > span { height: 60px; line-height: 28px; } +} + +.cs-skin-slide.cs-active > span { + text-indent: -290px; + opacity: 0; +} + +.cs-skin-slide.cs-active > span::after { + -webkit-transform: translate3d(0,-50%,0); + transform: translate3d(0,-50%,0); +} + +.cs-skin-slide .cs-options { + background: transparent; + width: 70%; + height: 400%; + padding: 1.9em 0; + top: 50%; + left: 50%; + -webkit-transform: translate3d(-50%,-50%,0); + transform: translate3d(-50%,-50%,0); +} + +@media screen and (max-width: 30em) { + .cs-skin-slide .cs-options { padding-top: 3em; } +} + +.cs-skin-slide .cs-options li { + opacity: 0; + -webkit-transform: translate3d(30%,0,0); + transform: translate3d(30%,0,0); + -webkit-transition: -webkit-transform 0.3s, opacity 0.3s; + transition: transform 0.3s, opacity 0.3s; +} + +.cs-skin-slide.cs-active .cs-options li { + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + opacity: 1; +} + +.cs-skin-slide.cs-active .cs-options li:first-child { + -webkit-transition-delay: 0.05s; + transition-delay: 0.05s; +} + +.cs-skin-slide.cs-active .cs-options li:nth-child(2) { + -webkit-transition-delay: 0.1s; + transition-delay: 0.1s; +} + +.cs-skin-slide.cs-active .cs-options li:nth-child(3) { + -webkit-transition-delay: 0.15s; + transition-delay: 0.15s; +} + +.cs-skin-slide.cs-active .cs-options li:nth-child(4) { + -webkit-transition-delay: 0.2s; + transition-delay: 0.2s; +} + +.cs-skin-slide.cs-active .cs-options li:nth-child(5) { + -webkit-transition-delay: 0.25s; + transition-delay: 0.25s; +} /* more options need more delay declaration */ + +.cs-skin-slide .cs-options li span { + text-transform: uppercase; + font-weight: 500; + letter-spacing: 2px; + font-size: 65%; + padding: 0.8em 1em 0.8em 2.5em; +} + +.cs-skin-slide .cs-options li span:hover, +.cs-skin-slide .cs-options li.cs-focus span, +.cs-skin-slide .cs-options li.cs-selected span { + color: #eb7e7f; + background: transparent; +} + +.cs-skin-slide .cs-selected span::after { + content: ''; +} + + +/* Pages Select overriding */ + +.form-group-default .cs-skin-slide > span{ + padding: 0 30px 0 0; + height: 22px; + line-height: 21px; +} +.form-group-default .cs-wrapper{ + width: 100%; + height: 100%; + @include flexbox(); + @include align-items(center); +} +.cs-wrapper{ + display: inline-block; + // width: 100%; +} +.form-control.cs-select:not(.cs-active){ + width: 100% !important; +} +.cs-select:not(.cs-active):not(.form-control){ + // width: 100% !important; +} +.cs-select{ + background-color: transparent; + span{ + text-overflow:initial; + } + .cs-placeholder{ + width: 100%; + } +} +div.cs-skin-slide{ + width: auto; + font-family: Arial,sans-serif; + //font-size: 14px; + color: #5e5e5e; + &:before{ + background-color: transparent; + } + &.cs-transparent{ + background: none; + .cs-backdrop{ + border-color: transparent; + background: none; + } + &.cs-active .cs-backdrop{ + background: $color-master-lightest; + } + } + & > span{ + height: 35px; + padding: 6px 33px 6px 17px; + line-height: 23px; + z-index: 1; + } + &.cs-active{ + z-index: $zIndex-navbar - 10; + &:before{ + -webkit-transform: scale3d(1,1,1); + transform: scale3d(1,1,1); + } + .cs-backdrop{ + border: transparent; + background: $color-master-lightest; + box-shadow: -1px 0 1px #ccc, 1px 0 1px #ccc; + } + } + & > span:after, + &.cs-active > span:after{ + content:"\f0d7"; + font-family: FontAwesome; + color: #5e5e5e; + } + .cs-options{ + height: auto; + padding: 9px 0; + width: auto; + padding: 10px; + max-height: 350px; + transform: translate3d(1,1,1); + overflow: hidden; + z-index: 1; + ul{ + width: 100%; + display: table; + li{ + display: table-row; + span{ + display: table-cell; + font-size: 14px; + font-weight: normal; + letter-spacing: normal; + padding: 5px 0; + text-transform: none; + max-height: 350px; + overflow-y: auto; + } + span:hover, + &.cs-focus span, + &.cs-selected span{ + color: $color-master-dark; + } + } + } + } +} +.cs-backdrop{ + background: none repeat scroll 0 0 #fff; + border: 1px solid $form-control-border-color; + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + @include transition(all .3s ease); + +} +.cs-skin-slide.cs-active .cs-options li:nth-child(6) { + transition-delay: 0.3s; +} +.cs-skin-slide.cs-active .cs-options li:nth-child(7) { + transition-delay: 0.35s; +} +.cs-skin-slide.cs-active .cs-options li:nth-child(8) { + transition-delay: 0.4s; +} +.cs-skin-slide.cs-active .cs-options li:nth-child(9) { + transition-delay: 0.45s; +} +.cs-skin-slide.cs-active .cs-options li:nth-child(10) { + transition-delay: 0.5s; +} +.cs-skin-slide.cs-active .cs-options li:nth-child(11) { + transition-delay: 0.55s; +} + +.dropzone { + overflow: hidden; + .dz-default.dz-message{ + width: 100%; + } +} + +/* Dropzone for Angular */ +.dropzone[dropzone="dropzone"] input[type="file"]{ + visibility: hidden; +} +/* end overrides */ + +// Twitter Typehead +// -------------------------------------------------- +.twitter-typeahead{ + width: 100%; +} +.tt-menu { + width: 100%; + padding: 3px 10px 3px 3px; + background-color: $color-white; + border: 1px solid rgba(0, 0, 0, 0.07); + border-top:0; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); +} + +.tt-suggestion { + color: $color-master; + padding: 3px 7px 4px; + padding-left: 26px; + line-height: 24px; + &:hover { + cursor: pointer; + background: $color-master-lighter; + } + &.tt-cursor { + background: $color-master-lighter; + } + p { + margin: 0; + } +} +.form-group-default{ + &.typehead{ + overflow: inherit; + } + .tt-menu { + width: calc(100% + 24px); + margin: 4px -12px; + } +} +/* Demo specifc classes */ +.demo-form-wysiwyg{ + height: 250px; +} + +// error form +.error-form{ + .form-group-default { + padding: 0; + justify-content: space-between; + .input-group-addon { + height: calc(50px); + min-width: calc(50px); + border-radius: 0; + border: none; + } + label { + margin-top: 6px; + padding-left: 12px; + } + .form-control { + margin-top: -2px; + margin-bottom: 3px; + padding-left: 12px; + } + } + .transparent { + .input-group-addon { + background-color: transparent; + border-color: rgba(0,0,0,0.07); + } + } +} +.error-container{ + &.bottom-container{ + margin-top: 0; + } +} + +.form-group-default { + &.input-group { + padding: 0; + label { + margin-top: 6px; + padding-left: 12px; + } + .form-input-group{ + width: 100%; + } + .form-control { + margin-top: -2px; + margin-bottom: 3px; + padding-left: 12px; + } + .input-group-addon { + min-width: calc(50px); + height: 52px; + border-radius: 0 !important; + border: none !important; + } + } +} +.h-c-50{ + height: calc(50px); +} +.card-toolbar{ + .note-editor{ + .btn-toolbar{ + display: block; + } + } +} +.pretty .state label { + line-height: 1; +} + +.inlineForm { + display: none; +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_gallery.scss b/resources/assets/sass/modules/_gallery.scss new file mode 100644 index 00000000..b6f6af8e --- /dev/null +++ b/resources/assets/sass/modules/_gallery.scss @@ -0,0 +1,255 @@ +/*------------------------------------------------------------------ +[25. Gallery] +*/ + +.gallery { + margin: 70px auto 0 auto; +} +.gallery-item { + overflow: hidden; + cursor: default; + background-color: #000; + margin-bottom: 10px; + position: relative; + width: 280px; + height: 240px; + &:hover { + cursor: pointer; + } + &[data-width="1"] { + width: 280px; + } + &[data-width="2"] { + width: 570px; + } + &[data-height="1"] { + height: 240px; + } + &[data-height="2"] { + height: 490px; + } + & >img { + opacity: 1; + -webkit-transition: opacity 0.35s; + transition: opacity 0.35s; + } + & > .live-tile { + & img { + opacity: 1; + -webkit-transition: opacity 0.35s; + transition: opacity 0.35s; + } + } + .rating { + margin-top: -5px; + color: rgba(255, 255, 255, 0.3); + & > .rated { + color: rgba(255, 255, 255, 1); + } + } + .item-info { + -webkit-transform: translate3d(0, 40%, 0); + transform: translate3d(0, 40%, 0); + -webkit-transition: -webkit-transform 0.35s, color 0.35s; + transition: transform 0.35s, color 0.35s; + &.more-content { + -webkit-transform: translate3d(0, 32%, 0); + transform: translate3d(0, 32%, 0); + } + } + &:hover { + .item-info { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + & >img { + opacity: 0.6; + } + & > .live-tile { + & img { + opacity: 0.6; + } + } + } + &:active { + .item-info { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + & >img { + opacity: 0.6; + } + } +} +.item-details { + z-index: 1050; + .dialog__content { + width: 845px; + max-width: 845px; + padding: 0; + text-align: left; + border: 1px solid rgba(0, 0, 0, 0.8); + .dialog__overview { + height: 516px; + position: relative; + .buy-now { + position: absolute; + bottom: 20px; + right: 35px; + } + .item-slideshow .slide { + width: 516px; + height: 516px; + display: block; + overflow: hidden; + } + } + .dialog__footer { + height: 75px; + .price { + margin: 0; + padding: 0; + line-height: 75px; + } + .separator { + position: relative; + } + .separator:after { + content: ""; + width: 1px; + background: rgba(255, 255, 255, .1); + position: absolute; + height: 27px; + right: 0; + top: 24px; + } + .recommended { + li { + a { + width: 56px; + height: 56px; + display: block; + } + overflow: hidden; + img { + width: 100%; + } + } + } + } + .close { + top: 15px; + right: 15px; + z-index: 100; + } + } + .owl-nav { + left: 0; + position: absolute; + top: 50%; + width: 100%; + color: #fff; + opacity: .7; + font-size: 18px; + padding: 0 20px; + .owl-prev { + float: left; + } + .owl-next { + float: right; + } + } + .owl-dots { + bottom: 23px; + position: absolute; + right: 23px; + .owl-dot { + width: 10px; + height: 10px; + border-radius: 10px; + display: inline-block; + background: rgba(0, 0, 0, .3); + margin-left: 6px; + &.active { + background: #fff; + } + } + } +} + +.gallery-filters{ + position: absolute; + left: 0; + right: 0; + height: 70px; + top:-70px; +} +@media (max-width: 920px) { + .gallery-item.first{ + display: none; + } +} +@media (max-width: 767px) { + .item-details { + .dialog__content { + height: 90%; + overflow-y: auto; + width: 400px; + max-width: 400px; + .container-fluid { + height: 100%; + padding-left: 30px; + padding-right: 30px; + } + .dialog__overview { + height: 100%; + margin-right: -30px; + margin-left: -30px; + } + } + .item-slideshow-wrapper { + height: 515px !important; + } + .item-description { + height: auto !important; + .buy-now { + position: static !important; + float: right; + margin-bottom: 20px; + } + } + .item-slideshow { + .owl-stage-outer, .owl-stage { + height: 100%; + } + .slide { + width: 100% !important; + } + } + } +} + +@media (max-width: 420px) { + .gallery{ + margin-top: 80px; + } + .gallery-filters{ + top: -90px; + } + .item-details .dialog__content { + width: 100%; + max-width: 100%; + } +} + +@media (max-width: 610px) { + .gallery-item, .gallery { + width: 100% !important; + } +} +@media (min-width: 768px) { + .item-details .dialog__content .container-fluid > .row { + margin-left: -30px; + margin-right: -30px; + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_layout.scss b/resources/assets/sass/modules/_layout.scss new file mode 100644 index 00000000..a7be3a0a --- /dev/null +++ b/resources/assets/sass/modules/_layout.scss @@ -0,0 +1,2176 @@ +/*------------------------------------------------------------------ +[1. Layouts] +*/ +html { + height: 100%; +} +/* Body Triggers for layout options +------------------------------------------------------------------ +*/ +body { + height: 100%; + margin: 0; + padding: 0; + background-color: $color-master-lightest; + -moz-osx-font-smoothing: grayscale; + &.fixed-header { + .header { + position: fixed; + left: 0; + top: 0; + } + } + &.mobile{ + .sidebar-menu { + overflow: scroll; + -webkit-overflow-scrolling: touch; + } + .sidebar-menu > ul { + height: auto !important; + overflow: visible !important; + -webkit-overflow-scrolling: touch !important; + } + .page-sidebar .sidebar-menu .menu-items { + li{ + &:hover{ + a{ + color:$color-menu-light; + } + .icon-thumbnail{ + color:$color-menu-light !important; + } + } + &.active, &.open{ + & > a{ + color:#fff; + } + & > .icon-thumbnail{ + color:#fff; + } + } + } + } + .drager{ + overflow: auto; + -webkit-overflow-scrolling: touch; + } + } + &.sidebar-visible{ + .page-sidebar{ + .scroll-element{ + visibility: visible; + } + .menu-items { + .icon-thumbnail{ + @include translate3d(-14px,0,0); + } + } + .sidebar-header .sidebar-header-controls{ + @include translate3d(48px,0,0); + } + } + + } + &.no-header{ + .page-container .page-content-wrapper .content{ + padding-top: 0px; + } + .header{ + border-bottom-color: transparent; + } + } + &.dashboard{ + background: $dashboard-background; + .page-container{ + background: $dashboard-background; + } + } + &.menu-pin{ + .overlay{ + padding-left:0; + .overlay-brand{ + margin-left: 0; + } + } + } +} + +.zig-zag-top:before{ + background: linear-gradient(-45deg, #ffffff 16px, #ffffff 16px, #ffffff 16px, transparent 0), linear-gradient(45deg, #ffffff 16px, transparent 0); + background-position: left top; + background-repeat: repeat-x; + background-size: 22px 32px; + content: " "; + display: block; + height: 32px; + width: 100%; + position: relative; + bottom: 0px; + left:0; +} + +.zig-zag-bottom{ + margin: 32px 0; + margin-top: 0; + background: #1ba1e2; +} + +/* Page Loader +------------------------------------ +*/ +.pace{ + .pace-progress{ + background: $color-success; + height: 3px; + } + .pace-progress-inner{ + box-shadow: none; + } + .pace-activity{ + -webkit-animation: none; + animation: none; + top: 73px; + background: url('#{$base-img-url}/progress/progress-circle-success.svg') no-repeat top left; + background-size: 100% auto; + margin: 0 auto; + border-width: 0; + border-radius: 0; + width: 28px; + height: 40px; + right: 19px; + } +} +/* Header +------------------------------------ +*/ +.header{ + position: relative; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + height: $layout-header-height; + width: 100%; + padding: 0 20px 0 0; + z-index: $zIndex-navbar; + background-color: #fff; + border-bottom: 1px solid fade($color-master-light, 70%); + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + a{ + color: $color-master; + &:hover,&:active,&:focus{ + color: $color-master; + } + } + //Used only in Boxed layout + .header-inner{ + height: inherit; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + } + &.transparent { + background-color: transparent !important; + } + .brand { + vertical-align: middle; + width: $layout-sidepanel-width; + text-align: center; + } + + + .bubble{ + border-radius:100%; + height:12px; + width:12px; + background-color:$color-danger; + color:$color-white; + position:absolute; + top:-6px; + float:right; + right:-5px; + } + .notification-list{ + display:inline-block; + line-height: 23px; + } + .search-link{ + display:inline-block; + margin-left:15px; + color : $color-master; + opacity: .7; + font-size:14px; + vertical-align: middle; + line-height: 12px; + font-family:$base-font-family; + i{ + margin-right:15px; + font-size:16px; + } + &:hover{ + opacity: 1; + } + } + .pg{ + font-size: 16px; + } + ul{ + li{ + line-height: 12px; + vertical-align: middle; + } + } + .dropdown{ + line-height: 12px; + } +} +/* Bootstrap navbar +------------------------------------ +*/ +.navbar{ + min-height: 50px; + position: relative; + margin-bottom: 20px; + border: 1px solid transparent; + top: -1px; +} +.navbar-nav > li { + & > a{ + position: relative; + display: block; + padding: 10px 15px; + padding-top: 20px; + padding-bottom: 20px; + } +} +.navbar-default{ + background-color: $color-white; + .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:hover, .navbar-default .navbar-nav>.active>a:focus{ + background-color:transparent; + } + .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:hover, .navbar-default .navbar-nav>.active>a:focus{ + background-color:transparent; + } + +} + +.navbar-toggle{ + border-radius: 0; + background-color: transparent !important; +} + +.navbar-default .navbar-nav>li>a { + color: $color-master; +} +/* Main Menu Sidebar +------------------------------------ +*/ +.page-sidebar{ + width: $layout-sidepanel-width; + background-color:$color-menu; + z-index: $zIndex-sidebar; + left:$layout-sidepanel-width-collapsed - $layout-sidepanel-width; + position: fixed; + bottom: 0; + top: 0; + right: auto; + overflow: hidden; +-webkit-transition: -webkit-transform 400ms cubic-bezier($menu-bezier); + -moz-transition: -moz-transform 400ms cubic-bezier($menu-bezier); + -o-transition: -o-transform 400ms cubic-bezier($menu-bezier); + transition: transform 400ms cubic-bezier($menu-bezier); +-webkit-backface-visibility: hidden; + a,button { + color:$color-menu-light; + &:hover,&:active{ + color:$color-menu-link-hover; + } + &:visited,&:focus{ + color:$color-menu-light; + } + } + .scroll-element{ + visibility: hidden; + } + .sidebar-header{ + /* Side-bar header */ + display: block; + height: $layout-header-height; + line-height:$layout-header-height; + background-color:$color-menu-darker; + border-bottom: 1px solid mix($color-menu-darker, #000, 90%); + color: $color-white; + width: 100%; + padding: 0 20px; + padding-left: 30px; + clear: both; + z-index: 10; + position: relative; + .sidebar-header-controls{ + display: inline-block; + -webkit-transition: -webkit-transform 0.4s cubic-bezier($menu-bezier); + transition: transform 0.4s cubic-bezier($menu-bezier); + -webkit-backface-visibility: hidden; + } + .sidebar-slide-toggle i{ + @include transition(all 0.12s ease); + } + .sidebar-slide-toggle.active i{ + @include rotate(-180deg); + } + } + .close-sidebar{ + position: absolute; + right: 19px; + top: 14px; + padding: 9px; + z-index: 1; + & > i{ + color: rgba(255,255,255,0.57); + } + } + .sidebar-overlay-slide{ + /* Side-bar Top Slider */ + width: 100%; + height: 100%; + background-color:$color-menu-darker; + display:block; + z-index: 9; + padding: $layout-header-height+20 20px 20px 20px; + &.from-top{ + top:-100%; + position: absolute; + @include transition(all .2s ease); + &.show{ + @include translate(0,100%); + } + } + } + .sidebar-menu{ + /* Side-bar Menu */ + height: calc(100% - 50px); + position: relative; + width: 100%; + .outer-tab-nav-section { + display: inline-block; + width: 45px; + position: absolute; + height: 100%; + background-color: #0aa699 !important; + } + .menu-items { + /* Side-bar Menut Items */ + list-style: none; + margin: 0; + padding: 0; + margin: 0; + padding: 0; + position: relative; + overflow: auto; + -webkit-overflow-scrolling: touch; + height: calc(100% - 10px); + width: 100%; + li{ + &:hover, &.open, &.active{ + & > .icon-thumbnail{ + color: $color-menu-link-hover; + } + & > a{ + color: $color-menu-link-hover; + } + } + & > a{ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + width: 65%; + } + } + & > li { + display: block; + padding:0; + clear: right; + + &:after, &:before{ + display: table; + content: " "; + clear: both; + } + + & > a { + font-family: Arial, sans-serif; + display: inline-block; + padding-left: 32px; + min-height: $menu-icon-size; + line-height: $menu-icon-size; + font-size: 14px; + clear: both; + &.open { + background: #313131; + } + & > .arrow { + float: right; + padding-right: 30px; + &:before { + float: right; + display: inline; + font-size: 16px; + font-family: FontAwesome; + height: auto; + content: "\f104"; + font-weight: 300; + text-shadow: none; + @include transition(all 0.12s ease); + } + &.open { + &:before { + @include rotate(-90deg); + } + } + } + & > .badge { + margin-top: 12px; + } + & > .title{ + float: left; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 65%; + } + & > .details{ + font-size: 12px; + opacity: 0.4; + display: block; + clear: both; + } + &.detailed{ + & > .title{ + line-height: 28px; + } + & > .details{ + line-height: 16px; + } + } + } + &.active { + & > ul { + &.sub-menu { + display: block; + } + } + } + & > .icon-thumbnail{ + &:first-letter { + text-transform: uppercase; + } + } + & > ul { + &.sub-menu { + & > li { + ul { + &.sub-menu { + li { + padding-left: 10px; + padding-right: 3px + } + .icon-thumbnail { + width: 25px; + height: 25px; + line-height: 25px; + font-size: 10px; + } + } + } + } + li { + & > a { + & > .arrow { + &:before { + float: right; + margin-top: 1px; + margin-right: 20px; + display: inline; + font-size: 16px; + font-family: FontAwesome; + height: auto; + content: "\f104"; + font-weight: 300; + text-shadow: none; + @include transition(all 0.12s ease); + } + &.open { + &:before { + float: right; + margin-top: 1px; + margin-right: 18px; + display: inline; + font-family: FontAwesome; + height: auto; + font-size: 16px; + @include rotate(-90deg); + font-weight: 300; + text-shadow: none; + } + } + } + } + + } + } + } + ul { + &.sub-menu { + display: none; + list-style: none; + clear: both; + margin: 0 0 10px 0; + background-color: $color-menu-dark; + padding: 18px 0 10px 0; + & > li { + background: none; + padding: 0px 20px 0 40px; + margin-top: 1px; + &:hover{ + & > .icon-thumbnail{ + color: $color-menu-link-hover; + } + } + & > a { + display: inline-block; + padding: 5px 0px; + font-size: 13px; + font-family: Arial, sans-serif; + white-space: normal; + } + .icon-thumbnail { + width: 30px; + height: 30px; + line-height: 30px; + margin: 0; + background-color: $color-menu; + font-size: 14px; + } + } + } + } + } + } + .muted { + color: #afafaf; + opacity:.45; + } + } + .icon-thumbnail [class^="bg-"], [class*="bg-"]{ + color: #fff; + } +} +[data-toggle-pin="sidebar"]{ + & > i:before{ + content: "\f10c"; + } +} +/* Sidebar icon holder +------------------------------------ +*/ +.icon-thumbnail { + display: inline-block; + background: $color-menu-dark; + height: $menu-icon-size; + width: $menu-icon-size; + line-height: $menu-icon-size; + text-align: center; + vertical-align: middle; + position: relative; + left: 0; + float: right; + margin-right: 14px; + color:$color-menu-light; + font-size: 16px; + -webkit-transition: -webkit-transform 0.4s cubic-bezier($menu-bezier); + transition: transform 0.4s cubic-bezier($menu-bezier); + -webkit-backface-visibility: hidden; + font-family: "Segoe UI","Helvetica Neue", Helvetica, Arial, sans-serif; + -webkit-font-smoothing:antialiased; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + font-weight: bold; + &.icon-12 { + height: 12px; + width: 12px; + line-height: 12px; + } + &.icon-25 { + height: 25px; + width: 25px; + line-height: 25px; + } + &.icon-35 { + height: 35px; + width: 35px; + line-height: 35px; + } + &.icon-50 { + height: 50px; + width: 50px; + line-height: 50px; + } + &.icon-75 { + height: 75px; + width: 75px; + line-height: 75px; + } + &.icon-100 { + height: 100px; + width: 100px; + line-height: 100px; + } + & > i{ + font-size: 14px; + } + & > svg{ + width: auto; + height: auto; + display: inline; + } +} + +.nav-collapse { + &.collapse { + height: 100% !important; + } +} + +/* Secondary App Menu */ +.toggle-secondary-sidebar{ + display: none; +} + +.secondary-sidebar { + background: $sidebar-background-color; + width: $secondary-sidebar-width; + float: left; + padding-left: 47px; + height: 100%; + position: fixed; + &.not-fixed{ + position: inherit; + } + &.open{ + position: fixed; + visibility: hidden; + display: block; + } + .btn-compose { + font-size: 13px; + font-weight: normal; + letter-spacing: 0.02em; + text-transform: uppercase; + } + .menu-title { + color: rgba($color-menu-light, .70); + font-size: 10.8px; + font-family: 'Montserrat'; + font-weight: normal; + letter-spacing: 0.03em; + } + .main-menu { + padding-left: 0; + & > li{ + list-style: none; + + &.active{ + & > a{ + color: $color-complete; + &:hover{ + color: $color-complete; + } + & > .title{ + position: relative; + &:after{ + background: $color-complete; + border-radius: 50%; + content: ""; + height: 7px; + position: absolute; + right: -14px; + top: 6.5px; + width: 7px; + } + + } + } + } + a{ + font-size: 14px; + color: $color-menu-light; + line-height: 37px; + &:hover{ + color: #fff; + } + & > .title{ + i{ + margin-right: 6px; + opacity: .9; + } + } + } + } + } + .sub-menu{ + margin-left: 23px; + li{ + list-style: none; + padding: 0; + &.active{ + a{ + color: #fff !important; + } + } + a{ + color: rgba($color-menu-light,.89); + line-height: 25px; + &:hover{ + color: #fff; + } + } + } + } + .sub-menu li a, .main-menu li a { + + .badge { + background: transparent; + font-size: 13px; + color: $color-menu-light; + line-height: 25px; + } + } + &.light{ + background-color: #fff; + border-right: 1px solid $form-control-border-color; + .menu-title { + color: fade($color-menu-light, 60%); + opacity: 1; + } + .icon-thumbnail{ + background-color: transparent; + } + .main-menu { + li{ + a{ + &:hover{ + color: $color-master-dark; + } + + } + &.active{ + & > a{ + color: $color-master-dark; + } + } + } + } + .sub-menu{ + margin-top: 5px; + li{ + &.active{ + a{ + color: $color-master-dark !important; + } + } + a{ + color: fade($color-menu-light,60%); + &:hover{ + color: $color-master-dark; + } + } + } + } + } +} + +.split-view{ + position: relative; + height: 100%; + .split-list { + float: left; + width: 360px; + background: #fff; + height: 100%; + overflow-y: auto; + position: relative; + -webkit-overflow-scrolling: touch; + border-right: 1px solid $color-master-light; + @include transition(all .5s ease); + .list-view-fake-header{ + font-size: 10.8px !important; + line-height:normal !important; + } + &.slideLeft{ + @include translate(-100%, 0); + } + .list-refresh{ + position: absolute; + right : 18px; + top: 4px; + color: $color-master; + opacity: .34; + z-index: 101; + i{ + font-size: 11px; + } + } + .list-view-fake-header, .list-view-group-header{ + background: $color-master-lighter; + height: 28px; + color: rgba($color-master, .70); + text-transform: uppercase; + font-size: 10.8px; + padding-left: 12px; + padding-top: 6px; + letter-spacing: 0.07em; + width: 100%; + } + + .item { + height: 111px; + list-style: none; + position: relative; + border-bottom: 1px solid rgba($color-master-light, .70); + cursor: pointer; + .inline { + width: 230px; + + & > * { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-family: arial; + } + } + .recipients { + letter-spacing: 0.01em; + padding-bottom: 2px; + } + .checkbox{ + float: left; + clear: left; + display: none; + max-width: 32px; + } + .subject { + font-family: 'Helvetica'; + font-size: 14.33px; + color: $color-info; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 38px; + display: -webkit-box; + white-space: normal; + line-height: 18px; + } + .body { + // color: #75828e; + font-size: 12.6px; + opacity: .52; + height: 22px; + } + .datetime { + color: $color-master-darkest; + font-family: arial; + font-size: 11.1px; + position: absolute; + right: 20px; + top: 15px; + opacity: 0.46; + } + } + } + + .split-details { + position: relative; + overflow: auto; + height: 100%; + .no-result{ + bottom: 0; + left: 0; + margin-top: -34px; + opacity: 0.5; + position: absolute; + right: 0; + text-align:center; + top: 50%; + } + .actions{ + height: 50px; + float: left; + li{ + list-style: none; + position: relative; + &:last-child:after{ + display: none; + } + &:after{ + content: ""; + height: 14px; + position: absolute; + right: -4px; + top: 18px; + width: 1px; + background: rgba(0,0,0,.07); + } + a{ + font-size: 13.1px; + color: $color-master; + font-weight: 600; + padding: 0 13px; + line-height: 50px; + white-space: nowrap; + } + } + } + + } +} +.inner-content{ + margin-top: 0px; + padding: 0px; + overflow: auto; + min-height: 100%; + margin-left: $secondary-sidebar-width; +} + +/* Quick View +------------------------------------ +*/ +.quickview-wrapper{ + position:fixed; + right:-$layout-right-quickview-width; + top:0; + width:$layout-right-quickview-width; + background:#fff; + bottom:0; + z-index:1000; + box-shadow:0 0 9px rgba(191,191,191,.36); + border-left: 1px solid rgba(222,227,231,.56); + -webkit-transition: -webkit-transform 400ms cubic-bezier($menu-bezier); + transition: transform 400ms cubic-bezier($menu-bezier); + -webkit-backface-visibility: hidden; + -ms-backface-visibility:hidden; + &.open{ + @include translate3d(-100%,0,0); + } + .quickview-toggle{ + position: absolute; + right: 12px; + top: 2px; + color: $color-menu-light; + padding: 6px; + opacity: 0.4; + &:hover{ + opacity: 1; + } + } + .nav-tabs{ + /* Quickview Tabs */ + background-color: $color-menu; + position: relative; + padding: 0 43px; + & > li{ + & > a{ + padding:11px; + color: $color-menu-light; + border: 0; + text-align: center; + font-size: 11px; + font-weight: bold; + min-width: 62px; + line-height: 1.4; + & > span{ + opacity: 0.6; + } + &:hover{ + & > span{ + color: $color-menu-light; + opacity: 1; + } + } + } + &.active{ + & > a, & > a:hover, & > a:focus{ + background-color: transparent; + border: 0; + color: mix($color-menu-light, #fff, 37%); + opacity: 1; + } + } + } + ~ .tab-content{ + position:absolute; + padding: 0; + left: 0; + right: 0; + top: 38px; + bottom: 0; + height: auto; + & > div{ + height:100%; + } + ul{ + margin:0; + padding:0; + li{ + list-style:none; + } + } + .quickview-notes{ + /* Quickview Notes */ + background:#fbf9e3; + a, button{ + color:#968974; + } + .list{ + position:relative; + .toolbar{ + height:50px; + padding:0 25px; + ul { + margin-top:10px; + & > li{ + display:inline-block; + height:auto; + a{ + height:22px; + line-height:22px; + display:block; + padding:0 5px; + &:hover, &.selected{ + background:#968974; + color:#FBF9E3; + } + } + } + } + .btn-remove-notes{ + background:transparent; + bottom: 8px; + display: block; + left: 50%; + margin-left: -40%; + position: absolute; + width: 83%; + border:1px solid #968974; + } + } + & > ul { + padding:0; + li{ + cursor:pointer; + height:42px; + padding:0 25px; + display:block; + clear:both; + .left{ + float:left; + width:65%; + height:100%; + padding-top:9px; + .checkbox{ + display:none; + float:left; + label{ + margin-right:0; + vertical-align:text-top; + } + } + p{ + margin:0; + font-size:13px; + font-weight:bold; + width: 100px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + vertical-align:middle; + display:inline-block; + } + } + .right{ + font-size:10.5px; + text-align:right; + width:35%; + line-height: 41px; + .date{ + margin-right:10px; + } + } + &:hover{ + background:#f4ecd1; + } + + } + } + } + .note{ + /* Quickview Note */ + background-image:url('#{$base-img-url}/notes_lines.png'); + background-repeat:repeat-y; + background-position:27px top; + & > div{ + display:table; height:100%; width:100%; + } + .toolbar { + background:#fcfcfa; + height:35px; + width:100%; + display:table-row; + box-shadow: 0 1px 1px -1px rgba(0, 0, 0, 0.33); + & > li{ + display:inline-block; + border-right: 1px solid #EDECEC; + float: left; + line-height: 37px; + padding: 0; + text-align: center; + width: 40px; + height:auto; + & > a{ + color:#a5a5a5; + display:block; + &:hover{ + background:#fffaf6; + } + &.active{ + color:#333; + background:#f9f1ea; + } + } + } + &:after{ + position:absolute; + content:""; + width:100%; + } + } + .body { + display:table-row; + height:100%; + & > div{ + display:table; + height:100%; + width: 100%; + padding:0 20px 0 45px; + white-space: normal; + } + .top{ + height:50px; + display:table-row; + clear:both; + line-height:50px; + text-align:center; + & > a{ + float:left; + color:#b0b0a8; + margin-left:10px; + } + & > span{ + font-style:italic; + color:#b0b0a8; + font-size:11px; + } + } + .content{ + display:table-row; + height:100%; + form{ + height:100%; + + } + .quick-note-editor{ + font-size:12px; + &:focus{ + outline: none; + } + &::-moz-selection{ + background:#fef8ae; + } + &::selection{ + background:#fef8ae; + } + } + + } + } + } + } + } + } +} + +/* Page Container +------------------------------------ +*/ +.page-container { + width:100%; + height:100%; + padding-left: $layout-sidepanel-width-collapsed; + .page-content-wrapper{ + min-height: 100%; + position: relative; + .content { + /* Content holder */ + z-index: 10; + padding-top: 102px; + padding-bottom: 30px; + min-height: 100%; + @include transition(all 0.3s ease); + &.full-width{ + width: 100%; + } + .content-inner{ + display: inline-block; + vertical-align: top; + height: 100%; + padding-left: 30px; + position: relative; + } + &:only-child{ + padding-bottom:0px; + } + &.overlay-footer{ + padding-bottom:0px; + } + } + .footer{ + /* Footer */ + position: absolute; + left: 0; + right: 0; + bottom: 0px; + @include transition(left 0.3s ease); + &.fixed{ + position: fixed; + } + } + } +} +.page-title{ + margin-top: 0px; +} +/* Breadcrumbs +------------------------------------ +*/ +.breadcrumb { + font-family: 'Montserrat'; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + border-radius: 0px; + box-shadow: none; + background-color: transparent; + padding: 15px 0; + margin: 0; + border: none; + text-transform:uppercase; + display: block; + &.breadcrumb-alt{ + padding: 8px 0; + text-transform: none; + font-family:"Segoe UI", Arial, sans-serif; + a{ + letter-spacing: normal; + color: #000; + font-size: 12px !important; + } + & > .breadcrumb-item, + & > .breadcrumb-item.active { + letter-spacing: normal; + opacity: .46; + color: #000; + font-size: 12px !important; + } + } + a { + margin-left: 5px; + margin-right: 5px; + font-size: 10.5px !important; + letter-spacing: 0.06em; + font-weight: 400; + color: #7b7d82; + } + .breadcrumb-item { + padding-left:0px; + } + & > .breadcrumb-item{ + & + .breadcrumb-item{ + &:before { + padding: 0 5px; + color: #515050; + font-family: FontAwesome; + content: "\f105"; + font-size: 12px; + font-weight:bold; + } + } + &.active{ + font-weight: 500; + color: #0090d9; + margin-left: 5px; + margin-right: 5px; + font-size: 10.5px !important; + letter-spacing: 0.06em; + &:before { + padding-right: 10px; + } + } + } +} +/* Overlay Search +------------------------------------ +*/ +.overlay{ + position:fixed; + left:0; + right:0; + top:0; + bottom:0; + background:rgba(255,255,255,.95); + z-index:1010; + padding-left: 64px; + overflow:auto; + .inline-block{ + display:inline-block; + } + .overlay-brand{ + margin-left: 7px; + } + & > div{ + width:100%; + height:260px; + display:block; + overflow:hidden; + } + .has-results{ + overflow: visible; + } + .overlay-search{ + font-weight:700; + font-size: 77px; + height: 100px; + letter-spacing: -1.925px; + line-height: 100px; + width:100%; + padding-left:0 !important; + } + .overlay-close{ + position:absolute; + right:20px; + top:5px; + } + +} + +.group-container { + white-space: nowrap !important; + .single-group { + vertical-align: top; + display: inline-block; + white-space: normal; + } +} + +.jumbotron{ + position: relative; + overflow: hidden; + display: block; + padding: 0; + .inner{ + position: relative; + z-index: 2; + } + &.lg{ + height: 600px; + } + + background-color: $color-master-lighter; + .cover-photo{ + width: 100%; + height: inherit; + overflow: hidden; + @include transition(opacity .3s ease); + background-size: cover; + background-color: $color-success; + img{ + display:none; + } + } + h1 { + font-size: 44px; + } +} + +/* Pages Scroll bar +------------------------------------ +*/ + +.scroll{ + position: relative; + overflow: auto; +} + +.scroll-wrapper { + & > .scroll-element, > .scroll-element div{ + background: none; + border: none; + margin: 0; + padding: 0; + position: absolute; + z-index: 10; + } + & > .scroll-element div { + display: block; + height: 100%; + left: 0; + top: 0; + width: 100%; + } + & > .scroll-element.scroll-x { + bottom: 2px; + height: 7px; + left: 0; + min-width: 100%; + width: 100%; + } + + & > .scroll-element.scroll-y { + height: 100%; + min-height: 100%; + right: 2px; + top: 0; + width: 4px; + } + & > .scroll-element{ + .scroll-element_outer { + opacity: 0.3; + } + .scroll-element_size { + background-color: rgba(0,0,0,0.07); + opacity: 0; + } + .scroll-bar { + background-color:#697686; + } + + &.scroll-x{ + .scroll-bar { + bottom: 0; + height: 4px; + min-width: 24px; + top: auto; + } + .scroll-element_outer { + bottom: 0; + top: auto; + left: 2px; + -webkit-transition: height 0.2s; + transition: height 0.2s; + } + .scroll-element_size { left: -4px; } + } + &.scroll-y{ + .scroll-bar { + left: auto; + min-height: 24px; + right: 0; + width: 4px; + } + .scroll-element_outer { + left: auto; + right: 0; + top: 2px; + -webkit-transition: all 0.2s; + transition: all 0.2s; + } + .scroll-element_size { top: -4px; } + } + } + & > .scroll-content{ + box-sizing: inherit !important; + } + &.auto-hide{ + & > .scroll-element{ + .scroll-element_track { + display: none; + } + } + } +} + +.scroll-wrapper > .scroll-element.scroll-x.scroll-scrolly_visible .scroll-element_size { left: -11px; } +.scroll-wrapper > .scroll-element.scroll-y.scroll-scrollx_visible .scroll-element_size { top: -11px; } + +/* hover & drag */ + +.scroll-wrapper > .scroll-element:hover .scroll-element_outer, +.scroll-wrapper > .scroll-element.scroll-draggable .scroll-element_outer { + overflow: hidden; + -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 0.7; +} +.scroll-wrapper > .scroll-element:hover .scroll-element_outer .scroll-element_size, +.scroll-wrapper > .scroll-element.scroll-draggable .scroll-element_outer .scroll-element_size { + opacity: 1; +} +.scroll-wrapper > .scroll-element:hover .scroll-element_outer .scroll-bar, +.scroll-wrapper > .scroll-element.scroll-draggable .scroll-element_outer .scroll-bar { + height: 100%; + width: 100%; +} + +.scroll-wrapper > .scroll-element.scroll-x:hover .scroll-element_outer, +.scroll-wrapper > .scroll-element.scroll-x.scroll-draggable .scroll-element_outer { + height: 10px; + min-height: 7px; +} +.scroll-wrapper > .scroll-element.scroll-y:hover .scroll-element_outer, +.scroll-wrapper > .scroll-element.scroll-y.scroll-draggable .scroll-element_outer { + min-width: 7px; + width: 7px; +} + +/* Other overides */ + +.container-fluid { +padding-left: 30px; +padding-right: 30px; + +} + +.copyright{ + padding: 25px 0; + border-top: 1px solid fade($color-master-light,70%); +} + +.navbar-center, .navbar-center > li{ + float:none; + display:inline-block; + *display:inline; /* ie7 fix */ + *zoom:1; /* hasLayout ie7 trigger */ + vertical-align: top; +} + +.navbar-nav{ + li a{ + min-width: 50px; + } +} + +.pager{ + margin: 0; +} + + +.horizontal-app-menu { + @include flexbox(); + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + &.fixed-header { + //overflow: hidden; + .header { + position: fixed; + } + .page-container { + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + } + } + .header { + height: auto; + border-bottom: none; + background-color: $color-menu; + color: $color-menu-light; + display: block; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + .header-inner { + height: 60px; + background-color: $color-menu; + position: relative; + color: $color-menu-light; + } + .header-lg-height { + height: $header-lg-height; + } + .header-md-height { + height: $header-md-height; + } + .header-sm-height { + height: $header-sm-height; + } + .search-link { + color: $color-menu-light; + } + .header-inner { + .brand.inline { + position: relative; + border-right: 1px solid #40444d; + padding-right: 15px; + margin-right: 0px; + width: auto; + & > img { + width: auto; + } + } + } + .notification-list { + border: none; + } + .title-bar { + padding-bottom: 18px; + } + .page-title { + color: $color-menu-light; + font-size: 21px; + line-height: 21px; + font-weight: normal; + margin-bottom: 0; + margin-left: 15px; + } + .bubble { + top: 1px; + right: 3px; + } + .pg { + color: $color-menu-light; + display: block; + } + } + .menu-bar { + @include flexbox(); + position: relative; + color: $color-menu-light; + //Globals Nav Items + ul { + margin: 0; + padding: 0; + list-style: none; + @include border-radius(3px); + li a { + .arrow { + position: relative; + @include flex-inline(); + @include align-items(center); + padding-left: 15px; + width: 23px; + &:before { + font-size: 16px; + font-family: FontAwesome; + height: auto; + content: "\f104"; + font-weight: 300; + text-shadow: none; + position: relative; + top: 2px; + @include rotate(-90deg); + @include transition(all 0.12s ease); + } + } + } + li { + line-height: 24px; + .sub-menu { + padding: 0; + left: 50%; + top: 0; + position: absolute; + visibility: hidden; + opacity: 0; + min-width: calc(100% + 4px); + padding: 18px $menu-padding; + background: #fff; + z-index: 1; + position: absolute; + @include box-shadow(0px 0px 16px 0px rgba(0, 0, 0, 0.08)); + @include translate3d(15px, 0, 0); + @include transition(all 0.15s ease-in); + li a { + min-width: 50px; + width: 100%; + padding: 4px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + display: block; + } + } + &:hover { + & > .sub-menu { + visibility: visible; + opacity: 1; + @include translate3d(34%, 0, 0); + } + } + } + } + //Level One + & > ul { + @include flexbox(); + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + & > li { + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + @include flex-inline(); + @include align-items(center); + padding: 0; + position: relative; + &:first-child { + & > a { + padding-left: 0; + } + } + &:last-child { + & > a { + padding-right: 0; + } + } + & > a { + padding: 0 20px; + } + & > ul { + display: none; + opacity: 0; + list-style: none; + border: 0; + top: -7px; + left: -4px; + min-width: calc(100% + 4px); + padding: 0 $menu-padding; + padding-top: 60px; + padding-bottom: 18px; + background: #fff; + z-index: 1; + position: absolute; + @include box-shadow(0px 0px 16px 0px rgba(0, 0, 0, 0.08)); + } + &.open { + //Level two and below + & > ul { + display: block; + &:before { + content: ''; + position: absolute; + height: 1px; + top: $navbar-width + 7px; + //width: calc(100% - $menu-padding * 2); + background-color: $form-control-border-color; + } + & > li { + padding-left: 0; + @include translate3d(0, -10px, 0); + opacity: 1; + transition: all 0.18s ease; + & > a { + min-width: 50px; + width: 100%; + padding: 4px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + @include flexbox(); + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + & > .arrow:before { + @include rotate(180deg); + } + } + } + + } + & > a { + @include translate3d(0, -10px, 0); + opacity: 0; + transition: all 0.18s ease !important; + } + } + &.opening { + & > ul { + opacity: 1; + & > li { + @include translate3d(0, 0, 0); + opacity: 1; + } + } + & > a { + position: relative; + z-index: 10; + @include translate3d(0, 0, 0); + opacity: 1; + } + } + &.closing { + & > ul { + opacity: 0; + & > li { + @include translate3d(0, -10px, 0); + opacity: 0; + } + } + & > a { + @include translate3d(0, -10px, 0); + opacity: 0; + } + } + } + li > a { + color: $color-menu-light; + } + } + } + .page-container{ + padding-left:0; + .page-content-wrapper .content{ + padding-top: 105px; + } + } + .ghost-nav-dropdown{ + top: -7px; + left: -4px; + background: #fff; + z-index: 1000; + position: absolute; + @include box-shadow(0px 0px 16px 0px rgba(0, 0, 0, 0.08)); + @include border-radius(3px); + transition: all 0.18s ease-in; + } + //calendar overwrites + .calendar { + .calendar-header{ + background-color: transparent; + padding-left: 0; + position: relative; + left: -20px; + } + .months .month:first-child{ + padding-left: 0; + } + .weeks-wrapper{ + margin-left:0; + padding-left: 0; + } + .week-dragger{ + margin-left:0; + } + .calendar-container .grid{ + overflow: hidden; + } + } +} + +@media (max-width:991px){ + body.horizontal-menu-open{ + .header{ + z-index: $zIndex-quickview; + } + } + .horizontal-menu-backdrop{ + background: rgba(0, 0, 0, .5); + position: absolute; + left:0; + right:0; + bottom: 0; + top: 0; + z-index: $zIndex-quickview - 1; + opacity: 0; + transition:opacity .3s ease; + pointer-events: none; + &.open{ + opacity: 1; + } + } + .horizontal-app-menu{ + .menu-bar{ + position: fixed; + top: 0; + bottom: 0; + background-color: $color-menu; + width: 270px; + right: -270px; + overflow-y: auto; + -webkit-transition: -webkit-transform 400ms cubic-bezier($menu-bezier); + transition: transform 400ms cubic-bezier($menu-bezier); + -webkit-backface-visibility: hidden; + -ms-backface-visibility:hidden; + + &.open{ + @include translate3d(-100%,0,0); + } + & > ul{ + flex-flow: column nowrap; + & > li{ + a{ + &:first-child{ + padding-left: 30px; + } + &:last-child{ + padding-left: 35px; + } + } + } + } + ul { + width: 100%; + li{ + min-height: 45px; + @include flexbox(); + flex-direction: column; + + & > ul{ + padding: 0; + overflow: hidden; + margin-top: 6px; + position: static; + background: $color-menu-dark; + opacity: 1; + } + width: 100%; + a{ + padding-left: 35px !important; + text-transform: uppercase; + width: 100%; + line-height: 40px; + & > .arrow{ + float: right; + } + } + &.active{ + border: 2px solid $color-primary; + } + } + } + } + &[data-pages-direction="slideRight"] { + right: 0; + } + .header .header-sm-height{ + height: 100%; + } + .ghost-nav-dropdown{ + display: none; + } + } + +} + +@media (min-width: 980px){ +.horizontal-menu{ + .page-content { + margin-left: 0; + .content { + padding-top: 123px; + } + } +} +} + +.hover-parent { + .hover-item { + visibility: hidden; + } + &:hover { + .hover-item { + visibility: visible; + } + } +} + +.inline-file-selector { + .image-container { + width: 50px; + height: 50px; + background-size: cover; + background-position: center; + .overlay-preview { + background-color: rgba(0,0,0,0.2); + display: none; + } + &:hover { + .overlay-preview { + display: block; + + } + } + } +} + +.mfp-close { + display: none !important; +} + +.mfp-figure:after { + box-shadow: none !important; + background: none !important; +} + +.profile-picture { + height: 150px; + background-size: 75%; + background-position: center; + background-repeat: no-repeat; +} + +.select2-container { + width: 100% !important; +} + +.select2-container--open { + z-index: 1050 !important; +} + +.select2-container--open .select2-dropdown { + border-radius: 0px !important; + border: solid 1px rgba(0, 0, 0, 0.07); + border-top: none; + left: -1px; + margin-top: -25px; + box-sizing: content-box; +} + +.select2-dropdown { + box-shadow: none !important; + &.select2-dark { + background-color: $color-master !important; + .select2-search--dropdown .select2-search__field { + background-color: $color-master-dark !important; + color: $color-master-lightest; + } + .select2-results { + li { + color: $color-master-lighter !important; + &.select2-results__option--highlighted { + color: $color-white !important; + background-color: $color-master-darkest !important; + } + } + } + } +} + +select2-dropdown, +.select2-container--bootstrap .select2-selection.form-control { + padding-top: 0.8rem !important; + height: calc(2em + 1.5rem) !important; +} + +.select2-container { + width: 100% !important; +} + +.select2-results__option[aria-disabled="true"] { + display: none; +} + +.select2-dark { + .select2-container--default { + .select2-selection__arrow b { + border-color: #fff transparent transparent transparent !important; + } + } + .select2-container--open { + .select2-selection__arrow b { + border-color: transparent transparent #fff transparent !important; + } + } +} + +.side-tab { + .tab-container { + border-left: solid 3px transparent !important; + } + .active .tab-container { + border-left: solid 3px $color-primary !important; + } +} + +.ellipsis-line-2 { + height: 3em; + line-height: 1.5em; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +.slider { + height: auto; + animation-name: slideDown; + -webkit-animation-name: slideDown; + + animation-duration: 1s; + -webkit-animation-duration: 1s; + + animation-timing-function: ease; + -webkit-animation-timing-function: ease; + + visibility: visible !important; + + &.close { + height: 0px !important; + overflow: hidden; + } +} + +.order-history-border { + height: .1875rem; + width: 100%; + background-position-x: -1.875rem; + background-size: 7.25rem .1875rem; + background-image: repeating-linear-gradient(45deg,$color-complete,$color-complete 33px,transparent 0,transparent 41px,$color-primary 0,$color-primary 74px,transparent 0,transparent 82px); +} + +.bullet-connector { + width: 2px; + height: 100%; + background: $color-master-light; + top: 0px; + left: 18px; + &.thin{ + width: 1px; + } +} +.noty_bar { + .noty_body { + padding: 15px; + padding-bottom: 10px; + } + .noty_buttons { + padding: 15px; + padding-top: 0; + padding-bottom: 0; + } +} diff --git a/resources/assets/sass/modules/_list.scss b/resources/assets/sass/modules/_list.scss new file mode 100644 index 00000000..ceaf9ec9 --- /dev/null +++ b/resources/assets/sass/modules/_list.scss @@ -0,0 +1,210 @@ +/*------------------------------------------------------------------ +[18. List] +*/ +.list-view-wrapper{ + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + width: 100%; + -webkit-overflow-scrolling: touch; +} + +.list-view-container{ + position: relative; + .list-quickscroll{ + ul { + list-style: none; + margin: 0; + padding: 0; + position: absolute; + top:0; + right: 10px; + z-index: 120; + padding-top: 10px; + padding-bottom: 10px; + li a{ + font-size: 0.7em; + vertical-align: baseline; + } + } + + } +} + +.list-view-group-container { + margin: 0; + min-height: 1px; + overflow: hidden; + padding: 26px 0 0 0; + position: relative; + &:last-child{ + ul{ + border: 0; + } + } +} +.list-view-group-header, .list-view-fake-header { + background: $color-master-lightest; + color: #232830; + font: normal 11px/14px 'Montserrat',Arial; + text-transform: uppercase; + margin: 0; + padding: 6px 0 5px 15px; + position: absolute; + z-index: 10; +} +.list-view-group-header { + bottom: auto; + min-height: 1px; + top: 0; + width: 100%; + border-top: 0; +} +.list-view-fake-header { + width: 100%; + z-index: 100; + font-size: 11px !important; + line-height: 14px !important; +} + +.list-view-fake-header.list-view-hidden { + visibility: hidden; +} +.list-view-group-container.list-view-animated .list-view-group-header { + bottom: 0; + top: auto; +} + + +input.list-view-search{ + font-size: 15px; + color: #232830; +} + +.no-top-border{ + .list-view-fake-header { + border-top: 0; + } +} + +.list-view { + ul { + list-style: none; + margin: 0; + padding: 0; + border-bottom: 1px solid rgba(0, 0, 0, 0.07); + } + li{ + padding-left:15px; + white-space: nowrap; + cursor: pointer; + width: 100%; + display: table; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + &:hover { + background-color: $color-complete-lighter; + } + &.active{ + background-color: $color-warning-lighter; + } + p{ + margin: 0; + line-height: 19px; + } + & > a{ + margin-right: 15px; + width: 100%; + } + & > *{ + @include flexbox(); + -webkit-box-orient: horizontal!important; + -webkit-box-direction: normal!important; + -webkit-flex-direction: row!important; + -ms-flex-direction: row!important; + flex-direction: row!important; + @include align-items(center); + } + } + &.boreded{ + li{ + & > a { + border-bottom: 1px solid rgba(0, 0, 0, 0.07); + } + &:last-child > a{ + border-bottom: 0; + } + } + } + +} + + +.list-view.boreded li + li { + border-top: 0; +} + +[data-ios="true"] .list-view-group-header, +[data-ios="true"] .list-view-fake-header { + width: 288px; /*scrollbars aren't visible in iOS devices, so make the headers wider */ +} + +//Bootstrap-List +.list-group-item{ + border: 1px solid $color-master-lighter; + &.active, &.active:hover, &.active:focus{ + background-color:$color-success-light; + border-color:$color-success-light; + } +} + +.list-group-item:first-child{ + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} +.list-group-item:last-child{ + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + + +.list-inline { + >li{ + display: inline-block; + padding-right: 5px; + padding-left: 5px; + } +} + + +.breadcrumb{ + a, i, span, li{ + color: #7b7d82; + font-weight: 300; + text-shadow: none; + } +} +.breadcrumb { + li { + padding-left: 0px; + display: inline-block; + a{ + &.active { + font-weight: 600; + color: #0090d9; + } + } + +li{ + &::before{ + padding: 0 5px; + color: #515050; + font-family: FontAwesome; + content: "\f105"; + font-weight: bold; + } + } + } +} diff --git a/resources/assets/sass/modules/_lock_screen.scss b/resources/assets/sass/modules/_lock_screen.scss new file mode 100644 index 00000000..94463735 --- /dev/null +++ b/resources/assets/sass/modules/_lock_screen.scss @@ -0,0 +1,92 @@ +/*------------------------------------------------------------------ +[23. Lock Screen] +*/ + +.lock-container{ + margin-left: auto; + margin-right: auto; + width: 600px; +} + +.lock-screen-wrapper { + .credentials { + margin-top: -84px; + position: absolute; + top: 50%; + .thumbnail-wrapper { + width: 53px; + height: 53px; + } + .logged { + opacity: .21; + margin-top: -5px !important; + } + .name { + opacity: .69; + margin-top: -5px !important; + font-size: 36px; + height: 45px; + overflow: hidden; + } + } + .terms-wrapper { + & > div { + display: table; + } + .terms { + display: table-cell; + vertical-align: middle; + } + .logo-terms { + width: 60px; + height: 60px; + border-radius: 15px; + text-align: center; + position: relative; + .brand { + left: 50%; + margin-left: -21px; + margin-top: -5px; + position: absolute; + top: 50%; + } + } + } +} + +/* Responsive Handlers : Lockscreen +------------------------------------ +*/ +@media (max-width: 767px) { + .lock-container{ + width: 80%; + } + .lock-screen-wrapper { + .credentials { + form { + margin-top: 15px; + } + } + } +} + +@media (max-width: 480px) { + + .lock-screen-wrapper { + .credentials { + margin: 0; + position: static; + margin-top: 100px; + width: 100%; + float: left; + clear: both; + & > div { + text-align: center; + } + .thumbnail-wrapper { + float: none; + margin: 0 auto; + } + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_login.scss b/resources/assets/sass/modules/_login.scss new file mode 100644 index 00000000..9b5361fe --- /dev/null +++ b/resources/assets/sass/modules/_login.scss @@ -0,0 +1,70 @@ +/*------------------------------------------------------------------ +[22. Login] +*/ + +.login-triangle { + display: inline-block; + position: absolute; + right: 0; top: 0; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 100vh 14rem; + border-color: transparent transparent #fff; + z-index: 10; +} + +.login-wrapper { + background: linear-gradient(rgba(0, 0, 0, 0.6), $color-primary), url('../images/iStock-976354264_Malaysia.jpg'); + background-size: cover; + padding: 80px 0 20px 0; + min-height: 100%; + .bg-pic{ + position: absolute; + width: 100%; + overflow: hidden; + & > img{ + height: 100%; + opacity: 0.6; + } + } + .login-container{ + width: 496px; + display: block; + position: relative; + float:right; + } + .bg-caption{ + width: 500px; + } +} +.register-container{ + width: 550px; + margin: auto; + height: 100%; +} + + +/* Responsive handlers : Login +------------------------------------ +*/ + +@media (max-width: 768px) { + .login-wrapper{ + .login-container{ + width: 100%; + } + } + .register-container{ + width: 100%; + padding: 15px; + } +} + +@media only screen and (max-width : 321px) { + .login-wrapper{ + .login-container{ + width: 100%; + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_misc.scss b/resources/assets/sass/modules/_misc.scss new file mode 100644 index 00000000..714c02d7 --- /dev/null +++ b/resources/assets/sass/modules/_misc.scss @@ -0,0 +1,718 @@ +/*------------------------------------------------------------------ +[28. Misc : Helper Classes] +*/ +.custom{ + height:150px; +} + +.icon-list{ + .fa-item{ + display: block; + color: $color-master-darkest; + line-height: 32px; + height: 32px; + padding-left: 10px; + & > i{ + width: 32px; + font-size: 14px; + display: inline-block; + text-align: right; + margin-right: 10px; + } + } +} +/* Thumbnail for icons and profile pics +------------------------------------ +*/ +.thumbnail-wrapper{ + display: inline-block; + overflow: hidden; + float:left; + &.circular{ + @include border-radius(50%); + } + &.bordered{ + border-width: 4px; + border-style:solid; + &.d16{ + @include square(16+4*1px); + & > *{ + line-height: 12px + } + } + &.d24{ + @include square(24+4*1px); + & > *{ + line-height: 24px + } + } + &.d32{ + @include square(32+4*1px); + & > *{ + line-height: 28px + } + } + &.d48{ + @include square(48+4*1px); + & > *{ + line-height: 44px + } + } + } + &.d16{ + @include square(16px); + & > *{ + line-height: 16px + } + } + &.d24{ + @include square(24px); + & > *{ + line-height: 24px + } + } + &.d32{ + @include square(32px); + & > *{ + line-height: 32px + } + } + &.d39{ + @include square(39px); + & > *{ + line-height: 39px + } + } + &.d48{ + @include square(48px); + & > *{ + line-height: 50px + } + } + & > *{ + vertical-align: middle; + width: 100%; + height: 100%; + text-align: center; + } +} + +/* Profile dropdown +------------------------------------ +*/ +.profile-dropdown{ + background: #fff; + padding: 0; + &:before { + position: absolute; + top: -7px; + right: 15px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; + } + + &:after { + position: absolute; + top: -6px; + right: 16px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; + } + & > a{ + opacity: .5; + @include transition(opacity ease .3s); + padding-left:17px; + padding-right:37px; + min-width: 138px; + & > i { + margin-right:5px; + } + &:hover{ + opacity: 1; + } + &:last-child{ + margin-top: 11px; + padding-bottom: 3px !important; + padding-top: 3px; + } + } +} +.profile-dropdown-toggle{ + background: transparent; + border: none; +} +/* Scroll +------------------------------------ +*/ +.scrollable { + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +/* Overides +------------------------------------ +*/ +.no-padding { + padding: 0px !important; +} + +.no-margin { + margin: 0px !important; +} + +.no-overflow{ + overflow: hidden !important; +} + +.auto-overflow{ + overflow: auto; +} + +.center-margin{ + margin-left: auto; + margin-right: auto; +} + +.inherit-size{ + width:inherit; + height:inherit +} +.inherit-height{ + height:inherit; +} + +.image-responsive-height{ + width: 100%; +} +.image-responsive-width{ + height: 100%; +} +.overlayer { + position: absolute; + display: block; + z-index: 21; + &.fullwidth { + width: 100%; + } +} +.overlayer-wrapper { + position: relative; + display: block; + z-index: 10; +} +.overlay-fixed { + position: fixed !important; + top: auto !important; +} +.top-left { + position: absolute !important; + top: 0; + left: 0; +} +.top-right { + position: absolute !important; + top: 1px; + right: 0; +} +.bottom-left { + position: absolute !important; + bottom: 1px; + left: 0; +} +.bottom-right { + position: absolute !important; + bottom: 0; + right: 0; +} +.pull-bottom{ + position: absolute !important; + bottom: 0; +} + +.pull-up{ + position:absolute !important; + top: 0; +} + +.pull-center { + position: absolute; + left: 0; + right: 0; + width: 100%; + display: table; + z-index: 1; +} + +.cursor{ + cursor: pointer; +} +.scroll-x-hidden{ + overflow-x: hidden !important; +} + +/* Generic Padding Helpers +------------------------------------ +*/ + +@mixin generate-padding-options($n, $j:0){ + @if $j <= $n { + @for $i from $j through $n { + $step : $i*5; + + .p-t-#{$step} { + padding-top: ($step*1px) !important; + } + .p-r-#{$step} { + padding-right: ($step*1px) !important; + } + .p-l-#{$step} { + padding-left: ($step*1px) !important; + } + .p-b-#{$step} { + padding-bottom: ($step*1px) !important; + } + .padding-#{$step} { + padding: ($step*1px) !important; + } + } + } +} + +@include generate-padding-options(10); + +/* Generic Margin Helpers +------------------------------------ + */ +@mixin generate-margin-options($n, $j: 0) { + @if $j <= $n { + @for $i from $j through $n { + $step : $i*5; + .m-t-#{$step} { + margin-top: ($step*1px); + } + .m-r-#{$step} { + margin-right: ($step*1px); + } + .m-l-#{$step} { + margin-left: ($step*1px); + } + .m-b-#{$step} { + margin-bottom: ($step*1px); + } + } + } +} + +@include generate-margin-options(10); + +@mixin generate-font-size($n, $j: 0) { + @if $j <= $n { + @for $i from $j through $n { + $step : $i*1; + .fs-#{$step} { + font-size: ($step*1px) !important; + } + } + } +} + +@include generate-font-size(100); + +@mixin generate-line-height($n, $j: 0) { + @if $j <= $n { + @for $i from $j through $n { + $step : $i*1; + .lh-#{$step} { + line-height: ($step*1px) !important; + } + } + } +} + +@include generate-line-height(50); + +.full-height{ + height: 100% !important; +} +.full-width{ + width: 100%; +} +.hide { + display: none !important; +} +.inline{ + display:inline-block !important; +} +.block{ + display: block !important; +} +.b-blank{ + border-color:#000; +} + +/* Border Helpers +------------------------------------ +*/ +.b-a, +.b-r, +.b-l, +.b-t, +.b-b{ + border-style: solid; + border-width: 0; +} + +.b-r{ + border-right-width:1px; +} +.b-l{ + border-left-width:1px; +} +.b-t{ + border-top-width:1px; +} +.b-b{ + border-bottom-width:1px; +} +.b-a{ + border-width:1px; +} + +.b-dashed{ + border-style: dashed; +} + +.b-thick{ + border-width : 2px !important; +} + +.b-transparent{ + border-color:rgba(0, 0, 0, 0.4); +} +.b-transparent-white{ + border-color:rgba(255, 255, 255, 0.3); +} +.b-grey{ + border-color:$color-master-lighter !important; +} +.b-white{ + border-color:#fff !important; +} +.b-primary{ + border-color:$color-primary !important; +} +.b-complete{ + border-color:$color-complete !important; +} +.b-success{ + border-color:$color-success !important; +} +.b-info{ + border-color:$color-info !important; +} +.b-danger{ + border-color:$color-danger !important; +} +.b-warning{ + border-color:$color-warning !important; +} +/* Border Radius +------------------------------------ +*/ +.b-rad-none{ + @include border-radius(0px); +} +.b-rad-sm{ + @include border-radius(3px); +} +.b-rad-md{ + @include border-radius(5px); +} +.b-rad-lg{ + @include border-radius(7px); +} +.no-border{ + border: none !important; +} + +.no-shadow{ + box-shadow: none !important; +} +/** Profile Wrappers **/ +.profile-img-wrapper{ + display:inline-block; + float:left; + border-radius: 100px 100px 100px 100px; + display: inline-block; + height: 35px; + overflow: hidden; + width: 35px; + -webkit-flex: 1; + -moz-flex: 1; + flex: 1; +} +.profile-img-wrapper.big{ + height: 68px; + width: 68px; +} +.profile-img-wrapper.with-left-space-custom{ + margin-left:7px; +} + +.absolute{ + position: absolute; +} + +.relative{ + position: relative; +} + +.flex-1{ + -webkit-box-flex: 1; + -moz-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} + +[data-pages-bg-image]{ + background-size: cover; +} + +/* Demo Purposes */ +.icon-set-preview{ + transition: opacity 0.1s linear; +} +#icon-list{ + transition: all 0.1s ease-in-out; +} +.error-number{ + font-size: 90px; + line-height: 90px; +} +.error-container-innner{ + margin-left: auto; + margin-right: auto; + width: 360px; +} +.error-container{ + margin-top: -100px; + margin-left: auto; + margin-right: auto; + width: 38%; +} + +.visible-xlg { + display: none; +} +.hidden-xlg { + display: block; +} + +// Dashboard widget heights + +.sm-gutter .row > [class^="col-"], .sm-gutter .row > [class*="col-"] { + padding-left: $layout-gutter-sm; + padding-right: $layout-gutter-sm; +} +.sm-gutter .row { + margin-left: -$layout-gutter-sm; + margin-right: -$layout-gutter-sm; +} + +/* Aspect ratio */ +.ar-1-1, +.ar-2-1, +.ar-1-2, +.ar-3-2, +.ar-2-3{ + .card{ + margin: 0; + } +} +.ar-1-1{ + position: relative; + width: 100%; /* desired width */ + overflow: hidden; + &:before{ + content: ""; + display: block; + padding-top: 100%; /* initial ratio of 1:1*/ + } + & > div{ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +} + +.ar-2-1{ + position: relative; + width: 100%; /* desired width */ + overflow: hidden; + &:before{ + content: ""; + display: block; + padding-top: calc(50% - #{$layout-gutter-sm}); /* initial ratio of 1:1*/ + } + & > div{ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +} + +.ar-1-2{ + position: relative; + width: 100%; /* desired width */ + overflow: hidden; + &:before{ + content: ""; + display: block; + padding-top: calc(150% - #{$layout-gutter-sm}); /* initial ratio of 1:1*/ + } + & > div{ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +} + +.ar-3-2{ + position: relative; + width: 100%; /* desired width */ + overflow: hidden; + &:before{ + content: ""; + display: block; + padding-top: calc(75% - #{$layout-gutter-sm}); /* initial ratio of 1:1*/ + } + & > div{ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +} + +.ar-2-3{ + position: relative; + width: 100%; /* desired width */ + overflow: hidden; + &:before{ + content: ""; + display: block; + padding-top: calc(125% - #{$layout-gutter-sm}); /* initial ratio of 1:1*/ + } + & > div{ + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +} + +.v-align-bottom{ + vertical-align: bottom !important; +} +.v-align-top{ + vertical-align: top !important; +} +.v-align-middle{ + vertical-align: middle !important; +} +/* vertical alignment styles */ +.col-top { + vertical-align:top !important; +} +.col-middle { + vertical-align:middle !important; +} +.col-bottom { + vertical-align:bottom !important; +} + +/* columns of same height styles +------------------------------------ +*/ +.container-xs-height { + display:table; + padding-left:0px; + padding-right:0px; + width: 100%; + border-collapse: collapse; + table-layout: fixed; +} +.row-xs-height { + display:table-row; +} +.col-xs-height { + display:table-cell; + float:none; +} +@media (min-width: 768px) { + .container-sm-height { + display:table; + padding-left:0px; + padding-right:0px; + width: 100%; + border-collapse: collapse; + table-layout: fixed; + } + .row-sm-height { + // display:table-row; + } + .col-sm-height { + // display:table-cell !important; + // float:none !important; + } +} +@media (min-width: 992px) { + .container-md-height { + display:table; + padding-left:0px; + padding-right:0px; + width: 100%; + border-collapse: collapse; + table-layout: fixed; + } + .row-md-height { + display:table-row; + } + .col-md-height { + display:table-cell !important; + float:none !important; + } +} +@media (min-width: 1200px) { + .container-lg-height { + display:table; + padding-left:0px; + padding-right:0px; + width: 100%; + border-collapse: collapse; + table-layout: fixed; + } + .row-lg-height { + display:table-row; + } + .col-lg-height { + display:table-cell !important; + float:none !important; + } +} diff --git a/resources/assets/sass/modules/_modals.scss b/resources/assets/sass/modules/_modals.scss new file mode 100644 index 00000000..73272c57 --- /dev/null +++ b/resources/assets/sass/modules/_modals.scss @@ -0,0 +1,285 @@ +/*------------------------------------------------------------------ +[10. Modals] +*/ +.modal{ + .close { + position: absolute; + right: 25px; + top: 15px; + } + .close:focus { + outline:0; + } + .modal-dialog{ + transition: all .2s !important; + } + .modal-content{ + border: 1px solid #f2f6f7; + border-radius:3px; + box-shadow:none; + } + .modal-header { + text-align: center; + border-bottom: 0; + padding: 25px 25px 0 25px; + position: relative; + flex-direction: column; + align-items: flex-start; + p { + color: #8b91a0; + } + } + .modal-body { + box-shadow: none; + padding: 25px; + white-space: normal; + } + .modal-footer { + border-top: none; + box-shadow: none; + margin-top: 0; + padding: 25px; + padding-top: 0; + } + .drop-shadow{ + box-shadow:0 0 9px rgba(191,191,191,.36) !important; + } + &.fade{ + opacity: 1 !important; + &.stick-up{ + .modal-dialog{ + @include translate3d(0,-100%,0); + margin-top: -5px; + } + // &.in{ + // .modal-dialog{ + // @include translate3d(0,0,0); + // } + // } + &.show{ + .modal-dialog{ + @include translate3d(0,0,0); + } + } + } + + &.slide-up{ + height: 100%; + top: auto; + + // &.in{ + // .modal-dialog{ + // @include translate3d(0,0,0); + // } + // } + &.show{ + .modal-dialog{ + @include translate3d(0,0,0); + } + } + &.disable-scroll{ + overflow: hidden; + } + .modal-dialog{ + display: table; + height: 100%; + @include translate3d(0,75%,0); + } + .modal-content-wrapper{ + display: table-cell; + vertical-align: middle; + } + } + &.center-scale{ + .modal-dialog { + display: table; + height: 100%; + } + .modal-content{ + display: table-cell; + vertical-align: middle; + border: 0; + background: transparent; + .modal-header{ + border-bottom: 0px; + } + } + // &.in{ + // .modal-dialog{ + // opacity: 1; + // @include scale(1); + // } + // } + &.show{ + .modal-dialog{ + opacity: 1; + @include scale(1); + } + } + .modal-dialog{ + opacity: 0; + @include scale(0.6); + } + } + &.fill-in{ + background-color: rgba(255, 255, 255, 0); + @include transition(background-color .3s); + & > .close{ + opacity: 0.6; + z-index: 9999; + & > i{ + font-size: 16px; + } + } + .modal-dialog { + display: table; + height: 100%; + } + .modal-content{ + display: table-cell; + vertical-align: middle; + border: 0; + background: transparent; + .modal-header{ + border-bottom: 0px; + } + } + // &.in{ + // background-color: rgba(255, 255, 255, 0.85); + // .modal-dialog{ + // opacity: 1; + // @include scale(1); + // } + // } + &.show{ + background-color: rgba(255, 255, 255, 0.85); + .modal-dialog{ + opacity: 1; + @include scale(1); + } + } + .modal-dialog{ + opacity: 0; + @include scale(0.6); + } + } + &.slide-right{ + .close{ + position: absolute; + top:0; + right: 0; + margin-right: 10px; + z-index: 10; + } + // &.in{ + // .modal-dialog{ + // @include translate3d(0,0,0); + // } + // } + &.show{ + .modal-dialog{ + @include translate3d(0,0,0); + } + } + .modal-dialog{ + position: absolute; + right: 0; + margin:0; + height: 100%; + @include translate3d(100%,0,0); + .modal-content-wrapper{ + height: 100%; + } + .modal-content{ + min-height: 100%; + } + } + .modal-content{ + border-radius: 0px; + } + } + } +} +.fill-in-modal{ + .modal-backdrop{ + background-color: transparent; + } +} +.modal-backdrop{ + opacity: 0; + @include transition(opacity 0.2s linear); + // &.in{ + // opacity: 0.30; + // } + &.show{ + opacity: 0.30; + } +} + +body.modal-open { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +/* Responsive Handlers: Modals +------------------------------------ +*/ + +@media (min-width: 992px){ + .modal-lg { + width: 900px; + } +} + +@media (max-width: 768px){ + .modal{ + &.fill-in{ + .modal-dialog { + width: calc(100% - 20px); + } + } + &.slide-up{ + .modal-dialog { + width: calc(100% - 20px); + } + } + } +} +@media (min-width: 768px){ + .modal{ + &.stick-up{ + .modal-dialog{ + margin: -5px auto; + } + } + &.slide-up{ + .modal-dialog { + margin: 0 auto; + } + } + &.fill-in{ + .modal-dialog { + margin: 0 auto; + } + } + .modal-content{ + box-shadow: none; + } + .modal-dialog { + width: 600px; + } + .modal-sm { + width: 300px; + } + .modal-sm { + min-width: auto; + } + } +} + +@media (min-width: 576px){ + +} diff --git a/resources/assets/sass/modules/_nestables.scss b/resources/assets/sass/modules/_nestables.scss new file mode 100644 index 00000000..936f7e24 --- /dev/null +++ b/resources/assets/sass/modules/_nestables.scss @@ -0,0 +1,84 @@ +/*------------------------------------------------------------------ +[14. Nesstables] +*/ + +.dd-handle{ + border-color: fade-out($color-master-light, .3); + color:$color-master; + &:hover{ + background-color: $color-master-lightest + } +} + +.dark { + .dd-handle{ + color:$color-master; + background: $color-master-lighter; + &:hover{ + background-color: $color-master-lightest + } + } + .dd-placeholder{ + background-color:$color-master-light; + } + +} + +.dd3-content{ + background:#fff; + border-color: fade-out($color-master-light, .3); + color:$color-master; + &:hover{ + background-color: $color-master-lightest + } +} + +.dd3-handle{ + background:transparent; + text-indent: 9999px; + &:before{ + font-family: 'pages-icon'; + color:$color-master; + content:"\e660"; + font-size: 11px; + top: 5px; + } +} + +.dd-placeholder{ + background:$color-master-lighter; + border-color: fade-out($color-master, .65); +} + +.dd-empty{ + background-image:none; + background:$color-master-lighter; + border-color: fade-out($color-master, .5); +} +.dd-item > button{ + font-size: 11px; + &:before{ + font-family: 'pages-icon'; + content: "\e63b"; + } +} +.dd-item > button[data-action="collapse"]:before{ + font-family: 'pages-icon'; + content: "\e635"; +} + + + +/* Responsive Handlers : Nestables +------------------------------------ +*/ +@media only screen and (min-width: 700px) { + .dd { + width: 100%; + } + .nestable-lists{ + .dd{ + float: left; + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_notifications.scss b/resources/assets/sass/modules/_notifications.scss new file mode 100644 index 00000000..364a1f6b --- /dev/null +++ b/resources/assets/sass/modules/_notifications.scss @@ -0,0 +1,675 @@ +/*------------------------------------------------------------------ +[8. Notifications] +*/ + +/* Badges +-------------------------------------------------- +*/ +.badge { + text-shadow: none; + font-family: $base-font-family; + font-weight: 600; + background-color: $color-master-light; + font-size: 11px; + padding-left: 6px; + padding-right: 6px; + padding-bottom: 4px; + color: $color-master; + border-radius: 10px; +} +.badge-success { + background-color: $color-success; + color: $color-white ; +} +.badge-warning { + background-color: $color-warning; + color: $color-white ; +} +.badge-important { + background-color: $color-danger; + color: $color-white ; +} +.badge-danger { + background-color: $color-danger; + color: $color-white ; +} +.badge-info { + background-color: $color-info; + color: $color-white ; +} +.badge-inverse { + background-color: $color-complete-darker; + color: $color-white ; +} +.badge-white { + background-color: $color-white ; + color: $color-master; +} +.badge-disable { + background-color: $color-master-dark; + color: $color-master; +} + +/* Tool Tip +-------------------------------------------------- +*/ +.tooltip-inner{ + font-size: 12px; +} + +/* Notification popup +-------------------------------------------------- +*/ +.popover{ + border: 1px solid rgba(0,0,0,.1); + box-shadow: 0 0 9px rgba(191, 191, 191, 0.36); + z-index: $zIndex-navbar - 10; +} +.notification-toggle{ + top: 35px; + left: -26px; + padding: 0; + &:before{ + border-bottom:0px !important; + } + &:after{ + border-bottom:0px !important; + } +} +.notification-panel{ + background-color: #fff; + border:1px solid $color-master-light; + .notification-body{ + height: auto; + max-height: 350px; + position: relative; + overflow: hidden; + .notification-item{ + position: relative; + margin-left: 25px; + background-color: #fff; + padding-right: 26px; + &.unread{ + .heading{ + opacity: 1; + } + .option{ + background-color: $color-complete-lighter; + } + .option .mark{ + color:$color-complete-light; + } + } + .heading{ + line-height: 43px; + margin-right: 5px; + background: #fff; + border-bottom: 1px solid $color-master-light; + position: relative; + float: left; + width: 100%; + font-size: 14px; + opacity: 0.7; + &:after{ + content:''; + position: absolute; + width: 5px; + height: 100%; + background-color: #fff; + right: 0; + top: 1px; + + } + .thumbnail-wrapper { + cursor: pointer; + i{ + @include transition(all 0.12s linear); + + } + } + .time{ + font-size: 11px; + margin-right: 8px; + } + &.open{ + display: block; + .more-details{ + display: block; + } + .thumbnail-wrapper i{ + @include rotate(-90deg); + } + } + .thumbnail-wrapper.d24{ + line-height: 20px; + } + } + .more-details{ + display: none; + background-color: #fff; + width: 100%; + height: 100%; + clear: both; + position: relative; + .more-details-inner{ + margin-left: 10px; + padding-left: 28px; + padding-top: 15px; + margin-bottom: 20px; + position: relative; + border-left: 1px solid fade($color-master-light, 70%); + &:after{ + width: 14px; + height: 14px; + position: absolute; + content: ''; + background-color: #fff; + left: -7px; + top: 25px; + border: 1px solid fade($color-master-light, 90%); + @include border-radius(99px); + } + &:before{ + color: mix($color-master, #fff, 40%); + position: absolute; + bottom: 0; + left: -5px; + content: ' \25CF'; + font-size: 13px; + line-height: 5px; + background-color: #fff; + height: 9px; + } + .hint-text { + opacity: .44; + } + } + + } + .option{ + font-size: 10px; + position: absolute; + height: 44px; + width: 26px; + right: 0; + text-align: center; + vertical-align: middle; + line-height: 44px; + background-color: $color-master-lightest; + height: 100%; + .mark{ + background-color: transparent; + color: mix($color-master, #fff, 40%); + &:before{ + content: ' \25CF'; + font-size: 12px; + } + } + } + &:last-child{ + .heading{ + border-bottom: 0px; + } + } + } + } + .notification-footer{ + padding: 10px; + display: block; + border-top:1px solid $color-master-light; + a{ + color: $color-master; + opacity: .54; + &:hover{ + opacity: .74; + } + } + } +} + + +/* Simple alerts +-------------------------------------------------- +*/ +.alerts-container{ + position: fixed; + width: 350px; + right: 20px; + z-index: 999; + top: $layout-header-height + 20px; + &[data-placement$='-left']{ + left: $layout-sidepanel-width-collapsed + 30px; + right: auto; + } + &[data-placement$='-right']{ + right: 20px; + left: auto; + } + &[data-placement^='top-']{ + top: $layout-header-height + 20px; + bottom: auto; + } + &[data-placement^='bottom-']{ + top: auto; + bottom: 20px; + } + + &[data-placement='bottom-right'], &[data-placement='bottom-left']{ + .alert:last-child{ + margin-bottom: 0; + } + } + .alert{ + position: relative; + .close{ + position: absolute; + right: 9px; + top: 15px; + } + } + +} + +/* Pages Notifications plugin +-------------------------------------------------- +*/ +body.menu-pin > .pgn-wrapper[data-position$='-left'], +body.menu-pin > .pgn-wrapper[data-position="top"], +body.menu-pin > .pgn-wrapper[data-position="bottom"]{ + left: $layout-sidepanel-pin-width; +} +.pgn-wrapper { + position: fixed; + z-index: 1000; +} +.pgn-wrapper[data-position$='-left'] { + left: 30px; +} +.pgn-wrapper[data-position$='-right'] { + right: 20px; +} +.pgn-wrapper[data-position^='top-'] { + top: 20px; +} +.pgn-wrapper[data-position^='bottom-'] { + bottom: 20px; +} +.pgn-wrapper[data-position='top'] { + top: 0; + left: 0; + right: 0; +} +.pgn-wrapper[data-position='bottom'] { + bottom: 0; + left: 0; + right: 0; +} +.pgn { + position: relative; + margin: 10px; +} +.pgn .alert { + margin: 0; +} + +/* Simple +------------------------------------ +*/ + +.pgn-simple .alert { + padding-top: 13px; + padding-bottom: 13px; + max-width: 500px; + animation: fadeIn .3s cubic-bezier(.05, .74, .27, .99) forwards; + -webkit-animation: fadeIn .3s cubic-bezier(.05, .74, .27, .99) forwards; + max-height: 250px; + overflow: hidden; +} +/* Bar +------------------------------------ +*/ + +.pgn-bar { + overflow: hidden; + margin: 0; +} +.pgn-bar .alert { + border-radius: 0; + padding-top: 13px; + padding-bottom: 13px; + max-height: 91px; +} +.pgn-wrapper[data-position='top'] .pgn-bar .alert { + animation: slideInFromTop .5s cubic-bezier(.05, .74, .27, .99) forwards; + -webkit-animation: slideInFromTop .5s cubic-bezier(.05, .74, .27, .99) forwards; + transform-origin: top left; + -webkit-transform-origin: top left; +} +.pgn-wrapper[data-position='bottom'] .pgn-bar .alert { + animation: slideInFromBottom .5s cubic-bezier(.05, .74, .27, .99) forwards; + -webkit-animation: slideInFromBottom .5s cubic-bezier(.05, .74, .27, .99) forwards; + transform-origin: bottom left; + -webkit-transform-origin: bottom left; +} +.pgn-bar .alert span { + opacity: 0; + animation: fadeIn .3s cubic-bezier(.05, .74, .27, .99) forwards; + -webkit-animation: fadeIn .3s cubic-bezier(.05, .74, .27, .99) forwards; +} +@keyframes slideInFromTop { + 0% { + transform: translateY(-100%); + } + 100% { + transform: translateY(0); + } +} +@-webkit-keyframes slideInFromTop { + 0% { + -webkit-transform: translateY(-100%); + } + 100% { + -webkit-transform: translateY(0); + } +} +@keyframes slideInFromBottom { + 0% { + transform: translateY(100%); + } + 100% { + transform: translateY(0); + } +} +@-webkit-keyframes slideInFromBottom { + 0% { + -webkit-transform: translateY(100%); + } + 100% { + -webkit-transform: translateY(0); + } +} +/* Circle +------------------------------------ +*/ + +.pgn-circle .alert { + border-radius: 300px; + animation: fadeInCircle .3s ease forwards, resizeCircle .3s .4s cubic-bezier(0.25, 0.25, 0.4, 1.6) forwards; + -webkit-animation: fadeInCircle .3s ease forwards, resizeCircle .3s .4s cubic-bezier(0.25, 0.25, 0.4, 1.6) forwards; + height: 60px; + overflow: hidden; + padding: 6px 55px 6px 6px; + -webkit-transform: translateZ(0); + position: relative; +} +.pgn-wrapper[data-position$='-right'] .pgn-circle .alert { + float: right; +} +.pgn-wrapper[data-position$='-left'] .pgn-circle .alert { + float: left; +} +.pgn-circle .alert > div > div.pgn-thumbnail > div { + border-radius: 50%; + overflow: hidden; + width: 48px; + height: 48px; +} +.pgn-circle .alert > div > div.pgn-thumbnail > div > img { + width: 100%; + height: 100%; +} +.pgn-circle .alert > div > div.pgn-message > div { + opacity: 0; + height: 47px; + padding-left: 9px; + animation: fadeIn .3s .5s ease forwards; + -webkit-animation: fadeIn .3s .5s ease forwards; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + word-break: break-all; + word-wrap: break-word; + // -webkit-transform: translateZ(0); + // @include backface-visibility(hidden); + +} +.pgn-circle .alert > div > div.pgn-message > div p:only-child{ +padding:12px 0; +} +.pgn-circle .alert .close { + margin-top: -12px; + position: absolute; + right: 18px; + top: 50%; + opacity: 0; + animation: fadeIn .3s .5s ease forwards; + -webkit-animation: fadeIn .3s .5s ease forwards; +} +.pgn-circle .alert p { + margin-bottom: 0; +} +.pgn-circle .alert > div { + display: table; + height: 100%; +} +.pgn-circle .alert > div > div { + display: table-cell; + vertical-align: middle; +} +@keyframes fadeInCircle { + 0% { + opacity: 0; + width: 60px; + } + 100% { + opacity: 1; + width: 60px; + } +} +@-webkit-keyframes fadeInCircle { + 0% { + opacity: 0; + width: 60px; + } + 100% { + opacity: 1; + width: 60px; + } +} +@keyframes resizeCircle { + 0% { + width: 60px; + } + 100% { + width: 300px; + } +} +@-webkit-keyframes resizeCircle { + 0% { + width: 60px; + } + 100% { + width: 300px; + } +} + +/* Flip +------------------------------------ +*/ + +.pgn-wrapper[data-position^='top-'] .pgn-flip { + top: -30px; +} +.pgn-wrapper[data-position^='bottom-'] .pgn-flip { + bottom: -30px; +} +.pgn-wrapper[data-position^='bottom-'] .pgn-flip .alert { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +.pgn-flip .alert { + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + box-shadow: 0 6px 4px -3px rgba(0, 0, 0, 0.2); + -webkit-animation-name: flipInX; + animation-name: flipInX; + -webkit-animation-duration: 0.8s; + animation-duration: 0.8s; + border-radius: 0; + padding: 25px 35px; + max-width: 500px; + max-height: 250px; + overflow: hidden; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + -webkit-transition-timing-function: ease-out; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + -webkit-transition-timing-function: ease-in; + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + -webkit-transition-timing-function: ease-out; + } + 100% { + -webkit-transform: perspective(400px); + } +} +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + transform: perspective(400px) rotate3d(1, 0, 0, -90deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + transform: perspective(400px) rotate3d(1, 0, 0, 20deg); + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + transform: perspective(400px) rotate3d(1, 0, 0, -10deg); + -webkit-transition-timing-function: ease-in; + transition-timing-function: ease-in; + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + transform: perspective(400px) rotate3d(1, 0, 0, 5deg); + -webkit-transition-timing-function: ease-out; + transition-timing-function: ease-out; + } + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/* Pages Notification customizations */ +body > .pgn-wrapper[data-position="top"] { + top: $layout-header-height; + left: $layout-sidepanel-width-collapsed; +} +body > .pgn-wrapper[data-position="bottom"] { + left: $layout-sidepanel-width-collapsed; +} + +body > .pgn-wrapper[data-position$='-left'] { + left: $layout-sidepanel-width-collapsed + 20px; + right: auto; +} + +body > .pgn-wrapper[data-position^='top-'] { + top: $layout-header-height + 20px; + bottom: auto; +} + + +.pgn-circle .alert .close { + margin-top: -4px; + } +body > .pgn-wrapper{ + z-index: $zIndex-notifications; +} + +@media (max-width: 979px) { + body > .pgn-wrapper[data-position="top"]{ + left: 0; + } + body > .pgn-wrapper[data-position="bottom"] { + left: 0; + } +} +@media (max-width: 767px) { + body > .pgn-wrapper[data-position$='-left'], + body > .pgn-wrapper[data-position$='-right'] { + left: 10px !important; + right: 10px !important; + } + body > .pgn-wrapper[data-position$='-right'] .alert, + body > .pgn-wrapper[data-position$='-left'] .alert{ + max-width: 100%; + width: 100%; + } +} + + +/* Notifications demo +-------------------------------------------------- +*/ +.notification-positions{ + border-radius: 4px; + border:3px dashed $color-master-light; + height: 370px; + position: relative; + + & > div > .position:not(:only-child){ + max-width: 50%; + } + .position{ + padding: 15px; + img{ + border:3px solid transparent; + } + &:hover{ + cursor: pointer; + } + &.active img{ + border-color:#0090d9; + } + &.pull-top, &.pull-bottom{ + left: 0; + right: 0; + + } + img{ + width: 100%; + } + } +} diff --git a/resources/assets/sass/modules/_print.scss b/resources/assets/sass/modules/_print.scss new file mode 100644 index 00000000..e6dc5c72 --- /dev/null +++ b/resources/assets/sass/modules/_print.scss @@ -0,0 +1,32 @@ +/*------------------------------------------------------------------ +[29. Print] +*/ + +@media print{ + .header, + .page-sidebar, + .quickview-wrapper, + .overlay { + display: none; + } + .page-container{ + padding-left: 0; + } + .page-content-wrapper { + .content{ + border-top:0; + .card { + border: none; + .card-body{ + padding: 0; + } + } + } + } + [class^='padding-'], + [class*='padding-'], + .table tbody tr td{ + padding: 10px; + } + +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_progress_indicators.scss b/resources/assets/sass/modules/_progress_indicators.scss new file mode 100644 index 00000000..2ac14b4c --- /dev/null +++ b/resources/assets/sass/modules/_progress_indicators.scss @@ -0,0 +1,225 @@ +/*------------------------------------------------------------------ +[9. Progress Indicators] +*/ +.progress { + height: 4px; + background-color: fade-out($color-master, .8); + background-image: none; + box-shadow: none; + border-radius: 0; + + margin-bottom: 20px; + &.transparent { + background-color: rgba(0, 0, 0, 0.28); + } + &.progress-small { + height: 3px; + } +} +/* Circular Progress : indeterminate color +------------------------------------ +*/ +.progress-bar-indeterminate{ + background: url('#{$base-img-url}/progress/progress-bar-master.svg') no-repeat top left; + width: 100%; + height: 100%; + background-size: cover; + &.progress-bar-primary{ + background-image: url('#{$base-img-url}/progress/progress-bar-primary.svg'); + background-color: transparent; + } + &.progress-bar-complete{ + background-image: url('#{$base-img-url}/progress/progress-bar-complete.svg'); + background-color: transparent; + } + &.progress-bar-success{ + background-image: url('#{$base-img-url}/progress/progress-bar-success.svg'); + background-color: transparent; + } + &.progress-bar-info{ + background-image: url('#{$base-img-url}/progress/progress-bar-info.svg'); + background-color: transparent; + } + &.progress-bar-warning{ + background-image: url('#{$base-img-url}/progress/progress-bar-warning.svg'); + background-color: transparent; + } + &.progress-bar-danger{ + background-image: url('#{$base-img-url}/progress/progress-bar-danger.svg'); + background-color: transparent; + } + &.progress-bar-master{ + background-image: url('#{$base-img-url}/progress/progress-bar-master.svg'); + background-color: transparent; + } +} +/* Progress Bar +------------------------------------ +*/ +.progress-bar { + box-shadow: none; + border-radius: 0; + background-color: $color-master; + background-image: none; + @include transition(all 1000ms cubic-bezier(0.785, 0.135, 0.150, 0.860)); + -webkit-transition-timing-function: cubic-bezier(0.785, 0.135, 0.150, 0.860); + -moz-transition-timing-function: cubic-bezier(0.785, 0.135, 0.150, 0.860); + -ms-transition-timing-function: cubic-bezier(0.785, 0.135, 0.150, 0.860); + -o-transition-timing-function: cubic-bezier(0.785, 0.135, 0.150, 0.860); + transition-timing-function: cubic-bezier(0.785, 0.135, 0.150, 0.860); +} +/* Progress Bar : Color Options +------------------------------------ +*/ +.progress-bar-primary { + background-color: $color-primary; + background-image: none; +} +.progress-bar-complete { + background-color: $color-complete; + background-image: none; +} +.progress-bar-success { + background-color: $color-success; + background-image: none; +} +.progress-bar-info { + background-color: $color-info; + background-image: none; +} +.progress-bar-warning { + background-color: $color-warning; + background-image: none; +} +.progress-bar-danger { + background-color: $color-danger; + background-image: none; +} +.progress-bar-white { + background-color: $color-white ; + background-image: none; +} +.progress-bar-black { + background-color: $color-black; + background-image: none; +} +.progress-info .bar, .progress .bar-info { + background-color: $color-info-darker; + background-image: none; +} +.progress-warning .bar, .progress .bar-warning { + background-color: $color-warning-darker; + background-image: none; +} +.progress-danger .bar, .progress .bar-danger { + background-color: $color-danger-darker; + background-image: none; +} +.progress-white .bar, .progress .bar-white { + background-color: $color-white; + background-image: none; +} +.progress-success.progress-striped .bar, .progress-striped .bar-success { + background-color: $color-success; +} +.progress-info.progress-striped .bar, .progress-striped .bar-info { + background-color: $color-info; +} +/* Circular Progress : indeterminate +------------------------------------ +*/ +.progress-circle-indeterminate{ + background: url('#{$base-img-url}/progress/progress-circle-master.svg') no-repeat top left; + width: 50px; + height: 50px; + background-size: 100% auto; + margin: 0 auto; + &.progress-circle-warning{ + background-image: url('#{$base-img-url}/progress/progress-circle-warning.svg'); + } + &.progress-circle-danger{ + background-image: url('#{$base-img-url}/progress/progress-circle-danger.svg'); + } + &.progress-circle-info{ + background-image: url('#{$base-img-url}/progress/progress-circle-info.svg'); + } + &.progress-circle-primary{ + background-image: url('#{$base-img-url}/progress/progress-circle-primary.svg'); + } + &.progress-circle-success{ + background-image: url('#{$base-img-url}/progress/progress-circle-success.svg'); + } + &.progress-circle-complete{ + background-image: url('#{$base-img-url}/progress/progress-circle-complete.svg'); + } +} +/* Circular Progress +------------------------------------ +*/ +.progress-circle { + $size: 45px; + $border : 3px; + display: block; + height: $size; + margin: 0 auto; + position: relative; + width: $size; + -webkit-backface-visibility: hidden; + &.progress-circle-warning{ + .pie .half-circle{ + border-color: $color-warning; + } + } + &.progress-circle-danger{ + .pie .half-circle{ + border-color: $color-danger; + } + } + &.progress-circle-info{ + .pie .half-circle{ + border-color: $color-info; + } + } + &.progress-circle-primary{ + .pie .half-circle{ + border-color: $color-primary; + } + } + &.progress-circle-success{ + .pie .half-circle{ + border-color: $color-success; + } + } + &.progress-circle-complete{ + .pie .half-circle{ + border-color: $color-complete; + } + } + &.progress-circle-thick{ + .pie .half-circle, .shadow{ + border-width: 5px; + } + } + .pie { + clip: rect(0, $size, $size, $size / 2); + height: $size; + position: absolute; + width: $size; + .half-circle { + border: $border solid $color-master; + border-radius: 50%; + clip: rect(0, $size / 2, $size, 0); + height: $size; + position: absolute; + width: $size; + + } + } + .shadow { + border: $border solid fade-out(#000, .9); + border-radius: 50%; + height: 100%; + width: 100%; + } + +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_sliders.scss b/resources/assets/sass/modules/_sliders.scss new file mode 100644 index 00000000..4efa0f56 --- /dev/null +++ b/resources/assets/sass/modules/_sliders.scss @@ -0,0 +1,313 @@ +/*------------------------------------------------------------------ +[12. Sliders] +*/ + +$slider-background-color : mix($color-master, #fff, 12%); + +/* Ion Range Slider +https://github.com/IonDen/ion.rangeSlider +-------------------------------------------------- +*/ +.irs-line-mid, .irs-line-left, .irs-line-right, .irs-bar, .irs-bar-edge, .irs-slider{ + background-image: none; +} +.irs-bar{ + background: $color-danger; +} +.irs-wrapper{ + .irs-line{ + background-color: $color-master-light; + } + .irs-line-mid, .irs-line-left, .irs-line-right, .irs-diapason, .irs-slider{ + background: none; + } + .irs-diapason{ + background-color:$color-danger; + @include transition(all 0.3s ease); + + } + .irs-from, .irs-to, .irs-single{ + background: $color-danger; + } + .irs-slider{ + + &.from:before{ + top: -2%; + left: 37%; + width: 16%; + height: 100%; + background: rgba(0,0,0,0.0); + background-color: $color-danger; + } + &.to:before{ + top: -2%; + left: 37%; + width: 16%; + height: 100%; + background: rgba(0,0,0,0.0); + background-color: $color-danger; + } + &.single:before{ + top: -2%; + left: 37%; + width: 16%; + height: 100%; + background: rgba(0,0,0,0.0); + background-color: $color-danger; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-danger; + } + &.success{ + .irs-diapason{ + background-color:$color-success; + } + .irs-from, .irs-to, .irs-single{ + background: $color-success; + } + .irs-slider{ + &.from:before{ + background-color: $color-success; + } + &.to:before{ + background-color: $color-success; + } + &.single:before{ + background-color: $color-success; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-success; + } + // v.2.0.1 + .irs-bar{ + background-color: $color-success; + } + } + &.primary{ + .irs-diapason{ + background-color:$color-primary; + } + .irs-from, .irs-to, .irs-single{ + background: $color-primary; + } + .irs-slider{ + &.from:before{ + background-color: $color-primary; + } + &.to:before{ + background-color: $color-primary; + } + &.single:before{ + background-color: $color-primary; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-primary; + } + // v.2.0.1 + .irs-bar{ + background-color: $color-primary; + } + } + &.warning{ + .irs-diapason{ + background-color:$color-warning; + } + .irs-from, .irs-to, .irs-single{ + background: $color-warning; + } + .irs-slider{ + &.from:before{ + background-color: $color-warning; + } + &.to:before{ + background-color: $color-warning; + } + &.single:before{ + background-color: $color-warning; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-warning; + } + // v.2.0.1 + .irs-bar{ + background-color: $color-warning; + } + } + &.complete{ + .irs-diapason{ + background-color:$color-complete; + } + .irs-from, .irs-to, .irs-single{ + background: $color-complete; + } + .irs-slider{ + &.from:before{ + background-color: $color-complete; + } + &.to:before{ + background-color: $color-complete; + } + &.single:before{ + background-color: $color-complete; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-complete; + } + // v.2.0.1 + .irs-bar{ + background-color: $color-complete; + } + } + &.danger{ + .irs-diapason{ + background-color:$color-danger; + } + .irs-from, .irs-to, .irs-single{ + background: $color-danger; + } + .irs-slider{ + &.from:before{ + background-color: $color-danger; + } + &.to:before{ + background-color: $color-danger; + } + &.single:before{ + background-color: $color-danger; + } + } + .irs-from:after, .irs-to:after, .irs-single:after{ + border-top-color: $color-danger; + } + // v.2.0.1 + .irs-bar{ + background-color: $color-danger; + } + } +} + +/* noUiSlider +http://refreshless.com/nouislider/ +-------------------------------------------------- +*/ +.noUi-target{ + border-radius:0px; + border: 0; + box-shadow: none; + &.bg-complete{ + .noUi-connect{ + background-color: $color-complete + } + } + &.bg-success{ + .noUi-connect{ + background-color: $color-success + } + } + &.bg-warning{ + .noUi-connect{ + background-color: $color-warning + } + } + &.bg-danger{ + .noUi-connect{ + background-color: $color-danger + } + } + &.bg-info{ + .noUi-connect{ + background-color: $color-info + } + + } + &.bg-primary{ + .noUi-connect{ + background-color: $color-primary + } + + } + &.noUi-connect{ + box-shadow: none; + } +} +.noUi-handle{ + border-radius:999px; + box-shadow:none; + &:before, &:after{ + display:none; + } +} +.noUi-horizontal { + height: 4px; + .noUi-handle{ + width: 18px; + height: 18px; + left: -15px; + border: 1px solid mix($color-master, #fff, 23%); + top: -7px; + @include transition(all 0.2s ease); + &:hover{ + border: 1px solid mix($color-master, #fff, 40%); + } + &:active{ + @include scale(1.3); + border: 1px solid mix($color-master, #fff, 23%); + } + &:focus{ + @include scale(1.3); + border: 1px solid mix($color-master, #fff, 23%); + } + } +} +.disable-hover-scale{ + .noUi-handle{ + &:active{ + @include scale(1); + } + &:focus{ + @include scale(1); + } + } +} +.vertical-slider{ + height: 150px; +} +.noUi-vertical { + width: 4px; + .noUi-handle{ + width: 18px; + height: 18px; + border: 1px solid mix($color-master, #fff, 23%); + @include transition(all 0.2s ease); + &:hover{ + border: 1px solid mix($color-master, #fff, 40%); + } + &:active{ + @include scale(1.3); + border: 1px solid mix($color-master, #fff, 23%); + } + &:focus{ + @include scale(1.3); + border: 1px solid mix($color-master, #fff, 23%); + } + } +} +.noUi-base{ + padding: 5px 0; +} +.noUi-origin{ + border-radius: 0px; + bottom: 5px; +} +.noUi-connect{ + box-shadow:none; +} +.noUi-background{ + background:$slider-background-color !important; + box-shadow: none; +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_social.scss b/resources/assets/sass/modules/_social.scss new file mode 100644 index 00000000..592081be --- /dev/null +++ b/resources/assets/sass/modules/_social.scss @@ -0,0 +1,450 @@ +/*------------------------------------------------------------------ +[19. Social App] +*/ + +.social-wrapper, +.social{ + height: 100%; + width: 100%; +} + +/* Cover +------------------------------------ +*/ + +.social-wrapper .social .jumbotron{ + height: 60vh; +} +.social-wrapper .social .cover-photo { + position: relative; + margin: 0 auto; + overflow-x: hidden; + &:before{ + background-image: url("#{$base-img-url}/linear_gradient.png"); + background-repeat: repeat-x; + bottom: 0; + content: " "; + height: 270px; + left: 0; + position: absolute; + right: 0; + z-index: 1; + } + .pull-bottom{ + z-index: 2; + } +} + .cover-img-container { + position: absolute; + overflow: hidden; + top: 0; + left: 0; + right: 0; + bottom: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.cover-img-container .cover-img { + position: absolute; + top: 0; + left: 0; + display: block; + min-width: 100%; + min-height: 100%; +} + +/* Feed +------------------------------------ +*/ + +.social-user-profile{ + width: 52px; + & > .thumbnail-wrapper{ + float: none; + } +} + +.social-wrapper .social .feed { + overflow-y: hidden; + width: 100%; + + & > .day { + white-space: normal; + display: block; + width: 100%; + margin: 0 auto; + + &:after { + feed:''; + display: block; + clear: both; + } + &:hover { + & > .timeline:after { + background: $color-complete; + } + } + } +} + +/* Social Cards +------------------------------------ +*/ + +.social-card { + padding-bottom: 0; + margin-bottom: 0; + background: #FFF; + float: left; + position: relative; + border-radius: 4px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; + margin-bottom: 20px; + width: 300px; + border:1px solid $color-master-light; + .circle { + position: absolute; + right: 20px; + top: 20px; + display: block; + border-radius: 50%; + border:2px solid $color-master-lighter; + width: 9px; + height: 9px; + background: $color-info-light; + z-index: 1; + &:hover { + cursor: pointer; + } + } + &.full-width{ + width: 100% !important + } + &.status { + background: $color-complete-lighter; + border-radius: 4px; + padding: 15px 25px; + @include box-sizing(border-box); + border:1px solid transparent; + &:hover,&.hover { + border-color: $color-info-lighter !important; + } + h5 { + font-size: 12px; + margin: 0; + .time { + color: #fff; + } + } + h2 { + color: $color-master-dark; + font-size: 25px; + line-height: 32px; + margin: 0; + font-weight: normal; + } + .reactions { + color: $color-master-lighter; + opacity: .45; + font-size: 12px; + padding: 0; + margin: 5px 0 0; + padding: 0; + li { + display: inline-block; + list-style: none; + padding: 0; + } + } + .circle { + width: 9px; + height: 9px; + border: none; + background: $color-complete; + } + } + .card-header, .card-footer { + background-color: $color-white; + @include transition(background .2s ease); + } + &.share { + .card-header { + padding: 15px 15px 12px; + border-bottom:1px solid $color-master-light; + border-top-right-radius: 2px; + border-top-left-radius: 2px; + &:hover { + background: $color-complete-lighter; + border-color:$color-complete-lighter; + cursor: pointer; + h6 { + opacity: .6; + } + } + &.last{ + border-bottom: none; + } + .user-pic { + float:left; + border-radius: 50%; + overflow: hidden; + margin-right: 10px; + & > img { + width: 30px; + height: 30px; + } + } + h5 { + font-weight: bold; + font-size: 14px; + margin: 0; + line-height: 22.7px; + font-family: arial; + letter-spacing: -0.006em; + margin-top: -3px; + } + h6 { + font-size: 12px; + margin: 0; + opacity: .45; + font-family: arial; + opacity: .45; + } + } + .card-description { + padding:12px 16px 11px; + font-size: 14px; + line-height: 21px; + margin: 0; + p { + margin-bottom: 4px; + } + &:hover { + } + .via { + opacity: .45; + display: block; + font-size: 12px; + font-family: arial; + } + } + .card-content{ + position: relative; + .buttons{ + left: 17px; + padding: 0; + position: absolute; + top: 10px; + li { + display: inline-block; + list-style: none; + margin-right: 10px; + a{ + color: #fff; + } + } + } + } + .card-feed { + overflow: hidden; + position: relative; + max-height: 400px; + &:hover { + .buttons { + opacity: 1; + } + } + .buttons { + position: absolute; + top: 5px; + right: 0; + opacity: 0; + li { + display: inline-block; + list-style: none; + a { + color: #fff; + opacity: 0.8; + padding: 5px; + } + } + } + & > * { + max-width: 100%; + } + } + .card-footer { + padding: 14px 16px 11px; + font-size: 12px !important; + &:hover { + background: $color-complete-lighter; + cursor: pointer; + .reactions, .time { + opacity: .8; + } + } + .time { + float: left; + opacity: .45; + font-family: arial; + margin-top: 1px; + } + .reactions { + float: right; + margin:0; + padding: 0; + opacity: .45; + li { + display: inline-block; + list-style: none; + a { + color: inherit; + } + } + } + } + .card-description, .card-feed, .card-footer { + border-color: transparent; + border-style: solid; + } + .card-description { + border-width: 1px; + } + .card-feed { + border-width: 0 1px; + margin-top: -2px; + } + .card-footer { + border-width: 0 1px 1px 1px; + } + &.share-other { + .card-description { + padding-bottom: 0; + } + .card-footer { + padding-top: 0; + border-radius: 0; + &:hover { + background: #fff; + } + } + .card-header { + border-top:1px solid $color-complete-lighter; + } + .circle { + background: $color-warning; + } + } + } + &.col1 { + width: 300px; + } + &.col2 { + width: 620px; + } + &.col3 { + width: 920px; + } + img { + width: 100%; + } +} +/* Step Form : Status */ +.simform{ + margin-left: 0; + padding:0; + position: static; + margin-bottom: 20px; + .error-message{ + padding-top: 29px !important; + padding-left: 22px; + } + .final-message, .error-message{ + font-size: 15px; + opacity: 0.5; + display: none; + margin-top: 19px; + position: static; + text-align: left; + @include translate(0,0); + } + ol:before { + background: transparent; + } + .questions li{ + overflow: hidden; + &.current{ + position: relative; + input{ + font-size:14px; + padding: 0 !important; + margin: 0 !important; + } + } + & > span{ + width: 100%; + label{ + font-size: 12px; + opacity: .55; + font-weight: 300; + @include transition(opacity .2s ease); + } + } + } + .questions input{ + background: transparent !important; + height: 30px; + } + .questions .current input, + .no-js .questions input { + background: transparent; + border: none; + } + .controls { + position: absolute; + top:0; + left: 0; + width: 100%; + .next, .number{ + display: none !important; + } + } + .progress{ + &:before{ + background:none; + } + } + .show{ + display: block; + } +} + + +/* Responsive Handlers: Social App +------------------------------------ +*/ + +@media (min-width: 991px) and (max-width: 1070px) { + .day .card:first-child{ + .col-md-4:first-child{ + width: 100%; + margin-bottom: 20px; + } + .col-md-4:nth-child(2), .col-md-4:nth-child(3){ + width: 50%; + } + + } +} +@media (max-width: 667px) { + .social-wrapper .social .feed { + + & > .day { + + & > .card{ + width: 100% !important; + } + } +} +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_tables.scss b/resources/assets/sass/modules/_tables.scss new file mode 100644 index 00000000..76e1c950 --- /dev/null +++ b/resources/assets/sass/modules/_tables.scss @@ -0,0 +1,416 @@ +/*------------------------------------------------------------------ +[16. Tables and Datatables] +*/ + +/* Generic Tables +------------------------------------ +*/ +.table { + margin-bottom: 0; + margin-top: 5px; + thead { + tr { + th { + text-transform: uppercase; + font-weight: 500; + font-family:'Montserrat'; + font-size: 10.5px; + letter-spacing: 0.06em; + padding-top: 14px; + padding-bottom: 14px; + vertical-align: middle; + border-bottom: 1px solid fade-out($color-master-light, .3); + color:fade-out($color-master-dark, .65); + border-top: none; + &[class*='sorting_'] { + color:$color-master-dark; + } + &:first-child { + padding-left: 18px !important; + } + .btn { + margin-top: -20px; + margin-bottom: -20px; + } + } + } + } + tbody { + tr { + td { + background: #fff; + border-bottom: 1px solid fade-out($color-master-light, .3); + border-top: 0px; + padding:20px; + font-size: 13.5px; + .btn-tag { + background:fade-out($color-master-dark, .93); + display: inline-block; + margin: 5px; + border-radius: 4px; + padding: 5px; + color: #62605a !important; + &:hover { + background:fade-out($color-master-dark, .85); + } + } + &[class*='sorting_'] { + color:#000; + } + .checkbox label::after{ + left: 0.5px; + } + } + &.selected td { + background: $color-warning-lighter; + } + } + } + &.table-hover { + tbody { + tr { + &:hover td { + background: $color-complete-lighter !important; + } + &.selected:hover td{ + background: $color-warning-lighter !important; + } + } + } + } + &.table-striped { + tbody { + tr { + td { + background: $body-background !important; + } + &:nth-child(2n+1) td { + background: #fff !important; + } + } + } + } + &.table-borderless{ + tbody { + tr { + td { + border-top: 0; + } + } + } + } + &.table-condensed { + table-layout: fixed; + thead { + tr { + th { + padding-left: 20px; + padding-right: 20px; + } + } + } + tbody { + tr { + td { + padding-top: 12px; + padding-bottom: 12px; + } + } + } + thead tr th, tbody tr td, tbody tr td * { + white-space: nowrap; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; + } + &.table-detailed { + & > tbody > tr { + &.shown { + & > td { + background: $color-warning-lighter; + &:first-child:before { + @include rotate(90deg); + } + } + & + tr { + & > td { + background: fade-out($body-background, .6); + padding: 0px 40px; + .table-inline{ + margin-top: 13px; + margin-bottom: 13px; + background: transparent; + tr,td{ + background: transparent; + font-weight: 600; + } + } + } + } + } + &.row-details{ + & > td { + &:first-child:before { + content: ''; + display: none; + } + } + } + & > td { + &:hover { + cursor: pointer; + } + &:first-child:before { + content:"\f054"; + display: inline-block; + margin-right: 8px; + font-size: 8px; + top: -1px; + position: relative; + font-family: 'FontAwesome'; + @include transition(all 0.12s linear); + } + } + } + .table-inline { + td { + border: none; + text-align: left; + } + } + } + } + &.table-borderless{ + & > tbody{ + & > tr{ + & > td{ + border-bottom: 0px; + } + } + } + } +} +.fht-table { + margin-bottom: 0 !important; +} + +/* Data-tables +------------------------------------ +*/ +.table.dataTable.no-footer{ + border: none; +} +.dataTables_scroll{ + &:hover{ + .dataTables_scrollBody:before{ + content: ""; + top: 0; + height: 0; + } + } +} +.dataTables_scrollBody { + overflow-y: auto; + border:none !important; + &:before { + content: ""; + position: absolute; + left: 0; + right: 0; + top: 60px; + bottom: 0; + background: transparent; + } + +} +.dataTables_wrapper .dataTables_paginate{ + float:right; +} +.dataTables_wrapper .dataTables_paginate ul > li.disabled a{ + opacity: .5; +} +.dataTables_wrapper .dataTables_paginate ul > li > a { + padding: 5px 10px; + color: $color-master; + opacity: .35; + @include transition(opacity .3s ease); + &:hover{ + opacity: .65; + } +} + +.dataTables_wrapper .dataTables_paginate ul > li.next > a, +.dataTables_wrapper .dataTables_paginate ul > li.prev > a{ + opacity: 1; +} +.dataTables_wrapper .dataTables_paginate ul > li.disabled a{ + opacity: .35; + &:hover{ + opacity: .35; + } +} +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_paginate{ + margin-top: 25px !important; +} +.dataTables_paginate.paging_bootstrap.pagination{ + padding-top: 0; + padding-right:20px; +} +.dataTables_wrapper .dataTables_info{ + clear: none; + font-size: 12px; + + padding: 0 33px; + color: $color-master; +} +.dataTables_wrapper .dataTables_paginate ul > li { + display: inline-block; + padding-left:0; + font-size: 11px; +} +.dataTables_scrollHeadInner{ + padding-right:0 !important; +} +.export-options-container{ + position: relative; +} +.dataTables_wrapper .dataTables_paginate ul > li.active > a{ + font-weight: bold; + color: $color-master; + opacity: 1; +} +.export-options-container a{ + color: inherit; + opacity: 1; +} +.exportOptions .DTTT.btn-group a{ + display: block !important; +} + +table.dataTable thead { + .sorting_asc:after{ + background-image: url("#{$base-img-url}/icons/sort_asc.png"); + } + .sorting_desc:after{ + background-image: url("#{$base-img-url}/icons/sort_desc.png"); + } + .sorting:after{ + background-image: url("#{$base-img-url}/icons/sort_both.png"); + } + .sorting_asc_disabled:after{ + background-image: url("#{$base-img-url}/icons/sort_asc_disabled.png"); + } + .sorting_desc_disabled:after{ + background-image: url("#{$base-img-url}/icons/sort_desc_disabled.png"); + } + +} + +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after, +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after{ + bottom: 12px; + content: ""; + width: 19px; + height: 19px; + background-position: center center; + opacity: 1; +} + +table.dataTable.table-condensed .sorting:after, +table.dataTable.table-condensed .sorting_asc:after, +table.dataTable.table-condensed .sorting_desc:after{ + top: 12px; +} + +/* Responsive Handlers : Tables */ +@media (max-width: 991px) { + .dataTables_wrapper .dataTables_info{ + float: left; + } + .dataTables_paginate.paging_bootstrap.pagination{ + float: right; + } + +} + +@media (max-width: 767px) { + .table-responsive{ + border: 1px solid #ddd; + } +} + + +@media (max-width: 480px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate{ + float: none; + text-align: left; + clear: both; + display: block; + } +} + +/* Demo classes */ +.demo-table-search{ + thead th{ + &:nth-child(1){ + width: 20%; + } + &:nth-child(2){ + width: 22%; + } + &:nth-child(3){ + width: 24%; + } + &:nth-child(4){ + width: 15%; + } + &:nth-child(5){ + width: 19%; + } + } +} + +.demo-table-dynamic { + thead th{ + &:nth-child(1){ + width: 25%; + } + &:nth-child(2){ + width: 30%; + } + &:nth-child(3){ + width: 20%; + } + &:nth-child(4){ + width: 25%; + } + } +} + +.table-invoice{ + th{ + border-top: 0; + } +} + +.dataTables_wrapper{ + .row{ + width: 100%; + & > div { + display: flex; + justify-content: space-between; + width: 100%; + flex-direction: row-reverse; + } + } + &#tableWithDynamicRows_wrapper{ + & > div { + width: 100%; + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_tabs_accordian.scss b/resources/assets/sass/modules/_tabs_accordian.scss new file mode 100644 index 00000000..d4a1ae1f --- /dev/null +++ b/resources/assets/sass/modules/_tabs_accordian.scss @@ -0,0 +1,764 @@ +/*------------------------------------------------------------------ +[11. Tabs & Accordians] +*/ + +/* Tabs +------------------------------------ +*/ +.nav-tabs { + position: relative; + & > li { + padding-left: 0; + padding-right: 0; + & > a.active { + &:hover, + &:focus { + border-color: $color-master-light; + color: $color-master; + background-color: $color-master-light; + } + } + & > a { + display: block; + border-radius: 0; + padding: 13px 20px; + margin-right:0; + font-weight: 500; + letter-spacing: 0.06em; + color: fade($color-master, + 70%); + font-size: 10.5px; + min-width: 70px; + text-transform: uppercase; + border-color: transparent; + position: relative; + line-height: 1.7em; + &:hover, + &:focus { + background: transparent; + border-color: transparent; + color: $color-master; + } + .tab-icon { + margin-right:6px; + } + } + } + & ~ .tab-content { + overflow: hidden; + padding: 15px; + & > .tab-pane { + &.slide-left, + &.slide-right { + @include transition(all .3s ease); + &.sliding { + opacity: 0 !important; + } + &.active { + @include translate3d(0, 0, 0); + opacity: 1; + } + } + &.slide-left.sliding { + @include translate3d(10%, 0, 0); + } + &.slide-right.sliding { + @include translate3d(-10%, 0, 0); + } + } + } + // POSITIONG OPTIONS + &.nav-tabs-left, + &.nav-tabs-right { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + //Old Browsers + -webkit-flex-shrink: 0; + flex-shrink: 0; + &:after { + border-bottom: 0px; + } + & > li { + float: none; + } + } + &.nav-tabs-left { + float: left; + padding-right:0; + & ~ .tab-content { + border-left: 1px solid rgba(0, 0, 0, 0.1); + //IE10 Fix + -ms-flex: 1; + } + } + &.nav-tabs-right { + float: right; + padding-right: 0; + & ~ .tab-content { + border-right: 1px solid rgba(0, 0, 0, 0.1); + //IE10 Fix + -ms-flex: 1; + } + } +} + +/* Tabs : Simple +------------------------------------ +*/ +.nav-tabs-plain { + & > li { + & > a{ + opacity: 0.4; + &:after { + display: none !important; + } + &.active { + opacity: 1; + font-weight: bold; + background-color: white !important; + color: $color-primary; + &:hover, + &:focus { + color: $color-primary; + background-color: white !important; + border-color: white !important; + } + &:after { + display: block !important; + left: 100% !important; + top: 50% !important; + border: solid transparent; + content: " "; + height: 0 !important; + pointer-events: none; + border-left-color: #ffffff; + border-width: 8px !important; + margin-top: -8px !important; + background-color: transparent !important; + } + } + } + } +} +.nav-tabs-simple { + border-bottom: 0px; + &:after { + content:''; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + width: 100%; + position: absolute; + bottom: -1px; + z-index: 120; + left: 0; + } + & > li { + margin-bottom: 0; + & > a{ + &:after { + position: absolute; + @include transition(all 0.1s linear 0s); + -webkit-backface-visibility: hidden; + width: 100%; + display: block; + background-color: $color-primary; + height: 0px; + content: ''; + left: 0; + z-index: 125; + top: calc(100% - 1px); + &.nav-tabs-primary{ + background-color: $color-primary; + } + &.nav-tabs-success{ + background-color: $color-success; + } + &.nav-tabs-complete{ + background-color: $color-complete; + } + &.nav-tabs-danger{ + background-color: $color-danger; + } + &.nav-tabs-warning{ + background-color: $color-warning; + } + &.nav-tabs-info{ + background-color: $color-info; + } + } + &.active { + &:hover, + &:focus { + background-color: transparent; + border-color: transparent; + } + } + &.active, + &:hover { + &:after { + height: 3px; + } + } + } + } + // POSITIONG OPTIONS + &.nav-tabs-left, + &.nav-tabs-right { + &:after { + border-bottom: 0px; + } + & > li { + & > a:after { + width: 0px; + height: 100%; + top: 0; + bottom: 0; + position: absolute; + } + & > a{ + &.active, + &:hover{ + &:after { + width: 3px; + } + } + } + } + & ~ .tab-content { + } + } + &.nav-tabs-left { + & > li > a:after { + right: 0; + left: auto; + } + } + &.nav-tabs-right { + & > li > a:after { + left: 0; + } + } +} + +/* Tabs : Line Triangles +------------------------------------ +*/ + +.nav-tabs-linetriangle { + border-bottom: 0; + &:after { + content:''; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + width: 100%; + position: absolute; + bottom: -1px; + z-index: 100; + left: 0; + } + & > li { + & > a{ + &.active { + background: transparent; + box-shadow: none; + border-color: transparent; + &:hover, + &:focus, + &:active { + border-color: transparent; + background-color: transparent; + } + &:after, + &:before { + border: medium solid transparent; + content: ""; + height: 0; + left: 50%; + pointer-events: none; + position: absolute; + width: 0; + z-index: 120; + top: 98%; + } + &:after { + border-top-color: $body-background; + border-width: 10px; + margin-left:-10px; + } + &:before { + border-top-color: rgba(0, 0, 0, 0.2); + border-width: 11px; + margin-left:-11px; + } + } + span { + font-size: 1em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + &:hover, + &:focus { + overflow: visible; + @include transition( color 0.2s ease 0s); + } + } + } + & ~ .tab-content { + background: #fff; + } + // POSITIONG OPTIONS + &.nav-tabs-left { + &.nav-tabs { + &:after { + border-bottom: none; + } + & > li > a{ + &.active { + &:before { + border-top: 11px solid transparent; + border-bottom: 11px solid transparent; + border-left: 11px solid rgba(0, 0, 0, 0.2); + } + &:after { + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-left: 10px solid $body-background; + margin-top: 1px; + margin-right:2px; + } + &:after, + &:before { + top: auto; + right: -22px; + left: auto; + } + } + } + } + } + &.nav-tabs-right { + &.nav-tabs { + &:after { + border-bottom: none; + } + & > li > a{ + &.active { + &:before { + border-top: 11px solid transparent; + border-bottom: 11px solid transparent; + border-right: 11px solid rgba(0, 0, 0, 0.2); + } + &:after { + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-right: 10px solid $body-background; + margin-top: 1px; + margin-left:-9px; + } + &:after, + &:before { + top: auto; + left: -11px; + right: auto; + } + } + } + } + } +} +@media screen and (max-width:58em) { + .nav-tabs-linetriangle { + font-size: 0.6em; + } +} + +/* Tabs : Fill-up +------------------------------------ +*/ + +.nav-tabs-fillup { + &.nav-tabs-master { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-master; + border: 1px solid $color-master; + } + } + } + } + &.nav-tabs-primary { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-primary; + border: 1px solid $color-primary; + } + } + } + } + &.nav-tabs-success { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-success; + border: 1px solid $color-success; + } + } + } + } + &.nav-tabs-complete { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-complete; + border: 1px solid $color-complete; + } + } + } + } + &.nav-tabs-warning { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-warning; + border: 1px solid $color-warning; + } + } + } + } + &.nav-tabs-danger { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-danger; + border: 1px solid $color-danger; + } + } + } + } + &.nav-tabs-info { + & > li { + & > a { + &:after { + background: none repeat scroll 0 0 $color-info; + border: 1px solid $color-info; + } + } + } + } +} + +.nav-tabs-fillup { + @include backface-visibility(hidden); + @include perspective(1000); + & > li { + overflow: hidden; + & > a { + @include backface-visibility(hidden); + @include transition(color 0.3s ease 0s); + background: transparent; + &:after { + @include backface-visibility(hidden); + background: none repeat scroll 0 0 $color-success; + border: 1px solid $color-success; + content: ""; + height: calc(100% + 1px); + left: 0; + position: absolute; + top: 0; + -webkit-transform: translate3d(0, + 100%, + 0px); + transform: translate3d(0, + 100%, + 0px); + -webkit-transition: -webkit-transform 0.3s ease 0s; + transition: transform 0.3s ease 0s; + width: 100%; + z-index: -1; + } + span { + @include backface-visibility(hidden); + -webkit-transform: translate3d(0px, 5px, 0px); + transform: translate3d(0px, 5px, 0px); + -webkit-transition: -webkit-transform 0.5s ease 0s; + transition: transform 0.5s ease 0s; + display: block; + font-weight: 700; + line-height: 1.5; + } + &.active { + z-index: 100; + color: #fff; + &:hover, + &:focus { + border-color: transparent; + background: transparent; + color: #fff; + } + &:after { + @include translate3d(0px, 0px, 0px); + } + span { + @include translate3d(0px, -5px, 0px); + } + } + } + } + .icon:before { + @include translate3d(0px, 5px, 0px); + @include transition(transform 0.5s ease 0s); + display: block; + margin: 0; + } + & ~ .tab-content { + background: #fff; + } + // POSITIONG OPTIONS + &.nav-tabs-left, + &.nav-tabs-right { + border-bottom: none; + &:after { + border-bottom: none; + } + & > li { + & > a { + &:after { + width: calc(100% + 1px); + height: 100%; + } + } + &.active { + a{&:after { + @include translate3d(0px, 0px, 0px); + } + } + } + } + } + &.nav-tabs-left { + & > li { + & > a { + &:after { + @include translate3d(100%, 0, 0); + } + span { + @include translate3d(5px, 0, 0px); + } + } + &.active { + a{span { + @include translate3d(-5px, 0, 0px); + } + } + .icon:before { + @include translate3d(-5px, 0, 0px); + } + } + } + } + &.nav-tabs-right { + & > li { + & > a { + &:after { + @include translate3d(-100%, 0, 0); + left: -1px; + } + span { + @include translate3d(-5px, 0, 0px); + } + } + &.active { + a{span { + @include translate3d(5px, 0, 0px); + } + } + .icon:before { + @include translate3d(5px, 0, 0px); + } + } + } + } +} + +.nav-tabs-header{ + overflow: scroll; + width: 100%; + .nav-tabs{ + width:auto; + white-space: nowrap; + & > li{ + display:inline-block; + float: inherit; + } + } + &.nav-tabs-linetriangle{ + height:54px; + overflow-y: hidden; + &:after{ + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + width: 100%; + position: relative; + bottom: 3px; + z-index: 120; + content: ""; + clear: both; + } + & ~ .tab-content{ + position: relative; + top:-12px; + } + } +} +.nav-tabs-header ~ .tab-content{ + overflow: hidden; + padding: 15px; +} +.nav-tab-dropdown .cs-select{ + width: 100% !important; + max-width: 100%; + .cs-placeholder{ + height: 48px; + padding: 12px 34px 15px 15px; + font-family: 'Montserrat'; + font-weight: 500; + letter-spacing: 0.06em; + font-size: 10.5px; + text-transform: uppercase; + } + .cs-backdrop{ + border:1px solid transparent; + border-bottom: 1px solid $form-control-border-color; + } +} + +.nav-item { + .arrow_tab { + overflow: hidden; + background-color: $color-master-lighter; + opacity: 0.5; + border-color: $color-master-light; + } + .active { + .arrow_tab { + opacity: 1; + background-color: $color-white !important; + border-color: $color-white; + } + } +} + +/* Panel Groups +------------------------------------ +*/ + +.card-group { + margin-bottom: 18px; + &.horizontal{ + display: block; + .card+.card{ + border-left:1px solid $panel-border-color; + } + } + .card-heading { + padding: 13px 18px 10px 22px; + &.collapsed { + background-color: #fff; + } + & + .card-collapse { + .card-body { + border: 0; + } + } + .card-title { + width: 100%; + & > a { + color: $color-master; + font-size: 13px; + font-weight: normal; + display: block; + opacity: 1; + &:hover { + color: $color-master !important; + &:after { + color: $color-master !important; + } + } + &:after { + font-family: 'FontAwesome'; + content: "\f056"; + position: absolute; + right:13px; + top: 36%; + color: $color-master; + } + &.collapsed { + color: fade($color-master, + 70%); + opacity: 1; + &:after { + content: "\f055"; + color: fade($color-master, 70%); + } + } + } + } + } + .card { + -webkit-box-flex: 1; + -webkit-flex: 1 0 0; + -ms-flex: 1 0 0; + flex: 1 0 0; + & + .card { + margin-top: 2px; + } + .card-body { + height: auto; + } + } +} +.nav-pills { + > li { + &:first-child{ + padding-left: 0; + } + // Links rendered as pills + padding-left: 0; + > a { + color: $color-master; + } + // Active state + &.active > a { + &, + &:hover, + &:focus { + color: $color-master; + background-color: $color-master-light; + } + } + } + +} +@media (max-width:767px) { + + .nav.nav-tabs.nav-stack-sm { + li { + float: none; + } + &.nav-tabs-linetriangle > li.active > a:after, + &.nav-tabs-linetriangle > li.active > a:before { + display: none; + } + } +} + +.tabButton { + cursor: pointer; + &.active { + background-color: #ffffff !important; + cursor: default; + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_timeline.scss b/resources/assets/sass/modules/_timeline.scss new file mode 100644 index 00000000..ca94a9c2 --- /dev/null +++ b/resources/assets/sass/modules/_timeline.scss @@ -0,0 +1,521 @@ +/*------------------------------------------------------------------ +[24. Timeline] +*/ + +/* + Adapted from Vertical Timeline by Sebastiano Guerriero + http://codyhouse.co/gem/vertical-timeline/ +*/ + +/* -------------------------------- + +Modules - reusable parts of our design + +-------------------------------- */ + +.timeline-container { + /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ + + width: 90%; + max-width: 1170px; + margin: 0 auto; + &::after { + /* clearfix */ + + content: ''; + display: table; + clear: both; + } + &.top-circle{ + &:before{ + position: absolute; + width: 20px; + height: 20px; + @include border-radius(99px); + background-color: #fff; + z-index: 10; + } + } +} +/* -------------------------------- + +Main components + +-------------------------------- */ + +.timeline { + position: relative; + padding: 3em 0 10em 0; + margin-top: 0; + margin-bottom: 0; + &::before { + /* this is the vertical line */ + + content: ''; + position: absolute; + top: 0; + left: 18px; + height: 100%; + width: 2px; + background: #fff; + } +} +@media only screen and (min-width: 1170px) { + .timeline-container:not(.left) { + .timeline { + margin-bottom: 0; + &::before { + left: 50%; + margin-left: -2px; + } + } + } +} +.timeline-block { + position: relative; + margin: 2em 0; + &:after { + content: ""; + display: table; + clear: both; + } + &:first-child { + margin-top: 0; + } + &:last-child { + margin-bottom: 0; + } +} +@media only screen and (min-width: 1170px) { + .timeline-container:not(.left) { + .timeline { + .timeline-block { + margin: 4em 0; + &:first-child { + margin-top: 0; + } + &:last-child { + margin-bottom: 0; + } + } + } + } +} +.timeline-point { + position: absolute; + top: 12px; + left: 0; + width: 40px; + height: 40px; + border-radius: 50%; + text-align: center; + background: darken($color-master-light, 20%); + border: 2px solid #fff; + &.small { + height: 12px; + margin-left: 13px; + margin-top: 14px; + width: 12px; + } + i { + color: #fff; + font-size: 14px; + left: 50%; + margin-left: -7px; + margin-top: -7px; + position: absolute; + top: 50%; + } + &.primary { + background-color: $color-primary; + } + &.complete { + background-color: $color-complete; + } + &.success { + background-color: $color-success; + } + &.info { + background-color: $color-info; + } + &.danger { + background-color: $color-danger; + } + &.warning { + background-color: $color-warning; + } +} +@media only screen and (min-width: 1170px) { + .timeline-container:not(.left) { + .timeline { + .timeline-point { + left: 50%; + margin-left: -21px; + /* Force Hardware Acceleration in WebKit */ + + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + &.is-hidden { + visibility: hidden; + } + &.small { + margin-left: -7px; + } + &.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-1 0.6s; + -moz-animation: cd-bounce-1 0.6s; + animation: cd-bounce-1 0.6s; + } + } + } + } +} +@-webkit-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); + } + 60% { + opacity: 1; + -webkit-transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -moz-transform: scale(0.5); + } + 60% { + opacity: 1; + -moz-transform: scale(1.2); + } + 100% { + -moz-transform: scale(1); + } +} +@keyframes cd-bounce-1 { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); + -moz-transform: scale(0.5); + -ms-transform: scale(0.5); + -o-transform: scale(0.5); + transform: scale(0.5); + } + 60% { + opacity: 1; + -webkit-transform: scale(1.2); + -moz-transform: scale(1.2); + -ms-transform: scale(1.2); + -o-transform: scale(1.2); + transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); + } +} +.timeline-content { + position: relative; + margin-left: 60px; + &:after { + content: ""; + display: table; + clear: both; + } + .card { + margin-bottom: 0; + } + .event-date { + display: inline-block; + float: left; + padding: .8em 0; + opacity: .7; + clear: both; + } +} +@media (max-width: 480px) { + .timeline-container{ + width: 94%; + } +} +@media only screen and (min-width: 768px) {} @media only screen and (min-width: 1170px) { + .timeline-container:not(.left) { + .timeline { + .timeline-content { + margin-left: 0; + width: 46%; + &::before { + top: 24px; + left: 100%; + border-color: transparent; + border-left-color: white; + } + &.is-hidden { + visibility: hidden; + } + &.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-2 0.6s; + -moz-animation: cd-bounce-2 0.6s; + animation: cd-bounce-2 0.6s; + } + .event-date { + position: absolute; + width: 100%; + left: 118%; + top: -2px; + font-size: 16px; + font-size: 1rem; + small { + margin-top: 13px; + display: block; + } + h6 + small { + margin-top: 0; + } + } + } + .timeline-block { + &:nth-child(odd) .timeline-content .card { + float: right; + } + &:nth-child(even) { + .timeline-content { + float: right; + &::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: white; + } + .event-date { + left: auto; + right: 118%; + text-align: right; + } + } + } + } + } + } +} +@media only screen and (min-width: 1170px) { + /* inverse bounce effect on even content blocks */ + + .timeline-container:not(.left) { + .timeline { + .timeline-block:nth-child(even) .timeline-content.bounce-in { + -webkit-animation: cd-bounce-2-inverse 0.6s; + -moz-animation: cd-bounce-2-inverse 0.6s; + animation: cd-bounce-2-inverse 0.6s; + } + } + } +} +@-webkit-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -webkit-transform: translateX(-100px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(20px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -moz-transform: translateX(-100px); + } + 60% { + opacity: 1; + -moz-transform: translateX(20px); + } + 100% { + -moz-transform: translateX(0); + } +} +@keyframes cd-bounce-2 { + 0% { + opacity: 0; + -webkit-transform: translateX(-100px); + -moz-transform: translateX(-100px); + -ms-transform: translateX(-100px); + -o-transform: translateX(-100px); + transform: translateX(-100px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -ms-transform: translateX(20px); + -o-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + -o-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -webkit-transform: translateX(100px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -moz-transform: translateX(100px); + } + 60% { + opacity: 1; + -moz-transform: translateX(-20px); + } + 100% { + -moz-transform: translateX(0); + } +} +@keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -webkit-transform: translateX(100px); + -moz-transform: translateX(100px); + -ms-transform: translateX(100px); + -o-transform: translateX(100px); + transform: translateX(100px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-20px); + -moz-transform: translateX(-20px); + -ms-transform: translateX(-20px); + -o-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + -o-transform: translateX(0); + transform: translateX(0); + } +} +.timeline-container { + &.center { + .timeline { + // Split view + margin-top: 3em; + margin-bottom: 3em; + &::before { + left: 50%; + margin-left: -2px; + } + .timeline-point { + left: 50%; + margin-left: -21px; + /* Force Hardware Acceleration in WebKit */ + + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + &.is-hidden { + visibility: hidden; + } + &.small { + margin-left: -7px; + } + &.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-1 0.6s; + -moz-animation: cd-bounce-1 0.6s; + animation: cd-bounce-1 0.6s; + } + } + .timeline-content { + margin-left: 0; + width: 46%; + &::before { + top: 24px; + left: 100%; + border-color: transparent; + border-left-color: white; + } + &.is-hidden { + visibility: hidden; + } + &.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-2 0.6s; + -moz-animation: cd-bounce-2 0.6s; + animation: cd-bounce-2 0.6s; + } + .event-date { + position: absolute; + width: 100%; + left: 118%; + top: -2px; + font-size: 16px; + font-size: 1rem; + small { + margin-top: 13px; + display: block; + } + h6 + small { + margin-top: 0; + } + } + } + .timeline-block { + &:nth-child(odd) .timeline-content .card { + float: right; + } + &:nth-child(even) { + .timeline-content { + float: right; + &::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: white; + } + .event-date { + left: auto; + right: 118%; + text-align: right; + } + } + } + } + } + } +} + +@media only screen and (min-width: 1170px) { + .timeline-container.left{ + width: 60%; + margin-left: 100px; + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_treeview.scss b/resources/assets/sass/modules/_treeview.scss new file mode 100644 index 00000000..527a316a --- /dev/null +++ b/resources/assets/sass/modules/_treeview.scss @@ -0,0 +1,36 @@ +/*------------------------------------------------------------------ +[13. Treeview] +*/ + +span.dynatree-active a{ + color:$color-master-dark !important; + background-color: transparent !important; +} + +span.dynatree-selected a{ + color:$color-master-dark !important; + font-style: normal; + +} +ul.dynatree-container a:focus, span.dynatree-focused a:link{ + background-color: transparent; +} +ul.dynatree-container{ + background-color: transparent; + a:hover{ + color: $color-master; + opacity: 0.7; + background-color: transparent; + } +} + +ul.dynatree-container a{ + color: $color-master; +} + +span.dynatree-empty, span.dynatree-vline, span.dynatree-connector, span.dynatree-expander, span.dynatree-icon, span.dynatree-checkbox, span.dynatree-radio, span.dynatree-drag-helper-img, #dynatree-drop-marker{ + height: 17px; + position: relative; + top: 3px; +} + diff --git a/resources/assets/sass/modules/_typography.scss b/resources/assets/sass/modules/_typography.scss new file mode 100644 index 00000000..6e9934dc --- /dev/null +++ b/resources/assets/sass/modules/_typography.scss @@ -0,0 +1,885 @@ +/*------------------------------------------------------------------ +[5. Typography] +*/ + +/* Standard elements +-------------------------------------------------- +*/ + +/* To Load Hinted Fonts for Windows */ +@import url('https://fonts.googleapis.com/css?family=Montserrat:400,500,600'); + +@import url('https://fonts.googleapis.com/css?family=Lato:100,300,400,700,900'); + +@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,500,600'); + +@import url('https://fonts.googleapis.com/css?family=Orbitron:400,500,600'); + +html{ + font-size: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body{ + color: $color-master; + font-family: 'Open Sans', sans-serif !important; + font-size: 14px; + font-weight: normal; + letter-spacing: 0.01em; + -webkit-font-smoothing:antialiased; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; +} +/* Headings +------------------------------------ +*/ +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: "Segoe UI","Helvetica Neue", Helvetica, Arial, sans-serif; + -webkit-font-smoothing:antialiased; + -webkit-text-size-adjust:100%; + -ms-text-size-adjust:100%; + font-weight: 300; + color: $color-master-dark; +} +h1 { + font-size: 44px; + line-height: 55px; + letter-spacing: -0.08px; +} +h2 { + font-size: 31px; + line-height: 40px; +} +h3 { + font-size: 27px; + line-height: 35px; +} +h4 { + font-size: 22px; + line-height: 31.88px; +} +h5{ + font-size: 18px; + line-height: 25.88px; +} +h3 small, +h4 small, +h5 small { + font-weight: 300; +} +h1.block, +h2.block, +h3.block, +h4.block, +h5.block, +h6.block { + padding-bottom: 10px; +} +/* Lins and Others +------------------------------------ +*/ +a { + text-shadow: none !important; + color: $color-primary-dark; + transition: color 0.1s linear 0s,background-color 0.1s linear 0s,opacity 0.2s linear 0s !important; +} +a:focus, a:hover, a:active { + color: $color-primary; +} +a,a:focus, a:hover, a:active { + outline: 0 !important; + text-decoration: none; +} +a[ng-click] { + cursor: pointer; +} +br { + line-height: normal; + clear: both; +} +code{ + color:$color-danger-dark; + background-color: $color-master-lighter; + &:hover { + background-color: $color-danger-lighter; + } +} +p { + display: block; + font-size: 14px; + font-weight: normal; + letter-spacing: 0.01em; + line-height: 22px; + margin: 0px 0px 10px 0px; + font-style: normal; + white-space: normal; +} +small, +.small{ + line-height: 18px; + font-size: 85%; +} +label { + &.inline { + display: inline-block; + position: relative; + top: 0px; + font-size: 13px; + } +} +ul,ol { + margin-bottom: 10px; + & > li { + padding-left: 3px; + line-height: 24px; + } + &.lg-icon{ + & > li { + font-size: 21px; + & span { + font-size: 14px; + } + } + } + &.no-style{ + list-style: none; + padding-left: 5px; + } +} +address { + margin-bottom: 0px; + a{ + color:$color-master; + } +} +blockquote { + padding: 0 0 0 18px; + border-left:0; + &:before{ + content: ''; + font-family: FontAwesome; + content: "\f10d"; + margin-right: 13px; + float: left; + } + p { + font-size: 16px; + } + small { + line-height: 29px; + color: #8b91a0; + padding-left: 30px; + &:before { + content: ""; + } + } + &.pull-right { + border-right:0; + &:before{ + float: right; + content: ''; + font-family: FontAwesome; + content: "\f10d"; + margin-left: 13px; + margin-right: 0; + } + small { + padding-right: 30px; + &:after { + content: ""; + } + } + } +} +hr{ + border-color:$color-master-light; + &.double{ + border-width:2px; + } + &.dotted{ + border-style:dotted none none; + } +} + +/* Font Sizes +------------------------------------ +*/ + +.small-text { + font-size: 12px !important; +} +.normal-text { + font-size: 13px !important; +} +.large-text { + font-size: 15px !important; +} + +/* Font Weights +------------------------------------ + */ + +.normal { + font-weight: normal; +} +.semi-bold { + font-weight: 400 !important; +} +.bold { + font-weight: bold !important; +} +.light { + font-weight: 300 !important; +} + +.lightest { + font-weight: 100 !important; +} + + +/* Misc +------------------------------------ +*/ + +.logo { + margin: 18px 14px; +} +.all-caps { + text-transform: uppercase; +} +.muted { + color: lighten($color-master,50%); +} +.hint-text{ + opacity: .7; +} +.no-decoration{ + text-decoration:none !important; +} +/* Monochrome Colors +------------------------------------ + */ + +.bg-master{ + background-color: $color-master !important; +} +.bg-master-light{ + background-color: $color-master-light !important; +} +.bg-master-lighter{ + background-color: $color-master-lighter !important; +} +.bg-master-lightest{ + background-color: $color-master-lightest !important; +} +.bg-master-dark{ + background-color: $color-master-dark !important; +} +.bg-master-darker{ + background-color: $color-master-darker !important; +} +.bg-master-darkest{ + background-color: $color-master-darkest !important; +} + +/* Contextual Colors +------------------------------------ +*/ + +.bg-primary-complete-gradient { + background: linear-gradient(to right, $color-complete, $color-primary); +} +/* Primary +------------------------------------ +*/ +.bg-primary { + background-color: $color-primary !important; +} +.bg-primary-dark { + background-color: $color-primary-dark !important; +} +.bg-primary-darker { + background-color: $color-primary-darker !important; +} +.bg-primary-light { + background-color: $color-primary-light !important; +} +.bg-primary-lighter { + background-color: $color-primary-lighter !important; +} + +/* Complete +------------------------------------ +*/ +.bg-complete { + background-color: $color-complete !important; +} +.bg-complete-dark { + background-color: $color-complete-dark !important; +} +.bg-complete-darker { + background-color: $color-complete-darker !important; +} +.bg-complete-light { + background-color: $color-complete-light !important; +} +.bg-complete-lighter { + background-color: $color-complete-lighter !important; +} + +/* Success +------------------------------------ +*/ +.bg-success { + background-color: $color-success !important; +} +.bg-success-dark { + background-color: $color-success-dark !important; +} +.bg-success-darker { + background-color: $color-success-darker !important; +} +.bg-success-light { + background-color: $color-success-light !important; +} +.bg-success-lighter { + background-color: $color-success-lighter !important; +} + +/* Info +------------------------------------ +*/ +.bg-info{ + background-color: $color-info !important; +} +.bg-info-dark{ + background-color: $color-info-dark !important; +} +.bg-info-darker{ + background-color: $color-info-darker !important; +} +.bg-info-light{ + background-color: $color-info-light !important; +} +.bg-info-lighter{ + background-color: $color-info-lighter !important; +} + +/* Danger +------------------------------------ +*/ +.bg-danger { + background-color: $color-danger !important;; +} +.bg-danger-dark { + background-color: $color-danger-dark !important; +} +.bg-danger-darker { + background-color: $color-danger-darker !important; +} +.bg-danger-light { + background-color: $color-danger-light !important; +} +.bg-danger-lighter { + background-color: $color-danger-lighter !important; +} + +/* Warning +------------------------------------ + */ +.bg-warning { + background-color: $color-warning !important; +} +.bg-warning-dark { + background-color: $color-warning-dark !important; +} +.bg-warning-darker { + background-color: $color-warning-darker !important; +} +.bg-warning-light { + background-color: $color-warning-light !important; +} +.bg-warning-lighter { + background-color: $color-warning-lighter !important; +} + +/* More Color Options +------------------------------------ +*/ + +/* Menu +------------------------------------ +*/ +.bg-menu-dark{ + background-color: $color-menu-dark; +} +.bg-menu{ + background-color: $color-menu; +} +.bg-menu-light{ + background-color: $color-menu-light; +} + +/* Gradients +------------------------------------ +*/ +.gradient-grey { + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) 75%); + background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) 75%); +} +.gradient-black { + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) 75%); + background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, rgba(0,0,0,0.8) 75%); +} + +/* Other Colors +------------------------------------ +*/ +.bg-white{ + background-color: #fff; +} +.bg-transparent{ + background-color: transparent !important; +} + +/* Text Colors */ +.link{ + opacity: .7; + &:hover{ + opacity: 1; + } +} +.text-black { + color: $color-master-dark !important; +} +.hover-black { + color: $color-master-dark !important; +} +.text-white { + color: #fff !important; +} +.hover-white { + &:hover { + color: $color-white !important; + } +} + +.text-master { + color: $color-master !important; +} +.text-master-dark { + color: $color-master-dark !important; +} +.text-master-darker { + color: $color-master-darker !important; +} +.text-master-light { + color: $color-master-light !important; +} +.text-master-lighter { + color: $color-master-lighter !important; +} +.hover-master { + &:hover { + color: $color-master !important; + } +} + +.text-complete { + color: $color-complete !important; +} +.text-complete-dark { + color: $color-complete-dark !important; +} +.text-complete-darker { + color: $color-complete-darker !important; +} +.text-complete-light { + color: $color-complete-light !important; +} +.text-complete-lighter { + color: $color-complete-lighter !important; +} +.hover-complete { + &:hover { + color: $color-complete !important; + } +} + +.text-success { + color: $color-success !important; +} +.text-success-dark { + color: $color-success-dark !important; +} +.text-success-darker { + color: $color-success-darker !important; +} +.text-success-light { + color: $color-success-light !important; +} +.text-success-lighter { + color: $color-success-lighter !important; +} +.hover-success { + &:hover { + color: $color-success !important; + } +} + +.text-info { + color: $color-info !important; +} +.text-info-dark { + color: $color-info-dark !important; +} +.text-info-darker { + color: $color-info-darker !important; +} +.text-info-light { + color: $color-info-light !important; +} +.text-info-lighter { + color: $color-info-lighter !important; +} +.hover-warning { + color: $color-warning !important; +} +.hover-info { + &:hover { + color: $color-info !important; + } +} + +.text-warning-dark { + color: $color-warning-dark !important; +} +.text-warning-darker { + color: $color-warning-darker !important; +} +.text-warning-light { + color: $color-warning-light !important; +} +.text-warning-lighter { + color: $color-warning-lighter !important; +} +.hover-warning { + &:hover { + color: $color-warning !important; + } +} + +.text-danger { + color: $color-danger !important; +} +.text-danger-dark { + color: $color-danger-dark !important; +} +.text-danger-darker { + color: $color-danger-darker !important; +} +.text-danger-light { + color: $color-danger-light !important; +} +.text-danger-lighter { + color: $color-danger-lighter !important; +} +.hover-danger { + &:hover{ + color: $color-danger !important; + } +} + +.text-primary { + color: $color-primary !important; +} +.text-primary-dark { + color: $color-primary-dark !important; +} +.text-primary-darker { + color: $color-primary-darker !important; +} +.text-primary-light { + color: $color-primary-light !important; +} +.text-primary-lighter { + color: $color-primary-lighter !important; +} +.hover-primary { + &:hover { + color: $color-primary !important; + } +} + +/* Text Aligngments +------------------------------------ +*/ + +.text-right { + text-align: right !important; +} +.text-left { + text-align: left !important; +} +.text-center { + text-align: center !important; +} + + +.text-underline { + text-decoration: underline !important; +} + +.pointer { + cursor: pointer !important; +} + +/* Labels +------------------------------------ +*/ + +.label { + padding: 3px 9px; + font-size: 11px; + line-height: 1; + text-shadow: none; + background-color: $color-master-light; + font-weight: 600; + color: $color-master; + border-radius: .25em; +} +.label-success { + background-color: $color-success; + color: #fff; +} +.label-warning{ + background-color: $color-warning; + color: #fff; +} +.label-important, .label-danger { + background-color: $color-danger; + color: #fff; +} +.label-info{ + background-color: $color-success; + color: #fff; +} +.label-inverse { + background-color: $color-complete-dark; + color: #fff; +} +.label-white { + background-color: #fff; + color: $color-master; +} + +/* Line-heights +------------------------------------ +*/ +.lh-normal{ + line-height: normal; +} + +/* Font Faces +------------------------------------ +*/ + +.font-arial{ + font-family: Arial, sans-serif !important; +} +.font-opensans{ + font-family: 'Open Sans', sans-serif !important; +} +.font-montserrat{ + font-family: 'Montserrat', sans-serif !important; +} + +.font-lato{ + font-family: 'Lato', sans-serif !important; +} + +.font-orbitron{ + font-family: 'Orbitron', sans-serif !important; +} + +.font-georgia{ + font-family: 'Georgia', sans-serif !important; +} +.font-heading{ + font-family: "Segoe UI","Helvetica Neue", Helvetica, Arial, sans-serif; +} + +/* Wells +------------------------------------ +*/ +.well { + background-color: $color-master-light; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + border: none; + background-image: none; + &.well-large { + padding: 24px; + width: auto; + } + &.well-small { + padding: 13px; + width: auto; + } + &.green { + background-color: $color-complete; + color: $color-white ; + border: none; + } +} +.overflow-ellipsis{ + text-overflow:ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.jumbotron { + @include border-radius(0); + p{ + font-size: 14px; + font-weight: normal; + margin-bottom: inherit; + &.small{ + font-size: 85%; + } + } +} + + +/* Responsive Handlers : Typo +------------------------------------ +*/ + +@media (max-width: 1400px) { + + body, p{ + font-size: 13px; + line-height: 20px; + } + + + h1 { + font-size: 33px; + line-height: 44px; + letter-spacing: -0.08px; + } + h2 { + font-size: 28px; + line-height: 40px; + } + h3 { + font-size: 24px; + line-height: 35.88px; + } + h4 { + font-size: 18px; + line-height: 33.88px; + } + h5{ + font-size: 16px; + line-height: 25.88px; + } + small, .small{ + font-size: 89%; + line-height: 17px; + } + +} + + +/* For Windows : Fixes +------------------------------------ +*/ +.windows { + body, + p{ + font-size: 13px; + letter-spacing: normal; + } + h3{ + font-size: 29px; + line-height: 33px; + } + h4{ + font-size: 23px; + line-height: 32px; + } + h5{ + font-size: 19px; + line-height: 28px; + font-weight: normal; + } + h1, + h2, + h3, + h4, + h5{ + font-weight: 300; + letter-spacing: normal; + + } + + .jumbotron p{ + font-size: 13px; + &.small{ + font-size: 85%; + } + } + small, + .small{ + // font-size: 85%; + font-size: 89%; + } + + +} + +.alert { + & > p, & > ul { + margin-bottom: 0; + } +} +.table{ + & > tbody{ + & > tr{ + & > td, & > th{ + line-height: 1.42857143; + } + } + } + & > tfoot{ + & > tr{ + & > td, & > th{ + line-height: 1.42857143; + } + } + } + & > thead{ + & > tr{ + & > td, & > th{ + line-height: 1.42857143; + } + } + } +} + +.fa { + line-height: 18px !important; +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_vector_map.scss b/resources/assets/sass/modules/_vector_map.scss new file mode 100644 index 00000000..17240989 --- /dev/null +++ b/resources/assets/sass/modules/_vector_map.scss @@ -0,0 +1,144 @@ +/*------------------------------------------------------------------ +[26. Vector Map : Mapplic Plugin] +*/ + +.horizontal-app-menu{ + .map-controls{ + left: 0; + } +} +.mapplic-container { + width: 100%; + background-color: transparent; + .mapplic-fullscreen-button { + left: auto; + right: 154px; + bottom: 0; + top: auto; + } + .mapplic-clear-button { + visibility: hidden; + } +} +.mapplic-tooltip:before { + content: "Location"; + font-size: 12px; + margin: 0; + line-height: normal; + opacity: .7; + color: $color-master; +} +.mapplic-tooltip-close { + opacity: .5; + background: none; + &:after { + content: "\e60a"; + font-family: 'pages-icon'; + font-size: 12px; + position: relative; + top: -2px; + color: $color-master; + opacity: .7; + } +} +.mapplic-tooltip-title { + display: none; +} +.mapplic-tooltip-content { + margin-top: 5px; +} +.mapplic-tooltip { + max-width: 150px; + padding: 10px 12px; + border-radius: 4px; +} +.mapplic-tooltip-description { + font-weight: bold; + color: $color-master; +} +.mapplic-tooltip-description strong { + color: $color-danger; + margin-right: 2px; +} +.map-controls { + position: absolute; + left: 50px; + top: 80px; + z-index: 1; +} +.mapplic-pin { + background-image: url('#{$assets-url}/img/maps/marker-master.svg'); + background-size: contain; + &.pulse { + background-image: url('#{$assets-url}/img/maps/pulse-master.svg'); + &.green { + background-image: url('#{$assets-url}/img/maps/pulse-success.svg'); + } + &.blue { + background-image: url('#{$assets-url}/img/maps/pulse-complete.svg'); + } + &.purple { + background-image: url('#{$assets-url}/img/maps/pulse-primary.svg'); + } + &.yellow { + background-image: url('#{$assets-url}/img/maps/pulse-warning.svg'); + } + &.red { + background-image: url('#{$assets-url}/img/maps/pulse-danger.svg'); + } + } + &.pulse-alt { + background-image: url('#{$assets-url}/img/maps/pulse-alt-master.svg'); + &.green { + background-image: url('#{$assets-url}/img/maps/pulse-alt-success.svg'); + } + &.blue { + background-image: url('#{$assets-url}/img/maps/pulse-alt-complete.svg'); + } + &.purple { + background-image: url('#{$assets-url}/img/maps/pulse-alt-primary.svg'); + } + &.yellow { + background-image: url('#{$assets-url}/img/maps/pulse-alt-warning.svg'); + } + &.red { + background-image: url('#{$assets-url}/img/maps/pulse-alt-danger.svg'); + } + } + &.marker { + background-image: url('#{$assets-url}/img/maps/marker-master.svg'); + &.green { + background-image: url('#{$assets-url}/img/maps/marker-success.svg'); + } + &.blue { + background-image: url('#{$assets-url}/img/maps/marker-complete.svg'); + } + &.purple { + background-image: url('#{$assets-url}/img/maps/marker-primary.svg'); + } + &.yellow { + background-image: url('#{$assets-url}/img/maps/marker-warning.svg'); + } + &.red { + background-image: url('#{$assets-url}/img/maps/marker-danger.svg'); + } + } + &.marker-alt { + background-image: url('#{$assets-url}/img/maps/marker-alt-master.svg'); + &.green { + background-image: url('#{$assets-url}/img/maps/marker-alt-success.svg'); + } + &.blue { + background-image: url('#{$assets-url}/img/maps/marker-alt-complete.svg'); + } + &.purple { + background-image: url('#{$assets-url}/img/maps/marker-alt-primary.svg'); + } + &.yellow { + background-image: url('#{$assets-url}/img/maps/marker-alt-warning.svg'); + } + &.red { + background-image: url('#{$assets-url}/img/maps/marker-alt-danger.svg'); + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_view.scss b/resources/assets/sass/modules/_view.scss new file mode 100644 index 00000000..6e9529a5 --- /dev/null +++ b/resources/assets/sass/modules/_view.scss @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------ +[2. View Ports] +*/ +.view-port{ + position: relative; + width: 100%; + height: 100%; + display: block; + white-space: nowrap; + overflow: hidden; + .navbar{ + border-radius: 0; + padding-left: 0; + margin-bottom:0; + border-left: 0; + display: table; + width: 100%; + top: 0; + border-top: 0; + padding: 0; + border-bottom: 1px solid #e7e7e7; + .navbar-inner{ + display: table-cell; + height: 50px; + vertical-align: middle; + } + .action{ + position: absolute; + top:0; + line-height: 50px; + z-index: 1; + &.pull-right{ + right: 0; + } + } + .view-heading{ + font-size: 15px; + text-align: center; + } + & > p{ + line-height: 12px; + font-size: 12px; + margin: 0; + } + &.navbar-sm{ + min-height: 35px; + .navbar-inner{ + height: 35px; + } + .action{ + line-height: 35px; + } + } + } + .view{ + display: inline-block; + width: 100%; + height: 100%; + vertical-align: top; + @include backface-visibility(hidden); + -webkit-perspective: 1000; + @include transition(all 0.4s ease); + &:first-child{ + &:before{ + position: absolute; + content: ''; + width: 100%; + height: 100%; + background-color: #000; + opacity:0; + @include transition(opacity 0.2s linear); + z-index: -1 + } + } + &:last-child{ + margin-left: -4px + } + &:only-child{ + margin: 0; + } + } + &.from-top{ + & > .view{ + &:last-child{ + @include translate3d(-100%,0,0); + } + } + } + &.push{ + & > .view{ + &:first-child{ + @include translate3d(-100%,0,0); + } + &:last-child{ + @include translate3d(-100%,0,0); + } + } + } + &.push-parrallax{ + & > .view{ + &:first-child{ + @include transition(all 400ms cubic-bezier(0.1,.7,.1,1)); + @include translate3d(-25%,0,0); + &:before{ + opacity:0; + z-index: 100; + } + } + &:last-child{ + @include transition(all 400ms cubic-bezier(0.1,.7,.1,1)); + @include translate3d(-100%,0,0); + box-shadow:0 0 9px rgba(191,191,191,.36); + } + } + } +} \ No newline at end of file diff --git a/resources/assets/sass/modules/_widgets.scss b/resources/assets/sass/modules/_widgets.scss new file mode 100644 index 00000000..8034776f --- /dev/null +++ b/resources/assets/sass/modules/_widgets.scss @@ -0,0 +1,472 @@ +/*------------------------------------------------------------------ +[27. Widgets] +*/ +.widget { + position: relative; + & > div { + position: relative; + z-index: 1; + } + &:after { + background-size: cover; + content: " "; + left: 0; + right: 0; + top: 0; + bottom: 0; + position: absolute; + z-index: 0; + opacity: .69; + } +} +.widget-1 { + &:after { + background-image: url("#{$assets-url}/img/dashboard/pages_hero.jpg"); + background-size: cover; + content: " "; + left: 0; + right: 0; + top: 0; + bottom: 0; + position: absolute; + z-index: 0; + opacity: .69; + } + &:before { + background-image: url('#{$base-img-url}/linear_gradient.png'); + background-repeat: repeat-x; + content: " "; + left: 0; + right: 0; + height: 325px; + bottom: 0; + position: absolute; + z-index: 1; + } + & > .card-block { + // padding: 54px 37px 37px 37px; + .company:nth-child(2) > div { + display: table; + margin: 0 auto; + width: 127px; + } + } + & > .card-block > * { + z-index: 1; + } + & > .card-block > *:not(.pull-bottom) { + position: relative; + } + & > .card-block .pull-bottom { + padding: 0 49px 56px 42px; + } + span.label { + color: #fff; + background: rgba(255, 255, 255, .3); + } +} +.widget-2 { + &:after { + background-image: url("#{$assets-url}/img/social/person-cropped.jpg"); + } +} +.widget-3 { + a{text-decoration: none; + } + .pg-map { + font-size: 30px; + } + .widget-3-fav { + background: rgba(0, 0, 0, 0.07); + vertical-align: middle; + padding: 6px 11px; + display: block; + } +} + +.widget-4{ + .row-sm-height:nth-child(1){ + height:30px; + } + .row-sm-height:nth-child(2){ + height:30px; + } +} +.widget-4-chart { + height: 100%; + width: 100%; + bottom: 0; + position: absolute; + right: 0; + &.line-chart .tick text, + .line-chart .nvd3 .nv-axis .nv-axisMaxMin text { + transform: translate(-10px, -32px); + } + .nvtooltip .nv-pointer-events-none { + thead { + display: none; + } + tbody { + .nv-pointer-events-none .key { + display: none; + } + } + } +} +.widget-5-chart-container { + overflow: hidden +} +.widget-5-chart { + height: auto; + width: auto; + bottom: 20px; + position: absolute; + right: 20px; + left: 20px; + top: 40px; +} +.widget-6 { + background: mix($color-master, + #fff, + 69%); + .label { + background: rgba(0, 0, 0, .3); + color: rgba(255, 255, 255, .67); + } +} +.widget-7 { + .slide-back{ + .row-sm-height:nth-child(1){ + height: 60%; + } + .row-sm-height:nth-child(2){ + height: 40%; + } + } +} +.widget-7-chart { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + &.line-chart[data-points="true"] .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + stroke-opacity: 1; + } + .nvd3 circle.nv-point:nth-child(4) { + fill: $color-danger !important; + stroke: $color-danger !important; + } +} +.widget-8{ + height:145px; + .row-xs-height:first-child{ + height:41px + } +} +.widget-8-chart { + height: 100px; + width: 50%; + bottom: 0; + position: absolute; + right: 0; + .line-chart[data-points="true"] .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + stroke-opacity: 0.3; + } + .line-chart .nvd3 .nv-groups path.nv-line { + stroke-opacity: 0.15; + } + .nvtooltip{ + display: none; + } +} + +.widget-9{ + height:145px; + .row-xs-height:first-child{ + height:26px; + } + .progress{ + background:rgba(0,0,0,.1); + } +} +.widget-10{ + height:145px; +} +.widget-11 { + sup { + margin-right: -4px; + } + .widget-11-table{ + height:380px; + tr td:first-child{ + width: 40%; + } + } +} +.widget-11-2 { + sup { + margin-right: -4px; + } + .widget-11-2-table{ + height:273px; + } +} + +.widget-12 { + .list-inline { + a{padding: 3px 4px; + border-radius: 3px; + opacity: .7; + } + .active a { + opacity: 1; + } + } + .nvd3-line svg{ + height:316px; + } + .company-stat-boxes .close{ + line-height:0; + } + .widget-12-search{ + margin-top: -3px; + } +} +.widget-14 { + .row-xs-height:nth-child(1){ + height: 30px + } + .row-xs-height:nth-child(2){ + height: 120px + } + .row-xs-height:nth-child(3){ + height: 297px + } +} +.widget-14-chart_y_axis { + position: absolute; + top: 0; + background: rgba(255, 255, 255, .8); + bottom: 0; + width: 35px; + left: 0; + z-index: 2; + .rickshaw_graph .y_ticks path, + .rickshaw_graph .x_ticks_d3 path { + fill: none; + stroke: none; + } + .rickshaw_graph .y_ticks text, + .rickshaw_graph .x_ticks_d3 text { + opacity: 0.35; + font-size: 11px; + } + .y_ticks.plain g:first-child { + opacity: 0 !important; + } +} +.widget-14-chart-legend .ui-sortable li { + padding-right: 0; + .action { + display: none; + } + &:last-child { + margin-top: 7px; + } +} + +.widget-15{ + #widget-15-tab-1 > div{ + height:170px; + } +} +.widget-15-2{ + height:469px; + #widget-15-2-tab-1 .full-width{ + height:180px; + } +} +.widget-16-header .pull-left:last-child{ + width:69%; +} +.widget-16-chart { + height:100px; + &.line-chart[data-stroke-width="2"] .nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { + stroke-width: 2px; + } +} + +.widget-17{ + height:467px; + .widget-17-weather{ + width:90% + } +} +.widget-18-post { + height:342px; + background: url('#{$assets-url}/img/social/quote.jpg'); + background-position: center center; + background-size: cover +} +.widget-19-post { + height:237px; + background: #00A79A; + img { + top: 50%; + margin-top: -70px + } +} +.btn-circle-arrow { + border: 1px solid #fff; + border-radius: 100px; + position: relative; + width: 18px; + height: 18px; + display: inline-block; + vertical-align: middle; + margin-right: 4px; + i { + font-size: 11px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -5px; + margin-top: -4px; + } +} + +/*** Large screens ***/ +@media only screen and (min-width:1824px) { + // Dashboard + .ar-3-2:before { + padding-top: calc(55% - 5px) !important; + } + .ar-2-3:before { + padding-top: calc(135% - 5px) !important; + } +} +@media (max-width:991px) { + .card { + height: auto !important; + } + .widget-8, + .widget-9, + .widget-10 { + height: 180px !important; + } +} +@media (max-width:480px) { + .widget-1-wrapper { + height: 340px; + } +} + + +/* WIDGET MANAGER */ +#widget-filter{ + font-size: 18px; + &:focus{ + background: none; + border: none; + } +} +#widgetDetails { + .progress-circle-indeterminate{ + position: absolute; + left: 50%; + margin-left: -19px; + top: 50%; + margin-top: -19px; + } +} +.widgets-container { + margin: 0 auto; +} +#widget-preview{ + display: block; + margin: 0 auto; +} +.widget-item { + overflow: hidden; + cursor: default; + background-color: #fff; + margin-bottom: 10px; + position: relative; + width: 280px; + height: 240px; + &:hover { + cursor: pointer; + &:before{ + opacity: 0; + } + &:after{ + opacity: .8; + } + .item-footer{ + color: $color-primary !important; + } + } + &:before{ + position: absolute; + content: ""; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-image: linear-gradient(rgba(255,255,255,0), rgba(255,255,255,.8) 70%); + transition: opacity .3s ease; + -webkit-transition: opacity .3s ease; + opacity: 1; + } + &:after{ + position: absolute; + content: ""; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: #fff; + opacity: 0; + transition: opacity .3s ease; + -webkit-transition: opacity .3s ease; + } + &[data-width="1"] { + width: 280px; + } + &[data-width="2"] { + width: 570px; + } + &[data-height="1"] { + height: 240px; + } + &[data-height="2"] { + height: 490px; + } + .item-footer{ + color: $color-master; + p.pull-left{ + text-overflow: ellipsis; + width: 84%; + white-space: nowrap; + overflow: hidden; + } + .pull-right{ + .fa-stack{ + font-size:69%; + } + } + } +} + +@media (max-width: 420px) { + .widgets-container{ + margin-top: 80px; + } +} + +@media (max-width: 610px) { + .widget-item, .widgets-container { + width: 100% !important; + } +} diff --git a/resources/assets/sass/modules/_z_index.scss b/resources/assets/sass/modules/_z_index.scss new file mode 100644 index 00000000..e8dd7f97 --- /dev/null +++ b/resources/assets/sass/modules/_z_index.scss @@ -0,0 +1,24 @@ +// z-index scale +$zIndex-1: 100; +$zIndex-2: 200; +$zIndex-3: 300; +$zIndex-4: 400; +$zIndex-5: 500; +$zIndex-6: 600; +$zIndex-7: 700; +$zIndex-8: 800; +$zIndex-9: 900; +$zIndex-10: 1000; + +//TODO: add all components +// z-index applications + + +$zIndex-sidebar : $zIndex-10; +$zIndex-tooltips : $zIndex-10; +$zIndex-quickview: $zIndex-10; +$zIndex-notifications : $zIndex-9; +$zIndex-navbar : $zIndex-8; +$zIndex-dropdown : $zIndex-7; +$zIndex-dropdownMask : $zIndex-6; +$zIndex-portlet : $zIndex-6; diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js new file mode 100644 index 00000000..192f9fb6 --- /dev/null +++ b/resources/assets/vue/app.js @@ -0,0 +1,54 @@ + +/** Dependencies */ +import Vue from 'vue' +import store from './vuex/store'; + +window.route = require('./general/functions/router'); + +/** Guards */ +import guards from './general/mixins/guards'; + +/** Validation **/ +import vuelidate from 'vuelidate'; + +/** Input Mask **/ +import VueTheMask from 'vue-the-mask'; + + +/** Mixins */ +import request from './general/mixins/request'; +import crudHandler from './general/mixins/crudHandler'; + +/** Directives */ +import closable from './general/directives/closable'; + +import Avatar from 'vue-avatar'; + +/** Application Injections */ +Vue.use(vuelidate); +Vue.use(VueTheMask); +Vue.directive('closable', closable); +Vue.mixin({ + methods: { + route: route + }, + mixins: [request, crudHandler] + }); + +/** Components Registrations */ +Vue.component(Avatar); + +const files = require.context('./', true, /\.vue$/i); +files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)); + +const app = new Vue({ + el: '#app', + store, + created(){ + this.routesGuard(); + }, + methods: { + route: route + }, + mixins: [guards] +}); diff --git a/resources/assets/vue/general/directives/closable.js b/resources/assets/vue/general/directives/closable.js new file mode 100644 index 00000000..a4d31d89 --- /dev/null +++ b/resources/assets/vue/general/directives/closable.js @@ -0,0 +1,39 @@ + +let handleOutsideClick; + +export const closable = { + bind (el, binding, vnode) { + handleOutsideClick = (e) => { + + e.stopPropagation(); + + const { handler, exclude } = binding.value; + + let clickedOnExcludedEl = false; + + exclude.forEach(refName => { + if (!clickedOnExcludedEl) { + const excludedEl = vnode.context.$refs[refName]; + + + if (excludedEl) { + clickedOnExcludedEl = excludedEl.contains(e.target) + } + + } + }); + + if (!el.contains(e.target) && !clickedOnExcludedEl) { + vnode.context[handler]() + } + }; + document.addEventListener('click', handleOutsideClick); + document.addEventListener('touchstart', handleOutsideClick) + }, + unbind () { + document.removeEventListener('click', handleOutsideClick); + document.removeEventListener('touchstart', handleOutsideClick) + } +}; + +export default { closable } \ No newline at end of file diff --git a/resources/assets/vue/general/functions/router.js b/resources/assets/vue/general/functions/router.js new file mode 100644 index 00000000..4bd9b637 --- /dev/null +++ b/resources/assets/vue/general/functions/router.js @@ -0,0 +1,16 @@ +let routes = window.Laravel.routes +module.exports = function () { + let args = Array.prototype.slice.call(arguments), + name = args.shift(), + prefixSlash = routes[name] !== '/' ? '/':''; + + if (routes[name] === undefined) { + console.error('Route not found ', name); + return; + } + + return window.Laravel.baseUrl + prefixSlash + routes[name] + .split('/') + .map(s => s[0] === '{' ? args.shift() : s) + .join('/'); +}; \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/authenticationHandler.js b/resources/assets/vue/general/mixins/accounts/authenticationHandler.js new file mode 100644 index 00000000..29f33f7e --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/authenticationHandler.js @@ -0,0 +1,16 @@ +import errorMessageHandler from "../errorMessageHandler"; +import formHandler from "../formHandler"; + +export default { + methods: { + successHandler(response){ + this.formHandler(''); + this.$store.dispatch('userAuthentication', {access_token: response.payload.access_token, redirect_url: response.payload.redirect_url}); + }, + errorHandler(error){ + this.formHandler(error.message); + } + }, + mixins: [errorMessageHandler, formHandler] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js new file mode 100644 index 00000000..f0e0789c --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js @@ -0,0 +1,17 @@ +import errorMessageHandler from "../errorMessageHandler"; +import formHandler from "../formHandler"; + +export default { + methods: { + successHandler(response){ + this.closeModal(); + this.formHandler(''); + }, + errorHandler(error){ + console.log("error" ,error); + this.formHandler(error.message); + } + }, + mixins: [errorMessageHandler, formHandler] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js b/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js new file mode 100644 index 00000000..4979dfd4 --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js @@ -0,0 +1,18 @@ +import errorMessageHandler from "../errorMessageHandler"; +import formHandler from "../formHandler"; + +export default { + methods: { + successHandler(response){ + this.closeModal(); + this.formHandler(''); + this.$store.dispatch('updateProfile', {fullname:response.payload.data.name}); + }, + errorHandler(error){ + console.log("error" ,error); + this.formHandler(error.message); + } + }, + mixins: [errorMessageHandler, formHandler] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/loginFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/loginFormValidation.js new file mode 100644 index 00000000..1cbc6fff --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/loginFormValidation.js @@ -0,0 +1,11 @@ +import { required, email } from "vuelidate/lib/validators"; +import authenticationHandler from '../authenticationHandler' +export default { + validations: { + parameters: { + email: { required, email }, + password: { required } + } + }, + mixins: [authenticationHandler] +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/registrationFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/registrationFormValidation.js new file mode 100644 index 00000000..a280739d --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/registrationFormValidation.js @@ -0,0 +1,30 @@ +import { required, email, numeric, sameAs, requiredUnless, requiredIf } from "vuelidate/lib/validators"; +import authenticationHandler from '../authenticationHandler' +export default { + validations: { + parameters: { + name: { + required + }, + email: { + required: requiredIf(function () { return this.step === 2 }), + email + }, + company_name: { + required: requiredIf(function () { return this.parameters.type === 1 }) + }, + phone: { + required, + numeric + }, + password: { + required: requiredIf(function () { return this.step === 2 }), + }, + password_confirmation: { + required: requiredIf(function () { return this.step === 2 }), + sameAs: sameAs('password') + } + } + }, + mixins: [authenticationHandler] +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js new file mode 100644 index 00000000..a4f17906 --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js @@ -0,0 +1,10 @@ +import { required } from "vuelidate/lib/validators"; +import resetPasswordHandler from "../resetPasswordHandler"; +export default { + validations: { + parameters: { + email: { required } + } + }, + mixins: [resetPasswordHandler] +}; diff --git a/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js new file mode 100644 index 00000000..8be6ce0b --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js @@ -0,0 +1,10 @@ +import { required } from "vuelidate/lib/validators"; +import updateProfileHandler from "../updateProfileHandler"; +export default { + validations: { + parameters: { + name: { required } + } + }, + mixins: [updateProfileHandler] +}; diff --git a/resources/assets/vue/general/mixins/companies/validation/identificationVerificationFormValidation.js b/resources/assets/vue/general/mixins/companies/validation/identificationVerificationFormValidation.js new file mode 100644 index 00000000..3804ca18 --- /dev/null +++ b/resources/assets/vue/general/mixins/companies/validation/identificationVerificationFormValidation.js @@ -0,0 +1,16 @@ +import ModalFromHandler from '../../modalFormHandler' +import { required } from "vuelidate/lib/validators"; + +export default { + validations: { + parameters: { + identification_no: { + required + }, + files: { + required + } + } + }, + mixins: [ModalFromHandler] +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/componentHandler.js b/resources/assets/vue/general/mixins/componentHandler.js new file mode 100644 index 00000000..05980215 --- /dev/null +++ b/resources/assets/vue/general/mixins/componentHandler.js @@ -0,0 +1,18 @@ +export default { + props: { + 'data': { + type: Object, + } + }, + data() { + return { + item: this.data + } + }, + watch: { + 'data': function() { + this.item = this.data; + } + } + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/crudHandler.js b/resources/assets/vue/general/mixins/crudHandler.js new file mode 100644 index 00000000..583629c9 --- /dev/null +++ b/resources/assets/vue/general/mixins/crudHandler.js @@ -0,0 +1,45 @@ +export default { + methods: { + crudSuccess(){ + this.closeModal(); + this.updateList(); + this.resetForm(); + + }, + resetForm(){ + if(this.$v){ this.$v.$reset() } + if(!this.data) { Object.assign(this.$data, this.$options.data.call(this)) } + }, + updateFilters(){ + if(this.$store.getters.isInQueue(this.section)){ + this.filters = this.$store.getters.getListDetails(this.section).filters; + } else { + this.setDecoratorDefault(); + } + + let vm = this; + $.each(this.parameters, function(key, value) { + value ? (vm.filters[key] = value) : (key in vm.filters && delete vm.filters[key]); + }); + + this.$store.dispatch('updateListQueue', {'name': this.section, 'page': 1, 'filters': this.filters}); + }, + updateList(){ + this.$store.dispatch('reloadList', {'name': this.section}); + }, + closeModal(){ + $(this.$el).closest('.modal').modal('hide'); + }, + openModal(){ + $(this.$el).closest('.modal').modal('show'); + }, + setDecoratorDefault(){ + this.filters.per_page = this.filters.per_page !== undefined ? this.filters.per_page : 10; + this.filters.order_by = this.filters.order_by !== undefined ? this.filters.order_by : { + column: 'id', + DESC: true + }; + } + } + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/errorMessageHandler.js b/resources/assets/vue/general/mixins/errorMessageHandler.js new file mode 100644 index 00000000..b95bcbb7 --- /dev/null +++ b/resources/assets/vue/general/mixins/errorMessageHandler.js @@ -0,0 +1,13 @@ +export default { + data(){ + return { + error: '', + } + }, + methods: { + errorMessageHandler(errorMessage){ + this.error = errorMessage; + } + } + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/formHandler.js b/resources/assets/vue/general/mixins/formHandler.js new file mode 100644 index 00000000..41713c17 --- /dev/null +++ b/resources/assets/vue/general/mixins/formHandler.js @@ -0,0 +1,48 @@ +import errorMessageHandler from "./errorMessageHandler"; +import {VMoney} from 'v-money' + +export default { + props: { + section:{ + type: String, + required: true + }, + data: { + type: Object, + default: null + } + }, + created() { + if(this.data){ + this.parameters = this.data; + } + + }, + watch: { + 'data': function() { + this.parameters = this.data; + } + }, + data() { + return { + isLoading: false, + error: '', + money: {decimal: '.',thousands: ',', precision: 2}, + productPrice: {decimal: '.',thousands: ',', precision: 3}, + exchangeRate: {decimal: '.', thousands: '', precision: 5}, + percentage: {decimal: '.', thousands: '', precision: 2, suffix: '%'}, + integer: {decimal: '', thousands: '', precision: 0}, + + } + }, + methods: { + formHandler(errorMessage){ + this.isLoading = false; + this.updateList(); + this.errorMessageHandler(errorMessage); + } + }, + mixins: [errorMessageHandler], + directives: {money: VMoney} + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js new file mode 100644 index 00000000..18681e5d --- /dev/null +++ b/resources/assets/vue/general/mixins/guards.js @@ -0,0 +1,17 @@ +export default { + methods: { + routesGuard(){ + (!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('login') : ''; + (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : ''; + }, + isProtectedRoute(){ + const unprotectedRoutes = [this.route('login'), this.route('account.email.verification')]; + return !unprotectedRoutes.includes(window.location.href); + }, + isWithTokenRoute(){ + const unprotectedRoutesWithToken = [this.route('account.password.reset')]; + return !window.location.href.includes(unprotectedRoutesWithToken); + } + } + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/modalFormHandler.js b/resources/assets/vue/general/mixins/modalFormHandler.js new file mode 100644 index 00000000..50a9e4a2 --- /dev/null +++ b/resources/assets/vue/general/mixins/modalFormHandler.js @@ -0,0 +1,15 @@ +import formHandler from "./formHandler"; + +export default { + methods: { + successHandler(){ + this.closeModal(); + this.formHandler(); + }, + errorHandler(error){ + this.formHandler(error.message); + } + }, + mixins: [formHandler] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/request.js b/resources/assets/vue/general/mixins/request.js new file mode 100644 index 00000000..84b9ccb4 --- /dev/null +++ b/resources/assets/vue/general/mixins/request.js @@ -0,0 +1,50 @@ +export default { + methods: { + submit(url, method, section, successNotification = true, errorNotification = true){ + if(!this.validate()){ return; } + if (section) { + this.$store.dispatch('toggleLoading', {name: section, status: true}) + } + this.$store.dispatch('crudRequest', { + endpoint: url, + method: method, + parameters: this.parameters + }).then(response => { + let statusCode = response.status, + success = response.ok; + + response.json().then(response => { + + if(!success){ + this.openModal(); + errorNotification ? this.$store.dispatch('createNotification', {title: response.title, message: response.message, type: 'error'}): null; + this.errorHandler(response, statusCode); return; + } + + successNotification ? this.$store.dispatch('createNotification', {title: response.title, message: response.message, type: 'success'}): null; + this.successHandler(response) + + + }); + }).catch((error) => { + console.log(error); + this.$store.dispatch('createNotification', {title: 'Unexpected Error', message: 'An unexpected error has occurred. Try again!', type: 'error'}); + }).then(() => { + if (section) { + this.$store.dispatch('toggleLoading', {name: section, status: false}) + } + }) + + }, + validate() { + if(this.$v){ + this.$v.$touch(); + return !this.$v.$invalid; + } + return true; + }, + successHandler(response){}, + errorHandler(response){} + } + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/staticFormHandler.js b/resources/assets/vue/general/mixins/staticFormHandler.js new file mode 100644 index 00000000..c65307cb --- /dev/null +++ b/resources/assets/vue/general/mixins/staticFormHandler.js @@ -0,0 +1,14 @@ +import formHandler from "./formHandler"; + +export default { + methods: { + successHandler(){ + this.formHandler(); + }, + errorHandler(error){ + this.formHandler(error.message); + } + }, + mixins: [formHandler] + +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/authentication.js b/resources/assets/vue/vuex/modules/authentication.js new file mode 100644 index 00000000..f349afa2 --- /dev/null +++ b/resources/assets/vue/vuex/modules/authentication.js @@ -0,0 +1,90 @@ +import jwt_decode from "jwt-decode"; +export default { + state: { + resetPasswordEmail: '', + updatedFullname:localStorage.getItem('updated-fullname') || '', + authentication: { + access_token: localStorage.getItem('user-token') || '' + } + }, + getters: { + isAuthenticated: state => !!state.authentication.access_token, + getAccessToken: state => state.authentication.access_token, + + isSuperAdmin: (state, getters) => getters.getDecodedAccessToken.user.type === 0 || getters.getDecodedAccessToken.user.type === 1, + isAdmin: (state, getters) => getters.getDecodedAccessToken.user.type === 0 || getters.getDecodedAccessToken.user.type === 1 || getters.getDecodedAccessToken.user.type === 2, + getUserName: (state, getters) => getters.getUpdatedFullname || getters.getDecodedAccessToken.user.name, + getUserId: (state, getters) => getters.getDecodedAccessToken.user.id, + getUserEmail: (state, getters) => getters.getDecodedAccessToken.user.email, + getCompanyId: (state, getters) => getters.getDecodedAccessToken.user.company_id, + + getDecodedAccessToken(state) { + try{ + return jwt_decode(state.authentication.access_token); + } + catch(Error){ + return { + user: { + id: '', + name: '', + role: '', + status: 0, + } + + }; + } + }, + + getResetPasswordEmail: state => state.resetPasswordEmail, + getUpdatedFullname: state => state.updatedFullname + }, + mutations: { + SET_AUTHENTICATION(state, {access_token}){ + state.authentication.access_token = access_token; + }, + SET_PASSWORD_RESET_EMAIL(state, {email}){ + state.resetPasswordEmail = email; + }, + UPDATE_FULL_NAME(state, {fullname}){ + state.updatedFullname = fullname; + } + }, + actions: { + userAuthentication(store, {access_token, redirect_url}){ + localStorage.setItem('user-token', access_token); + + store.commit('SET_AUTHENTICATION', {access_token}); + + store.dispatch('toggleLoading', {name: 'loginSection', status: true}); + + setTimeout(function(){ + window.location.href = redirect_url; + }, 2000); + }, + updateToken(store, {access_token}){ + + localStorage.setItem('user-token', access_token); + + store.commit('SET_AUTHENTICATION', {access_token}); + + }, + passwordResetEmail(store, {email}){ + store.commit('SET_PASSWORD_RESET_EMAIL', {email}); + store.dispatch('toggleLoading', {name: 'forgetPasswordSection', status: true}); + setTimeout(function(){ + store.dispatch('toggleLoading', {name: 'forgetPasswordSection', status: false}); + }, 2000); + }, + passwordReset(store){ + store.dispatch('toggleLoading', {name: 'resetPasswordSection', status: true}); + }, + returnToLoginAfterSendResetPasswordLink(store){ + store.dispatch('toggleSection', {name: 'forgetPassword', status: false}) + store.dispatch('toggleSection', {name: 'forgetPasswordSuccess', status: false}); + }, + updateProfile(store, {fullname}){ + localStorage.setItem('updated-fullname', fullname); + store.commit('UPDATE_FULL_NAME', {fullname}); + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/createNotification.js b/resources/assets/vue/vuex/modules/createNotification.js new file mode 100644 index 00000000..ed7e3284 --- /dev/null +++ b/resources/assets/vue/vuex/modules/createNotification.js @@ -0,0 +1,15 @@ +export default { + actions: { + createNotification(store, payload){ + let content = '
      '+payload.title+'
      '+payload.message+'
      '; + new Noty({ + type: payload.type, + text: content, + timeout: 5000, + closeWith: ['button'], + layout: "bottomRight", + theme: "metroui" + }).show(); + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/crudRequest.js b/resources/assets/vue/vuex/modules/crudRequest.js new file mode 100644 index 00000000..f4f6c37f --- /dev/null +++ b/resources/assets/vue/vuex/modules/crudRequest.js @@ -0,0 +1,23 @@ +export default { + actions: { + crudRequest({getters, dispatch}, {endpoint, method, parameters}){ + return fetch(endpoint, { + method: method, + responseType: 'json', + body: parameters ? JSON.stringify(parameters):null, + headers: { + 'content-type': 'application/json', + 'Authorization': 'Bearer '+getters.getAccessToken + } + }).then(response => { + + if(response.status === 401 && window.location.href !== route('login')){ + dispatch('userAuthentication', {access_token: '', redirect_url: '/'}); + } + + return response; + + }) + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/loadRequestQueue.js b/resources/assets/vue/vuex/modules/loadRequestQueue.js new file mode 100644 index 00000000..3bb574c5 --- /dev/null +++ b/resources/assets/vue/vuex/modules/loadRequestQueue.js @@ -0,0 +1,71 @@ +export default { + state: { + queue: [] + }, + getters: { + isInQueue: (state) => (name) => { + let list = state.queue.find(list => list.name === name); + return !!list + }, + isInCompleteQueue: (state) => (name) => { + let list = state.queue.find(list => list.name === name); + return list ? !list.complete : false; + }, + getListDetails: (state) => (name) => { + return state.queue.find(list => list.name === name); + }, + getListData: (state, getters) => (name) => { + return (!getters.isInCompleteQueue()) ? state.queue.find(list => list.name === name).data : []; + }, + getSelectableList: (state, getters) => (name) => { + let list = state.queue.find(list => list.name === name); + return list ? list.data : []; + } + + }, + mutations: { + SET_QUEUE_LIST(state, payload){ + let list = state.queue.find(list => list.name === payload.name); + + list ? Object.assign(list, {page: payload.page, filters: payload.filters, complete: false}) : + state.queue.push({'name': payload.name, 'page': payload.page, 'filters': payload.filters, 'complete': false, 'data': []}); + + }, + SET_LIST_INCOMPLETE(state, payload) { + state.queue.find(list => list.name === payload.name).complete = false + }, + SET_LIST_COMPLETE(state, payload) { + let list = state.queue.find(list => list.name === payload.name); + + list.complete = true; + list.data = payload.data; + } + }, + actions: { + updateListQueue(store, payload){ + store.commit('SET_QUEUE_LIST', {name: payload.name, page: payload.page, filters: payload.filters}); + }, + fetchSelectable({ commit, getters, dispatch }, payload){ + if(!getters.isInQueue(payload.section)){ + dispatch('updateListQueue', {name: payload.section}); + dispatch('crudRequest', {endpoint: payload.endpoint, method: 'get'}).then(response => { + let success = response.ok; + response.json().then(response => { + + if(!success){return;} + + dispatch('completeList', {name: this.section, data: response.payload.data}) + + }); + }) + } + + }, + reloadList({ commit, getters }, payload){ + getters.isInQueue(payload.name) ? commit('SET_LIST_INCOMPLETE', {name: payload.name}) : commit('SET_QUEUE_LIST', {name: payload.name, page: 1, filters: {}}); + }, + completeList(store, payload){ + store.commit('SET_LIST_COMPLETE', {name: payload.name, data: payload.data}); + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/toggleLoading.js b/resources/assets/vue/vuex/modules/toggleLoading.js new file mode 100644 index 00000000..635f9b5c --- /dev/null +++ b/resources/assets/vue/vuex/modules/toggleLoading.js @@ -0,0 +1,26 @@ +export default { + state: { + loading: [] + }, + getters: { + isLoading: (state) => (name) => { + let loader = state.loading.find(loader => loader.name === name); + return loader ? loader.active > 0 : false + } + }, + mutations: { + SET_LOADING_STATUS(state, payload){ + let loader = state.loading.find(loader => loader.name === payload.name); + if(payload.status){ + loader ? loader.active++ : state.loading.push({'name': payload.name, 'active': 1}) + } else { + loader ? loader.active-- : null + } + } + }, + actions: { + toggleLoading(store, payload){ + store.commit('SET_LOADING_STATUS', {name: payload.name, status: payload.status}); + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/modules/toggleSection.js b/resources/assets/vue/vuex/modules/toggleSection.js new file mode 100644 index 00000000..f4a523c4 --- /dev/null +++ b/resources/assets/vue/vuex/modules/toggleSection.js @@ -0,0 +1,29 @@ +export default { + state: { + toggleSections: [] + }, + getters: { + isShowing: (state) => (name) => { + return state.toggleSections.indexOf(name) !== -1 + } + }, + mutations: { + SET_TOGGLE_SECTION(state, payload){ + let index = state.toggleSections.indexOf(payload.name); + if(payload.status){ + if(index === -1){ + state.toggleSections.push(payload.name) + } + } else { + if(index !== -1){ + state.toggleSections.splice(state.toggleSections.indexOf(payload.name), 1) + } + } + } + }, + actions: { + toggleSection(store, payload){ + store.commit('SET_TOGGLE_SECTION', {name: payload.name, status: payload.status}); + } + } +} \ No newline at end of file diff --git a/resources/assets/vue/vuex/store.js b/resources/assets/vue/vuex/store.js new file mode 100644 index 00000000..2c3d911b --- /dev/null +++ b/resources/assets/vue/vuex/store.js @@ -0,0 +1,21 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import toggleSection from './modules/toggleSection' +import toggleLoading from './modules/toggleLoading' +import createNotification from './modules/createNotification' +import crudRequest from './modules/crudRequest' +import authentication from './modules/authentication' +import loadRequestQueue from './modules/loadRequestQueue' + +Vue.use(Vuex); + +export default new Vuex.Store({ + modules: { + toggleSection, + toggleLoading, + loadRequestQueue, + createNotification, + crudRequest, + authentication + } +}) \ No newline at end of file diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php new file mode 100644 index 00000000..6598e2c0 --- /dev/null +++ b/resources/lang/en/auth.php @@ -0,0 +1,20 @@ + 'These credentials do not match our records.', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php new file mode 100644 index 00000000..d4814118 --- /dev/null +++ b/resources/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php new file mode 100644 index 00000000..2345a56b --- /dev/null +++ b/resources/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php new file mode 100644 index 00000000..7a15f437 --- /dev/null +++ b/resources/lang/en/validation.php @@ -0,0 +1,156 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute must only contain letters.', + 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute must only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'current_password' => 'The password is incorrect.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute must not be greater than :max.', + 'file' => 'The :attribute must not be greater than :max kilobytes.', + 'string' => 'The :attribute must not be greater than :max characters.', + 'array' => 'The :attribute must not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'multiple_of' => 'The :attribute must be a multiple of :value.', + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'prohibited' => 'The :attribute field is prohibited.', + 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', + 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php new file mode 100644 index 00000000..e293e78a --- /dev/null +++ b/resources/views/layouts/base.blade.php @@ -0,0 +1,13 @@ + + + + @include('vendor/head') + + +
      + @yield('content') +
      + @include('vendor/js') + @stack('scripts') + + \ No newline at end of file diff --git a/resources/views/layouts/base_login.blade.php b/resources/views/layouts/base_login.blade.php new file mode 100644 index 00000000..dcd78ed9 --- /dev/null +++ b/resources/views/layouts/base_login.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.base') + +@section('content') + + @yield('inner_content') + +@endsection \ No newline at end of file diff --git a/resources/views/layouts/base_pdf.blade.php b/resources/views/layouts/base_pdf.blade.php new file mode 100644 index 00000000..99eb376a --- /dev/null +++ b/resources/views/layouts/base_pdf.blade.php @@ -0,0 +1,152 @@ + + + + + + Invoice + + + + +@yield('inner_content') + + + \ No newline at end of file diff --git a/resources/views/layouts/base_portal.blade.php b/resources/views/layouts/base_portal.blade.php new file mode 100644 index 00000000..583dcc37 --- /dev/null +++ b/resources/views/layouts/base_portal.blade.php @@ -0,0 +1,19 @@ +@extends('layouts.base') + +@section('content') + @include('partials.header') +
      +
      +
      +
      +
      +
      + @yield('inner_content') +
      +
      +
      +
      + @include('partials.footer') +
      +
      +@endsection \ No newline at end of file diff --git a/resources/views/vendor/head.blade.php b/resources/views/vendor/head.blade.php new file mode 100644 index 00000000..994929c5 --- /dev/null +++ b/resources/views/vendor/head.blade.php @@ -0,0 +1,13 @@ + + +Exchange - Overseas Money Transfers + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/vendor/js.blade.php b/resources/views/vendor/js.blade.php new file mode 100644 index 00000000..a761d204 --- /dev/null +++ b/resources/views/vendor/js.blade.php @@ -0,0 +1,12 @@ +{{--BEGIN VENDOR JS--}} + + + + +{{--END VENDOR JS--}} \ No newline at end of file diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php new file mode 100644 index 00000000..8cae33c8 --- /dev/null +++ b/resources/views/welcome.blade.php @@ -0,0 +1,7 @@ +@extends('layouts.base_login') + +@section('inner_content') + +

      welcome~

      + +@endsection \ No newline at end of file diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 00000000..bcb8b189 --- /dev/null +++ b/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/routes/channels.php b/routes/channels.php new file mode 100644 index 00000000..5d451e1f --- /dev/null +++ b/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/routes/console.php b/routes/console.php new file mode 100644 index 00000000..e05f4c9a --- /dev/null +++ b/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/routes/web.php b/routes/web.php new file mode 100644 index 00000000..b1303973 --- /dev/null +++ b/routes/web.php @@ -0,0 +1,18 @@ + + */ + +$uri = urldecode( + parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) +); + +// This file allows us to emulate Apache's "mod_rewrite" functionality from the +// built-in PHP web server. This provides a convenient way to test a Laravel +// application without having installed a "real" web server software here. +if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { + return false; +} + +require_once __DIR__.'/public/index.php'; diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 00000000..8f4803c0 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 00000000..05c4471f --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/storage/framework/cache/.gitignore b/storage/framework/cache/.gitignore new file mode 100644 index 00000000..01e4a6cd --- /dev/null +++ b/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/storage/framework/cache/data/.gitignore b/storage/framework/cache/data/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/sessions/.gitignore b/storage/framework/sessions/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/testing/.gitignore b/storage/framework/testing/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/framework/views/.gitignore b/storage/framework/views/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/webpack.mix.js b/webpack.mix.js new file mode 100644 index 00000000..71ad8ef5 --- /dev/null +++ b/webpack.mix.js @@ -0,0 +1,14 @@ +const mix = require('laravel-mix'); + +/* + |-------------------------------------------------------------------------- + | Mix Asset Management + |-------------------------------------------------------------------------- + | + | Mix provides a clean, fluent API for defining some Webpack build steps + | for your Laravel applications. By default, we are compiling the CSS + | file for the application as well as bundling up all the JS files. + | + */ + +mix.js('./resources/assets/vue/app.js', 'public/vue');