diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..99413e1
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+.dockerignore
+.editorconfig
+.env.testing
+.git*
+package.json
+phpunit.xml
+webpack.mix.js
+yarn.lock
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..a98075a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = tab
+insert_final_newline = false
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
+
+[docker-compose.yml]
+indent_size = 4
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..4163d8e
--- /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
+
+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
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+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=
+
+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}"
+
+LDAP_HOST=
+LDAP_BASE_DN=
+LDAP_USERNAME=
+LDAP_PASSWORD=
diff --git a/.env.testing b/.env.testing
new file mode 100644
index 0000000..34bbb3e
--- /dev/null
+++ b/.env.testing
@@ -0,0 +1,51 @@
+APP_NAME=Laravel
+APP_ENV=dev
+APP_KEY=base64:KvIecx8zoy6RjcbJM8s98ZKs9IDGUHFVqBRn3Awfmso=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+LOG_CHANNEL=stack
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=homestead
+DB_USERNAME=homestead
+DB_PASSWORD=secret
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+
+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}"
+
+LDAP_HOST=ldap
+LDAP_PORT=389
+LDAP_BASE_DN="dc=Test"
+LDAP_USERNAME="cn=admin,dc=Test"
+LDAP_PASSWORD="test"
+LDAP_CACHE=false
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..967315d
--- /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
index ac7db53..0f7df0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,12 @@
-config/config.php
-queries/custom_*
-templates/*/custom_*
+/node_modules
+/public/hot
+/public/storage
+/storage/*.key
+/vendor
+.env
+.env.backup
+.phpunit.result.cache
+Homestead.json
+Homestead.yaml
+npm-debug.log
+yarn-error.log
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..34d272e
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,14 @@
+stages:
+- test
+- build
+
+# This folder is cached between builds
+# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
+cache:
+ key: ${CI_JOB_NAME_SLUG}-${CI_COMMIT_REF_SLUG}
+ paths:
+ - vendor/
+
+include:
+- .gitlab-test.yml
+- .gitlab-docker-x86_64.yml
diff --git a/.gitlab-docker-x86_64.yml b/.gitlab-docker-x86_64.yml
new file mode 100644
index 0000000..c5bca19
--- /dev/null
+++ b/.gitlab-docker-x86_64.yml
@@ -0,0 +1,27 @@
+docker:
+ variables:
+ VERSION: latest
+ DOCKER_HOST: tcp://docker:2375
+
+ stage: build
+
+ image: docker:latest
+ services:
+ - docker:dind
+
+ before_script:
+ - docker info && docker version
+ - echo "$CI_JOB_TOKEN" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin
+ - if [ -n "$GITHUB_TOKEN" ]; then cat $GITHUB_TOKEN |base64 -d > auth.json; fi
+
+ script:
+ - if [ -f init ]; then chmod 500 init; fi
+ - echo -n ${CI_COMMIT_SHORT_SHA} > VERSION
+ - rm -rf vendor/ database/schema database/seeders database/factories/*
+ - docker build -f docker/Dockerfile -t ${CI_REGISTRY_IMAGE}:${VERSION} .
+ - docker push ${CI_REGISTRY_IMAGE}:${VERSION}
+ tags:
+ - docker
+ - x86_64
+ only:
+ - BRANCH-2.0
diff --git a/.gitlab-test.yml b/.gitlab-test.yml
new file mode 100644
index 0000000..197572f
--- /dev/null
+++ b/.gitlab-test.yml
@@ -0,0 +1,49 @@
+test:
+ image: ${CI_REGISTRY}/leenooks/php:8.1-fpm-alpine-ldap-test
+
+ stage: test
+
+ # NOTE: This service is dependant on project file configuration, which is not there if the cache was deleted
+ # resulting in the testing to fail on the first run.
+ services:
+ - name: osixia/openldap:latest
+ alias: ldap
+ command: ["--loglevel","debug"]
+
+ variables:
+ LDAP_SEED_INTERNAL_LDIF_PATH: "${CI_PROJECT_DIR}/tests/server/openldap/data"
+ LDAP_SEED_INTERNAL_SCHEMA_PATH: "${CI_PROJECT_DIR}/tests/server/openldap/schema"
+ LDAP_BASE_DN: "dc=Test"
+ LDAP_DOMAIN: "Test"
+ LDAP_ADMIN_PASSWORD: test
+ LDAP_HOST: ldap
+ LDAP_PORT: 389
+ #CI_DEBUG_SERVICES: "true"
+
+ tags:
+ - php
+ only:
+ - BRANCH-2.0
+
+ before_script:
+ - mv .env.testing .env
+
+ # Install Composer and project dependencies.
+ - mkdir -p ${COMPOSER_HOME}
+ - if [ -n "$GITHUB_TOKEN" ]; then cat $GITHUB_TOKEN |base64 -d > ${COMPOSER_HOME}/auth.json; fi
+ - composer install
+
+ # Generate an application key. Re-cache.
+ - php artisan key:generate
+
+ script:
+ # Sleep if we need to, in case we want to jump in and see what is going on during the test
+ - if [ -n "$DEBUG_PAUSE" ]; then echo "Pausing for $DEBUG_PAUSE seconds, so you can jump into the containers"; sleep $DEBUG_PAUSE; fi
+ # run laravel tests
+ - XDEBUG_MODE=coverage php vendor/bin/phpunit --coverage-text --colors=never
+
+ # run frontend tests
+ # if you have any task for testing frontend
+ # set it in your package.json script
+ # comment this out if you don't have a frontend test
+ # npm test
diff --git a/INSTALL.md b/INSTALL.md
deleted file mode 100644
index d9ca60c..0000000
--- a/INSTALL.md
+++ /dev/null
@@ -1,23 +0,0 @@
-For install instructions in non-English languages, see the wiki:
- http://phpldapadmin.sourceforge.net
-
-* Requirements
-
- phpLDAPadmin requires the following:
- a. A web server (Apache, IIS, etc).
- b. PHP 5.5.0 or newer (with LDAP support)
-
-* To install
-
- 1. Unpack the archive (if you're reading this, you already did that).
- 2. Put the resulting 'phpldapadmin' directory somewhere in your webroot.
- 3. Copy 'config.php.example' to 'config.php' and edit to taste (this is in the config/ directory).
- 4. Then, point your browser to the phpldapadmin directory.
-
-* For additional help
-
- See the wiki:
- http://phpldapadmin.sourceforge.net
-
- Join our mailing list:
- https://lists.sourceforge.net/lists/listinfo/phpldapadmin-devel
diff --git a/README.md b/README.md
index 06c19e4..9533ec0 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,33 @@
# phpLDAPadmin
phpLDAPadmin is a web based LDAP data management tool for system administrators. It is commonly known and referred by many as "PLA".
-A primary goal of PLA is to be as intuitive as possible - so it is certainly possible for end users to use it as well, for example, to manage their data in an LDAP server.
-
PLA is designed to be compliant with LDAP RFCs, enabling it to be used with any LDAP server.
If you come across an LDAP server, where PLA exhibits problems, please open an issue with full details of the problem so that we can have it fixed.
-## History
-Initially created in 2002 by David Smith, it was taken over by Deon George (aka leenooks) in 2005.
+For up to date information on PLA, please head to the [wiki](https://github.com/leenooks/phpLDAPadmin/wiki).
-Since 2003 many things have changed - initial development was done in CVS and the project was hosted on Sourceforge.
-In 2009, CVS was swapped out for GIT, and in around 2011 the project was moved to Github.
+> **NOTE**: GIT **master** is currently in active development, and as such functionality may be missing, broken or not working as expected.
+>
+> If you are after a working version of PLA, please use one of the tagged releases.
-The PLA v1.2.x stream was created in July 2009.
+## Demo
+If you havent seen PLA in action, you can head here to the [demo](https://demo.phpldapadmin.org) site.
-Work on PLA v2 has started and some information on that is below. Soon `master` will be updated and `BRANCH-2.0` will be visible in git. Until then, a sneak peak of v2 is available [here](https://phpldapadmin.servio.leenooks.net)
+## Getting Help
+The best place to get help with PLA (new and old) is on [Stack Overflow](https://stackoverflow.com/tags/phpldapadmin/info).
+
+## Found a bug?
+If you have found a bug, and can provide detailed instructions so that it can be reproduced, please open an [issue](https://github.com/leenooks/phpLDAPadmin/issues) and provide those details.
+
+Before opening a ticket, please check to see if it hasnt already been reported, and if it has, please provide any additional information that will help it be fixed.
+
+*TIP*: Issues opened with:
+
+* details enabling the problem to be reproduced,
+* including (if appropriate) an LDIF with the data that exhibits the problem,
+* a patch (or a git pull request) to fix the problem
+
+will be looked at first :)
## THANK YOU
Over the years, many, many, many people have supported PLA with either their time, their coding or with financial donations.
@@ -22,69 +35,5 @@ I have tried to send an email to acknowledge each contribution, and if you haven
Again, Thank You.
-## Future
-Web development, tools, approaches and technology has come along way since 2009 and some talented folks have created some fantastic tools.
-With that PLA is going under a major revamp in preparation for v2 and will aim to use those existing creations to help speed up the revamp effort.
-
-Some of the creations planned to be used in v2 include:
-* Laravel (https://laravel.com)
-* adldap2/adldap2 (https://github.com/Adldap2/Adldap2)
-* JQuery (https://jquery.com)
-* FancyTree (https://github.com/mar10/fancytree)
-* ArchitectUI (https://architectui.com)
-
-PLA v1.2.x will be archived into [BRANCH-1.2](https://github.com/leenooks/phpLDAPadmin/tree/BRANCH-1.2), and `master` will be changed to reflect the new v2 work and effort.
-
-If you plan to use PLA, and cannot use an installation from your OS package, please use [BRANCH-1.2](https://github.com/leenooks/phpLDAPadmin/tree/BRANCH-1.2) while progress is made in master for v2.
-
-If you like the cutting edge, feel free to try out `master`, but expect problems, bugs and missing functionality.
-If you have extended v2 and would like to contribute your extension, or if you find a way to fix something that is broken or missing please submit a pull request.
-
-Alternatively, you can get take a peek at the work so far by using our docker container, which is built automatically after testing passes.
-The [demo](http://demo.phpldapadmin.org) site, will also be running the same docker container. (See below for details.)
-
-In summary, for the time being, expect `master` to be buggy and broken, and I'll update this readme as enhancements progress.
-
-## Installation
-The following instructions will be for PLA v2 when its commited to GIT. Checkback regularly, as it will be pushed when its is semi functional.
-
-### Installation on your server
-
-#### Prerequisites
-* A HTTP server (eg: Apache, Nginx)
-* PHP (minimum version 7.2) https://www.php.net
-* Composer https://getcomposer.org
-* GIT
-
-#### Installation
-1. Checkout the code from github
- ```bash
- git clone https://github.com/leenooks/phpLDAPadmin.git
- ```
-
-1. Install composer dependencies.
- ```bash
- composer install
- ```
-
-1. Edit your `.env` file as appropriate
-
- copy `.env.example` to `.env` as a start.
-
-1. Configure your webserver to have PLA's root in the `public` directory
-
-### Using Docker
-Instructions to come.
-
-## Getting Help
-The best place to get help with PLA (new and old) is on Stack Overflow (https://stackoverflow.com/tags/phpldapadmin/info)
-
-## Found a bug?
-If you have found a bug, and can provide detailed instructions so that it can be reproduced, please open an [issue](https://github.com/leenooks/phpLDAPadmin/issues) and provide those details.
-
-Before opening a ticket, please check to see if it hasnt already been reported, and if it has, please provide any additional information that will help it be fixed.
-
-*TIP*: Issues opened with reproducible details accompanied with a patch (or a pull request) to fix the problem will be looked at first.
-
## License
[LICENSE](LICENSE)
diff --git a/VERSION b/VERSION
index 8ce7e19..34725a9 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-RELEASE-1.2.5
+GIT
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..9741e9f
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,3 @@
+q*
+!public/
+!.gitignore
diff --git a/lib/Attribute.php b/app/Classes/LDAP/Attribute.php
similarity index 85%
rename from lib/Attribute.php
rename to app/Classes/LDAP/Attribute.php
index 9c4ef98..3816c6b 100644
--- a/lib/Attribute.php
+++ b/app/Classes/LDAP/Attribute.php
@@ -1,33 +1,45 @@
name = $name;
+ $this->values = collect($values);
- $server = $_SESSION[APPCONFIG]->getServer($server_id);
-
- $sattr = $server->getSchemaAttribute($name);
- if ($sattr) {
- $this->name = $sattr->getName(false);
- $this->setLDAPdetails($sattr);
-
- } else
- $this->name = $name;
-
- $this->source = $source;
-
- # XML attributes are shown by default
- switch ($source) {
- case 'XML': $this->show();
- $this->setXML($values);
-
- break;
-
- default:
- if (! isset($values['values']))
- debug_dump_backtrace('no index "values"',1);
-
- $this->initValue($values['values']);
- }
+ // No need to load our schema for internal attributes
+ if (! $this->is_internal)
+ $this->schema = config('server')->schema('attributetypes',$name);
+ /*
# Should this attribute be hidden
if ($server->isAttrHidden($this->name))
$this->forcehide = true;
@@ -119,6 +111,97 @@ class Attribute {
# Should this attribute value be unique
if ($server->isAttrUnique($this->name))
$this->unique = true;
+ */
+ }
+
+ public function __get(string $key): mixed
+ {
+ return match ($key) {
+ // Can this attribute have more values
+ 'can_addvalues' => $this->schema && (! $this->schema->is_single_value) && ((! $this->max_values_count) || ($this->values->count() < $this->max_values_count)),
+ // Schema attribute description
+ 'description' => $this->schema ? $this->schema->{$key} : NULL,
+ // Attribute hints
+ 'hints' => $this->hints(),
+ // Is this an internal attribute
+ 'is_internal' => isset($this->{$key}) && $this->{$key},
+ // We prefer the name as per the schema if it exists
+ 'name' => $this->schema ? $this->schema->{$key} : $this->{$key},
+ // Attribute name in lower case
+ 'name_lc' => strtolower($this->name),
+ // Is this attribute the RDN
+ 'rdn' => $this->is_rdn,
+
+ default => throw new \Exception('Unknown key:' . $key),
+ };
+ }
+
+ /**
+ * Determine how we render this attribute's value
+ *
+ * @return string
+ */
+ public function __toString(): string
+ {
+ return $this->values->join(' ');
+ }
+
+ /**
+ * Return an instance of this attribute that is deletable.
+ * This is primarily used for rendering to know if to render delete options.
+ *
+ * @return Attribute
+ */
+ public function deletable(): self
+ {
+ $clone = clone $this;
+
+ if (! $this->required_by->count())
+ $clone->is_deletable = TRUE;
+
+ return $clone;
+ }
+
+ /**
+ * Return the hints about this attribute, ie: RDN, Required, etc
+ *
+ * @return array
+ */
+ public function hints(): array
+ {
+ $result = collect();
+
+ // Is this Attribute an RDN
+ if ($this->is_rdn)
+ $result->put(__('rdn'),__('This attribute is required for the RDN'));
+
+ // If this attribute name is an alias for the schema attribute name
+ // @todo
+
+ // objectClasses requiring this attribute
+ // eg: $result->put('required','Required by objectClasses: a,b');
+ if ($this->required_by->count())
+ $result->put(__('required'),sprintf('%s: %s',__('Required Attribute by ObjectClass(es)'),$this->required_by->join(',')));
+
+ return $result->toArray();
+ }
+
+ /**
+ * Set the objectclasses that require this attribute
+ *
+ * @param Collection $oc
+ * @return Collection
+ */
+ public function required_by(Collection $oc): Collection
+ {
+ return $this->required_by = ($this->schema
+ ? $oc->intersect($this->schema->required_by_object_classes)
+ : collect());
+ }
+
+ public function setRDN(): void
+ {
+ $this->is_rdn = TRUE;
}
/**
@@ -127,7 +210,7 @@ class Attribute {
* @param boolean $lower - Return the attribute in normal or lower case (default lower)
* @param boolean $real - Return the real attribute name (with ;binary, or just the name)
* @return string Attribute name
- */
+ *
public function getName($lower=true,$real=false) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs,$this->name);
@@ -168,7 +251,7 @@ class Attribute {
/**
* Autovalue is called after the attribute is initialised, and thus the values from the ldap server will be set.
- */
+ *
public function autoValue($new_val) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -258,64 +341,6 @@ class Attribute {
}
}
- public function getValue($i) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (isset($this->values[$i]))
- return $this->values[$i];
- else
- return null;
- }
-
- public function getOldValue($i) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (isset($this->oldvalues[$i]))
- return $this->oldvalues[$i];
- else
- return null;
- }
-
- public function getMinValueCount() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->min_value_count);
-
- return $this->min_value_count;
- }
-
- public function setMinValueCount($min) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->min_value_count = $min;
- }
-
- public function getMaxValueCount() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->max_value_count);
-
- return $this->max_value_count;
- }
-
- public function setMaxValueCount($max) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->max_value_count = $max;
- }
-
- public function haveMoreValues() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if ($this->getMaxValueCount() < 0 || ($this->getValueCount() < $this->getMaxValueCount()))
- return true;
- else
- return false;
- }
-
public function justModified() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -347,20 +372,6 @@ class Attribute {
$this->justModified();
}
- public function isInternal() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->internal);
-
- return $this->internal;
- }
-
- public function setInternal() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->internal = true;
- }
-
public function isRequired() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -637,30 +648,11 @@ class Attribute {
return $this->verify;
}
- public function setRDN($rdn) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->rdn = $rdn;
- }
-
- /**
- * Return if this attribute is an RDN attribute
- *
- * @return boolean
- */
- public function isRDN() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs,$this->rdn);
-
- return $this->rdn;
- }
-
/**
* Capture all the LDAP details we are interested in
*
* @param sattr Schema Attribute
- */
+ *
private function setLDAPdetails($sattr) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -680,7 +672,7 @@ class Attribute {
/**
* Return a list of aliases for this Attribute (as defined by the schema)
* This list will be lowercase.
- */
+ *
public function getAliases() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->aliases);
@@ -846,7 +838,7 @@ class Attribute {
/**
* Display the values removed in an attribute.
- */
+ *
public function getRemovedValues() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -856,7 +848,7 @@ class Attribute {
/**
* Display the values removed in an attribute.
- */
+ *
public function getAddedValues() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -872,7 +864,7 @@ class Attribute {
*
* @param string $attr_name The name of the attribute to examine.
* @return string
- */
+ *
private function real_attr_name() {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->name);
@@ -882,7 +874,7 @@ class Attribute {
/**
* Does this attribute need supporting JS
- */
+ *
public function needJS($type=null) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',5,0,__FILE__,__LINE__,__METHOD__,$fargs);
@@ -913,5 +905,5 @@ class Attribute {
} else
debug_dump_backtrace(sprintf('Unknown JS request %s',$type),1);
}
-}
-?>
+ */
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Binary.php b/app/Classes/LDAP/Attribute/Binary.php
new file mode 100644
index 0000000..4f84e14
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Binary.php
@@ -0,0 +1,12 @@
+internal = FALSE;
+ }
+
+ public function __toString(): string
+ {
+ // We'll use finfo to try and figure out what type of image is stored
+ $f = new \finfo;
+
+ $result = '
';
+
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Factory.php b/app/Classes/LDAP/Attribute/Factory.php
new file mode 100644
index 0000000..d7bff91
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Factory.php
@@ -0,0 +1,57 @@
+ Internal\Timestamp::class,
+ 'creatorsname' => Internal\EntryDN::class,
+ 'entrycsn' => Internal\EntryCSN::class,
+ 'entrydn' => Internal\EntryDN::class,
+ 'entryuuid' => Internal\EntryUUID::class,
+ 'gidnumber' => GidNumber::class,
+ 'hassubordinates' => Internal\HasSubordinates::class,
+ 'jpegphoto' => Binary\JpegPhoto::class,
+ 'modifytimestamp' => Internal\Timestamp::class,
+ 'modifiersname' => Internal\EntryDN::class,
+ 'objectclass' => ObjectClass::class,
+ 'structuralobjectclass' => Internal\StructuralObjectClass::class,
+ 'subschemasubentry' => Internal\SubschemaSubentry::class,
+ 'supportedcontrol' => Schema\OID::class,
+ 'supportedextension' => Schema\OID::class,
+ 'supportedfeatures' => Schema\OID::class,
+ 'supportedsaslmechanisms' => Schema\Mechanisms::class,
+ 'userpassword' => Password::class,
+ ];
+
+ /**
+ * Create the new Object for an attribute
+ *
+ * @param string $attribute
+ * @param array $values
+ * @return Attribute
+ */
+ public static function create(string $attribute,array $values): Attribute
+ {
+ $class = Arr::get(self::map,$attribute,Attribute::class);
+ Log::debug(sprintf('%s:Creating LDAP Attribute [%s] as [%s]',static::LOGKEY,$attribute,$class));
+
+ return new $class($attribute,$values);
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/GidNumber.php b/app/Classes/LDAP/Attribute/GidNumber.php
new file mode 100644
index 0000000..b2a05a3
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/GidNumber.php
@@ -0,0 +1,12 @@
+values[0]))->format(config('ldap.datetime_format','Y-m-d H:i:s'));
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/ObjectClass.php b/app/Classes/LDAP/Attribute/ObjectClass.php
new file mode 100644
index 0000000..01e6782
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/ObjectClass.php
@@ -0,0 +1,16 @@
+values->sort()->join(' ');
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Password.php b/app/Classes/LDAP/Attribute/Password.php
new file mode 100644
index 0000000..7e50623
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Password.php
@@ -0,0 +1,17 @@
+ %s',__('Check Password'));
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Schema.php b/app/Classes/LDAP/Attribute/Schema.php
new file mode 100644
index 0000000..533c4f5
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Schema.php
@@ -0,0 +1,50 @@
+put($x=Arr::get($fields,0),[
+ 'title'=>Arr::get($fields,1,$x),
+ 'ref'=>Arr::get($fields,2),
+ 'desc'=>Arr::get($fields,3,__('No description available, can you help with one?')),
+ ]);
+ }
+ fclose($f);
+
+ return $result;
+ });
+
+ return Arr::get(($array ? $array->get($string) : []),$key);
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Schema/Mechanisms.php b/app/Classes/LDAP/Attribute/Schema/Mechanisms.php
new file mode 100644
index 0000000..af154e5
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Schema/Mechanisms.php
@@ -0,0 +1,48 @@
+values
+ ->transform(function($item) {
+ $format = sprintf('%s%s
%s
',
+ $item,
+ static::get($item,'title'),
+ ($x=static::get($item,'ref')) ? sprintf('',$x) : '',
+ static::get($item,'desc'),
+ );
+
+ return $format;
+ })->join(' ');
+ }
+
+ /**
+ * Given an SASL Mechanism name, returns a verbose description of the Mechanism.
+ * This function parses ldap_supported_saslmechanisms.txt and looks up the specified
+ * Mechanism, and returns the verbose message defined in that file.
+ *
+ *
+ * "SCRAM-SHA-1" => array:3 [▼
+ * "title" => "Salted Challenge Response Authentication Mechanism (SCRAM) SHA1"
+ * "ref" => "RFC 5802"
+ * "desc" => "This specification describes a family of authentication mechanisms called the Salted Challenge Response Authentication Mechanism (SCRAM) which addresses the req ▶"
+ * ]
+ *
+ *
+ * @param string $string The SASL Mechanism (ie, "SCRAM-SHA-1") of interest.
+ * @param string $key The title|ref|desc to return
+ * @return string|NULL
+ */
+ protected static function get(string $string,string $key): ?string
+ {
+ return parent::_get(config_path('ldap_supported_saslmechanisms.txt'),$string,$key);
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Attribute/Schema/OID.php b/app/Classes/LDAP/Attribute/Schema/OID.php
new file mode 100644
index 0000000..e0254e3
--- /dev/null
+++ b/app/Classes/LDAP/Attribute/Schema/OID.php
@@ -0,0 +1,53 @@
+values
+ ->transform(function($item) {
+ if (preg_match('/[0-9]+\.[0-9]+\.[0-9]+/',$item)) {
+ $format = sprintf('%s%s
%s
',
+ $item,
+ static::get($item,'title'),
+ ($x=static::get($item,'ref')) ? sprintf('',$x) : '',
+ static::get($item,'desc'),
+ );
+
+ return $format;
+
+ } else
+ return $item;
+ })->join(' ');
+ }
+
+ /**
+ * Given an LDAP OID number, returns a verbose description of the OID.
+ * This function parses ldap_supported_oids.txt and looks up the specified
+ * OID, and returns the verbose message defined in that file.
+ *
+ *
+ * "1.3.6.1.4.1.4203.1.5.1" => array:3 [
+ * [title] => All Operational Attribute
+ * [ref] => RFC 3673
+ * [desc] => An LDAP extension which clients may use to request the return of all operational attributes.
+ * ]
+ *
+ *
+ * @param string $string The OID number (ie, "1.3.6.1.4.1.4203.1.5.1") of the OID of interest.
+ * @param string $key The title|ref|desc to return
+ * @return string|null
+ * @testedby TranslateOidTest::testRootDSE()
+ */
+ protected static function get(string $string,string $key): ?string
+ {
+ return parent::_get(config_path('ldap_supported_oids.txt'),$string,$key);
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/AttributeType.php b/app/Classes/LDAP/Schema/AttributeType.php
new file mode 100644
index 0000000..85d3129
--- /dev/null
+++ b/app/Classes/LDAP/Schema/AttributeType.php
@@ -0,0 +1,595 @@
+children = collect();
+ $this->aliases = collect();
+ $this->used_in_object_classes = collect();
+ $this->required_by_object_classes = collect();
+
+ for ($i=0; $i < count($strings); $i++) {
+ switch ($strings[$i]) {
+ case '(':
+ case ')':
+ break;
+
+ case 'NAME':
+ // @note Some schema's return a (' instead of a ( '
+ if ($strings[$i+1] != '(' && ! preg_match('/^\(/',$strings[$i+1])) {
+ do {
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ // This attribute has no aliases
+ //$this->aliases = collect();
+
+ } else {
+ $i++;
+
+ do {
+ // In case we came here becaues of a ('
+ if (preg_match('/^\(/',$strings[$i]))
+ $strings[$i] = preg_replace('/^\(/','',$strings[$i]);
+ else
+ $i++;
+
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ // Add alias names for this attribute
+ while ($strings[++$i] != ')') {
+ $alias = $strings[$i];
+ $alias = preg_replace("/^\'(.*)\'$/",'$1',$alias);
+ $this->addAlias($alias);
+ }
+ }
+
+ $this->name = preg_replace("/^\'(.*)\'$/",'$1',$this->name);
+
+ Log::debug(sprintf('- Case NAME returned (%s)',$this->name),['aliases'=>$this->aliases]);
+ break;
+
+ case 'DESC':
+ do {
+ $this->description .= (strlen($this->description) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ $this->description = preg_replace("/^\'(.*)\'$/",'$1',$this->description);
+
+ Log::debug(sprintf('- Case DESC returned (%s)',$this->description));
+ break;
+
+ case 'OBSOLETE':
+ $this->is_obsolete = TRUE;
+
+ Log::debug(sprintf('- Case OBSOLETE returned (%s)',$this->is_obsolete));
+ break;
+
+ case 'SUP':
+ $i++;
+ $this->sup_attribute = preg_replace("/^\'(.*)\'$/",'$1',$strings[$i]);
+
+ Log::debug(sprintf('- Case SUP returned (%s)',$this->sup_attribute));
+ break;
+
+ case 'EQUALITY':
+ $this->equality = $strings[++$i];
+
+ Log::debug(sprintf('- Case EQUALITY returned (%s)',$this->equality));
+ break;
+
+ case 'ORDERING':
+ $this->ordering = $strings[++$i];
+
+ Log::debug(sprintf('- Case ORDERING returned (%s)',$this->ordering));
+ break;
+
+ case 'SUBSTR':
+ $this->sub_str_rule = $strings[++$i];
+
+ Log::debug(sprintf('- Case SUBSTR returned (%s)',$this->sub_str_rule));
+ break;
+
+ case 'SYNTAX':
+ $this->syntax = $strings[++$i];
+ $this->syntax_oid = preg_replace('/{\d+}$/','',$this->syntax);
+ Log::debug(sprintf('/ Evaluating SYNTAX returned (%s) [%s]',$this->syntax,$this->syntax_oid));
+
+ // Does this SYNTAX string specify a max length (ie, 1.2.3.4{16})
+ $m = [];
+ if (preg_match('/{(\d+)}$/',$this->syntax,$m))
+ $this->max_length = $m[1];
+ else
+ $this->max_length = NULL;
+
+ if ($i < count($strings) - 1 && $strings[$i+1] == '{')
+ do {
+ $this->name .= ' '.$strings[++$i];
+ } while ($strings[$i] != '}');
+
+ $this->syntax = preg_replace("/^\'(.*)\'$/",'$1',$this->syntax);
+ $this->syntax_oid = preg_replace("/^\'(.*)\'$/",'$1',$this->syntax_oid);
+
+ Log::debug(sprintf('- Case SYNTAX returned (%s) [%s] {%d}',$this->syntax,$this->syntax_oid,$this->max_length));
+ break;
+
+ case 'SINGLE-VALUE':
+ $this->is_single_value = TRUE;
+
+ Log::debug(sprintf('- Case SINGLE-VALUE returned (%s)',$this->is_single_value));
+ break;
+
+ case 'COLLECTIVE':
+ $this->is_collective = TRUE;
+
+ Log::debug(sprintf('- Case COLLECTIVE returned (%s)',$this->is_collective));
+ break;
+
+ case 'NO-USER-MODIFICATION':
+ $this->is_no_user_modification = TRUE;
+
+ Log::debug(sprintf('- Case NO-USER-MODIFICATION returned (%s)',$this->is_no_user_modification));
+ break;
+
+ case 'USAGE':
+ $this->usage = $strings[++$i];
+
+ Log::debug(sprintf('- Case USAGE returned (%s)',$this->usage));
+ break;
+
+ // @note currently not captured
+ case 'X-ORDERED':
+ Log::error(sprintf('- Case X-ORDERED returned (%s)',$strings[++$i]));
+ break;
+
+ // @note currently not captured
+ case 'X-ORIGIN':
+ $value = '';
+
+ do {
+ $value .= (strlen($value) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ Log::error(sprintf('- Case X-ORIGIN returned (%s)',$value));
+ break;
+
+ default:
+ if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
+ $this->oid = $strings[$i];
+ Log::debug(sprintf('- Case default returned (%s)',$this->oid));
+
+ } elseif ($strings[$i])
+ Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
+ }
+ }
+ }
+
+ public function __clone()
+ {
+ // When we clone, we need to break the reference to
+ $this->aliases = clone $this->aliases;
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'aliases': return $this->aliases;
+ case 'children': return $this->children;
+ case 'forced_as_may': return $this->forced_as_may;
+ case 'is_collective': return $this->is_collective;
+ case 'is_no_user_modification': return $this->is_no_user_modification;
+ case 'is_single_value': return $this->is_single_value;
+ case 'equality': return $this->equality;
+ case 'max_length': return $this->max_length;
+ case 'ordering': return $this->ordering;
+ case 'required_by_object_classes': return $this->required_by_object_classes;
+ case 'sub_str_rule': return $this->sub_str_rule;
+ case 'sup_attribute': return $this->sup_attribute;
+ case 'syntax': return $this->syntax;
+ case 'syntax_oid': return $this->syntax_oid;
+ case 'type': return $this->type;
+ case 'usage': return $this->usage;
+ case 'used_in_object_classes': return $this->used_in_object_classes;
+
+ default: return parent::__get($key);
+ }
+ }
+
+ /**
+ * Adds an attribute name to the alias array.
+ *
+ * @param string $alias The name of a new attribute to add to this attribute's list of aliases.
+ */
+ public function addAlias(string $alias): void
+ {
+ $this->aliases->push($alias);
+ }
+
+ /**
+ * Children of this attribute type that inherit from this one
+ *
+ * @param string $child
+ * @return void
+ */
+ public function addChild(string $child): void
+ {
+ $this->children->push($child);
+ }
+
+ /**
+ * Adds an objectClass name to this attribute's list of "required by" objectClasses,
+ * that is the list of objectClasses which must have this attribute.
+ *
+ * @param string $name The name of the objectClass to add.
+ */
+ public function addRequiredByObjectClass(string $name): void
+ {
+ if ($this->required_by_object_classes->search($name) === FALSE)
+ $this->required_by_object_classes->push($name);
+ }
+
+ /**
+ * Adds an objectClass name to this attribute's list of "used in" objectClasses,
+ * that is the list of objectClasses which provide this attribute.
+ *
+ * @param string $name The name of the objectClass to add.
+ */
+ public function addUsedInObjectClass(string $name): void
+ {
+ if ($this->used_in_object_classes->search($name) === FALSE)
+ $this->used_in_object_classes->push($name);
+ }
+
+ /**
+ * Gets the names of attributes that are an alias for this attribute (if any).
+ *
+ * @return Collection An array of names of attributes which alias this attribute or
+ * an empty array if no attribute aliases this object.
+ * @deprecated use class->aliases
+ */
+ public function getAliases(): Collection
+ {
+ return $this->aliases;
+ }
+
+ /**
+ * Gets this attribute's equality string
+ *
+ * @return string
+ * @deprecated use $this->equality
+ */
+ public function getEquality()
+ {
+ return $this->equality;
+ }
+
+ /**
+ * Gets whether this attribute is collective.
+ *
+ * @return boolean Returns TRUE if this attribute is collective and FALSE otherwise.
+ * @deprecated use $this->is_collective
+ */
+ public function getIsCollective(): bool
+ {
+ return $this->is_collective;
+ }
+
+ /**
+ * Gets whether this attribute is not modifiable by users.
+ *
+ * @return boolean Returns TRUE if this attribute is not modifiable by users.
+ * @deprecated use $this->is_no_user_modification
+ */
+ public function getIsNoUserModification(): bool
+ {
+ return $this->is_no_user_modification;
+ }
+
+ /**
+ * Gets whether this attribute is single-valued. If this attribute only supports single values, TRUE
+ * is returned. If this attribute supports multiple values, FALSE is returned.
+ *
+ * @return boolean Returns TRUE if this attribute is single-valued or FALSE otherwise.
+ * @deprecated use class->is_single_value
+ */
+ public function getIsSingleValue(): bool
+ {
+ return $this->is_single_value;
+ }
+
+ /**
+ * Gets this attribute's the maximum length. If no maximum is defined by the LDAP server, NULL is returned.
+ *
+ * @return int The maximum length (in characters) of this attribute or NULL if no maximum is specified.
+ * @deprecated use $this->max_length;
+ */
+ public function getMaxLength()
+ {
+ return $this->max_length;
+ }
+
+ /**
+ * Gets this attribute's ordering specification.
+ *
+ * @return string
+ * @deprecated use $this->ordering
+ */
+ public function getOrdering(): string
+ {
+ return $this->ordering;
+ }
+
+ /**
+ * Gets the list of "required by" objectClasses, that is the list of objectClasses
+ * which provide must have attribute.
+ *
+ * @return array An array of names of objectclasses (strings) which provide this attribute
+ */
+ public function getRequiredByObjectClasses() {
+ if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+ debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->required_by_object_classes);
+
+ return $this->required_by_object_classes;
+ }
+ /**
+ * Gets this attribute's substring matching specification
+ *
+ * @return string
+ * @deprecated use $this->sub_str_rule;
+ */
+ public function getSubstr() {
+ return $this->sub_str_rule;
+ }
+
+ /**
+ * Gets this attribute's parent attribute (if any). If this attribute does not
+ * inherit from another attribute, NULL is returned.
+ *
+ * @return string
+ * @deprecated use $class->sup_attribute directly
+ */
+ public function getSupAttribute() {
+ return $this->sup_attribute;
+ }
+
+ /**
+ * Gets this attribute's syntax OID. Differs from getSyntaxString() in that this
+ * function only returns the actual OID with any length specification removed.
+ * Ie, if the syntax string is "1.2.3.4{16}", this function only retruns
+ * "1.2.3.4".
+ *
+ * @return string The syntax OID string.
+ * @deprecated use $this->syntax_oid;
+ */
+ public function getSyntaxOID()
+ {
+ return $this->syntax_oid;
+ }
+
+ /**
+ * Gets this attribute's raw syntax string (ie: "1.2.3.4{16}").
+ *
+ * @return string The raw syntax string
+ */
+ public function getSyntaxString() {
+ if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+ debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->syntax);
+
+ return $this->syntax;
+ }
+
+ /**
+ * Gets this attribute's type
+ *
+ * @return string The attribute's type.
+ * @deprecated use $this->type;
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Gets this attribute's usage string as defined by the LDAP server
+ *
+ * @return string
+ * @deprecated use $this->usage
+ */
+ public function getUsage()
+ {
+ return $this->usage;
+ }
+
+ /**
+ * Gets the list of "used in" objectClasses, that is the list of objectClasses
+ * which provide this attribute.
+ *
+ * @return Collection An array of names of objectclasses (strings) which provide this attribute
+ * @deprecated use $this->used_in_object_classes
+ */
+ public function getUsedInObjectClasses(): Collection
+ {
+ return $this->used_in_object_classes;
+ }
+
+ /**
+ * Returns whether the specified attribute is an alias for this one (based on this attribute's alias list).
+ *
+ * @param string $attr_name The name of the attribute to check.
+ * @return boolean TRUE if the specified attribute is an alias for this one, or FALSE otherwise.
+ */
+ public function isAliasFor($attr_name) {
+ if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+ debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
+
+ foreach ($this->aliases as $alias_attr_name)
+ if (strcasecmp($alias_attr_name,$attr_name) == 0)
+ return TRUE;
+
+ return FALSE;
+ }
+
+ /**
+ * @return bool
+ * @deprecated use $this->forced_as_may
+ */
+ public function isForceMay(): bool
+ {
+ return $this->forced_as_may;
+ }
+
+ /**
+ * Removes an attribute name from this attribute's alias array.
+ *
+ * @param string $alias The name of the attribute to remove.
+ */
+ public function removeAlias(string $alias): void
+ {
+ if (($x=$this->aliases->search($alias)) !== FALSE)
+ $this->aliases->forget($x);
+ }
+
+ /**
+ * Given a list of object classes, determine if this is a required attribute
+ *
+ * @param Collection $oc List of objectclasses to compare.
+ * @return Collection
+ */
+ public function required_by(Collection $oc): Collection
+ {
+ return $oc->diff($this->required_by_object_classes);
+ }
+
+ /**
+ * Sets this attribute's list of aliases.
+ *
+ * @param Collection $aliases The array of alias names (strings)
+ * @deprecated use $this->aliases =
+ */
+ public function setAliases(Collection $aliases): void
+ {
+ $this->aliases = $aliases;
+ }
+
+ /**
+ * This function will mark this attribute as a forced MAY attribute
+ */
+ public function setForceMay() {
+ if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+ debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
+
+ $this->forced_as_may = TRUE;
+ }
+
+ /**
+ * Sets whether this attribute is single-valued.
+ *
+ * @param boolean $is
+ */
+ public function setIsSingleValue(bool $is): void
+ {
+ $this->is_single_value = $is;
+ }
+
+ /**
+ * Sets this attribute's SUP attribute (ie, the attribute from which this attribute inherits).
+ *
+ * @param string $attr The name of the new parent (SUP) attribute
+ */
+ public function setSupAttribute(string $attr): void
+ {
+ $this->sup_attribute = trim($attr);
+ }
+
+ /**
+ * Sets this attribute's type.
+ *
+ * @param string $type The new type.
+ */
+ public function setType($type) {
+ if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
+ debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
+
+ $this->type = $type;
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/Base.php b/app/Classes/LDAP/Schema/Base.php
new file mode 100644
index 0000000..d97ef6c
--- /dev/null
+++ b/app/Classes/LDAP/Schema/Base.php
@@ -0,0 +1,110 @@
+line = $line;
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'description': return $this->description;
+ case 'is_obsolete': return $this->is_obsolete;
+ case 'line': return $this->line;
+ case 'name': return $this->name;
+ case 'name_lc': return strtolower($this->name);
+ case 'oid': return $this->oid;
+
+ default:
+ throw new InvalidUsage('Unknown key:'.$key);
+ }
+ }
+
+ /**
+ * @return string
+ * @deprecated replace with $class->description
+ */
+ public function getDescription(): string
+ {
+ return $this->description;
+ }
+
+ /**
+ * Gets whether this item is flagged as obsolete by the LDAP server.
+ *
+ * @deprecated replace with $this->is_obsolete
+ */
+ public function getIsObsolete(): bool
+ {
+ return $this->is_obsolete;
+ }
+
+ /**
+ * Return the objects name.
+ *
+ * @param boolean $lower Return the name in lower case (default)
+ * @return string The name
+ * @deprecated use object->name
+ */
+ public function getName(bool $lower=TRUE): string
+ {
+ return $lower ? strtolower($this->name) : $this->name;
+ }
+
+ /**
+ * Return the objects name.
+ *
+ * @return string The name
+ * @deprecated use object->oid
+ */
+ public function getOID(): string
+ {
+ return $this->oid;
+ }
+
+ public function setDescription(string $desc): void
+ {
+ $this->description = $desc;
+ }
+
+ /**
+ * Sets this attribute's name.
+ *
+ * @param string $name The new name to give this attribute.
+ */
+ public function setName($name): void
+ {
+ $this->name = $name;
+ }
+
+ public function setOID(string $oid): void
+ {
+ $this->oid = $oid;
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/LDAPSyntax.php b/app/Classes/LDAP/Schema/LDAPSyntax.php
new file mode 100644
index 0000000..046abe7
--- /dev/null
+++ b/app/Classes/LDAP/Schema/LDAPSyntax.php
@@ -0,0 +1,79 @@
+description .= (strlen($this->description) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ $this->description = preg_replace("/^\'(.*)\'$/",'$1',$this->description);
+
+ Log::debug(sprintf('- Case DESC returned (%s)',$this->description));
+ break;
+
+ case 'X-BINARY-TRANSFER-REQUIRED':
+ $this->binary_transfer_required = (str_replace("'",'',$strings[++$i]) === 'TRUE');
+
+ Log::debug(sprintf('- Case X-BINARY-TRANSFER-REQUIRED returned (%s)',$this->binary_transfer_required));
+ break;
+
+ case 'X-NOT-HUMAN-READABLE':
+ $this->is_not_human_readable = (str_replace("'",'',$strings[++$i]) === 'TRUE');
+
+ Log::debug(sprintf('- Case X-NOT-HUMAN-READABLE returned (%s)',$this->is_not_human_readable));
+ break;
+
+ default:
+ if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
+ $this->oid = $strings[$i];
+ Log::debug(sprintf('- Case default returned (%s)',$this->oid));
+
+ } elseif ($strings[$i])
+ Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
+ }
+ }
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'binary_transfer_required': return $this->binary_transfer_required;
+ case 'is_not_human_readable': return $this->is_not_human_readable;
+
+ default: return parent::__get($key);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/MatchingRule.php b/app/Classes/LDAP/Schema/MatchingRule.php
new file mode 100644
index 0000000..5492421
--- /dev/null
+++ b/app/Classes/LDAP/Schema/MatchingRule.php
@@ -0,0 +1,142 @@
+used_by_attrs = collect();
+
+ for ($i=0; $iname .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ } else {
+ $i++;
+
+ do {
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ do {
+ $i++;
+
+ } while (! preg_match('/\)+\)?/',$strings[$i]));
+ }
+
+ $this->name = preg_replace("/^\'/",'',$this->name);
+ $this->name = preg_replace("/\'$/",'',$this->name);
+
+ Log::debug(sprintf(sprintf('- Case NAME returned (%s)',$this->name)));
+ break;
+
+ case 'DESC':
+ do {
+ $this->description .= (strlen($this->description) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ $this->description = preg_replace("/^\'(.*)\'$/",'$1',$this->description);
+
+ Log::debug(sprintf('- Case DESC returned (%s)',$this->description));
+ break;
+
+ case 'OBSOLETE':
+ $this->is_obsolete = TRUE;
+
+ Log::debug(sprintf('- Case OBSOLETE returned (%s)',$this->is_obsolete));
+ break;
+
+ case 'SYNTAX':
+ $this->syntax = $strings[++$i];
+
+ Log::debug(sprintf('- Case SYNTAX returned (%s)',$this->syntax));
+ break;
+
+ default:
+ if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
+ $this->oid = $strings[$i];
+ Log::debug(sprintf('- Case default returned (%s)',$this->oid));
+
+ } elseif ($strings[$i])
+ Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
+ }
+ }
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'syntax': return $this->syntax;
+ case 'used_by_attrs': return $this->used_by_attrs;
+
+ default: return parent::__get($key);
+ }
+ }
+
+ /**
+ * Adds an attribute name to the list of attributes who use this MatchingRule
+ */
+ public function addUsedByAttr(string $name): void
+ {
+ $name = trim($name);
+
+ if ($this->used_by_attrs->search($name) === FALSE)
+ $this->used_by_attrs->push($name);
+ }
+
+ /**
+ * Gets an array of attribute names (strings) which use this MatchingRule
+ *
+ * @return array The array of attribute names (strings).
+ * @deprecated use $this->used_by_attrs
+ */
+ public function getUsedByAttrs()
+ {
+ return $this->used_by_attrs;
+ }
+
+ /**
+ * Sets the list of used_by_attrs to the array specified by $attrs;
+ *
+ * @param Collection $attrs The array of attribute names (strings) which use this MatchingRule
+ */
+ public function setUsedByAttrs(Collection $attrs): void
+ {
+ $this->used_by_attrs = $attrs;
+ }
+}
diff --git a/app/Classes/LDAP/Schema/MatchingRuleUse.php b/app/Classes/LDAP/Schema/MatchingRuleUse.php
new file mode 100644
index 0000000..cdbd2c8
--- /dev/null
+++ b/app/Classes/LDAP/Schema/MatchingRuleUse.php
@@ -0,0 +1,99 @@
+used_by_attrs = collect();
+
+ for ($i=0; $iname .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ } else {
+ $i++;
+
+ do {
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match("/\'$/s",$strings[$i]));
+
+ do {
+ $i++;
+
+ } while (! preg_match('/\)+\)?/',$strings[$i]));
+ }
+
+ $this->name = preg_replace("/^\'(.*)\'$/",'$1',$this->name);
+
+ Log::debug(sprintf(sprintf('- Case NAME returned (%s)',$this->name)));
+ break;
+
+ case 'APPLIES':
+ if ($strings[$i+1] != '(') {
+ // Has a single attribute name
+ $this->used_by_attrs = collect($strings[++$i]);
+
+ } else {
+ // Has multiple attribute names
+ while ($strings[++$i] != ')') {
+ $new_attr = $strings[++$i];
+ $new_attr = preg_replace("/^\'(.*)\'$/",'$1',$new_attr);
+
+ $this->used_by_attrs->push($new_attr);
+ }
+ }
+
+ Log::debug(sprintf('- Case APPLIES returned (%s)',$this->used_by_attrs->join(',')));
+ break;
+
+ default:
+ if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
+ $this->oid = $strings[$i];
+ Log::debug(sprintf('- Case default returned (%s)',$this->oid));
+
+ } elseif ($strings[$i])
+ Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
+ }
+ }
+ }
+
+ /**
+ * Gets an array of attribute names (strings) which use this MatchingRuleUse object.
+ *
+ * @return array The array of attribute names (strings).
+ * @deprecated use $this->used_by_attrs
+ */
+ public function getUsedByAttrs()
+ {
+ return $this->used_by_attrs;
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/ObjectClass.php b/app/Classes/LDAP/Schema/ObjectClass.php
new file mode 100644
index 0000000..84b3f0e
--- /dev/null
+++ b/app/Classes/LDAP/Schema/ObjectClass.php
@@ -0,0 +1,526 @@
+server = $server;
+ $this->may_attrs = collect();
+ $this->may_force = collect();
+ $this->must_attrs = collect();
+ $this->sup_classes = collect();
+ $this->child_objectclasses = collect();
+
+ for ($i=0; $i < count($strings); $i++) {
+ switch ($strings[$i]) {
+ case '(':
+ case ')':
+ break;
+
+ case 'NAME':
+ if ($strings[$i+1] != '(') {
+ do {
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match('/\'$/s',$strings[$i]));
+
+ } else {
+ $i++;
+
+ do {
+ $this->name .= (strlen($this->name) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match('/\'$/s',$strings[$i]));
+
+ do {
+ $i++;
+ } while (! preg_match('/\)+\)?/',$strings[$i]));
+ }
+
+ $this->name = preg_replace("/^\'(.*)\'$/",'$1',$this->name);
+
+ Log::debug(sprintf(sprintf('- Case NAME returned (%s)',$this->name)));
+ break;
+
+ case 'DESC':
+ do {
+ $this->description .= (strlen($this->description) ? ' ' : '').$strings[++$i];
+
+ } while (! preg_match('/\'$/s',$strings[$i]));
+
+ $this->description = preg_replace("/^\'(.*)\'$/",'$1',$this->description);
+
+ Log::debug(sprintf('- Case DESC returned (%s)',$this->description));
+ break;
+
+ case 'OBSOLETE':
+ $this->is_obsolete = TRUE;
+
+ Log::debug(sprintf('- Case OBSOLETE returned (%s)',$this->is_obsolete));
+ break;
+
+ case 'SUP':
+ if ($strings[$i+1] != '(') {
+ $this->sup_classes->push(preg_replace("/'/",'',$strings[++$i]));
+
+ } else {
+ $i++;
+
+ do {
+ $i++;
+
+ if ($strings[$i] != '$')
+ $this->sup_classes->push(preg_replace("/'/",'',$strings[$i]));
+
+ } while (! preg_match('/\)+\)?/',$strings[$i+1]));
+ }
+
+ Log::debug(sprintf('- Case SUP returned (%s)',$this->sup_classes->join(',')));
+ break;
+
+ case 'ABSTRACT':
+ $this->type = self::OC_ABSTRACT;
+
+ Log::debug(sprintf('- Case ABSTRACT returned (%s)',$this->type));
+ break;
+
+ case 'STRUCTURAL':
+ $this->type = self::OC_STRUCTURAL;
+
+ Log::debug(sprintf('- Case STRUCTURAL returned (%s)',$this->type));
+ break;
+
+ case 'AUXILIARY':
+ $this->type = self::OC_AUXILIARY;
+
+ Log::debug(sprintf('- Case AUXILIARY returned (%s)',$this->type));
+ break;
+
+ case 'MUST':
+ $attrs = collect();
+
+ $i = $this->parseList(++$i,$strings,$attrs);
+
+ Log::debug(sprintf('= parseList returned %d (%s)',$i,$attrs->join(',')));
+
+ foreach ($attrs as $string) {
+ $attr = new ObjectClassAttribute($string,$this->name);
+
+ if ($server->isForceMay($attr->getName())) {
+ $this->may_force->push($attr);
+ $this->may_attrs->push($attr);
+
+ } else
+ $this->must_attrs->push($attr);
+ }
+
+ Log::debug(sprintf('- Case MUST returned (%s) (%s)',$this->must_attrs->join(','),$this->may_force->join(',')));
+ break;
+
+ case 'MAY':
+ $attrs = collect();
+
+ $i = $this->parseList(++$i,$strings,$attrs);
+
+ Log::debug(sprintf('parseList returned %d (%s)',$i,$attrs->join(',')));
+
+ foreach ($attrs as $string) {
+ $attr = new ObjectClassAttribute($string,$this->name);
+ $this->may_attrs->push($attr);
+ }
+
+ Log::debug(sprintf('- Case MAY returned (%s)',$this->may_attrs->join(',')));
+ break;
+
+ default:
+ if (preg_match('/[\d\.]+/i',$strings[$i]) && ($i === 1)) {
+ $this->oid = $strings[$i];
+ Log::debug(sprintf('- Case default returned (%s)',$this->oid));
+
+ } elseif ($strings[$i])
+ Log::alert(sprintf('! Case default discovered a value NOT parsed (%s)',$strings[$i]),['line'=>$line]);
+ }
+ }
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'sup':
+ return $this->sup_classes;
+
+ case 'type_name':
+ switch ($this->type) {
+ case self::OC_STRUCTURAL: return 'Structural';
+ case self::OC_ABSTRACT: return 'Abstract';
+ case self::OC_AUXILIARY: return 'Auxiliary';
+ default:
+ throw new InvalidUsage('Unknown ObjectClass Type: '.$this->type);
+ }
+
+ default: return parent::__get($key);
+ }
+ }
+
+ /**
+ * Adds an objectClass to the list of objectClasses that inherit
+ * from this objectClass.
+ *
+ * @param String $name The name of the objectClass to add
+ */
+ public function addChildObjectClass(string $name): void
+ {
+ if ($this->child_objectclasses->search($name) === FALSE) {
+ $this->child_objectclasses->push($name);
+ }
+ }
+
+ /**
+ * Behaves identically to addMustAttrs, but it operates on the MAY
+ * attributes of this objectClass.
+ *
+ * @param array $attr An array of attribute names (strings) to add.
+ */
+ private function addMayAttrs(array $attr): void
+ {
+ if (! is_array($attr) || ! count($attr))
+ return;
+
+ $this->may_attrs = $this->may_attrs->merge($attr)->unique();
+ }
+
+ /**
+ * Adds the specified array of attributes to this objectClass' list of
+ * MUST attributes. The resulting array of must attributes will contain
+ * unique members.
+ *
+ * @param array $attr An array of attribute names (strings) to add.
+ */
+ private function addMustAttrs(array $attr): void
+ {
+ if (! is_array($attr) || ! count($attr))
+ return;
+
+ $this->must_attrs = $this->must_attrs->merge($attr)->unique();
+ }
+
+ /**
+ * @return Collection
+ * @deprecated use $this->may_force
+ */
+ public function getForceMayAttrs(): Collection
+ {
+ return $this->may_force;
+ }
+
+ /**
+ * Gets an array of AttributeType objects that entries of this ObjectClass may define.
+ * This differs from getMayAttrNames in that it returns an array of AttributeType objects
+ *
+ * @param bool $parents Also get the may attrs of our parents.
+ * @return Collection The array of allowed AttributeType objects.
+ *
+ * @throws InvalidUsage
+ * @see getMustAttrNames
+ * @see getMustAttrs
+ * @see getMayAttrNames
+ * @see AttributeType
+ */
+ public function getMayAttrs(bool $parents=FALSE): Collection
+ {
+ // If we dont need our parents, then we'll just return ours.
+ if (! $parents)
+ return $this->may_attrs->sortBy(function($item) { return strtolower($item->name.$item->source); });
+
+ $attrs = $this->may_attrs;
+
+ foreach ($this->getParents() as $object_class) {
+ $sc = $this->server->schema('objectclasses',$object_class);
+ $attrs = $attrs->merge($sc->getMayAttrs($parents));
+ }
+
+ // Remove any duplicates
+ $attrs = $attrs->unique(function($item) { return $item->name; });
+
+ // Return a sorted list
+ return $attrs->sortBy(function($item) { return strtolower($item->name.$item->source); });
+ }
+
+ /**
+ * Gets an array of attribute names (strings) that entries of this ObjectClass must define.
+ * This differs from getMayAttrs in that it returns an array of strings rather than
+ * array of AttributeType objects
+ *
+ * @param bool $parents An array of ObjectClass objects to use when traversing
+ * the inheritance tree. This presents some what of a bootstrapping problem
+ * as we must fetch all objectClasses to determine through inheritance which
+ * attributes this objectClass provides.
+ * @return Collection The array of allowed attribute names (strings).
+ *
+ * @throws InvalidUsage
+ * @see getMustAttrs
+ * @see getMayAttrs
+ * @see getMustAttrNames
+ */
+ public function getMayAttrNames(bool $parents=FALSE): Collection
+ {
+ return $this->getMayAttrs($parents)->ppluck('name');
+ }
+
+ /**
+ * Gets an array of AttributeType objects that entries of this ObjectClass must define.
+ * This differs from getMustAttrNames in that it returns an array of AttributeType objects
+ *
+ * @param bool $parents Also get the must attrs of our parents.
+ * @return Collection The array of required AttributeType objects.
+ *
+ * @throws InvalidUsage
+ * @see getMustAttrNames
+ * @see getMayAttrs
+ * @see getMayAttrNames
+ */
+ public function getMustAttrs(bool $parents=FALSE): Collection
+ {
+ // If we dont need our parents, then we'll just return ours.
+ if (! $parents)
+ return $this->must_attrs->sortBy(function($item) { return strtolower($item->name.$item->source); });
+
+ $attrs = $this->must_attrs;
+
+ foreach ($this->getParents() as $object_class) {
+ $sc = $this->server->schema('objectclasses',$object_class);
+ $attrs = $attrs->merge($sc->getMustAttrs($parents));
+ }
+
+ // Remove any duplicates
+ $attrs = $attrs->unique(function($item) { return $item->name; });
+
+ // Return a sorted list
+ return $attrs->sortBy(function($item) { return strtolower($item->name.$item->source); });
+ }
+
+ /**
+ * Gets an array of attribute names (strings) that entries of this ObjectClass must define.
+ * This differs from getMustAttrs in that it returns an array of strings rather than
+ * array of AttributeType objects
+ *
+ * @param bool $parents An array of ObjectClass objects to use when traversing
+ * the inheritance tree. This presents some what of a bootstrapping problem
+ * as we must fetch all objectClasses to determine through inheritance which
+ * attributes this objectClass provides.
+ * @return Collection The array of allowed attribute names (strings).
+ *
+ * @throws InvalidUsage
+ * @see getMustAttrs
+ * @see getMayAttrs
+ * @see getMayAttrNames
+ */
+ public function getMustAttrNames(bool $parents=FALSE): Collection
+ {
+ return $this->getMustAttrs($parents)->ppluck('name');
+ }
+
+ /**
+ * This will return all our parent ObjectClass Objects
+ */
+ public function getParents(): Collection
+ {
+ // If the only class is 'top', then we have no more parents
+ if (($this->sup_classes->count() === 1) && (strtolower($this->sup_classes->first()) === 'top'))
+ return collect();
+
+ $result = collect();
+
+ foreach ($this->sup_classes as $object_class) {
+ $result->push($object_class);
+
+ $oc = $this->server->schema('objectclasses',$object_class);
+
+ if ($oc)
+ $result = $result->merge($oc->getParents());
+ }
+
+ return $result;
+ }
+
+ /**
+ * Determine if an array is listed in the may_force attrs
+ */
+ public function isForceMay(string $attr): bool
+ {
+ return $this->may_force->ppluck('name')->contains($attr);
+ }
+
+ /**
+ * Return if this objectClass is related to $oclass
+ *
+ * @param array $oclass ObjectClasses that this attribute may be related to
+ * @return bool
+ * @throws InvalidUsage
+ */
+ public function isRelated(array $oclass): bool
+ {
+ // If I am in the array, we'll just return false
+ if (in_array_ignore_case($this->name,$oclass))
+ return FALSE;
+
+ foreach ($oclass as $object_class) {
+ $oc = $this->server->schema('objectclasses',$object_class);
+
+ if ($oc->isStructural() && in_array_ignore_case($this->name,$oc->getParents()))
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ public function isStructural(): bool
+ {
+ return $this->type === self::OC_STRUCTURAL;
+ }
+
+ /**
+ * Parse an LDAP schema list
+ *
+ * A list starts with a ( followed by a list of attributes separated by $ terminated by )
+ * The first token can therefore be a ( or a (NAME or a (NAME)
+ * The last token can therefore be a ) or NAME)
+ * The last token may be terminated by more than one bracket
+ */
+ private function parseList(int $i,array $strings,Collection &$attrs): int
+ {
+ $string = $strings[$i];
+
+ if (! preg_match('/^\(/',$string)) {
+ // A bareword only - can be terminated by a ) if the last item
+ if (preg_match('/\)+$/',$string))
+ $string = preg_replace('/\)+$/','',$string);
+
+ $attrs->push($string);
+
+ } elseif (preg_match('/^\(.*\)$/',$string)) {
+ $string = preg_replace('/^\(/','',$string);
+ $string = preg_replace('/\)+$/','',$string);
+
+ $attrs->push($string);
+
+ } else {
+ // Handle the opening cases first
+ if ($string === '(') {
+ $i++;
+
+ } elseif (preg_match('/^\(./',$string)) {
+ $string = preg_replace('/^\(/','',$string);
+ $attrs->push($string);
+ $i++;
+ }
+
+ // Token is either a name, a $ or a ')'
+ // NAME can be terminated by one or more ')'
+ while (! preg_match('/\)+$/',$strings[$i])) {
+ $string = $strings[$i];
+
+ if ($string === '$') {
+ $i++;
+ continue;
+ }
+
+ if (preg_match('/\)$/',$string))
+ $string = preg_replace('/\)+$/','',$string);
+ else
+ $i++;
+
+ $attrs->push($string);
+ }
+ }
+
+ $attrs = $attrs->sort();
+
+ return $i;
+ }
+
+ /**
+ * Returns the array of objectClass names which inherit from this objectClass.
+ *
+ * @return Collection Names of objectClasses which inherit from this objectClass.
+ * @deprecated use $this->child_objectclasses
+ */
+ public function getChildObjectClasses(): Collection
+ {
+ return $this->child_objectclasses;
+ }
+
+ /**
+ * Gets the objectClass names from which this objectClass inherits.
+ *
+ * @return array An array of objectClass names (strings)
+ * @deprecated use $this->sup_classes;
+ */
+ public function getSupClasses() {
+ return $this->sup_classes;
+ }
+
+ /**
+ * Gets the type of this objectClass: STRUCTURAL, ABSTRACT, or AUXILIARY.
+ *
+ * @deprecated use $this->type_name
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Schema/ObjectClassAttribute.php b/app/Classes/LDAP/Schema/ObjectClassAttribute.php
new file mode 100644
index 0000000..62e92ff
--- /dev/null
+++ b/app/Classes/LDAP/Schema/ObjectClassAttribute.php
@@ -0,0 +1,41 @@
+name = $name;
+ $this->source = $source;
+ }
+
+ public function __get(string $key): mixed
+ {
+ switch ($key) {
+ case 'source':
+ return $this->source;
+
+ default: return parent::__get($key);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/Classes/LDAP/Server.php b/app/Classes/LDAP/Server.php
new file mode 100644
index 0000000..365017c
--- /dev/null
+++ b/app/Classes/LDAP/Server.php
@@ -0,0 +1,520 @@
+attributetypes;
+ case 'ldapsyntaxes': return $this->ldapsyntaxes;
+ case 'matchingrules': return $this->matchingrules;
+ case 'objectclasses': return $this->objectclasses;
+
+ default:
+ throw new Exception('Unknown key:'.$key);
+ }
+ }
+
+ /* STATIC METHODS */
+
+ /**
+ * Gets the root DN of the specified LDAPServer, or throws an exception if it
+ * can't find it.
+ *
+ * @param null $connection Return a collection of baseDNs
+ * @param bool $objects Return a collection of Entry Models
+ * @return Collection
+ * @throws ObjectNotFoundException
+ * @testedin GetBaseDNTest::testBaseDNExists();
+ */
+ public static function baseDNs($connection=NULL,bool $objects=TRUE): Collection
+ {
+ $cachetime = Carbon::now()->addSeconds(Config::get('ldap.cache.time'));
+
+ try {
+ $base = self::rootDSE($connection,$cachetime);
+
+ /**
+ * LDAP Error Codes:
+ * https://ldap.com/ldap-result-code-reference/
+ * + success 0
+ * + operationsError 1
+ * + protocolError 2
+ * + timeLimitExceeded 3
+ * + sizeLimitExceeded 4
+ * + compareFalse 5
+ * + compareTrue 6
+ * + authMethodNotSupported 7
+ * + strongerAuthRequired 8
+ * + referral 10
+ * + adminLimitExceeded 11
+ * + unavailableCriticalExtension 12
+ * + confidentialityRequired 13
+ * + saslBindInProgress 14
+ * + noSuchAttribute 16
+ * + undefinedAttributeType 17
+ * + inappropriateMatching 18
+ * + constraintViolation 19
+ * + attributeOrValueExists 20
+ * + invalidAttributeSyntax 21
+ * + noSuchObject 32
+ * + aliasProblem 33
+ * + invalidDNSyntax 34
+ * + isLeaf 35
+ * + aliasDereferencingProblem 36
+ * + inappropriateAuthentication 48
+ * + invalidCredentials 49
+ * + insufficientAccessRights 50
+ * + busy 51
+ * + unavailable 52
+ * + unwillingToPerform 53
+ * + loopDetect 54
+ * + sortControlMissing 60
+ * + offsetRangeError 61
+ * + namingViolation 64
+ * + objectClassViolation 65
+ * + notAllowedOnNonLeaf 66
+ * + notAllowedOnRDN 67
+ * + entryAlreadyExists 68
+ * + objectClassModsProhibited 69
+ * + resultsTooLarge 70
+ * + affectsMultipleDSAs 71
+ * + virtualListViewError or controlError 76
+ * + other 80
+ * + serverDown 81
+ * + localError 82
+ * + encodingError 83
+ * + decodingError 84
+ * + timeout 85
+ * + authUnknown 86
+ * + filterError 87
+ * + userCanceled 88
+ * + paramError 89
+ * + noMemory 90
+ * + connectError 91
+ * + notSupported 92
+ * + controlNotFound 93
+ * + noResultsReturned 94
+ * + moreResultsToReturn 95
+ * + clientLoop 96
+ * + referralLimitExceeded 97
+ * + invalidResponse 100
+ * + ambiguousResponse 101
+ * + tlsNotSupported 112
+ * + intermediateResponse 113
+ * + unknownType 114
+ * + canceled 118
+ * + noSuchOperation 119
+ * + tooLate 120
+ * + cannotCancel 121
+ * + assertionFailed 122
+ * + authorizationDenied 123
+ * + e-syncRefreshRequired 4096
+ * + noOperation 16654
+ *
+ * LDAP Tag Codes:
+ * + A client bind operation 97
+ * + The entry for which you were searching 100
+ * + The result from a search operation 101
+ * + The result from a modify operation 103
+ * + The result from an add operation 105
+ * + The result from a delete operation 107
+ * + The result from a modify DN operation 109
+ * + The result from a compare operation 111
+ * + A search reference when the entry you perform your search on holds a referral to the entry you require.
+ * + Search references are expressed in terms of a referral.
+ * 115
+ * + A result from an extended operation 120
+ */
+ // If we cannot get to our LDAP server we'll head straight to the error page
+ } catch (LdapRecordException $e) {
+ switch ($e->getDetailedError()->getErrorCode()) {
+ case 49:
+ abort(401,$e->getDetailedError()->getErrorMessage());
+
+ default:
+ abort(597,$e->getDetailedError()->getErrorMessage());
+ }
+ }
+
+ if (! $objects)
+ return collect($base->namingcontexts);
+
+ /**
+ * @note While we are caching our baseDNs, it seems if we have more than 1,
+ * our caching doesnt generate a hit on a subsequent call to this function (before the cache expires).
+ * IE: If we have 5 baseDNs, it takes 5 calls to this function to case them all.
+ * @todo Possibly a bug wtih ldaprecord, so need to investigate
+ */
+ $result = collect();
+ foreach ($base->namingcontexts as $dn) {
+ $result->push((new Entry)->cache($cachetime)->findOrFail($dn));
+ }
+
+ return $result;
+ }
+
+ /**
+ * Obtain the rootDSE for the server, that gives us server information
+ *
+ * @param null $connection
+ * @return Entry|null
+ * @throws ObjectNotFoundException
+ * @testedin TranslateOidTest::testRootDSE();
+ */
+ public static function rootDSE($connection=NULL,Carbon $cachetime=NULL): ?Model
+ {
+ $e = new Entry;
+
+ return Entry::on($connection ?? $e->getConnectionName())
+ ->cache($cachetime)
+ ->in(NULL)
+ ->read()
+ ->select(['+'])
+ ->whereHas('objectclass')
+ ->firstOrFail();
+ }
+
+ /**
+ * Get the Schema DN
+ *
+ * @param $connection
+ * @return string
+ * @throws ObjectNotFoundException
+ */
+ public static function schemaDN($connection=NULL): string
+ {
+ $cachetime = Carbon::now()->addSeconds(Config::get('ldap.cache.time'));
+
+ return collect(self::rootDSE($connection,$cachetime)->subschemasubentry)->first();
+ }
+
+ /**
+ * Query the server for a DN and return its children and if those children have children.
+ *
+ * @param string $dn
+ * @return LDAPCollection|NULL
+ */
+ public function children(string $dn): ?LDAPCollection
+ {
+ return ($x=(new Entry)
+ ->query()
+ ->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
+ ->select(['*','hassubordinates'])
+ ->setDn($dn)
+ ->listing()
+ ->get()) ? $x : NULL;
+ }
+
+ /**
+ * Fetch a DN from the server
+ *
+ * @param string $dn
+ * @param array $attrs
+ * @return Entry|null
+ */
+ public function fetch(string $dn,array $attrs=['*','+']): ?Entry
+ {
+ return ($x=(new Entry)
+ ->query()
+ ->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
+ ->select($attrs)
+ ->find($dn)) ? $x : NULL;
+ }
+
+ /**
+ * This function determines if the specified attribute is contained in the force_may list
+ * as configured in config.php.
+ *
+ * @return boolean True if the specified attribute is configured to be force as a may attribute
+ */
+ public function isForceMay($attr_name): bool
+ {
+ return in_array($attr_name,config('pla.force_may',[]));
+ }
+
+ /**
+ * Return the server's schema
+ *
+ * @param string $item Schema Item to Fetch
+ * @param string|null $key
+ * @return Collection|Base|NULL
+ * @throws InvalidUsage
+ */
+ public function schema(string $item,string $key=NULL): Collection|Base|NULL
+ {
+ // Ensure our item to fetch is lower case
+ $item = strtolower($item);
+ if ($key)
+ $key = strtolower($key);
+
+ // This error message is not localized as only developers should ever see it
+ if (! in_array($item,self::schema_types))
+ throw new InvalidUsage('Invalid request to fetch schema: '.$item);
+
+ $result = Cache::remember('schema'.$item,config('ldap.cache.time'),function() use ($item) {
+ // First pass if we have already retrieved the schema item
+ switch ($item) {
+ case 'attributetypes':
+ if (isset($this->attributetypes))
+ return $this->attributetypes;
+ else
+ $this->attributetypes = collect();
+
+ break;
+
+ case 'ldapsyntaxes':
+ if (isset($this->ldapsyntaxes))
+ return $this->ldapsyntaxes;
+ else
+ $this->ldapsyntaxes = collect();
+
+ break;
+
+ case 'matchingrules':
+ if (isset($this->matchingrules))
+ return $this->matchingrules;
+ else
+ $this->matchingrules = collect();
+
+ break;
+
+ /*
+ case 'matchingruleuse':
+ if (isset($this->matchingruleuse))
+ return is_null($key) ? $this->matchingruleuse : $this->matchingruleuse->get($key);
+ else
+ $this->matchingruleuse = collect();
+
+ break;
+ */
+
+ case 'objectclasses':
+ if (isset($this->objectclasses))
+ return $this->objectclasses;
+ else
+ $this->objectclasses = collect();
+
+ break;
+
+ // Shouldnt get here
+ default:
+ throw new InvalidUsage('Invalid request to fetch schema: '.$item);
+ }
+
+ // Try to get the schema DN from the specified entry.
+ $schema_dn = $this->schemaDN();
+ $schema = $this->fetch($schema_dn);
+
+ switch ($item) {
+ case 'attributetypes':
+ Log::debug('Attribute Types');
+ // build the array of attribueTypes
+ //$syntaxes = $this->SchemaSyntaxes($dn);
+
+ foreach ($schema->{$item} as $line) {
+ if (is_null($line) || ! strlen($line))
+ continue;
+
+ $o = new AttributeType($line);
+ $this->attributetypes->put($o->name_lc,$o);
+
+ /*
+ if (isset($syntaxes[$attr->getSyntaxOID()])) {
+ $syntax = $syntaxes[$attr->getSyntaxOID()];
+ $attr->setType($syntax->getDescription());
+ }
+ $this->attributetypes[$attr->getName()] = $attr;
+ */
+
+ /**
+ * bug 856832: create an entry in the $attrs_oid array too. This
+ * will be a ref to the $attrs entry for maintenance and performance
+ * reasons
+ */
+ //$attrs_oid[$attr->getOID()] = &$attrs[$attr->getName()];
+ }
+
+ // go back and add data from aliased attributeTypes
+ foreach ($this->attributetypes as $o) {
+ /* foreach of the attribute's aliases, create a new entry in the attrs array
+ * with its name set to the alias name, and all other data copied.*/
+
+ if ($o->aliases->count()) {
+ Log::debug(sprintf('\ Attribute [%s] has the following aliases [%s]',$o->name,$o->aliases->join(',')));
+
+ foreach ($o->aliases as $alias) {
+ $new_attr = clone $o;
+ $new_attr->setName($alias);
+ $new_attr->addAlias($o->name);
+ $new_attr->removeAlias($alias);
+
+ $this->attributetypes->put(strtolower($alias),$new_attr);
+ }
+ }
+ }
+
+ // Now go through and reference the parent/child relationships
+ foreach ($this->attributetypes as $o)
+ if ($o->sup_attribute) {
+ $parent = strtolower($o->sup_attribute);
+
+ if ($this->attributetypes->has($parent) !== FALSE)
+ $this->attributetypes[$parent]->addChild($o->name);
+ }
+
+ // go through any children and add details if the child doesnt have them (ie, cn inherits name)
+ // @todo This doesnt traverse children properly, so children of children may not get the settings they should
+ foreach ($this->attributetypes as $parent) {
+ foreach ($parent->children as $child) {
+ $child = strtolower($child);
+
+ /* only overwrite the child's SINGLE-VALUE property if the parent has it set, and the child doesnt
+ * (note: All LDAP attributes default to multi-value if not explicitly set SINGLE-VALUE) */
+ if (! is_null($parent->is_single_value) && is_null($this->attributetypes[$child]->is_single_value))
+ $this->attributetypes[$child]->setIsSingleValue($parent->is_single_value);
+ }
+ }
+
+ // Add the used in and required_by values.
+ foreach ($this->schema('objectclasses') as $object_class) {
+ $must_attrs = $object_class->getMustAttrNames();
+ $may_attrs = $object_class->getMayAttrNames();
+ $oclass_attrs = $must_attrs->merge($may_attrs)->unique();
+
+ // Add Used In.
+ foreach ($oclass_attrs as $attr_name)
+ if ($this->attributetypes->has(strtolower($attr_name)))
+ $this->attributetypes[strtolower($attr_name)]->addUsedInObjectClass($object_class->name);
+
+ // Add Required By.
+ foreach ($must_attrs as $attr_name)
+ if ($this->attributetypes->has(strtolower($attr_name)))
+ $this->attributetypes[strtolower($attr_name)]->addRequiredByObjectClass($object_class->name);
+
+ // Force May
+ foreach ($object_class->getForceMayAttrs() as $attr_name)
+ if ($this->attributetypes->has(strtolower($attr_name->name)))
+ $this->attributetypes[strtolower($attr_name->name)]->setForceMay();
+ }
+
+ return $this->attributetypes;
+
+ case 'ldapsyntaxes':
+ Log::debug('LDAP Syntaxes');
+
+ foreach ($schema->{$item} as $line) {
+ if (is_null($line) || ! strlen($line))
+ continue;
+
+ $o = new LDAPSyntax($line);
+ $this->ldapsyntaxes->put(strtolower($o->oid),$o);
+ }
+
+ return $this->ldapsyntaxes;
+
+ case 'matchingrules':
+ Log::debug('Matching Rules');
+ $this->matchingruleuse = collect();
+
+ foreach ($schema->{$item} as $line) {
+ if (is_null($line) || ! strlen($line))
+ continue;
+
+ $o = new MatchingRule($line);
+ $this->matchingrules->put($o->name_lc,$o);
+ }
+
+ /*
+ * For each MatchingRuleUse entry, add the attributes who use it to the
+ * MatchingRule in the $rules array.
+ */
+ if ($schema->matchingruleuse) {
+ foreach ($schema->matchingruleuse as $line) {
+ if (is_null($line) || ! strlen($line))
+ continue;
+
+ $o = new MatchingRuleUse($line);
+ $this->matchingruleuse->put($o->name_lc,$o);
+
+ if ($this->matchingrules->has($o->name_lc) !== FALSE)
+ $this->matchingrules[$o->name_lc]->setUsedByAttrs($o->getUsedByAttrs());
+ }
+
+ } else {
+ /* No MatchingRuleUse entry in the subschema, so brute-forcing
+ * the reverse-map for the "$rule->getUsedByAttrs()" data.*/
+ foreach ($this->schema('attributetypes') as $attr) {
+ $rule_key = strtolower($attr->getEquality());
+
+ if ($this->matchingrules->has($rule_key) !== FALSE)
+ $this->matchingrules[$rule_key]->addUsedByAttr($attr->name);
+ }
+ }
+
+ return $this->matchingrules;
+
+ case 'objectclasses':
+ Log::debug('Object Classes');
+
+ foreach ($schema->{$item} as $line) {
+ if (is_null($line) || ! strlen($line))
+ continue;
+
+ $o = new ObjectClass($line,$this);
+ $this->objectclasses->put($o->name_lc,$o);
+ }
+
+ // Now go through and reference the parent/child relationships
+ foreach ($this->objectclasses as $o)
+ foreach ($o->getSupClasses() as $parent) {
+ $parent = strtolower($parent);
+ if ($this->objectclasses->has($parent) !== FALSE)
+ $this->objectclasses[$parent]->addChildObjectClass($o->name);
+ }
+
+ return $this->objectclasses;
+ }
+ });
+
+ return is_null($key) ? $result : $result->get($key);
+ }
+
+ public function schemaSyntaxName(string $oid): ?LDAPSyntax
+ {
+ return $this->schema('ldapsyntaxes',$oid);
+ }
+}
\ No newline at end of file
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
new file mode 100644
index 0000000..69914e9
--- /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 0000000..82a37e4
--- /dev/null
+++ b/app/Exceptions/Handler.php
@@ -0,0 +1,50 @@
+, \Psr\Log\LogLevel::*>
+ */
+ protected $levels = [
+ //
+ ];
+
+ /**
+ * A list of the exception types that are not reported.
+ *
+ * @var array>
+ */
+ protected $dontReport = [
+ //
+ ];
+
+ /**
+ * A list of the inputs that are never flashed to the session on validation exceptions.
+ *
+ * @var array
+ */
+ protected $dontFlash = [
+ 'current_password',
+ 'password',
+ 'password_confirmation',
+ ];
+
+ /**
+ * Register the exception handling callbacks for the application.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->reportable(function (Throwable $e) {
+ //
+ });
+ }
+}
diff --git a/app/Exceptions/InvalidUsage.php b/app/Exceptions/InvalidUsage.php
new file mode 100644
index 0000000..dffcda5
--- /dev/null
+++ b/app/Exceptions/InvalidUsage.php
@@ -0,0 +1,10 @@
+query('depth',1);
+ $dn = Crypt::decryptString($request->query('key'));
+ Log::debug(sprintf('%s: Query [%s] - Levels [%d]',__METHOD__,$dn,$levels));
+
+ return (config('server'))
+ ->children($dn)
+ ->transform(function($item) {
+ return [
+ 'title'=>$item->getRdn(),
+ 'item'=>Crypt::encryptString($item->getDn()),
+ 'icon'=>$item->icon(),
+ 'lazy'=>Arr::get($item->getAttribute('hassubordinates'),0) == 'TRUE',
+ 'tooltip'=>$item->getDn(),
+ ];
+ });
+ }
+
+ public function schema_view(Request $request)
+ {
+ $server = new Server;
+
+ switch($request->type) {
+ case 'objectclasses':
+ return view('frames.schema.objectclasses')
+ ->with('objectclasses',$server->schema('objectclasses')->sortBy(function($item) { return strtolower($item->name); }));
+
+ case 'attributetypes':
+ return view('frames.schema.attributetypes')
+ ->with('server',$server)
+ ->with('attributetypes',$server->schema('attributetypes')->sortBy(function($item) { return strtolower($item->name); }));
+
+ case 'ldapsyntaxes':
+ return view('frames.schema.ldapsyntaxes')
+ ->with('ldapsyntaxes',$server->schema('ldapsyntaxes')->sortBy(function($item) { return strtolower($item->description); }));
+
+ case 'matchingrules':
+ return view('frames.schema.matchingrules')
+ ->with('matchingrules',$server->schema('matchingrules')->sortBy(function($item) { return strtolower($item->name); }));
+
+ default:
+ abort(404);
+ }
+ }
+}
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
new file mode 100644
index 0000000..90a4c4f
--- /dev/null
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -0,0 +1,94 @@
+middleware('guest')->except('logout');
+ }
+
+ protected function credentials(Request $request): array
+ {
+ return [
+ 'mail' => $request->get('email'),
+ 'password' => $request->get('password'),
+ ];
+ }
+
+ /**
+ * We need to delete our encrypted username/password cookies
+ *
+ * @note The rest of this function is the same as a normal laravel logout as in AuthenticatesUsers::class
+ * @param Request $request
+ * @return \Illuminate\Contracts\Foundation\Application|JsonResponse|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|mixed
+ */
+ public function logout(Request $request)
+ {
+ // Delete our LDAP authentication cookies
+ Cookie::queue(Cookie::forget('username_encrypt'));
+ Cookie::queue(Cookie::forget('password_encrypt'));
+
+ $this->guard()->logout();
+
+ $request->session()->invalidate();
+
+ $request->session()->regenerateToken();
+
+ if ($response = $this->loggedOut($request)) {
+ return $response;
+ }
+
+ return $request->wantsJson()
+ ? new JsonResponse([], 204)
+ : redirect('/');
+ }
+
+ /**
+ *
+ * Show our themed login page
+ */
+ public function showLoginForm()
+ {
+ $login_note = '';
+
+ if (file_exists('login_note.txt'))
+ $login_note = file_get_contents('login_note.txt');
+
+ return view('architect::auth.login')->with('login_note',$login_note);
+ }
+}
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
new file mode 100644
index 0000000..a0a2a8a
--- /dev/null
+++ b/app/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+with('server',config('ldap.connections.default.name'))
+ ->with('bases',$base->transform(function($item) {
+ return [
+ 'title'=>$item->getRdn(),
+ 'item'=>Crypt::encryptString($item->getDn()),
+ 'lazy'=>TRUE,
+ 'icon'=>'fa-fw fas fa-sitemap',
+ 'tooltip'=>$item->getDn(),
+ ];
+ }));
+ }
+
+ /**
+ * LDAP Server INFO
+ *
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
+ * @throws ObjectNotFoundException
+ */
+ public function info()
+ {
+ // Load our attributes
+ $s = config('server');
+ $s->schema('objectclasses');
+ $s->schema('attributetypes');
+
+ return view('frames.info')
+ ->with('s',$s);
+ }
+
+ /**
+ * Render a specific DN
+ *
+ * @param Request $request
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
+ */
+ public function dn_frame(Request $request)
+ {
+ $dn = Crypt::decryptString($request->post('key'));
+
+ return view('frames.dn')
+ ->with('o',config('server')->fetch($dn))
+ ->with('dn',$dn);
+ }
+
+ /**
+ * Show the Schema Viewer
+ *
+ * @note Our route will validate that types are valid.
+ * @param Request $request
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
+ * @throws InvalidUsage
+ */
+ public function schema_frame(Request $request)
+ {
+ $s = config('server');
+
+ // If an invalid key, we'll 404
+ if ($request->type && $request->key && ($s->schema($request->type)->has($request->key) === FALSE))
+ abort(404);
+
+ return view('frames.schema')
+ ->with('type',$request->type)
+ ->with('key',$request->key);
+ }
+
+ /**
+ * Sort the attributes
+ *
+ * @param Collection $attrs
+ * @return Collection
+ */
+ private function sortAttrs(Collection $attrs): Collection
+ {
+ return $attrs->sortKeys();
+ }
+
+ /**
+ * Return the image for the logged in user or anonymous
+ *
+ * @param Request $request
+ * @return mixed
+ */
+ public function user_image(Request $request)
+ {
+ $image = NULL;
+ $content = NULL;
+
+ if (Auth::check()) {
+ $image = Arr::get(Auth::user()->getAttribute('jpegphoto'),0);
+ $content = 'image/jpeg';
+ }
+
+ if (! $image) {
+ $image = File::get('../resources/images/user-secret-solid.svg');
+ $content = 'image/svg+xml';
+ }
+
+ return response($image)
+ ->header('Content-Type',$content);
+ }
+}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
new file mode 100644
index 0000000..ac66e94
--- /dev/null
+++ b/app/Http/Kernel.php
@@ -0,0 +1,82 @@
+ [
+ \App\Http\Middleware\EncryptCookies::class,
+ \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+ \Illuminate\Session\Middleware\StartSession::class,
+ SwapinAuthUser::class,
+ \Illuminate\Session\Middleware\AuthenticateSession::class,
+ \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+ \App\Http\Middleware\VerifyCsrfToken::class,
+ \Illuminate\Routing\Middleware\SubstituteBindings::class,
+ \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
+ ApplicationSession::class,
+ CheckUpdate::class,
+ ],
+
+ 'api' => [
+ 'throttle:60,1',
+ \App\Http\Middleware\EncryptCookies::class,
+ SwapinAuthUser::class,
+ ApplicationSession::class,
+ \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,
+ 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::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,
+
+ 'localize' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
+ 'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
+ 'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
+ 'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
+ 'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class
+ ];
+}
diff --git a/app/Http/Middleware/ApplicationSession.php b/app/Http/Middleware/ApplicationSession.php
new file mode 100644
index 0000000..dd6f028
--- /dev/null
+++ b/app/Http/Middleware/ApplicationSession.php
@@ -0,0 +1,29 @@
+share('user', auth()->user() ?: new User);
+
+ \Config::set('server',new Server);
+
+ return $next($request);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
new file mode 100644
index 0000000..704089a
--- /dev/null
+++ b/app/Http/Middleware/Authenticate.php
@@ -0,0 +1,21 @@
+expectsJson()) {
+ return route('login');
+ }
+ }
+}
diff --git a/app/Http/Middleware/CheckForMaintenanceMode.php b/app/Http/Middleware/CheckForMaintenanceMode.php
new file mode 100644
index 0000000..35b9824
--- /dev/null
+++ b/app/Http/Middleware/CheckForMaintenanceMode.php
@@ -0,0 +1,17 @@
+request('POST',sprintf('%s/%s',self::UPDATE_SERVER,strtolower(config('app.version'))));
+
+ if ($response->getStatusCode() === 200) {
+ $result = json_decode($response->getBody());
+
+ Log::debug(sprintf('CU_:- Update server returned...'),['update'=>$result]);
+
+ return $result;
+ }
+
+ return NULL;
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php
new file mode 100644
index 0000000..033136a
--- /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/SwapinAuthUser.php b/app/Http/Middleware/SwapinAuthUser.php
new file mode 100644
index 0000000..f45081a
--- /dev/null
+++ b/app/Http/Middleware/SwapinAuthUser.php
@@ -0,0 +1,50 @@
+addConnection(new Connection(config('ldap.connections.'.$key)),$key);
+
+ return $next($request);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php
new file mode 100644
index 0000000..5a50e7b
--- /dev/null
+++ b/app/Http/Middleware/TrimStrings.php
@@ -0,0 +1,18 @@
+allSubdomainsOfApplicationUrl(),
+ ];
+ }
+}
diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php
new file mode 100644
index 0000000..3391630
--- /dev/null
+++ b/app/Http/Middleware/TrustProxies.php
@@ -0,0 +1,28 @@
+|string|null
+ */
+ protected $proxies;
+
+ /**
+ * The headers that should be used to detect proxies.
+ *
+ * @var int
+ */
+ protected $headers =
+ Request::HEADER_X_FORWARDED_FOR |
+ Request::HEADER_X_FORWARDED_HOST |
+ Request::HEADER_X_FORWARDED_PORT |
+ Request::HEADER_X_FORWARDED_PROTO |
+ Request::HEADER_X_FORWARDED_AWS_ELB;
+}
diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php
new file mode 100644
index 0000000..0c13b85
--- /dev/null
+++ b/app/Http/Middleware/VerifyCsrfToken.php
@@ -0,0 +1,17 @@
+authGuardResolver = function () {
+ return new Guard($this->ldap, $this->configuration);
+ };
+ }
+}
\ No newline at end of file
diff --git a/app/Ldap/Entry.php b/app/Ldap/Entry.php
new file mode 100644
index 0000000..ef3118d
--- /dev/null
+++ b/app/Ldap/Entry.php
@@ -0,0 +1,172 @@
+ $value) {
+ $o = Factory::create($attribute,$value);
+
+ // Set the rdn flag
+ if (preg_match('/^'.$attribute.'=/i',$this->dn))
+ $o->setRDN();
+
+ // Set required flag
+ $o->required_by(collect($this->getAttribute('objectclass')));
+
+ $result->put($attribute,$o);
+ }
+
+ $sort = collect(config('ldap.attr_display_order',[]))->transform(function($item) { return strtolower($item); });
+
+ // Order the attributes
+ $result = $result->sortBy([function(Attribute $a,Attribute $b) use ($sort): int {
+ if ($a === $b)
+ return 0;
+
+ // Check if $a/$b are in the configuration to be sorted first, if so get it's key
+ $a_key = $sort->search($a->name_lc);
+ $b_key = $sort->search($b->name_lc);
+
+ // If the keys were not in the sort list, set the key to be the count of elements (ie: so it is last to be sorted)
+ if ($a_key === FALSE)
+ $a_key = $sort->count()+1;
+
+ if ($b_key === FALSE)
+ $b_key = $sort->count()+1;
+
+ // Case where neither $a, nor $b are in ldap.attr_display_order, $a_key = $b_key = one greater than num elements.
+ // So we sort them alphabetically
+ if ($a_key === $b_key)
+ return strcasecmp($a->name,$b->name);
+
+ // Case where at least one attribute or its friendly name is in $attrs_display_order
+ // return -1 if $a before $b in $attrs_display_order
+ return ($a_key < $b_key) ? -1 : 1;
+ } ])->toArray();
+ }
+
+ return $result;
+ }
+
+ /* ATTRIBUTES */
+
+ /**
+ * Return a key to use for sorting
+ *
+ * @todo This should be the DN in reverse order
+ * @return string
+ */
+ public function getSortKeyAttribute(): string
+ {
+ return $this->getDn();
+ }
+
+ /* METHODS */
+
+ /**
+ * Return a list of LDAP internal attributes
+ *
+ * @return Collection
+ */
+ public function getInternalAttributes(): Collection
+ {
+ return collect($this->getAttributes())->filter(function($item) {
+ return $item->is_internal;
+ });
+ }
+
+ /**
+ * Return this list of user attributes
+ *
+ * @return Collection
+ */
+ public function getVisibleAttributes(): Collection
+ {
+ return collect($this->getAttributes())->filter(function($item) {
+ return ! $item->is_internal;
+ });
+ }
+
+ /**
+ * Return an icon for a DN based on objectClass
+ *
+ * @return string
+ */
+ public function icon(): string
+ {
+ $objectclasses = array_map('strtolower',$this->objectclass);
+
+ // Return icon based upon objectClass value
+ if (in_array('person',$objectclasses) ||
+ in_array('organizationalperson',$objectclasses) ||
+ in_array('inetorgperson',$objectclasses) ||
+ in_array('account',$objectclasses) ||
+ in_array('posixaccount',$objectclasses))
+
+ return 'fas fa-user';
+
+ elseif (in_array('organization',$objectclasses))
+ return 'fas fa-university';
+
+ elseif (in_array('organizationalunit',$objectclasses))
+ return 'fas fa-object-group';
+
+ elseif (in_array('posixgroup',$objectclasses) ||
+ in_array('groupofnames',$objectclasses) ||
+ in_array('groupofuniquenames',$objectclasses) ||
+ in_array('group',$objectclasses))
+
+ return 'fas fa-users';
+
+ elseif (in_array('dcobject',$objectclasses) ||
+ in_array('domainrelatedobject',$objectclasses) ||
+ in_array('domain',$objectclasses) ||
+ in_array('builtindomain',$objectclasses))
+
+ return 'fas fa-network-wired';
+
+ elseif (in_array('alias',$objectclasses))
+ return 'fas fa-theater-masks';
+
+ elseif (in_array('country',$objectclasses))
+ return sprintf('flag %s',strtolower(Arr::get($this->c,0)));
+
+ elseif (in_array('device',$objectclasses))
+ return 'fas fa-mobile-alt';
+
+ elseif (in_array('document',$objectclasses))
+ return 'fas fa-file-alt';
+
+ elseif (in_array('iphost',$objectclasses))
+ return 'fas fa-wifi';
+
+ elseif (in_array('room',$objectclasses))
+ return 'fas fa-door-open';
+
+ elseif (in_array('server',$objectclasses))
+ return 'fas fa-server';
+
+ elseif (in_array('openldaprootdse',$objectclasses))
+ return 'fas fa-info';
+
+ // Default
+ return 'fa-fw fas fa-cog';
+ }
+}
\ No newline at end of file
diff --git a/app/Ldap/Guard.php b/app/Ldap/Guard.php
new file mode 100644
index 0000000..728e632
--- /dev/null
+++ b/app/Ldap/Guard.php
@@ -0,0 +1,29 @@
+session()->put('username_encrypt',Crypt::encryptString($username));
+ request()->session()->put('password_encrypt',Crypt::encryptString($password));
+ */
+
+ // For our API calls, we store the cookie - which our cookies are already encrypted
+ Cookie::queue('username_encrypt',$username);
+ Cookie::queue('password_encrypt',$password);
+ }
+
+ return $result;
+ }
+}
\ No newline at end of file
diff --git a/app/Ldap/LdapUserRepository.php b/app/Ldap/LdapUserRepository.php
new file mode 100644
index 0000000..ced1017
--- /dev/null
+++ b/app/Ldap/LdapUserRepository.php
@@ -0,0 +1,75 @@
+query()->setBaseDn($base);
+
+ foreach ($credentials as $key => $value) {
+ if (Str::contains($key, $this->bypassCredentialKeys)) {
+ continue;
+ }
+
+ if (is_array($value) || $value instanceof Arrayable) {
+ $query->whereIn($key, $value);
+ } else {
+ $query->where($key, $value);
+ }
+ }
+
+ if (! is_null($user = $query->first())) {
+ event(new DiscoveredWithCredentials($user));
+
+ return $user;
+ }
+ }
+
+ return NULL;
+ }
+
+ /**
+ * Get a user by their object GUID.
+ *
+ * @param string $guid
+ *
+ * @return Model|null
+ * @throws \LdapRecord\Query\ObjectNotFoundException
+ */
+ public function findByGuid($guid): ?Model
+ {
+ // Look for a user using all our baseDNs
+ foreach (Server::baseDNs() as $base) {
+ $user = $this->query()->setBaseDn($base)->findByGuid($guid);
+
+ if ($user)
+ return $user;
+ }
+
+ return NULL;
+ }
+}
\ No newline at end of file
diff --git a/app/Ldap/User.php b/app/Ldap/User.php
new file mode 100644
index 0000000..69b1729
--- /dev/null
+++ b/app/Ldap/User.php
@@ -0,0 +1,27 @@
+exists ? parent::getDn() : 'Anonymous';
+ }
+}
\ No newline at end of file
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
new file mode 100644
index 0000000..475ba19
--- /dev/null
+++ b/app/Providers/AppServiceProvider.php
@@ -0,0 +1,44 @@
+loadViewsFrom(__DIR__.'/../../resources/themes/architect/views/','architect');
+
+ // Enable pluck on collections to work on private values
+ Collection::macro('ppluck', function ($attr) {
+ return $this->map(function (object $item) use ($attr) {
+ return $item->{$attr};
+ })->values();
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php
new file mode 100644
index 0000000..33b83f5
--- /dev/null
+++ b/app/Providers/AuthServiceProvider.php
@@ -0,0 +1,30 @@
+
+ */
+ protected $policies = [
+ // 'App\Models\Model' => '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 0000000..395c518
--- /dev/null
+++ b/app/Providers/BroadcastServiceProvider.php
@@ -0,0 +1,21 @@
+configureRateLimiting();
+
+ $this->routes(function () {
+ Route::middleware('api')
+ ->prefix('api')
+ ->group(base_path('routes/api.php'));
+
+ Route::middleware('web')
+ ->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($request->user()?->id ?: $request->ip());
+ });
+ }
+}
diff --git a/artisan b/artisan
new file mode 100755
index 0000000..67a3329
--- /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 0000000..037e17d
--- /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 0000000..d6b7ef3
--- /dev/null
+++ b/bootstrap/cache/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..d4dbcfd
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,67 @@
+{
+ "name": "laravel/laravel",
+ "type": "project",
+ "description": "The Laravel Framework.",
+ "keywords": ["framework","laravel"],
+ "license": "MIT",
+ "require": {
+ "php": "^8.0.2",
+ "directorytree/ldaprecord-laravel": "^2",
+ "fideloper/proxy": "^4.4",
+ "fruitcake/laravel-cors": "^2.0",
+ "guzzlehttp/guzzle": "^7.2",
+ "laravel/framework": "^9.19",
+ "laravel/passport": "^10.1",
+ "laravel/ui": "^3.2",
+ "mcamara/laravel-localization": "^1.7"
+ },
+ "require-dev": {
+ "barryvdh/laravel-debugbar": "^3.5",
+ "fakerphp/faker": "^1.9.1",
+ "mockery/mockery": "^1.4.4",
+ "nunomaduro/collision": "^6.1",
+ "phpunit/phpunit": "^9.5.10"
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "app/",
+ "Database\\Factories\\": "database/factories/",
+ "Database\\Seeders\\": "database/seeders/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\": "tests/"
+ }
+ },
+ "repositories": [
+ {
+ "type": "vcs",
+ "url": "https://dev.leenooks.net/leenooks/laravel"
+ }
+ ],
+ "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": "stable",
+ "prefer-stable": true
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..3551137
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,8966 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "8a5ebae961209b2078fa7f733bf5903f",
+ "packages": [
+ {
+ "name": "asm89/stack-cors",
+ "version": "v2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/asm89/stack-cors.git",
+ "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/asm89/stack-cors/zipball/73e5b88775c64ccc0b84fb60836b30dc9d92ac4a",
+ "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "symfony/http-foundation": "^4|^5|^6",
+ "symfony/http-kernel": "^4|^5|^6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7|^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Asm89\\Stack\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
+ }
+ ],
+ "description": "Cross-origin resource sharing library and stack middleware",
+ "homepage": "https://github.com/asm89/stack-cors",
+ "keywords": [
+ "cors",
+ "stack"
+ ],
+ "support": {
+ "issues": "https://github.com/asm89/stack-cors/issues",
+ "source": "https://github.com/asm89/stack-cors/tree/v2.1.1"
+ },
+ "time": "2022-01-18T09:12:03+00:00"
+ },
+ {
+ "name": "brick/math",
+ "version": "0.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f",
+ "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^9.0",
+ "vimeo/psalm": "4.25.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "support": {
+ "issues": "https://github.com/brick/math/issues",
+ "source": "https://github.com/brick/math/tree/0.10.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/BenMorel",
+ "type": "github"
+ }
+ ],
+ "time": "2022-08-10T22:54:19+00:00"
+ },
+ {
+ "name": "defuse/php-encryption",
+ "version": "v2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/defuse/php-encryption.git",
+ "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2",
+ "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "paragonie/random_compat": ">= 2",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4|^5|^6|^7|^8|^9"
+ },
+ "bin": [
+ "bin/generate-defuse-key"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Defuse\\Crypto\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Hornby",
+ "email": "taylor@defuse.ca",
+ "homepage": "https://defuse.ca/"
+ },
+ {
+ "name": "Scott Arciszewski",
+ "email": "info@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "Secure PHP Encryption Library",
+ "keywords": [
+ "aes",
+ "authenticated encryption",
+ "cipher",
+ "crypto",
+ "cryptography",
+ "encrypt",
+ "encryption",
+ "openssl",
+ "security",
+ "symmetric key cryptography"
+ ],
+ "support": {
+ "issues": "https://github.com/defuse/php-encryption/issues",
+ "source": "https://github.com/defuse/php-encryption/tree/v2.3.1"
+ },
+ "time": "2021-04-09T23:57:26+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "f41715465d65213d644d3141a6a93081be5d3549"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/f41715465d65213d644d3141a6a93081be5d3549",
+ "reference": "f41715465d65213d644d3141a6a93081be5d3549",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.2"
+ },
+ "time": "2022-10-27T11:44:00+00:00"
+ },
+ {
+ "name": "directorytree/ldaprecord",
+ "version": "v2.19.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/DirectoryTree/LdapRecord.git",
+ "reference": "3557d500b24b331852e4c9ebea1e712b7629cb09"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/DirectoryTree/LdapRecord/zipball/3557d500b24b331852e4c9ebea1e712b7629cb09",
+ "reference": "3557d500b24b331852e4c9ebea1e712b7629cb09",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-ldap": "*",
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "nesbot/carbon": "^1.0|^2.0",
+ "php": ">=7.3",
+ "psr/log": "^1.0|^2.0|^3.0",
+ "psr/simple-cache": "^1.0|^2.0",
+ "symfony/polyfill-php80": "^1.25",
+ "tightenco/collect": "^5.6|^6.0|^7.0|^8.0|^9.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^9.0",
+ "spatie/ray": "^1.24"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "LdapRecord\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Steve Bauman",
+ "email": "steven_bauman@outlook.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A fully-featured LDAP ORM.",
+ "homepage": "https://www.ldaprecord.com",
+ "keywords": [
+ "active directory",
+ "ad",
+ "adLDAP",
+ "adldap2",
+ "directory",
+ "ldap",
+ "ldaprecord",
+ "orm",
+ "windows"
+ ],
+ "support": {
+ "docs": "https://ldaprecord.com",
+ "email": "steven_bauman@outlook.com",
+ "issues": "https://github.com/DirectoryTree/LdapRecord/issues",
+ "source": "https://github.com/DirectoryTree/LdapRecord"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/stevebauman",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-16T14:11:36+00:00"
+ },
+ {
+ "name": "directorytree/ldaprecord-laravel",
+ "version": "v2.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/DirectoryTree/LdapRecord-Laravel.git",
+ "reference": "35eb11817833da9f605ea0429c4e2ff42c481d3d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/DirectoryTree/LdapRecord-Laravel/zipball/35eb11817833da9f605ea0429c4e2ff42c481d3d",
+ "reference": "35eb11817833da9f605ea0429c4e2ff42c481d3d",
+ "shasum": ""
+ },
+ "require": {
+ "directorytree/ldaprecord": "^2.4.4",
+ "ext-ldap": "*",
+ "illuminate/support": "^5.6|^6.0|^7.0|^8.0|^9.0|^10.0",
+ "php": ">=7.3",
+ "ramsey/uuid": "*"
+ },
+ "require-dev": {
+ "laravel/sanctum": "*",
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^3.7|^4.0|^5.0|^6.0|^7.0",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0",
+ "spatie/ray": "^1.28"
+ },
+ "type": "project",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "LdapRecord\\Laravel\\LdapServiceProvider",
+ "LdapRecord\\Laravel\\LdapAuthServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "LdapRecord\\Laravel\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "LDAP Authentication & Management for Laravel.",
+ "keywords": [
+ "adldap2",
+ "laravel",
+ "ldap",
+ "ldaprecord"
+ ],
+ "support": {
+ "issues": "https://github.com/DirectoryTree/LdapRecord-Laravel/issues",
+ "source": "https://github.com/DirectoryTree/LdapRecord-Laravel/tree/v2.7.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/stevebauman",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-16T14:13:28+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
+ "reference": "d9d313a36c872fd6ee06d9a6cbcf713eaa40f024",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-10-20T09:10:12+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "84a527db05647743d50373e0ec53a152f2cde568"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/84a527db05647743d50373e0ec53a152f2cde568",
+ "reference": "84a527db05647743d50373e0ec53a152f2cde568",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.9",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-15T16:57:16+00:00"
+ },
+ {
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8",
+ "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-webmozart-assert": "^1.0",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cron\\": "src/Cron/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
+ }
+ ],
+ "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+ "keywords": [
+ "cron",
+ "schedule"
+ ],
+ "support": {
+ "issues": "https://github.com/dragonmantank/cron-expression/issues",
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-10T18:51:20+00:00"
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/3a85486b709bc384dae8eb78fb2eec649bdb64ff",
+ "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^4.30"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/egulias/EmailValidator/issues",
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-14T14:17:03+00:00"
+ },
+ {
+ "name": "fideloper/proxy",
+ "version": "4.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fideloper/TrustedProxy.git",
+ "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/a751f2bc86dd8e6cfef12dc0cbdada82f5a18750",
+ "reference": "a751f2bc86dd8e6cfef12dc0cbdada82f5a18750",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Fideloper\\Proxy\\TrustedProxyServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fideloper\\Proxy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Fidao",
+ "email": "fideloper@gmail.com"
+ }
+ ],
+ "description": "Set trusted proxies for Laravel",
+ "keywords": [
+ "load balancing",
+ "proxy",
+ "trusted proxy"
+ ],
+ "support": {
+ "issues": "https://github.com/fideloper/TrustedProxy/issues",
+ "source": "https://github.com/fideloper/TrustedProxy/tree/4.4.2"
+ },
+ "time": "2022-02-09T13:33:34+00:00"
+ },
+ {
+ "name": "firebase/php-jwt",
+ "version": "v6.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "ea7dda77098b96e666c5ef382452f94841e439cd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/ea7dda77098b96e666c5ef382452f94841e439cd",
+ "reference": "ea7dda77098b96e666c5ef382452f94841e439cd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1||^8.0"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^6.5||^7.4",
+ "phpspec/prophecy-phpunit": "^1.1",
+ "phpunit/phpunit": "^7.5||^9.5",
+ "psr/cache": "^1.0||^2.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0"
+ },
+ "suggest": {
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "keywords": [
+ "jwt",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/firebase/php-jwt/issues",
+ "source": "https://github.com/firebase/php-jwt/tree/v6.3.2"
+ },
+ "time": "2022-12-19T17:10:46+00:00"
+ },
+ {
+ "name": "fruitcake/laravel-cors",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/laravel-cors.git",
+ "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/783a74f5e3431d7b9805be8afb60fd0a8f743534",
+ "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534",
+ "shasum": ""
+ },
+ "require": {
+ "asm89/stack-cors": "^2.0.1",
+ "illuminate/contracts": "^6|^7|^8|^9",
+ "illuminate/support": "^6|^7|^8|^9",
+ "php": ">=7.2"
+ },
+ "require-dev": {
+ "laravel/framework": "^6|^7.24|^8",
+ "orchestra/testbench-dusk": "^4|^5|^6|^7",
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Fruitcake\\Cors\\CorsServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
+ "keywords": [
+ "api",
+ "cors",
+ "crossdomain",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/fruitcake/laravel-cors/issues",
+ "source": "https://github.com/fruitcake/laravel-cors/tree/v2.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-23T14:25:13+00:00"
+ },
+ {
+ "name": "fruitcake/php-cors",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/php-cors.git",
+ "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e",
+ "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0",
+ "symfony/http-foundation": "^4.4|^5.4|^6"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "phpunit/phpunit": "^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barryvdh",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Cross-origin resource sharing library for the Symfony HttpFoundation",
+ "homepage": "https://github.com/fruitcake/php-cors",
+ "keywords": [
+ "cors",
+ "laravel",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/fruitcake/php-cors/issues",
+ "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-20T15:07:15+00:00"
+ },
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/a878d45c1914464426dc94da61c9e1d36ae262a8",
+ "reference": "a878d45c1914464426dc94da61c9e1d36ae262a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "phpoption/phpoption": "^1.9"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.28 || ^9.5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "support": {
+ "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+ "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-07-30T15:56:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba",
+ "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5",
+ "guzzlehttp/psr7": "^1.9 || ^2.4",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "7.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-08-28T15:39:27+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "1.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "b94b2807d85443f9719887892882d0329d1e2598"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
+ "reference": "b94b2807d85443f9719887892882d0329d1e2598",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/1.5.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-08-28T14:55:35+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "67c26b443f348a51926030c83481b85718457d3d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d",
+ "reference": "67c26b443f348a51926030c83481b85718457d3d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ },
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-10-26T14:07:24+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v9.48.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "c78ae7aeb0cbcb1a205050d3592247ba07f5b711"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/c78ae7aeb0cbcb1a205050d3592247ba07f5b711",
+ "reference": "c78ae7aeb0cbcb1a205050d3592247ba07f5b711",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.10.2",
+ "doctrine/inflector": "^2.0",
+ "dragonmantank/cron-expression": "^3.3.2",
+ "egulias/email-validator": "^3.2.1|^4.0",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "fruitcake/php-cors": "^1.2",
+ "laravel/serializable-closure": "^1.2.2",
+ "league/commonmark": "^2.2.1",
+ "league/flysystem": "^3.8.0",
+ "monolog/monolog": "^2.0",
+ "nesbot/carbon": "^2.62.1",
+ "nunomaduro/termwind": "^1.13",
+ "php": "^8.0.2",
+ "psr/container": "^1.1.1|^2.0.1",
+ "psr/log": "^1.0|^2.0|^3.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "ramsey/uuid": "^4.7",
+ "symfony/console": "^6.0.9",
+ "symfony/error-handler": "^6.0",
+ "symfony/finder": "^6.0",
+ "symfony/http-foundation": "^6.0",
+ "symfony/http-kernel": "^6.0",
+ "symfony/mailer": "^6.0",
+ "symfony/mime": "^6.0",
+ "symfony/process": "^6.0",
+ "symfony/routing": "^6.0",
+ "symfony/uid": "^6.0",
+ "symfony/var-dumper": "^6.0",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.5",
+ "vlucas/phpdotenv": "^5.4.1",
+ "voku/portable-ascii": "^2.0"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0"
+ },
+ "replace": {
+ "illuminate/auth": "self.version",
+ "illuminate/broadcasting": "self.version",
+ "illuminate/bus": "self.version",
+ "illuminate/cache": "self.version",
+ "illuminate/collections": "self.version",
+ "illuminate/conditionable": "self.version",
+ "illuminate/config": "self.version",
+ "illuminate/console": "self.version",
+ "illuminate/container": "self.version",
+ "illuminate/contracts": "self.version",
+ "illuminate/cookie": "self.version",
+ "illuminate/database": "self.version",
+ "illuminate/encryption": "self.version",
+ "illuminate/events": "self.version",
+ "illuminate/filesystem": "self.version",
+ "illuminate/hashing": "self.version",
+ "illuminate/http": "self.version",
+ "illuminate/log": "self.version",
+ "illuminate/macroable": "self.version",
+ "illuminate/mail": "self.version",
+ "illuminate/notifications": "self.version",
+ "illuminate/pagination": "self.version",
+ "illuminate/pipeline": "self.version",
+ "illuminate/queue": "self.version",
+ "illuminate/redis": "self.version",
+ "illuminate/routing": "self.version",
+ "illuminate/session": "self.version",
+ "illuminate/support": "self.version",
+ "illuminate/testing": "self.version",
+ "illuminate/translation": "self.version",
+ "illuminate/validation": "self.version",
+ "illuminate/view": "self.version"
+ },
+ "require-dev": {
+ "ably/ably-php": "^1.0",
+ "aws/aws-sdk-php": "^3.235.5",
+ "doctrine/dbal": "^2.13.3|^3.1.4",
+ "fakerphp/faker": "^1.21",
+ "guzzlehttp/guzzle": "^7.5",
+ "league/flysystem-aws-s3-v3": "^3.0",
+ "league/flysystem-ftp": "^3.0",
+ "league/flysystem-path-prefixing": "^3.3",
+ "league/flysystem-read-only": "^3.3",
+ "league/flysystem-sftp-v3": "^3.0",
+ "mockery/mockery": "^1.5.1",
+ "orchestra/testbench-core": "^7.16",
+ "pda/pheanstalk": "^4.0",
+ "phpstan/phpdoc-parser": "^1.15",
+ "phpstan/phpstan": "^1.4.7",
+ "phpunit/phpunit": "^9.5.8",
+ "predis/predis": "^1.1.9|^2.0.2",
+ "symfony/cache": "^6.0",
+ "symfony/http-client": "^6.0"
+ },
+ "suggest": {
+ "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).",
+ "brianium/paratest": "Required to run tests in parallel (^6.0).",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).",
+ "ext-bcmath": "Required to use the multiple_of validation rule.",
+ "ext-ftp": "Required to use the Flysystem FTP driver.",
+ "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
+ "ext-memcached": "Required to use the memcache cache driver.",
+ "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "filp/whoops": "Required for friendly error pages in development (^2.14.3).",
+ "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).",
+ "laravel/tinker": "Required to use the tinker console command (^2.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).",
+ "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).",
+ "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).",
+ "league/flysystem-read-only": "Required to use read-only disks (^3.3)",
+ "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).",
+ "mockery/mockery": "Required to use mocking (^1.5.1).",
+ "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).",
+ "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).",
+ "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^6.0).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).",
+ "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).",
+ "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).",
+ "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
+ "src/Illuminate/Foundation/helpers.php",
+ "src/Illuminate/Support/helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/",
+ "src/Illuminate/Conditionable/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Laravel Framework.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "framework",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2023-01-17T15:06:19+00:00"
+ },
+ {
+ "name": "laravel/passport",
+ "version": "v10.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/passport.git",
+ "reference": "b62b418a6d9e9aca231a587be0fc14dc55cd8d77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/passport/zipball/b62b418a6d9e9aca231a587be0fc14dc55cd8d77",
+ "reference": "b62b418a6d9e9aca231a587be0fc14dc55cd8d77",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "firebase/php-jwt": "^6.0",
+ "illuminate/auth": "^8.37|^9.0",
+ "illuminate/console": "^8.37|^9.0",
+ "illuminate/container": "^8.37|^9.0",
+ "illuminate/contracts": "^8.37|^9.0",
+ "illuminate/cookie": "^8.37|^9.0",
+ "illuminate/database": "^8.37|^9.0",
+ "illuminate/encryption": "^8.37|^9.0",
+ "illuminate/http": "^8.37|^9.0",
+ "illuminate/support": "^8.37|^9.0",
+ "lcobucci/jwt": "^3.4|^4.0",
+ "league/oauth2-server": "^8.2",
+ "nyholm/psr7": "^1.3",
+ "php": "^7.3|^8.0",
+ "phpseclib/phpseclib": "^2.0|^3.0",
+ "symfony/psr-http-message-bridge": "^2.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^6.0|^7.0",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "10.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Passport\\PassportServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Passport\\": "src/",
+ "Laravel\\Passport\\Database\\Factories\\": "database/factories/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Passport provides OAuth2 server support to Laravel.",
+ "keywords": [
+ "laravel",
+ "oauth",
+ "passport"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/passport/issues",
+ "source": "https://github.com/laravel/passport"
+ },
+ "time": "2022-04-16T13:38:08+00:00"
+ },
+ {
+ "name": "laravel/serializable-closure",
+ "version": "v1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/serializable-closure.git",
+ "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/47afb7fae28ed29057fdca37e16a84f90cc62fae",
+ "reference": "47afb7fae28ed29057fdca37e16a84f90cc62fae",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "nesbot/carbon": "^2.61",
+ "pestphp/pest": "^1.21.3",
+ "phpstan/phpstan": "^1.8.2",
+ "symfony/var-dumper": "^5.4.11"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\SerializableClosure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ },
+ {
+ "name": "Nuno Maduro",
+ "email": "nuno@laravel.com"
+ }
+ ],
+ "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.",
+ "keywords": [
+ "closure",
+ "laravel",
+ "serializable"
+ ],
+ "support": {
+ "issues": "https://github.com/laravel/serializable-closure/issues",
+ "source": "https://github.com/laravel/serializable-closure"
+ },
+ "time": "2022-09-08T13:45:54+00:00"
+ },
+ {
+ "name": "laravel/ui",
+ "version": "v3.4.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/ui.git",
+ "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/ui/zipball/65ec5c03f7fee2c8ecae785795b829a15be48c2c",
+ "reference": "65ec5c03f7fee2c8ecae785795b829a15be48c2c",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^8.42|^9.0",
+ "illuminate/filesystem": "^8.42|^9.0",
+ "illuminate/support": "^8.82|^9.0",
+ "illuminate/validation": "^8.42|^9.0",
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^6.23|^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Ui\\UiServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Ui\\": "src/",
+ "Illuminate\\Foundation\\Auth\\": "auth-backend/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel UI utilities and presets.",
+ "keywords": [
+ "laravel",
+ "ui"
+ ],
+ "support": {
+ "source": "https://github.com/laravel/ui/tree/v3.4.6"
+ },
+ "time": "2022-05-20T13:38:08+00:00"
+ },
+ {
+ "name": "lcobucci/clock",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/clock.git",
+ "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lcobucci/clock/zipball/039ef98c6b57b101d10bd11d8fdfda12cbd996dc",
+ "reference": "039ef98c6b57b101d10bd11d8fdfda12cbd996dc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~8.1.0 || ~8.2.0",
+ "psr/clock": "^1.0"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "require-dev": {
+ "infection/infection": "^0.26",
+ "lcobucci/coding-standard": "^9.0",
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-deprecation-rules": "^1.1.1",
+ "phpstan/phpstan-phpunit": "^1.3.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^9.5.27"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\Clock\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Luís Cobucci",
+ "email": "lcobucci@gmail.com"
+ }
+ ],
+ "description": "Yet another clock abstraction",
+ "support": {
+ "issues": "https://github.com/lcobucci/clock/issues",
+ "source": "https://github.com/lcobucci/clock/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/lcobucci",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/lcobucci",
+ "type": "patreon"
+ }
+ ],
+ "time": "2022-12-19T15:00:24+00:00"
+ },
+ {
+ "name": "lcobucci/jwt",
+ "version": "4.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/jwt.git",
+ "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/4d7de2fe0d51a96418c0d04004986e410e87f6b4",
+ "reference": "4d7de2fe0d51a96418c0d04004986e410e87f6b4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "ext-sodium": "*",
+ "lcobucci/clock": "^2.0 || ^3.0",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "infection/infection": "^0.21",
+ "lcobucci/coding-standard": "^6.0",
+ "mikey179/vfsstream": "^1.6.7",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/php-invoker": "^3.1",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Cobucci",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "JWS",
+ "jwt"
+ ],
+ "support": {
+ "issues": "https://github.com/lcobucci/jwt/issues",
+ "source": "https://github.com/lcobucci/jwt/tree/4.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/lcobucci",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/lcobucci",
+ "type": "patreon"
+ }
+ ],
+ "time": "2023-01-02T13:28:00+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47",
+ "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.30.0",
+ "commonmark/commonmark.js": "0.30.0",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-10T16:02:17+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "league/event",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/event.git",
+ "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/event/zipball/d2cc124cf9a3fab2bb4ff963307f60361ce4d119",
+ "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "henrikbjorn/phpspec-code-coverage": "~1.0.1",
+ "phpspec/phpspec": "^2.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Event\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Event package",
+ "keywords": [
+ "emitter",
+ "event",
+ "listener"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/event/issues",
+ "source": "https://github.com/thephpleague/event/tree/master"
+ },
+ "time": "2018-11-26T11:52:41+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "3.12.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f6377c709d2275ed6feaf63e44be7a7162b0e77f",
+ "reference": "f6377c709d2275ed6feaf63e44be7a7162b0e77f",
+ "shasum": ""
+ },
+ "require": {
+ "league/mime-type-detection": "^1.0.0",
+ "php": "^8.0.2"
+ },
+ "conflict": {
+ "aws/aws-sdk-php": "3.209.31 || 3.210.0",
+ "guzzlehttp/guzzle": "<7.0",
+ "guzzlehttp/ringphp": "<1.1.1",
+ "phpseclib/phpseclib": "3.0.15",
+ "symfony/http-client": "<5.2"
+ },
+ "require-dev": {
+ "async-aws/s3": "^1.5",
+ "async-aws/simple-s3": "^1.1",
+ "aws/aws-sdk-php": "^3.220.0",
+ "composer/semver": "^3.0",
+ "ext-fileinfo": "*",
+ "ext-ftp": "*",
+ "ext-zip": "*",
+ "friendsofphp/php-cs-fixer": "^3.5",
+ "google/cloud-storage": "^1.23",
+ "microsoft/azure-storage-blob": "^1.1",
+ "phpseclib/phpseclib": "^3.0.14",
+ "phpstan/phpstan": "^0.12.26",
+ "phpunit/phpunit": "^9.5.11",
+ "sabre/dav": "^4.3.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "File storage abstraction for PHP",
+ "keywords": [
+ "WebDAV",
+ "aws",
+ "cloud",
+ "file",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/flysystem/issues",
+ "source": "https://github.com/thephpleague/flysystem/tree/3.12.2"
+ },
+ "funding": [
+ {
+ "url": "https://ecologi.com/frankdejonge",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-19T12:02:19+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
+ "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\MimeTypeDetection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Mime-type detection for Flysystem",
+ "support": {
+ "issues": "https://github.com/thephpleague/mime-type-detection/issues",
+ "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-17T13:12:02+00:00"
+ },
+ {
+ "name": "league/oauth2-server",
+ "version": "8.3.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-server.git",
+ "reference": "28c5441716c10d0c936bd731860dc385d0f6d1a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/28c5441716c10d0c936bd731860dc385d0f6d1a8",
+ "reference": "28c5441716c10d0c936bd731860dc385d0f6d1a8",
+ "shasum": ""
+ },
+ "require": {
+ "defuse/php-encryption": "^2.2.1",
+ "ext-json": "*",
+ "ext-openssl": "*",
+ "lcobucci/jwt": "^3.4.6 || ^4.0.4",
+ "league/event": "^2.2",
+ "league/uri": "^6.4",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.0.1"
+ },
+ "replace": {
+ "league/oauth2server": "*",
+ "lncd/oauth2": "*"
+ },
+ "require-dev": {
+ "laminas/laminas-diactoros": "^2.4.1",
+ "phpstan/phpstan": "^0.12.57",
+ "phpstan/phpstan-phpunit": "^0.12.16",
+ "phpunit/phpunit": "^8.5.13",
+ "roave/security-advisories": "dev-master"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Server\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alex Bilbie",
+ "email": "hello@alexbilbie.com",
+ "homepage": "http://www.alexbilbie.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Andy Millington",
+ "email": "andrew@noexceptions.io",
+ "homepage": "https://www.noexceptions.io",
+ "role": "Developer"
+ }
+ ],
+ "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.",
+ "homepage": "https://oauth2.thephpleague.com/",
+ "keywords": [
+ "Authentication",
+ "api",
+ "auth",
+ "authorisation",
+ "authorization",
+ "oauth",
+ "oauth 2",
+ "oauth 2.0",
+ "oauth2",
+ "protect",
+ "resource",
+ "secure",
+ "server"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/oauth2-server/issues",
+ "source": "https://github.com/thephpleague/oauth2-server/tree/8.3.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sephster",
+ "type": "github"
+ }
+ ],
+ "time": "2022-11-14T19:42:00+00:00"
+ },
+ {
+ "name": "league/uri",
+ "version": "6.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri.git",
+ "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/a700b4656e4c54371b799ac61e300ab25a2d1d39",
+ "reference": "a700b4656e4c54371b799ac61e300ab25a2d1d39",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "league/uri-interfaces": "^2.3",
+ "php": "^8.1",
+ "psr/http-message": "^1.0.1"
+ },
+ "conflict": {
+ "league/uri-schemes": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v3.9.5",
+ "nyholm/psr7": "^1.5.1",
+ "php-http/psr7-integration-tests": "^1.1.1",
+ "phpbench/phpbench": "^1.2.6",
+ "phpstan/phpstan": "^1.8.5",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.1.1",
+ "phpstan/phpstan-strict-rules": "^1.4.3",
+ "phpunit/phpunit": "^9.5.24",
+ "psr/http-factory": "^1.0.1"
+ },
+ "suggest": {
+ "ext-fileinfo": "Needed to create Data URI from a filepath",
+ "ext-intl": "Needed to improve host validation",
+ "league/uri-components": "Needed to easily manipulate URI objects",
+ "psr/http-factory": "Needed to use the URI factory"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "URI manipulation library",
+ "homepage": "https://uri.thephpleague.com",
+ "keywords": [
+ "data-uri",
+ "file-uri",
+ "ftp",
+ "hostname",
+ "http",
+ "https",
+ "middleware",
+ "parse_str",
+ "parse_url",
+ "psr-7",
+ "query-string",
+ "querystring",
+ "rfc3986",
+ "rfc3987",
+ "rfc6570",
+ "uri",
+ "uri-template",
+ "url",
+ "ws"
+ ],
+ "support": {
+ "docs": "https://uri.thephpleague.com",
+ "forum": "https://thephpleague.slack.com",
+ "issues": "https://github.com/thephpleague/uri/issues",
+ "source": "https://github.com/thephpleague/uri/tree/6.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-13T19:58:47+00:00"
+ },
+ {
+ "name": "league/uri-interfaces",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/uri-interfaces.git",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "reference": "00e7e2943f76d8cb50c7dfdc2f6dee356e15e383",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.19",
+ "phpstan/phpstan": "^0.12.90",
+ "phpstan/phpstan-phpunit": "^0.12.19",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "phpunit/phpunit": "^8.5.15 || ^9.5"
+ },
+ "suggest": {
+ "ext-intl": "to use the IDNA feature",
+ "symfony/intl": "to use the IDNA feature via Symfony Polyfill"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Uri\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ignace Nyamagana Butera",
+ "email": "nyamsprod@gmail.com",
+ "homepage": "https://nyamsprod.com"
+ }
+ ],
+ "description": "Common interface for URI representation",
+ "homepage": "http://github.com/thephpleague/uri-interfaces",
+ "keywords": [
+ "rfc3986",
+ "rfc3987",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/thephpleague/uri-interfaces/issues",
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/2.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/nyamsprod",
+ "type": "github"
+ }
+ ],
+ "time": "2021-06-28T04:27:21+00:00"
+ },
+ {
+ "name": "mcamara/laravel-localization",
+ "version": "v1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mcamara/laravel-localization.git",
+ "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mcamara/laravel-localization/zipball/27565315c585e90d8d93aa06afd49d6a5992fe5a",
+ "reference": "27565315c585e90d8d93aa06afd49d6a5992fe5a",
+ "shasum": ""
+ },
+ "require": {
+ "laravel/framework": "~5.2.0||~5.3.0||~5.4.0||~5.5.0||~5.6.0||~5.7.0||~5.8.0||^6.0||^7.0||^8.0||^9.0",
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "orchestra/testbench-browser-kit": "~3.4|~3.8|~4.0",
+ "phpunit/phpunit": "6.0.*|^8.0"
+ },
+ "suggest": {
+ "ext-intl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Mcamara\\LaravelLocalization\\LaravelLocalizationServiceProvider"
+ ],
+ "aliases": {
+ "LaravelLocalization": "Mcamara\\LaravelLocalization\\Facades\\LaravelLocalization"
+ }
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mcamara\\LaravelLocalization": "src/"
+ },
+ "classmap": []
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marc Cámara",
+ "email": "mcamara88@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Easy localization for Laravel",
+ "homepage": "https://github.com/mcamara/laravel-localization",
+ "keywords": [
+ "laravel",
+ "localization",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/mcamara/laravel-localization/issues",
+ "source": "https://github.com/mcamara/laravel-localization/tree/v1.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/iwasherefirst2",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/mcamara",
+ "type": "github"
+ }
+ ],
+ "time": "2022-01-26T10:27:45+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "2.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50",
+ "reference": "720488632c590286b88b80e62aa3d3d551ad4a50",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2",
+ "guzzlehttp/guzzle": "^7.4",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "phpspec/prophecy": "^1.15",
+ "phpstan/phpstan": "^0.12.91",
+ "phpunit/phpunit": "^8.5.14",
+ "predis/predis": "^1.1 || ^2.0",
+ "rollbar/rollbar": "^1.3 || ^2 || ^3",
+ "ruflin/elastica": "^7",
+ "swiftmailer/swiftmailer": "^5.3|^6.0",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/2.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-07-24T11:55:47+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.65.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "09acf64155c16dc6f580f36569ae89344e9734a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/09acf64155c16dc6f580f36569ae89344e9734a3",
+ "reference": "09acf64155c16dc6f580f36569ae89344e9734a3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1.8 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^2.0 || ^3.1.4",
+ "doctrine/orm": "^2.7",
+ "friendsofphp/php-cs-fixer": "^3.0",
+ "kylekatarnls/multi-tester": "^2.0",
+ "ondrejmirtes/better-reflection": "*",
+ "phpmd/phpmd": "^2.9",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+ "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-3.x": "3.x-dev",
+ "dev-master": "2.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "https://markido.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "https://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "https://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "support": {
+ "docs": "https://carbon.nesbot.com/docs",
+ "issues": "https://github.com/briannesbitt/Carbon/issues",
+ "source": "https://github.com/briannesbitt/Carbon"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/kylekatarnls",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/Carbon#sponsor",
+ "type": "opencollective"
+ },
+ {
+ "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-06T15:55:01+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
+ "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": ">=7.1 <8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.2.3"
+ },
+ "time": "2022-10-13T01:24:26+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c",
+ "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.3"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.9"
+ },
+ "time": "2023-01-18T03:26:20+00:00"
+ },
+ {
+ "name": "nunomaduro/termwind",
+ "version": "v1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/termwind.git",
+ "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/594ab862396c16ead000de0c3c38f4a5cbe1938d",
+ "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^8.0",
+ "symfony/console": "^5.3.0|^6.0.0"
+ },
+ "require-dev": {
+ "ergebnis/phpstan-rules": "^1.0.",
+ "illuminate/console": "^8.0|^9.0",
+ "illuminate/support": "^8.0|^9.0",
+ "laravel/pint": "^1.0.0",
+ "pestphp/pest": "^1.21.0",
+ "pestphp/pest-plugin-mock": "^1.0",
+ "phpstan/phpstan": "^1.4.6",
+ "phpstan/phpstan-strict-rules": "^1.1.0",
+ "symfony/var-dumper": "^5.2.7|^6.0.0",
+ "thecodingmachine/phpstan-strict-rules": "^1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Termwind\\Laravel\\TermwindServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Functions.php"
+ ],
+ "psr-4": {
+ "Termwind\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Its like Tailwind CSS, but for the console.",
+ "keywords": [
+ "cli",
+ "console",
+ "css",
+ "package",
+ "php",
+ "style"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/termwind/issues",
+ "source": "https://github.com/nunomaduro/termwind/tree/v1.15.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/xiCO2k",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-20T19:00:15+00:00"
+ },
+ {
+ "name": "nyholm/psr7",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Nyholm/psr7.git",
+ "reference": "f734364e38a876a23be4d906a2a089e1315be18a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Nyholm/psr7/zipball/f734364e38a876a23be4d906a2a089e1315be18a",
+ "reference": "f734364e38a876a23be4d906a2a089e1315be18a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "php-http/message-factory": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "php-http/psr7-integration-tests": "^1.0",
+ "phpunit/phpunit": "^7.5 || 8.5 || 9.4",
+ "symfony/error-handler": "^4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "description": "A fast PHP7 implementation of PSR-7",
+ "homepage": "https://tnyholm.se",
+ "keywords": [
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/Nyholm/psr7/issues",
+ "source": "https://github.com/Nyholm/psr7/tree/1.5.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2022-06-22T07:13:36+00:00"
+ },
+ {
+ "name": "paragonie/constant_time_encoding",
+ "version": "v2.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938",
+ "reference": "58c3f47f650c94ec05a151692652a868995d2938",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7|^8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "vimeo/psalm": "^1|^2|^3|^4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
+ }
+ ],
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+ "keywords": [
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/constant_time_encoding/issues",
+ "source": "https://github.com/paragonie/constant_time_encoding"
+ },
+ "time": "2022-06-14T06:56:20+00:00"
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v9.99.100",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
+ },
+ {
+ "name": "php-http/message-factory",
+ "version": "v1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message-factory.git",
+ "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
+ "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Factory interfaces for PSR-7 HTTP Message",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message-factory/issues",
+ "source": "https://github.com/php-http/message-factory/tree/master"
+ },
+ "time": "2015-12-19T14:08:53+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
+ "reference": "dc5ff11e274a90cc1c743f66c9ad700ce50db9ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8",
+ "phpunit/phpunit": "^8.5.28 || ^9.5.21"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": true
+ },
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com",
+ "homepage": "https://github.com/schmittjoh"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "support": {
+ "issues": "https://github.com/schmittjoh/php-option/issues",
+ "source": "https://github.com/schmittjoh/php-option/tree/1.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-07-30T15:51:26+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "3.0.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/f28693d38ba21bb0d9f0c411ee5dae2b178201da",
+ "reference": "f28693d38ba21bb0d9f0c411ee5dae2b178201da",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1|^2",
+ "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
+ "php": ">=5.6.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "ext-dom": "Install the DOM extension to load XML formatted public keys.",
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib3\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/phpseclib/phpseclib/issues",
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.18"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-17T18:26:50+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/master"
+ },
+ "time": "2020-06-29T06:28:15+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/master"
+ },
+ "time": "2019-04-30T12:38:16+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/master"
+ },
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.0"
+ },
+ "time": "2021-07-14T16:46:02+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a",
+ "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/simple-cache/tree/2.0.0"
+ },
+ "time": "2021-10-29T13:22:09+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "captainhook/plugin-composer": "^5.3",
+ "ergebnis/composer-normalize": "^2.28.3",
+ "fakerphp/faker": "^1.21",
+ "hamcrest/hamcrest-php": "^2.0",
+ "jangregor/phpstan-prophecy": "^1.0",
+ "mockery/mockery": "^1.5",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpcsstandards/phpcsutils": "^1.0.0-rc1",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.9",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-mockery": "^1.1",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "ramsey/coding-standard": "^2.0.3",
+ "ramsey/conventional-commits": "^1.3",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ },
+ "ramsey/conventional-commits": {
+ "configFile": "conventional-commits.json"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/collection/issues",
+ "source": "https://github.com/ramsey/collection/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-31T21:50:55+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.7.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "433b2014e3979047db08a17a205f410ba3869cf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/433b2014e3979047db08a17a205f410ba3869cf2",
+ "reference": "433b2014e3979047db08a17a205f410ba3869cf2",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.8.8 || ^0.9 || ^0.10",
+ "ext-json": "*",
+ "php": "^8.0",
+ "ramsey/collection": "^1.2 || ^2.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.10",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "ergebnis/composer-normalize": "^2.15",
+ "mockery/mockery": "^1.3",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^1.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "ramsey/composer-repl": "^1.4",
+ "slevomat/coding-standard": "^8.4",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.9"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/uuid/issues",
+ "source": "https://github.com/ramsey/uuid/tree/4.7.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-12T18:13:24+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "3e294254f2191762c1d137aed4b94e966965e985"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/3e294254f2191762c1d137aed4b94e966965e985",
+ "reference": "3e294254f2191762c1d137aed4b94e966965e985",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.4|^6.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/lock": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1",
+ "reference": "bf1b9d4ad8b1cf0dbde8b08e0135a2f6259b9ba1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Converts CSS selectors to XPath expressions",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/css-selector/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+ "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-25T10:21:52+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/0092696af0be8e6124b042fbe2890ca1788d7b28",
+ "reference": "0092696af0be8e6124b042fbe2890ca1788d7b28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/http-kernel": "^5.4|^6.0",
+ "symfony/serializer": "^5.4|^6.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68",
+ "reference": "f02d108b5e9fd4a6245aa73a9d2df2ec060c3e68",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/event-dispatcher-contracts": "^2|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/expression-language": "^5.4|^6.0",
+ "symfony/http-foundation": "^5.4|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/stopwatch": "^5.4|^6.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "0782b0b52a737a05b4383d0df35a474303cabdae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae",
+ "reference": "0782b0b52a737a05b4383d0df35a474303cabdae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-25T10:21:52+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/c90dc446976a612e3312a97a6ec0069ab0c2099c",
+ "reference": "c90dc446976a612e3312a97a6ec0069ab0c2099c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-20T17:45:48+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "9d081ead9d3432e2e8002178d14c4c9dd4b8ffbf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9d081ead9d3432e2e8002178d14c4c9dd4b8ffbf",
+ "reference": "9d081ead9d3432e2e8002178d14c4c9dd4b8ffbf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.1"
+ },
+ "conflict": {
+ "symfony/cache": "<6.2"
+ },
+ "require-dev": {
+ "predis/predis": "~1.0",
+ "symfony/cache": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/expression-language": "^5.4|^6.0",
+ "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4",
+ "symfony/mime": "^5.4|^6.0",
+ "symfony/rate-limiter": "^5.2|^6.0"
+ },
+ "suggest": {
+ "symfony/mime": "To use the file extension guesser"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "f68aaa11eee6b21c99bce0f3d98815924888fe62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f68aaa11eee6b21c99bce0f3d98815924888fe62",
+ "reference": "f68aaa11eee6b21c99bce0f3d98815924888fe62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/error-handler": "^6.1",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/http-foundation": "^5.4|^6.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<5.4",
+ "symfony/cache": "<5.4",
+ "symfony/config": "<6.1",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<6.2",
+ "symfony/doctrine-bridge": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<5.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/translation": "<5.4",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/validator": "<5.4",
+ "twig/twig": "<2.13"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^5.4|^6.0",
+ "symfony/config": "^6.1",
+ "symfony/console": "^5.4|^6.0",
+ "symfony/css-selector": "^5.4|^6.0",
+ "symfony/dependency-injection": "^6.2",
+ "symfony/dom-crawler": "^5.4|^6.0",
+ "symfony/expression-language": "^5.4|^6.0",
+ "symfony/finder": "^5.4|^6.0",
+ "symfony/http-client-contracts": "^1.1|^2|^3",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/routing": "^5.4|^6.0",
+ "symfony/stopwatch": "^5.4|^6.0",
+ "symfony/translation": "^5.4|^6.0",
+ "symfony/translation-contracts": "^1.1|^2|^3",
+ "symfony/uid": "^5.4|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-24T15:33:24+00:00"
+ },
+ {
+ "name": "symfony/mailer",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mailer.git",
+ "reference": "29729ac0b4e5113f24c39c46746bd6afb79e0aaa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/29729ac0b4e5113f24c39c46746bd6afb79e0aaa",
+ "reference": "29729ac0b4e5113f24c39c46746bd6afb79e0aaa",
+ "shasum": ""
+ },
+ "require": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1",
+ "psr/log": "^1|^2|^3",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/mime": "^6.2",
+ "symfony/service-contracts": "^1.1|^2|^3"
+ },
+ "conflict": {
+ "symfony/http-kernel": "<5.4",
+ "symfony/messenger": "<6.2",
+ "symfony/mime": "<6.2",
+ "symfony/twig-bridge": "<6.2.1"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0",
+ "symfony/http-client-contracts": "^1.1|^2|^3",
+ "symfony/messenger": "^6.2",
+ "symfony/twig-bridge": "^6.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mailer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps sending emails",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/mailer/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-10T18:53:53+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "4b7b349f67d15cd0639955c8179a76c89f6fd610"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/4b7b349f67d15cd0639955c8179a76c89f6fd610",
+ "reference": "4b7b349f67d15cd0639955c8179a76c89f6fd610",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "conflict": {
+ "egulias/email-validator": "~3.0.0",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/mailer": "<5.4",
+ "symfony/serializer": "<6.2"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3.1|^4",
+ "league/html-to-markdown": "^5.0",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/property-access": "^5.4|^6.0",
+ "symfony/property-info": "^5.4|^6.0",
+ "symfony/serializer": "^6.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows manipulating MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/mime/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-10T18:53:53+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "639084e360537a19f9ee352433b84ce831f3d2da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
+ "reference": "639084e360537a19f9ee352433b84ce831f3d2da",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "symfony/polyfill-intl-normalizer": "^1.10",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-uuid",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-uuid.git",
+ "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166",
+ "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-uuid": "*"
+ },
+ "suggest": {
+ "ext-uuid": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Uuid\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for uuid functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "uuid"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/9ead139f63dfa38c4e4a9049cc64a8b2748c83b7",
+ "reference": "9ead139f63dfa38c4e4a9049cc64a8b2748c83b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/psr-http-message-bridge",
+ "version": "v2.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/psr-http-message-bridge.git",
+ "reference": "a125b93ef378c492e274f217874906fb9babdebb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/a125b93ef378c492e274f217874906fb9babdebb",
+ "reference": "a125b93ef378c492e274f217874906fb9babdebb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0",
+ "symfony/http-foundation": "^4.4 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.1",
+ "psr/log": "^1.1 || ^2 || ^3",
+ "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0",
+ "symfony/config": "^4.4 || ^5.0 || ^6.0",
+ "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0",
+ "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0",
+ "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0",
+ "symfony/phpunit-bridge": "^5.4@dev || ^6.0"
+ },
+ "suggest": {
+ "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\PsrHttpMessage\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ }
+ ],
+ "description": "PSR HTTP message bridge",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/psr-http-message-bridge/issues",
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-28T22:46:34+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "589bd742d5d03c192c8521911680fe88f61712fe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/589bd742d5d03c192c8521911680fe88f61712fe",
+ "reference": "589bd742d5d03c192c8521911680fe88f61712fe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.2",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/expression-language": "^5.4|^6.0",
+ "symfony/http-foundation": "^5.4|^6.0",
+ "symfony/yaml": "^5.4|^6.0"
+ },
+ "suggest": {
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/http-foundation": "For using a Symfony Request object",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Maps an HTTP request to a set of configuration variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/routing/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+ "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-25T10:21:52+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
+ "reference": "b2dac0fa27b1ac0f9c0c0b23b43977f12308d0b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/intl": "^6.2",
+ "symfony/translation-contracts": "^2.0|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/60556925a703cfbc1581cde3b3f35b0bb0ea904c",
+ "reference": "60556925a703cfbc1581cde3b3f35b0bb0ea904c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^2.3|^3.0"
+ },
+ "conflict": {
+ "symfony/config": "<5.4",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/twig-bundle": "<5.4",
+ "symfony/yaml": "<5.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.3|3.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.13",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/console": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/finder": "^5.4|^6.0",
+ "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
+ "symfony/http-kernel": "^5.4|^6.0",
+ "symfony/intl": "^5.4|^6.0",
+ "symfony/polyfill-intl-icu": "^1.21",
+ "symfony/routing": "^5.4|^6.0",
+ "symfony/service-contracts": "^1.1.2|^2|^3",
+ "symfony/yaml": "^5.4|^6.0"
+ },
+ "suggest": {
+ "nikic/php-parser": "To use PhpAstExtractor",
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to internationalize your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/translation/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-05T07:00:27+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "68cce71402305a015f8c1589bfada1280dc64fe7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7",
+ "reference": "68cce71402305a015f8c1589bfada1280dc64fe7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-25T10:21:52+00:00"
+ },
+ {
+ "name": "symfony/uid",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/uid.git",
+ "reference": "8ace895bded57d6496638c9b2d3b788e05b7395b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/8ace895bded57d6496638c9b2d3b788e05b7395b",
+ "reference": "8ace895bded57d6496638c9b2d3b788e05b7395b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-uuid": "^1.15"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Uid\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Grégoire Pineau",
+ "email": "lyrixx@lyrixx.info"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to generate and represent UIDs",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "UID",
+ "ulid",
+ "uuid"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/uid/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:38:09+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v6.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/44b7b81749fd20c1bdf4946c041050e22bc8da27",
+ "reference": "44b7b81749fd20c1bdf4946c041050e22bc8da27",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<5.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/uid": "^5.4|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v6.2.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-20T17:45:48+00:00"
+ },
+ {
+ "name": "tightenco/collect",
+ "version": "v9.47.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tighten/collect.git",
+ "reference": "7bc3f863032e4458d798a4d2fa9379d32504aa97"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tighten/collect/zipball/7bc3f863032e4458d798a4d2fa9379d32504aa97",
+ "reference": "7bc3f863032e4458d798a4d2fa9379d32504aa97",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0",
+ "symfony/var-dumper": "^3.4 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "nesbot/carbon": "^2.23.0",
+ "phpunit/phpunit": "^8.3"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Collect/Support/helpers.php",
+ "src/Collect/Support/alias.php"
+ ],
+ "psr-4": {
+ "Tightenco\\Collect\\": "src/Collect"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylorotwell@gmail.com"
+ }
+ ],
+ "description": "Collect - Illuminate Collections as a separate package.",
+ "keywords": [
+ "collection",
+ "laravel"
+ ],
+ "support": {
+ "issues": "https://github.com/tighten/collect/issues",
+ "source": "https://github.com/tighten/collect/tree/v9.47.0"
+ },
+ "time": "2023-01-13T19:14:21+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "2.2.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/c42125b83a4fa63b187fdf29f9c93cb7733da30c",
+ "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Tijs Verkoyen",
+ "email": "css_to_inline_styles@verkoyen.eu",
+ "role": "Developer"
+ }
+ ],
+ "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+ "support": {
+ "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
+ "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.6"
+ },
+ "time": "2023-01-03T09:29:04+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
+ "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.2",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.8",
+ "symfony/polyfill-ctype": "^1.23",
+ "symfony/polyfill-mbstring": "^1.23.1",
+ "symfony/polyfill-php80": "^1.23.1"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": true
+ },
+ "branch-alias": {
+ "dev-master": "5.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://github.com/vlucas"
+ }
+ ],
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "issues": "https://github.com/vlucas/phpdotenv/issues",
+ "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-10-16T01:01:54+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "b56450eed252f6801410d810c8e1727224ae0743"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743",
+ "reference": "b56450eed252f6801410d810c8e1727224ae0743",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/voku/portable-ascii/issues",
+ "source": "https://github.com/voku/portable-ascii/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-08T17:03:00+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<4.6.1 || 4.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ },
+ "time": "2022-06-03T18:03:27+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "3372ed65e6d2039d663ed19aa699956f9d346271"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3372ed65e6d2039d663ed19aa699956f9d346271",
+ "reference": "3372ed65e6d2039d663ed19aa699956f9d346271",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/routing": "^7|^8|^9",
+ "illuminate/session": "^7|^8|^9",
+ "illuminate/support": "^7|^8|^9",
+ "maximebf/debugbar": "^1.17.2",
+ "php": ">=7.2.5",
+ "symfony/finder": "^5|^6"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.3.3",
+ "orchestra/testbench-dusk": "^5|^6|^7",
+ "phpunit/phpunit": "^8.5|^9.0",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Barryvdh\\Debugbar\\ServiceProvider"
+ ],
+ "aliases": {
+ "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar"
+ }
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/helpers.php"
+ ],
+ "psr-4": {
+ "Barryvdh\\Debugbar\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "support": {
+ "issues": "https://github.com/barryvdh/laravel-debugbar/issues",
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2022-07-11T09:26:42+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "fakerphp/faker",
+ "version": "v1.21.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d",
+ "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "psr/container": "^1.0 || ^2.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "doctrine/persistence": "^1.3 || ^2.0",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^9.5.26",
+ "symfony/phpunit-bridge": "^5.4.16"
+ },
+ "suggest": {
+ "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+ "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+ "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+ "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+ "ext-mbstring": "Required for multibyte Unicode string functionality."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "v1.21-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "support": {
+ "issues": "https://github.com/FakerPHP/Faker/issues",
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0"
+ },
+ "time": "2022-12-13T13:54:32+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.14.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "f7948baaa0330277c729714910336383286305da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da",
+ "reference": "f7948baaa0330277c729714910336383286305da",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "support": {
+ "issues": "https://github.com/filp/whoops/issues",
+ "source": "https://github.com/filp/whoops/tree/2.14.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2022-11-02T16:23:29+00:00"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3|^7.0|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "support": {
+ "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+ "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+ },
+ "time": "2020-07-09T08:09:16+00:00"
+ },
+ {
+ "name": "maximebf/debugbar",
+ "version": "v1.18.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maximebf/php-debugbar.git",
+ "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/ba0af68dd4316834701ecb30a00ce9604ced3ee9",
+ "reference": "ba0af68dd4316834701ecb30a00ce9604ced3ee9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1|^8",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^2.6|^3|^4|^5|^6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5.20 || ^9.4.2",
+ "twig/twig": "^1.38|^2.7|^3.0"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "DebugBar\\": "src/DebugBar/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug",
+ "debugbar"
+ ],
+ "support": {
+ "issues": "https://github.com/maximebf/php-debugbar/issues",
+ "source": "https://github.com/maximebf/php-debugbar/tree/v1.18.1"
+ },
+ "time": "2022-03-31T14:55:54+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e",
+ "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": "^7.3 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mockery": "library/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "http://blog.astrumfutura.com"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "http://davedevelopment.co.uk"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/mockery/mockery/issues",
+ "source": "https://github.com/mockery/mockery/tree/1.5.1"
+ },
+ "time": "2022-09-07T15:32:08+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-03-03T13:19:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.15.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "reference": "570e980a201d8ed0236b0a62ddf2c9cbb2034039",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.3"
+ },
+ "time": "2023-01-16T22:05:37+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v6.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "f05978827b9343cba381ca05b8c7deee346b6015"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f05978827b9343cba381ca05b8c7deee346b6015",
+ "reference": "f05978827b9343cba381ca05b8c7deee346b6015",
+ "shasum": ""
+ },
+ "require": {
+ "filp/whoops": "^2.14.5",
+ "php": "^8.0.0",
+ "symfony/console": "^6.0.2"
+ },
+ "require-dev": {
+ "brianium/paratest": "^6.4.1",
+ "laravel/framework": "^9.26.1",
+ "laravel/pint": "^1.1.1",
+ "nunomaduro/larastan": "^1.0.3",
+ "nunomaduro/mock-final-classes": "^1.1.0",
+ "orchestra/testbench": "^7.7",
+ "phpunit/phpunit": "^9.5.23",
+ "spatie/ignition": "^1.4.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "6.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "support": {
+ "issues": "https://github.com/nunomaduro/collision/issues",
+ "source": "https://github.com/nunomaduro/collision"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2023-01-03T12:54:54+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2cf940ebc6355a9d430462811b5aaa308b174bed",
+ "reference": "2cf940ebc6355a9d430462811b5aaa308b174bed",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.14",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.24"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-01-26T08:26:55+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e",
+ "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.13",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.5",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.2",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-14T12:32:24+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-04-03T09:37:03+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:03:37+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-14T08:28:10+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
+ "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-12T14:47:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.0.2"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000..91383a7
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,203 @@
+ 'PLA',
+ 'name_html_long' => 'phpLDAPadmin',
+ 'version' => (trim(file_get_contents(__DIR__.'/../public/VERSION')) ?? 'UNKNOWN').'-'.(trim(file_get_contents(__DIR__.'/../VERSION')) ?? 'UNKNOWN'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => 'UTC',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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,
+
+ /*
+ * Other Service Providers...
+ */
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => Facade::defaultAliases()->merge([
+ // 'ExampleClass' => App\Example\ExampleClass::class,
+ ])->toArray(),
+
+];
diff --git a/config/auth.php b/config/auth.php
new file mode 100644
index 0000000..4cb9951
--- /dev/null
+++ b/config/auth.php
@@ -0,0 +1,122 @@
+ [
+ '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' => 'ldap',
+ ],
+
+ 'api' => [
+ 'driver' => 'passport',
+ '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' => 'ldap',
+ 'model' => App\Ldap\User::class,
+ ],
+
+ // 'users' => [
+ // 'driver' => 'database',
+ // 'table' => 'users',
+ // ],
+
+ 'ldap' => [
+ 'driver' => 'ldap',
+ 'model' => App\Ldap\User::class,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 0000000..3bba110
--- /dev/null
+++ b/config/broadcasting.php
@@ -0,0 +1,59 @@
+ 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,
+ ],
+ ],
+
+ '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 0000000..4f41fdf
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,104 @@
+ 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.
+ |
+ */
+
+ 'stores' => [
+
+ 'apc' => [
+ 'driver' => 'apc',
+ ],
+
+ 'array' => [
+ 'driver' => 'array',
+ 'serialize' => false,
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'table' => 'cache',
+ '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',
+ ],
+
+ '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'),
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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/config.php.example b/config/config.php.example
index b7bcd27..bb38466 100644
--- a/config/config.php.example
+++ b/config/config.php.example
@@ -249,29 +249,6 @@ $config->custom->appearance['friendly_attrs'] = array(
// $config->custom->modify_member['posixfilter'] = '(uid=*)';
// $config->custom->modify_member['posixgroupattr'] = 'memberUid';
-/*********************************************
- * Support for attrs display order *
- *********************************************/
-
-/* Use this array if you want to have your attributes displayed in a specific
- order. You can use default attribute names or their fridenly names.
- For example, "sn" will be displayed right after "givenName". All the other
- attributes that are not specified in this array will be displayed after in
- alphabetical order. */
-// $config->custom->appearance['attr_display_order'] = array();
-# $config->custom->appearance['attr_display_order'] = array(
-# 'givenName',
-# 'sn',
-# 'cn',
-# 'displayName',
-# 'uid',
-# 'uidNumber',
-# 'gidNumber',
-# 'homeDirectory',
-# 'mail',
-# 'userPassword'
-# );
-
/*********************************************
* Define your LDAP servers in this section *
*********************************************/
@@ -507,15 +484,6 @@ $servers->setValue('server','name','My LDAP Server');
// $servers->setValue('server','custom_attrs',array(''));
# $servers->setValue('server','custom_attrs',array('nsRoleDN','nsRole','nsAccountLock'));
-/* These attributes will be forced to MAY attributes and become option in the
- templates. If they are not defined in the templates, then they wont appear
- as per normal template processing. You may want to do this because your LDAP
- server may automatically calculate a default value.
- In Fedora Directory Server using the DNA Plugin one could ignore uidNumber,
- gidNumber and sambaSID. */
-// $servers->setValue('server','force_may',array(''));
-# $servers->setValue('server','force_may',array('uidNumber','gidNumber','sambaSID'));
-
/*********************************************
* Unique attributes *
*********************************************/
diff --git a/config/cors.php b/config/cors.php
new file mode 100644
index 0000000..8a39e6d
--- /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 0000000..b42d9b3
--- /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 0000000..94c8112
--- /dev/null
+++ b/config/filesystems.php
@@ -0,0 +1,85 @@
+ env('FILESYSTEM_DRIVER', 'local'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default Cloud Filesystem Disk
+ |--------------------------------------------------------------------------
+ |
+ | Many applications store files both locally and in the cloud. For this
+ | reason, you may specify a default "cloud" driver here. This driver
+ | will be bound as the Cloud disk implementation in the container.
+ |
+ */
+
+ 'cloud' => env('FILESYSTEM_CLOUD', 's3'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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'),
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 0000000..8425770
--- /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/laravellocalization.php b/config/laravellocalization.php
new file mode 100644
index 0000000..93b87c7
--- /dev/null
+++ b/config/laravellocalization.php
@@ -0,0 +1,348 @@
+ [
+ 'dev' => ['name' => 'Development', 'script' => 'Latn', 'native' => 'Development', 'regional' => ''],
+ //'ace' => ['name' => 'Achinese', 'script' => 'Latn', 'native' => 'Aceh', 'regional' => ''],
+ //'af' => ['name' => 'Afrikaans', 'script' => 'Latn', 'native' => 'Afrikaans', 'regional' => 'af_ZA'],
+ //'agq' => ['name' => 'Aghem', 'script' => 'Latn', 'native' => 'Aghem', 'regional' => ''],
+ //'ak' => ['name' => 'Akan', 'script' => 'Latn', 'native' => 'Akan', 'regional' => 'ak_GH'],
+ //'an' => ['name' => 'Aragonese', 'script' => 'Latn', 'native' => 'aragonés', 'regional' => 'an_ES'],
+ //'cch' => ['name' => 'Atsam', 'script' => 'Latn', 'native' => 'Atsam', 'regional' => ''],
+ //'gn' => ['name' => 'Guaraní', 'script' => 'Latn', 'native' => 'Avañe’ẽ', 'regional' => ''],
+ //'ae' => ['name' => 'Avestan', 'script' => 'Latn', 'native' => 'avesta', 'regional' => ''],
+ //'ay' => ['name' => 'Aymara', 'script' => 'Latn', 'native' => 'aymar aru', 'regional' => 'ay_PE'],
+ //'az' => ['name' => 'Azerbaijani (Latin)', 'script' => 'Latn', 'native' => 'azərbaycanca', 'regional' => 'az_AZ'],
+ //'id' => ['name' => 'Indonesian', 'script' => 'Latn', 'native' => 'Bahasa Indonesia', 'regional' => 'id_ID'],
+ //'ms' => ['name' => 'Malay', 'script' => 'Latn', 'native' => 'Bahasa Melayu', 'regional' => 'ms_MY'],
+ //'bm' => ['name' => 'Bambara', 'script' => 'Latn', 'native' => 'bamanakan', 'regional' => ''],
+ //'jv' => ['name' => 'Javanese (Latin)', 'script' => 'Latn', 'native' => 'Basa Jawa', 'regional' => ''],
+ //'su' => ['name' => 'Sundanese', 'script' => 'Latn', 'native' => 'Basa Sunda', 'regional' => ''],
+ //'bh' => ['name' => 'Bihari', 'script' => 'Latn', 'native' => 'Bihari', 'regional' => ''],
+ //'bi' => ['name' => 'Bislama', 'script' => 'Latn', 'native' => 'Bislama', 'regional' => ''],
+ //'nb' => ['name' => 'Norwegian Bokmål', 'script' => 'Latn', 'native' => 'Bokmål', 'regional' => 'nb_NO'],
+ //'bs' => ['name' => 'Bosnian', 'script' => 'Latn', 'native' => 'bosanski', 'regional' => 'bs_BA'],
+ //'br' => ['name' => 'Breton', 'script' => 'Latn', 'native' => 'brezhoneg', 'regional' => 'br_FR'],
+ //'ca' => ['name' => 'Catalan', 'script' => 'Latn', 'native' => 'català', 'regional' => 'ca_ES'],
+ //'ch' => ['name' => 'Chamorro', 'script' => 'Latn', 'native' => 'Chamoru', 'regional' => ''],
+ //'ny' => ['name' => 'Chewa', 'script' => 'Latn', 'native' => 'chiCheŵa', 'regional' => ''],
+ //'kde' => ['name' => 'Makonde', 'script' => 'Latn', 'native' => 'Chimakonde', 'regional' => ''],
+ //'sn' => ['name' => 'Shona', 'script' => 'Latn', 'native' => 'chiShona', 'regional' => ''],
+ //'co' => ['name' => 'Corsican', 'script' => 'Latn', 'native' => 'corsu', 'regional' => ''],
+ //'cy' => ['name' => 'Welsh', 'script' => 'Latn', 'native' => 'Cymraeg', 'regional' => 'cy_GB'],
+ //'da' => ['name' => 'Danish', 'script' => 'Latn', 'native' => 'dansk', 'regional' => 'da_DK'],
+ //'se' => ['name' => 'Northern Sami', 'script' => 'Latn', 'native' => 'davvisámegiella', 'regional' => 'se_NO'],
+ //'de' => ['name' => 'German', 'script' => 'Latn', 'native' => 'Deutsch', 'regional' => 'de_DE'],
+ //'luo' => ['name' => 'Luo', 'script' => 'Latn', 'native' => 'Dholuo', 'regional' => ''],
+ //'nv' => ['name' => 'Navajo', 'script' => 'Latn', 'native' => 'Diné bizaad', 'regional' => ''],
+ //'dua' => ['name' => 'Duala', 'script' => 'Latn', 'native' => 'duálá', 'regional' => ''],
+ //'et' => ['name' => 'Estonian', 'script' => 'Latn', 'native' => 'eesti', 'regional' => 'et_EE'],
+ //'na' => ['name' => 'Nauru', 'script' => 'Latn', 'native' => 'Ekakairũ Naoero', 'regional' => ''],
+ //'guz' => ['name' => 'Ekegusii', 'script' => 'Latn', 'native' => 'Ekegusii', 'regional' => ''],
+ 'en' => ['name' => 'English', 'script' => 'Latn', 'native' => 'English', 'regional' => 'en_GB'],
+ //'en-AU' => ['name' => 'Australian English', 'script' => 'Latn', 'native' => 'Australian English', 'regional' => 'en_AU'],
+ //'en-GB' => ['name' => 'British English', 'script' => 'Latn', 'native' => 'British English', 'regional' => 'en_GB'],
+ //'en-CA' => ['name' => 'Canadian English', 'script' => 'Latn', 'native' => 'Canadian English', 'regional' => 'en_CA'],
+ //'en-US' => ['name' => 'U.S. English', 'script' => 'Latn', 'native' => 'U.S. English', 'regional' => 'en_US'],
+ //'es' => ['name' => 'Spanish', 'script' => 'Latn', 'native' => 'español', 'regional' => 'es_ES'],
+ //'eo' => ['name' => 'Esperanto', 'script' => 'Latn', 'native' => 'esperanto', 'regional' => ''],
+ //'eu' => ['name' => 'Basque', 'script' => 'Latn', 'native' => 'euskara', 'regional' => 'eu_ES'],
+ //'ewo' => ['name' => 'Ewondo', 'script' => 'Latn', 'native' => 'ewondo', 'regional' => ''],
+ //'ee' => ['name' => 'Ewe', 'script' => 'Latn', 'native' => 'eʋegbe', 'regional' => ''],
+ //'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'],
+ //'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'],
+ //'fr-CA' => ['name' => 'Canadian French', 'script' => 'Latn', 'native' => 'français canadien', 'regional' => 'fr_CA'],
+ //'fy' => ['name' => 'Western Frisian', 'script' => 'Latn', 'native' => 'frysk', 'regional' => 'fy_DE'],
+ //'fur' => ['name' => 'Friulian', 'script' => 'Latn', 'native' => 'furlan', 'regional' => 'fur_IT'],
+ //'fo' => ['name' => 'Faroese', 'script' => 'Latn', 'native' => 'føroyskt', 'regional' => 'fo_FO'],
+ //'gaa' => ['name' => 'Ga', 'script' => 'Latn', 'native' => 'Ga', 'regional' => ''],
+ //'ga' => ['name' => 'Irish', 'script' => 'Latn', 'native' => 'Gaeilge', 'regional' => 'ga_IE'],
+ //'gv' => ['name' => 'Manx', 'script' => 'Latn', 'native' => 'Gaelg', 'regional' => 'gv_GB'],
+ //'sm' => ['name' => 'Samoan', 'script' => 'Latn', 'native' => 'Gagana fa’a Sāmoa', 'regional' => ''],
+ //'gl' => ['name' => 'Galician', 'script' => 'Latn', 'native' => 'galego', 'regional' => 'gl_ES'],
+ //'ki' => ['name' => 'Kikuyu', 'script' => 'Latn', 'native' => 'Gikuyu', 'regional' => ''],
+ //'gd' => ['name' => 'Scottish Gaelic', 'script' => 'Latn', 'native' => 'Gàidhlig', 'regional' => 'gd_GB'],
+ //'ha' => ['name' => 'Hausa', 'script' => 'Latn', 'native' => 'Hausa', 'regional' => 'ha_NG'],
+ //'bez' => ['name' => 'Bena', 'script' => 'Latn', 'native' => 'Hibena', 'regional' => ''],
+ //'ho' => ['name' => 'Hiri Motu', 'script' => 'Latn', 'native' => 'Hiri Motu', 'regional' => ''],
+ //'hr' => ['name' => 'Croatian', 'script' => 'Latn', 'native' => 'hrvatski', 'regional' => 'hr_HR'],
+ //'bem' => ['name' => 'Bemba', 'script' => 'Latn', 'native' => 'Ichibemba', 'regional' => 'bem_ZM'],
+ //'io' => ['name' => 'Ido', 'script' => 'Latn', 'native' => 'Ido', 'regional' => ''],
+ //'ig' => ['name' => 'Igbo', 'script' => 'Latn', 'native' => 'Igbo', 'regional' => 'ig_NG'],
+ //'rn' => ['name' => 'Rundi', 'script' => 'Latn', 'native' => 'Ikirundi', 'regional' => ''],
+ //'ia' => ['name' => 'Interlingua', 'script' => 'Latn', 'native' => 'interlingua', 'regional' => 'ia_FR'],
+ //'iu-Latn' => ['name' => 'Inuktitut (Latin)', 'script' => 'Latn', 'native' => 'Inuktitut', 'regional' => 'iu_CA'],
+ //'sbp' => ['name' => 'Sileibi', 'script' => 'Latn', 'native' => 'Ishisangu', 'regional' => ''],
+ //'nd' => ['name' => 'North Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => ''],
+ //'nr' => ['name' => 'South Ndebele', 'script' => 'Latn', 'native' => 'isiNdebele', 'regional' => 'nr_ZA'],
+ //'xh' => ['name' => 'Xhosa', 'script' => 'Latn', 'native' => 'isiXhosa', 'regional' => 'xh_ZA'],
+ //'zu' => ['name' => 'Zulu', 'script' => 'Latn', 'native' => 'isiZulu', 'regional' => 'zu_ZA'],
+ //'it' => ['name' => 'Italian', 'script' => 'Latn', 'native' => 'italiano', 'regional' => 'it_IT'],
+ //'ik' => ['name' => 'Inupiaq', 'script' => 'Latn', 'native' => 'Iñupiaq', 'regional' => 'ik_CA'],
+ //'dyo' => ['name' => 'Jola-Fonyi', 'script' => 'Latn', 'native' => 'joola', 'regional' => ''],
+ //'kea' => ['name' => 'Kabuverdianu', 'script' => 'Latn', 'native' => 'kabuverdianu', 'regional' => ''],
+ //'kaj' => ['name' => 'Jju', 'script' => 'Latn', 'native' => 'Kaje', 'regional' => ''],
+ //'mh' => ['name' => 'Marshallese', 'script' => 'Latn', 'native' => 'Kajin M̧ajeļ', 'regional' => 'mh_MH'],
+ //'kl' => ['name' => 'Kalaallisut', 'script' => 'Latn', 'native' => 'kalaallisut', 'regional' => 'kl_GL'],
+ //'kln' => ['name' => 'Kalenjin', 'script' => 'Latn', 'native' => 'Kalenjin', 'regional' => ''],
+ //'kr' => ['name' => 'Kanuri', 'script' => 'Latn', 'native' => 'Kanuri', 'regional' => ''],
+ //'kcg' => ['name' => 'Tyap', 'script' => 'Latn', 'native' => 'Katab', 'regional' => ''],
+ //'kw' => ['name' => 'Cornish', 'script' => 'Latn', 'native' => 'kernewek', 'regional' => 'kw_GB'],
+ //'naq' => ['name' => 'Nama', 'script' => 'Latn', 'native' => 'Khoekhoegowab', 'regional' => ''],
+ //'rof' => ['name' => 'Rombo', 'script' => 'Latn', 'native' => 'Kihorombo', 'regional' => ''],
+ //'kam' => ['name' => 'Kamba', 'script' => 'Latn', 'native' => 'Kikamba', 'regional' => ''],
+ //'kg' => ['name' => 'Kongo', 'script' => 'Latn', 'native' => 'Kikongo', 'regional' => ''],
+ //'jmc' => ['name' => 'Machame', 'script' => 'Latn', 'native' => 'Kimachame', 'regional' => ''],
+ //'rw' => ['name' => 'Kinyarwanda', 'script' => 'Latn', 'native' => 'Kinyarwanda', 'regional' => 'rw_RW'],
+ //'asa' => ['name' => 'Kipare', 'script' => 'Latn', 'native' => 'Kipare', 'regional' => ''],
+ //'rwk' => ['name' => 'Rwa', 'script' => 'Latn', 'native' => 'Kiruwa', 'regional' => ''],
+ //'saq' => ['name' => 'Samburu', 'script' => 'Latn', 'native' => 'Kisampur', 'regional' => ''],
+ //'ksb' => ['name' => 'Shambala', 'script' => 'Latn', 'native' => 'Kishambaa', 'regional' => ''],
+ //'swc' => ['name' => 'Congo Swahili', 'script' => 'Latn', 'native' => 'Kiswahili ya Kongo', 'regional' => ''],
+ //'sw' => ['name' => 'Swahili', 'script' => 'Latn', 'native' => 'Kiswahili', 'regional' => 'sw_KE'],
+ //'dav' => ['name' => 'Dawida', 'script' => 'Latn', 'native' => 'Kitaita', 'regional' => ''],
+ //'teo' => ['name' => 'Teso', 'script' => 'Latn', 'native' => 'Kiteso', 'regional' => ''],
+ //'khq' => ['name' => 'Koyra Chiini', 'script' => 'Latn', 'native' => 'Koyra ciini', 'regional' => ''],
+ //'ses' => ['name' => 'Songhay', 'script' => 'Latn', 'native' => 'Koyraboro senni', 'regional' => ''],
+ //'mfe' => ['name' => 'Morisyen', 'script' => 'Latn', 'native' => 'kreol morisien', 'regional' => ''],
+ //'ht' => ['name' => 'Haitian', 'script' => 'Latn', 'native' => 'Kreyòl ayisyen', 'regional' => 'ht_HT'],
+ //'kj' => ['name' => 'Kuanyama', 'script' => 'Latn', 'native' => 'Kwanyama', 'regional' => ''],
+ //'ksh' => ['name' => 'Kölsch', 'script' => 'Latn', 'native' => 'Kölsch', 'regional' => ''],
+ //'ebu' => ['name' => 'Kiembu', 'script' => 'Latn', 'native' => 'Kĩembu', 'regional' => ''],
+ //'mer' => ['name' => 'Kimîîru', 'script' => 'Latn', 'native' => 'Kĩmĩrũ', 'regional' => ''],
+ //'lag' => ['name' => 'Langi', 'script' => 'Latn', 'native' => 'Kɨlaangi', 'regional' => ''],
+ //'lah' => ['name' => 'Lahnda', 'script' => 'Latn', 'native' => 'Lahnda', 'regional' => ''],
+ //'la' => ['name' => 'Latin', 'script' => 'Latn', 'native' => 'latine', 'regional' => ''],
+ //'lv' => ['name' => 'Latvian', 'script' => 'Latn', 'native' => 'latviešu', 'regional' => 'lv_LV'],
+ //'to' => ['name' => 'Tongan', 'script' => 'Latn', 'native' => 'lea fakatonga', 'regional' => ''],
+ //'lt' => ['name' => 'Lithuanian', 'script' => 'Latn', 'native' => 'lietuvių', 'regional' => 'lt_LT'],
+ //'li' => ['name' => 'Limburgish', 'script' => 'Latn', 'native' => 'Limburgs', 'regional' => 'li_BE'],
+ //'ln' => ['name' => 'Lingala', 'script' => 'Latn', 'native' => 'lingála', 'regional' => ''],
+ //'lg' => ['name' => 'Ganda', 'script' => 'Latn', 'native' => 'Luganda', 'regional' => 'lg_UG'],
+ //'luy' => ['name' => 'Oluluyia', 'script' => 'Latn', 'native' => 'Luluhia', 'regional' => ''],
+ //'lb' => ['name' => 'Luxembourgish', 'script' => 'Latn', 'native' => 'Lëtzebuergesch', 'regional' => 'lb_LU'],
+ //'hu' => ['name' => 'Hungarian', 'script' => 'Latn', 'native' => 'magyar', 'regional' => 'hu_HU'],
+ //'mgh' => ['name' => 'Makhuwa-Meetto', 'script' => 'Latn', 'native' => 'Makua', 'regional' => ''],
+ //'mg' => ['name' => 'Malagasy', 'script' => 'Latn', 'native' => 'Malagasy', 'regional' => 'mg_MG'],
+ //'mt' => ['name' => 'Maltese', 'script' => 'Latn', 'native' => 'Malti', 'regional' => 'mt_MT'],
+ //'mtr' => ['name' => 'Mewari', 'script' => 'Latn', 'native' => 'Mewari', 'regional' => ''],
+ //'mua' => ['name' => 'Mundang', 'script' => 'Latn', 'native' => 'Mundang', 'regional' => ''],
+ //'mi' => ['name' => 'Māori', 'script' => 'Latn', 'native' => 'Māori', 'regional' => 'mi_NZ'],
+ //'nl' => ['name' => 'Dutch', 'script' => 'Latn', 'native' => 'Nederlands', 'regional' => 'nl_NL'],
+ //'nmg' => ['name' => 'Kwasio', 'script' => 'Latn', 'native' => 'ngumba', 'regional' => ''],
+ //'yav' => ['name' => 'Yangben', 'script' => 'Latn', 'native' => 'nuasue', 'regional' => ''],
+ //'nn' => ['name' => 'Norwegian Nynorsk', 'script' => 'Latn', 'native' => 'nynorsk', 'regional' => 'nn_NO'],
+ //'oc' => ['name' => 'Occitan', 'script' => 'Latn', 'native' => 'occitan', 'regional' => 'oc_FR'],
+ //'ang' => ['name' => 'Old English', 'script' => 'Runr', 'native' => 'Old English', 'regional' => ''],
+ //'xog' => ['name' => 'Soga', 'script' => 'Latn', 'native' => 'Olusoga', 'regional' => ''],
+ //'om' => ['name' => 'Oromo', 'script' => 'Latn', 'native' => 'Oromoo', 'regional' => 'om_ET'],
+ //'ng' => ['name' => 'Ndonga', 'script' => 'Latn', 'native' => 'OshiNdonga', 'regional' => ''],
+ //'hz' => ['name' => 'Herero', 'script' => 'Latn', 'native' => 'Otjiherero', 'regional' => ''],
+ //'uz-Latn' => ['name' => 'Uzbek (Latin)', 'script' => 'Latn', 'native' => 'oʼzbekcha', 'regional' => 'uz_UZ'],
+ //'nds' => ['name' => 'Low German', 'script' => 'Latn', 'native' => 'Plattdüütsch', 'regional' => 'nds_DE'],
+ //'pl' => ['name' => 'Polish', 'script' => 'Latn', 'native' => 'polski', 'regional' => 'pl_PL'],
+ //'pt' => ['name' => 'Portuguese', 'script' => 'Latn', 'native' => 'português', 'regional' => 'pt_PT'],
+ //'pt-BR' => ['name' => 'Brazilian Portuguese', 'script' => 'Latn', 'native' => 'português do Brasil', 'regional' => 'pt_BR'],
+ //'ff' => ['name' => 'Fulah', 'script' => 'Latn', 'native' => 'Pulaar', 'regional' => 'ff_SN'],
+ //'pi' => ['name' => 'Pahari-Potwari', 'script' => 'Latn', 'native' => 'Pāli', 'regional' => ''],
+ //'aa' => ['name' => 'Afar', 'script' => 'Latn', 'native' => 'Qafar', 'regional' => 'aa_ER'],
+ //'ty' => ['name' => 'Tahitian', 'script' => 'Latn', 'native' => 'Reo Māohi', 'regional' => ''],
+ //'ksf' => ['name' => 'Bafia', 'script' => 'Latn', 'native' => 'rikpa', 'regional' => ''],
+ //'ro' => ['name' => 'Romanian', 'script' => 'Latn', 'native' => 'română', 'regional' => 'ro_RO'],
+ //'cgg' => ['name' => 'Chiga', 'script' => 'Latn', 'native' => 'Rukiga', 'regional' => ''],
+ //'rm' => ['name' => 'Romansh', 'script' => 'Latn', 'native' => 'rumantsch', 'regional' => ''],
+ //'qu' => ['name' => 'Quechua', 'script' => 'Latn', 'native' => 'Runa Simi', 'regional' => ''],
+ //'nyn' => ['name' => 'Nyankole', 'script' => 'Latn', 'native' => 'Runyankore', 'regional' => ''],
+ //'ssy' => ['name' => 'Saho', 'script' => 'Latn', 'native' => 'Saho', 'regional' => ''],
+ //'sc' => ['name' => 'Sardinian', 'script' => 'Latn', 'native' => 'sardu', 'regional' => 'sc_IT'],
+ //'de-CH' => ['name' => 'Swiss High German', 'script' => 'Latn', 'native' => 'Schweizer Hochdeutsch', 'regional' => 'de_CH'],
+ //'gsw' => ['name' => 'Swiss German', 'script' => 'Latn', 'native' => 'Schwiizertüütsch', 'regional' => ''],
+ //'trv' => ['name' => 'Taroko', 'script' => 'Latn', 'native' => 'Seediq', 'regional' => ''],
+ //'seh' => ['name' => 'Sena', 'script' => 'Latn', 'native' => 'sena', 'regional' => ''],
+ //'nso' => ['name' => 'Northern Sotho', 'script' => 'Latn', 'native' => 'Sesotho sa Leboa', 'regional' => 'nso_ZA'],
+ //'st' => ['name' => 'Southern Sotho', 'script' => 'Latn', 'native' => 'Sesotho', 'regional' => 'st_ZA'],
+ //'tn' => ['name' => 'Tswana', 'script' => 'Latn', 'native' => 'Setswana', 'regional' => 'tn_ZA'],
+ //'sq' => ['name' => 'Albanian', 'script' => 'Latn', 'native' => 'shqip', 'regional' => 'sq_AL'],
+ //'sid' => ['name' => 'Sidamo', 'script' => 'Latn', 'native' => 'Sidaamu Afo', 'regional' => 'sid_ET'],
+ //'ss' => ['name' => 'Swati', 'script' => 'Latn', 'native' => 'Siswati', 'regional' => 'ss_ZA'],
+ //'sk' => ['name' => 'Slovak', 'script' => 'Latn', 'native' => 'slovenčina', 'regional' => 'sk_SK'],
+ //'sl' => ['name' => 'Slovene', 'script' => 'Latn', 'native' => 'slovenščina', 'regional' => 'sl_SI'],
+ //'so' => ['name' => 'Somali', 'script' => 'Latn', 'native' => 'Soomaali', 'regional' => 'so_SO'],
+ //'sr-Latn' => ['name' => 'Serbian (Latin)', 'script' => 'Latn', 'native' => 'Srpski', 'regional' => 'sr_RS'],
+ //'sh' => ['name' => 'Serbo-Croatian', 'script' => 'Latn', 'native' => 'srpskohrvatski', 'regional' => ''],
+ //'fi' => ['name' => 'Finnish', 'script' => 'Latn', 'native' => 'suomi', 'regional' => 'fi_FI'],
+ //'sv' => ['name' => 'Swedish', 'script' => 'Latn', 'native' => 'svenska', 'regional' => 'sv_SE'],
+ //'sg' => ['name' => 'Sango', 'script' => 'Latn', 'native' => 'Sängö', 'regional' => ''],
+ //'tl' => ['name' => 'Tagalog', 'script' => 'Latn', 'native' => 'Tagalog', 'regional' => 'tl_PH'],
+ //'tzm-Latn' => ['name' => 'Central Atlas Tamazight (Latin)', 'script' => 'Latn', 'native' => 'Tamazight', 'regional' => ''],
+ //'kab' => ['name' => 'Kabyle', 'script' => 'Latn', 'native' => 'Taqbaylit', 'regional' => 'kab_DZ'],
+ //'twq' => ['name' => 'Tasawaq', 'script' => 'Latn', 'native' => 'Tasawaq senni', 'regional' => ''],
+ //'shi' => ['name' => 'Tachelhit (Latin)', 'script' => 'Latn', 'native' => 'Tashelhit', 'regional' => ''],
+ //'nus' => ['name' => 'Nuer', 'script' => 'Latn', 'native' => 'Thok Nath', 'regional' => ''],
+ //'vi' => ['name' => 'Vietnamese', 'script' => 'Latn', 'native' => 'Tiếng Việt', 'regional' => 'vi_VN'],
+ //'tg-Latn' => ['name' => 'Tajik (Latin)', 'script' => 'Latn', 'native' => 'tojikī', 'regional' => 'tg_TJ'],
+ //'lu' => ['name' => 'Luba-Katanga', 'script' => 'Latn', 'native' => 'Tshiluba', 'regional' => 've_ZA'],
+ //'ve' => ['name' => 'Venda', 'script' => 'Latn', 'native' => 'Tshivenḓa', 'regional' => ''],
+ //'tw' => ['name' => 'Twi', 'script' => 'Latn', 'native' => 'Twi', 'regional' => ''],
+ //'tr' => ['name' => 'Turkish', 'script' => 'Latn', 'native' => 'Türkçe', 'regional' => 'tr_TR'],
+ //'ale' => ['name' => 'Aleut', 'script' => 'Latn', 'native' => 'Unangax tunuu', 'regional' => ''],
+ //'ca-valencia' => ['name' => 'Valencian', 'script' => 'Latn', 'native' => 'valencià', 'regional' => ''],
+ //'vai-Latn' => ['name' => 'Vai (Latin)', 'script' => 'Latn', 'native' => 'Viyamíĩ', 'regional' => ''],
+ //'vo' => ['name' => 'Volapük', 'script' => 'Latn', 'native' => 'Volapük', 'regional' => ''],
+ //'fj' => ['name' => 'Fijian', 'script' => 'Latn', 'native' => 'vosa Vakaviti', 'regional' => ''],
+ //'wa' => ['name' => 'Walloon', 'script' => 'Latn', 'native' => 'Walon', 'regional' => 'wa_BE'],
+ //'wae' => ['name' => 'Walser', 'script' => 'Latn', 'native' => 'Walser', 'regional' => 'wae_CH'],
+ //'wen' => ['name' => 'Sorbian', 'script' => 'Latn', 'native' => 'Wendic', 'regional' => ''],
+ //'wo' => ['name' => 'Wolof', 'script' => 'Latn', 'native' => 'Wolof', 'regional' => 'wo_SN'],
+ //'ts' => ['name' => 'Tsonga', 'script' => 'Latn', 'native' => 'Xitsonga', 'regional' => 'ts_ZA'],
+ //'dje' => ['name' => 'Zarma', 'script' => 'Latn', 'native' => 'Zarmaciine', 'regional' => ''],
+ //'yo' => ['name' => 'Yoruba', 'script' => 'Latn', 'native' => 'Èdè Yorùbá', 'regional' => 'yo_NG'],
+ // 'de-AT' => ['name' => 'Austrian German', 'script' => 'Latn', 'native' => 'Österreichisches Deutsch', 'regional' => 'de_AT'],
+ //'is' => ['name' => 'Icelandic', 'script' => 'Latn', 'native' => 'íslenska', 'regional' => 'is_IS'],
+ //'cs' => ['name' => 'Czech', 'script' => 'Latn', 'native' => 'čeština', 'regional' => 'cs_CZ'],
+ //'bas' => ['name' => 'Basa', 'script' => 'Latn', 'native' => 'Ɓàsàa', 'regional' => ''],
+ //'mas' => ['name' => 'Masai', 'script' => 'Latn', 'native' => 'ɔl-Maa', 'regional' => ''],
+ //'haw' => ['name' => 'Hawaiian', 'script' => 'Latn', 'native' => 'ʻŌlelo Hawaiʻi', 'regional' => ''],
+ //'el' => ['name' => 'Greek', 'script' => 'Grek', 'native' => 'Ελληνικά', 'regional' => 'el_GR'],
+ //'uz' => ['name' => 'Uzbek (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Ўзбек', 'regional' => 'uz_UZ'],
+ //'az-Cyrl' => ['name' => 'Azerbaijani (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Азәрбајҹан', 'regional' => 'uz_UZ'],
+ //'ab' => ['name' => 'Abkhazian', 'script' => 'Cyrl', 'native' => 'Аҧсуа', 'regional' => ''],
+ //'os' => ['name' => 'Ossetic', 'script' => 'Cyrl', 'native' => 'Ирон', 'regional' => 'os_RU'],
+ //'ky' => ['name' => 'Kyrgyz', 'script' => 'Cyrl', 'native' => 'Кыргыз', 'regional' => 'ky_KG'],
+ //'sr' => ['name' => 'Serbian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'Српски', 'regional' => 'sr_RS'],
+ //'av' => ['name' => 'Avaric', 'script' => 'Cyrl', 'native' => 'авар мацӀ', 'regional' => ''],
+ //'ady' => ['name' => 'Adyghe', 'script' => 'Cyrl', 'native' => 'адыгэбзэ', 'regional' => ''],
+ //'ba' => ['name' => 'Bashkir', 'script' => 'Cyrl', 'native' => 'башҡорт теле', 'regional' => ''],
+ //'be' => ['name' => 'Belarusian', 'script' => 'Cyrl', 'native' => 'беларуская', 'regional' => 'be_BY'],
+ //'bg' => ['name' => 'Bulgarian', 'script' => 'Cyrl', 'native' => 'български', 'regional' => 'bg_BG'],
+ //'kv' => ['name' => 'Komi', 'script' => 'Cyrl', 'native' => 'коми кыв', 'regional' => ''],
+ //'mk' => ['name' => 'Macedonian', 'script' => 'Cyrl', 'native' => 'македонски', 'regional' => 'mk_MK'],
+ //'mn' => ['name' => 'Mongolian (Cyrillic)', 'script' => 'Cyrl', 'native' => 'монгол', 'regional' => 'mn_MN'],
+ //'ce' => ['name' => 'Chechen', 'script' => 'Cyrl', 'native' => 'нохчийн мотт', 'regional' => 'ce_RU'],
+ //'ru' => ['name' => 'Russian', 'script' => 'Cyrl', 'native' => 'русский', 'regional' => 'ru_RU'],
+ //'sah' => ['name' => 'Yakut', 'script' => 'Cyrl', 'native' => 'саха тыла', 'regional' => ''],
+ //'tt' => ['name' => 'Tatar', 'script' => 'Cyrl', 'native' => 'татар теле', 'regional' => 'tt_RU'],
+ //'tg' => ['name' => 'Tajik (Cyrillic)', 'script' => 'Cyrl', 'native' => 'тоҷикӣ', 'regional' => 'tg_TJ'],
+ //'tk' => ['name' => 'Turkmen', 'script' => 'Cyrl', 'native' => 'түркменче', 'regional' => 'tk_TM'],
+ //'uk' => ['name' => 'Ukrainian', 'script' => 'Cyrl', 'native' => 'українська', 'regional' => 'uk_UA'],
+ //'cv' => ['name' => 'Chuvash', 'script' => 'Cyrl', 'native' => 'чӑваш чӗлхи', 'regional' => 'cv_RU'],
+ //'cu' => ['name' => 'Church Slavic', 'script' => 'Cyrl', 'native' => 'ѩзыкъ словѣньскъ', 'regional' => ''],
+ //'kk' => ['name' => 'Kazakh', 'script' => 'Cyrl', 'native' => 'қазақ тілі', 'regional' => 'kk_KZ'],
+ //'hy' => ['name' => 'Armenian', 'script' => 'Armn', 'native' => 'Հայերեն', 'regional' => 'hy_AM'],
+ //'yi' => ['name' => 'Yiddish', 'script' => 'Hebr', 'native' => 'ייִדיש', 'regional' => 'yi_US'],
+ //'he' => ['name' => 'Hebrew', 'script' => 'Hebr', 'native' => 'עברית', 'regional' => 'he_IL'],
+ //'ug' => ['name' => 'Uyghur', 'script' => 'Arab', 'native' => 'ئۇيغۇرچە', 'regional' => 'ug_CN'],
+ //'ur' => ['name' => 'Urdu', 'script' => 'Arab', 'native' => 'اردو', 'regional' => 'ur_PK'],
+ //'ar' => ['name' => 'Arabic', 'script' => 'Arab', 'native' => 'العربية', 'regional' => 'ar_AE'],
+ //'uz-Arab' => ['name' => 'Uzbek (Arabic)', 'script' => 'Arab', 'native' => 'اۉزبېک', 'regional' => ''],
+ //'tg-Arab' => ['name' => 'Tajik (Arabic)', 'script' => 'Arab', 'native' => 'تاجیکی', 'regional' => 'tg_TJ'],
+ //'sd' => ['name' => 'Sindhi', 'script' => 'Arab', 'native' => 'سنڌي', 'regional' => 'sd_IN'],
+ //'fa' => ['name' => 'Persian', 'script' => 'Arab', 'native' => 'فارسی', 'regional' => 'fa_IR'],
+ //'pa-Arab' => ['name' => 'Punjabi (Arabic)', 'script' => 'Arab', 'native' => 'پنجاب', 'regional' => 'pa_IN'],
+ //'ps' => ['name' => 'Pashto', 'script' => 'Arab', 'native' => 'پښتو', 'regional' => 'ps_AF'],
+ //'ks' => ['name' => 'Kashmiri (Arabic)', 'script' => 'Arab', 'native' => 'کأشُر', 'regional' => 'ks_IN'],
+ //'ku' => ['name' => 'Kurdish', 'script' => 'Arab', 'native' => 'کوردی', 'regional' => 'ku_TR'],
+ //'dv' => ['name' => 'Divehi', 'script' => 'Thaa', 'native' => 'ދިވެހިބަސް', 'regional' => 'dv_MV'],
+ //'ks-Deva' => ['name' => 'Kashmiri (Devaganari)', 'script' => 'Deva', 'native' => 'कॉशुर', 'regional' => 'ks_IN'],
+ //'kok' => ['name' => 'Konkani', 'script' => 'Deva', 'native' => 'कोंकणी', 'regional' => 'kok_IN'],
+ //'doi' => ['name' => 'Dogri', 'script' => 'Deva', 'native' => 'डोगरी', 'regional' => 'doi_IN'],
+ //'ne' => ['name' => 'Nepali', 'script' => 'Deva', 'native' => 'नेपाली', 'regional' => ''],
+ //'pra' => ['name' => 'Prakrit', 'script' => 'Deva', 'native' => 'प्राकृत', 'regional' => ''],
+ //'brx' => ['name' => 'Bodo', 'script' => 'Deva', 'native' => 'बड़ो', 'regional' => 'brx_IN'],
+ //'bra' => ['name' => 'Braj', 'script' => 'Deva', 'native' => 'ब्रज भाषा', 'regional' => ''],
+ //'mr' => ['name' => 'Marathi', 'script' => 'Deva', 'native' => 'मराठी', 'regional' => 'mr_IN'],
+ //'mai' => ['name' => 'Maithili', 'script' => 'Tirh', 'native' => 'मैथिली', 'regional' => 'mai_IN'],
+ //'raj' => ['name' => 'Rajasthani', 'script' => 'Deva', 'native' => 'राजस्थानी', 'regional' => ''],
+ //'sa' => ['name' => 'Sanskrit', 'script' => 'Deva', 'native' => 'संस्कृतम्', 'regional' => 'sa_IN'],
+ //'hi' => ['name' => 'Hindi', 'script' => 'Deva', 'native' => 'हिन्दी', 'regional' => 'hi_IN'],
+ //'as' => ['name' => 'Assamese', 'script' => 'Beng', 'native' => 'অসমীয়া', 'regional' => 'as_IN'],
+ //'bn' => ['name' => 'Bengali', 'script' => 'Beng', 'native' => 'বাংলা', 'regional' => 'bn_BD'],
+ //'mni' => ['name' => 'Manipuri', 'script' => 'Beng', 'native' => 'মৈতৈ', 'regional' => 'mni_IN'],
+ //'pa' => ['name' => 'Punjabi (Gurmukhi)', 'script' => 'Guru', 'native' => 'ਪੰਜਾਬੀ', 'regional' => 'pa_IN'],
+ //'gu' => ['name' => 'Gujarati', 'script' => 'Gujr', 'native' => 'ગુજરાતી', 'regional' => 'gu_IN'],
+ //'or' => ['name' => 'Oriya', 'script' => 'Orya', 'native' => 'ଓଡ଼ିଆ', 'regional' => 'or_IN'],
+ //'ta' => ['name' => 'Tamil', 'script' => 'Taml', 'native' => 'தமிழ்', 'regional' => 'ta_IN'],
+ //'te' => ['name' => 'Telugu', 'script' => 'Telu', 'native' => 'తెలుగు', 'regional' => 'te_IN'],
+ //'kn' => ['name' => 'Kannada', 'script' => 'Knda', 'native' => 'ಕನ್ನಡ', 'regional' => 'kn_IN'],
+ //'ml' => ['name' => 'Malayalam', 'script' => 'Mlym', 'native' => 'മലയാളം', 'regional' => 'ml_IN'],
+ //'si' => ['name' => 'Sinhala', 'script' => 'Sinh', 'native' => 'සිංහල', 'regional' => 'si_LK'],
+ //'th' => ['name' => 'Thai', 'script' => 'Thai', 'native' => 'ไทย', 'regional' => 'th_TH'],
+ //'lo' => ['name' => 'Lao', 'script' => 'Laoo', 'native' => 'ລາວ', 'regional' => 'lo_LA'],
+ //'bo' => ['name' => 'Tibetan', 'script' => 'Tibt', 'native' => 'པོད་སྐད་', 'regional' => 'bo_IN'],
+ //'dz' => ['name' => 'Dzongkha', 'script' => 'Tibt', 'native' => 'རྫོང་ཁ', 'regional' => 'dz_BT'],
+ //'my' => ['name' => 'Burmese', 'script' => 'Mymr', 'native' => 'မြန်မာဘာသာ', 'regional' => 'my_MM'],
+ //'ka' => ['name' => 'Georgian', 'script' => 'Geor', 'native' => 'ქართული', 'regional' => 'ka_GE'],
+ //'byn' => ['name' => 'Blin', 'script' => 'Ethi', 'native' => 'ብሊን', 'regional' => 'byn_ER'],
+ //'tig' => ['name' => 'Tigre', 'script' => 'Ethi', 'native' => 'ትግረ', 'regional' => 'tig_ER'],
+ //'ti' => ['name' => 'Tigrinya', 'script' => 'Ethi', 'native' => 'ትግርኛ', 'regional' => 'ti_ET'],
+ //'am' => ['name' => 'Amharic', 'script' => 'Ethi', 'native' => 'አማርኛ', 'regional' => 'am_ET'],
+ //'wal' => ['name' => 'Wolaytta', 'script' => 'Ethi', 'native' => 'ወላይታቱ', 'regional' => 'wal_ET'],
+ //'chr' => ['name' => 'Cherokee', 'script' => 'Cher', 'native' => 'ᏣᎳᎩ', 'regional' => ''],
+ //'iu' => ['name' => 'Inuktitut (Canadian Aboriginal Syllabics)', 'script' => 'Cans', 'native' => 'ᐃᓄᒃᑎᑐᑦ', 'regional' => 'iu_CA'],
+ //'oj' => ['name' => 'Ojibwa', 'script' => 'Cans', 'native' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', 'regional' => ''],
+ //'cr' => ['name' => 'Cree', 'script' => 'Cans', 'native' => 'ᓀᐦᐃᔭᐍᐏᐣ', 'regional' => ''],
+ //'km' => ['name' => 'Khmer', 'script' => 'Khmr', 'native' => 'ភាសាខ្មែរ', 'regional' => 'km_KH'],
+ //'mn-Mong' => ['name' => 'Mongolian (Mongolian)', 'script' => 'Mong', 'native' => 'ᠮᠣᠨᠭᠭᠣᠯ ᠬᠡᠯᠡ', 'regional' => 'mn_MN'],
+ //'shi-Tfng' => ['name' => 'Tachelhit (Tifinagh)', 'script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''],
+ //'tzm' => ['name' => 'Central Atlas Tamazight (Tifinagh)','script' => 'Tfng', 'native' => 'ⵜⴰⵎⴰⵣⵉⵖⵜ', 'regional' => ''],
+ //'yue' => ['name' => 'Yue', 'script' => 'Hant', 'native' => '廣州話', 'regional' => 'yue_HK'],
+ //'ja' => ['name' => 'Japanese', 'script' => 'Jpan', 'native' => '日本語', 'regional' => 'ja_JP'],
+ //'zh' => ['name' => 'Chinese (Simplified)', 'script' => 'Hans', 'native' => '简体中文', 'regional' => 'zh_CN'],
+ //'zh-Hant' => ['name' => 'Chinese (Traditional)', 'script' => 'Hant', 'native' => '繁體中文', 'regional' => 'zh_CN'],
+ //'ii' => ['name' => 'Sichuan Yi', 'script' => 'Yiii', 'native' => 'ꆈꌠꉙ', 'regional' => ''],
+ //'vai' => ['name' => 'Vai (Vai)', 'script' => 'Vaii', 'native' => 'ꕙꔤ', 'regional' => ''],
+ //'jv-Java' => ['name' => 'Javanese (Javanese)', 'script' => 'Java', 'native' => 'ꦧꦱꦗꦮ', 'regional' => ''],
+ //'ko' => ['name' => 'Korean', 'script' => 'Hang', 'native' => '한국어', 'regional' => 'ko_KR'],
+ ],
+
+ // Requires middleware `LaravelSessionRedirect.php`.
+ //
+ // Automatically determine locale from browser (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language)
+ // on first call if it's not defined in the URL. Redirect user to computed localized url.
+ // For example, if users browser language is `de`, and `de` is active in the array `supportedLocales`,
+ // the `/about` would be redirected to `/de/about`.
+ //
+ // The locale will be stored in session and only be computed from browser
+ // again if the session expires.
+ //
+ // If false, system will take app.php locale attribute
+ 'useAcceptLanguageHeader' => true,
+
+ // If `hideDefaultLocaleInURL` is true, then a url without locale
+ // is identical with the same url with default locale.
+ // For example, if `en` is default locale, then `/en/about` and `/about`
+ // would be identical.
+ //
+ // If in addition the middleware `LaravelLocalizationRedirectFilter` is active, then
+ // every url with default locale is redirected to url without locale.
+ // For example, `/en/about` would be redirected to `/about`.
+ // It is recommended to use `hideDefaultLocaleInURL` only in
+ // combination with the middleware `LaravelLocalizationRedirectFilter`
+ // to avoid duplicate content (SEO).
+ //
+ // If `useAcceptLanguageHeader` is true, then the first time
+ // the locale will be determined from browser and redirect to that language.
+ // After that, `hideDefaultLocaleInURL` behaves as usual.
+ 'hideDefaultLocaleInURL' => true,
+
+ // If you want to display the locales in particular order in the language selector you should write the order here.
+ //CAUTION: Please consider using the appropriate locale code otherwise it will not work
+ //Example: 'localesOrder' => ['es','en'],
+ 'localesOrder' => [],
+
+ // If you want to use custom lang url segments like 'at' instead of 'de-AT', you can use the mapping to tallow the LanguageNegotiator to assign the descired locales based on HTTP Accept Language Header. For example you want ot use 'at', so map HTTP Accept Language Header 'de-AT' to 'at' (['de-AT' => 'at']).
+ 'localesMapping' => [],
+
+ // Locale suffix for LC_TIME and LC_MONETARY
+ // Defaults to most common ".UTF-8". Set to blank on Windows systems, change to ".utf8" on CentOS and similar.
+ 'utf8suffix' => env('LARAVELLOCALIZATION_UTF8SUFFIX', '.UTF-8'),
+
+ // URLs which should not be processed, e.g. '/nova', '/nova/*', '/nova-api/*' or specific application URLs
+ // Defaults to []
+ 'urlsIgnored' => ['/skipped'],
+
+];
diff --git a/config/ldap.php b/config/ldap.php
new file mode 100644
index 0000000..d4b141f
--- /dev/null
+++ b/config/ldap.php
@@ -0,0 +1,114 @@
+ env('LDAP_CONNECTION', 'default'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | LDAP Connections
+ |--------------------------------------------------------------------------
+ |
+ | Below you may configure each LDAP connection your application requires
+ | access to. Be sure to include a valid base DN - otherwise you may
+ | not receive any results when performing LDAP search operations.
+ |
+ */
+
+ 'connections' => [
+
+ 'default' => [
+ 'hosts' => [env('LDAP_HOST', '127.0.0.1')],
+ 'username' => env('LDAP_USERNAME', 'cn=user,dc=local,dc=com'),
+ 'password' => env('LDAP_PASSWORD', 'secret'),
+ 'port' => env('LDAP_PORT', 389),
+ 'base_dn' => env('LDAP_BASE_DN', 'dc=local,dc=com'),
+ 'timeout' => env('LDAP_TIMEOUT', 5),
+ 'use_ssl' => env('LDAP_SSL', false),
+ 'use_tls' => env('LDAP_TLS', false),
+ 'name' => env('LDAP_NAME','LDAP Server'),
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | LDAP Logging
+ |--------------------------------------------------------------------------
+ |
+ | When LDAP logging is enabled, all LDAP search and authentication
+ | operations are logged using the default application logging
+ | driver. This can assist in debugging issues and more.
+ |
+ */
+
+ 'logging' => env('LDAP_LOGGING', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | LDAP Cache
+ |--------------------------------------------------------------------------
+ |
+ | LDAP caching enables the ability of caching search results using the
+ | query builder. This is great for running expensive operations that
+ | may take many seconds to complete, such as a pagination request.
+ |
+ */
+
+ 'cache' => [
+ 'enabled' => env('LDAP_CACHE', false),
+ 'driver' => env('CACHE_DRIVER', 'file'),
+ 'time' => env('LDAP_CACHE_TIME',5*60), // Seconds
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Support for attrs display order
+ |--------------------------------------------------------------------------
+ |
+ | Use this array if you want to have your attributes displayed in a specific
+ | order. Case is not important.
+ |
+ | For example, "sn" will be displayed right after "givenName". All the other
+ | attributes that are not specified in this array will be displayed after in
+ | alphabetical order.
+ |
+ */
+
+ 'attr_display_order' => [],
+ /*
+ 'attr_display_order' => [
+ 'givenName',
+ 'sn',
+ 'cn',
+ 'displayName',
+ 'uid',
+ 'uidNumber',
+ 'gidNumber',
+ 'homeDirectory',
+ 'mail',
+ 'userPassword'
+ ],
+ */
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Date Format
+ |--------------------------------------------------------------------------
+ |
+ | Configuration to determine how date fields will be displayed.
+ |
+ */
+ 'datetime_format' => 'Y-m-d H:i:s',
+];
diff --git a/config/ldap_supported_oids.txt b/config/ldap_supported_oids.txt
new file mode 100644
index 0000000..d50d433
--- /dev/null
+++ b/config/ldap_supported_oids.txt
@@ -0,0 +1,190 @@
+# If you find some reliable and more meaningful descriptions to these OIDS,
+# then please let the phpldapadmin development know so that this file can be
+# more descriptive.
+
+# Format
+# OID:Title:RFC Ref:Detail
+1.2.826.0.1.334810.2.3:LDAP_CONTROL_VALUESRETURNFILTER
+1.2.826.0.1.3344810.2.3:Matched Values Control:RFC 3876:Describes a control for the LDAP v3 that is used to return a subset of attribute values from an entry. Specifically, only those values that match a 'values return' filter. Without support for this control, a client must retrieve all of an attribute's values and search for specific values locally.
+1.2.826.0.1050.11.1.1:Read-Only LDAP Server
+1.2.826.0.1050.11.2.1:Read-Write LDAP Server
+1.2.826.0.1050.11.3.1:White Pages Application LDAP Server
+1.2.826.0.1050.11.4.1:Certificate Application LDAP Server
+1.2.826.0.1050.11.5.1:Single Sign On Application LDAP Server
+1.2.840.113549.6.0.0:Signed Operation
+1.2.840.113549.6.0.1:Demand Signed Result
+1.2.840.113549.6.0.2:Signed Result RFC 2649
+1.2.840.113556.1.4.319:Simple Paged Results Manipulation Control Extension:RFC 2696:This control extension allows a client to control the rate at which an LDAP server returns the results of an LDAP search operation. This control may be useful when the LDAP client has limited resources and may not be able to process the entire result set from a given LDAP query, or when the LDAP client is connected over a low-bandwidth connection.
+1.2.840.113556.1.4.417:Show deleted control::The LDAP_SERVER_SHOW_DELETED_OID control is used with an extended LDAP search function to specify that the search results include any deleted objects that match the search filter.
+1.2.840.113556.1.4.473:LDAP Server Sort Result extension:draft-ietf-ldapext-sorting-01:This control is included in the searchRequest message as part of the controls field of the LDAPMessage.
+1.2.840.113556.1.4.474:LDAP Server Sort Result extension response control::This control is included in the searchResultDone message as part of the controls field of the LDAPMessage
+1.2.840.113556.1.4.521:Cross-domain move control::The LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID control is used with an extended LDAP rename function to move an LDAP object from one domain to another. The control specifies the DNS hostname of the domain controller in the destination domain.
+1.2.840.113556.1.4.528:Server search notification control::The LDAP_SERVER_NOTIFICATION_OID control is used with an extended LDAP asynchronous search function to register the client to be notified when changes are made to an object in Active Directory.
+1.2.840.113556.1.4.529:Extended DN control::The LDAP_SERVER_EXTENDED_DN_OID control is used with an extended LDAP search function to request an extended form of an Active Directory object distinguished name. The extended form includes a string representation of the object objectGUID property. For security principal objects such as users, groups, and computers, the extended form also includes a string representation of the object objectSID property.
+1.2.840.113556.1.4.616:LDAP_CONTROL_REFERRALS
+1.2.840.113556.1.4.619:Lazy commit control::The LDAP_SERVER_LAZY_COMMIT_OID control is used to instruct the server to return the results of a DS modification command, such as add, delete, or replace, after it has been completed in memory, but before it has been committed to disk. The server can then return results quickly, and save the data to disk without holding the client.
+1.2.840.113556.1.4.800:LDAP_CAP_ACTIVE_DIRECTORY_OID::This is an Actrive Directory Server (Win2k and later).
+1.2.840.113556.1.4.801:Security descriptor flags control::The LDAP_SERVER_SD_FLAGS_OID control is used to pass flags to the server to control various security descriptor results.
+1.2.840.113556.1.4.802:Attribute Range Option::Server supports the Range property enabling clients to incremental retrieve values from multivalue attributes.
+1.2.840.113556.1.4.803:LDAP_MATCHING_RULE_BIT_AND
+1.2.840.113556.1.4.804:LDAP_MATCHING_RULE_BIT_OR
+1.2.840.113556.1.4.805:Tree Delete::The LDAP_SERVER_TREE_DELETE_OID control is used with an extended LDAP delete function to delete an entire subtree in the directory.
+1.2.840.113556.1.4.841:Directory synchronization control::The LDAP_SERVER_DIRSYNC_OID control enables an application to search the directory for objects changed from a previous state. It is also used with the extended LDAP search functions such as ldap_search_ext.
+1.2.840.113556.1.4.906:Microsoft Large Integer
+1.2.840.113556.1.4.970:Get stats control (Stateless)
+1.2.840.113556.1.4.1302:Microsoft OID used with DEN Attributes
+1.2.840.113556.1.4.1338:Verify name control::The LDAP_SERVER_VERIFY_NAME_OID control is used with extended LDAP add and modify requests to instruct the DC accepting the update which DC it should verify with, the existence of any DN attribute values.
+1.2.840.113556.1.4.1339:LDAP_SERVER_DOMAIN_SCOPE_OID::The LDAP_SERVER_DOMAIN_SCOPE_OID control is used to instruct the LDAP server not to generate any referrals when completing a request. This control also limits any search using it to a single naming context.
+1.2.840.113556.1.4.1340:Search options control:: The LDAP_SERVER_SEARCH_OPTIONS_OID control is used to pass flags to the server to control various search behaviors.
+1.2.840.113556.1.4.1413:LDAP ease modify restrictions::Allows an LDAP modify to work under less restrictive conditions. Without it, a delete will fail if an attribute does not exist, and an add will fail if an attribute already exists.
+1.2.840.113556.1.4.1504:Attribute scoped query control::The LDAP_SERVER_ASQ_OID control is used with an extended LDAP search function to force the query to be based on a specific DN-valued attribute. Only one source attribute can be specified with this control and the search request is limited to base object scoped queries.
+1.2.840.113556.1.4.1670:LDAP_CAP_ACTIVE_DIRECTORY_V51_OID::This server is a Whistler Active Directory server (Win2k3 and later).
+1.2.840.113556.1.4.1781:Fast concurrent bind extended operation::The Microsoft LDAP API will send an extended request with this name to Active Directory to request that all binds on this connection be processed as 'fast' binds.
+1.2.840.113556.1.4.1791:LDAP_CAP_ACTIVE_DIRECTORY_LDAP_INTEG_OID::LDAP server is capable of doing signing and sealing on an NTLM authenticated connection, and that the server is capable of performing subsequent binds on a signed or sealed connection.
+1.2.840.113556.1.4.1852:LDAP_SERVER_QUOTA_CONTROL_OID::The LDAP_SERVER_QUOTA_CONTROL_OID control is used to pass the SID of a security principal, whose quota is being queried, to the server in a LDAP search operation.
+1.3.6.1.1.7.1:LCUP Sync Request Control. RFC 3928 control
+1.3.6.1.1.7.2:LCUP Sync Update Control. RFC 3928 control
+1.3.6.1.1.7.3:LCUP Sync Done Control. RFC 3928 control
+1.3.6.1.1.8:Cancel Operation. RFC 3909 extension
+1.3.6.1.1.12:Assertion Control:RFC 4511:The assertion control allows the client to specify a condition that must be true for the operation to be processed normally.
+1.3.6.1.1.13.1:Pre-Read Controls::The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned.
+1.3.6.1.1.13.2:Post-Read Controls::The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned.
+1.3.6.1.1.14:Modify-Increment Extension:RFC 4525:An extension to the Lightweight Directory Access Protocol (LDAP) Modify operation to support an increment capability.
+1.3.6.1.1.22:Dont Use Copy Control:RFC 6171:When the control is attached to an LDAP request, the requested operation MUST NOT be performed on copied information. That is, the requested operation MUST be performed on original information.
+1.3.6.1.4.1.42.2.27.8.5.1:passwordPolicyRequest
+1.3.6.1.4.1.42.2.27.9.5.2:GetEffectiveRights control::May be used to determine what operations a given user may perform on a specified entry.
+1.3.6.1.4.1.1466.101.119.1:Dynamic Directory Services Refresh Request:RFC 2589
+1.3.6.1.4.1.1466.20036:LDAP_NOTICE_OF_DISCONNECTION
+1.3.6.1.4.1.1466.20037:Transport Layer Security Extension:RFC 2830:This operation provides for TLS establishment in an LDAP association and is defined in terms of an LDAP extended request.
+1.3.6.1.4.1.1466.29539.1:LDAP_CONTROL_ATTR_SIZELIMIT
+1.3.6.1.4.1.1466.29539.2:LDAP_CONTROL_NO_COPY
+1.3.6.1.4.1.1466.29539.3:LDAP_CONTROL_PARTIAL_COPY
+1.3.6.1.4.1.1466.29539.5:LDAP_CONTROL_NO_CHAINING
+1.3.6.1.4.1.1466.29539.7:LDAP_CONTROL_ALIAS_ON_UPDATE
+1.3.6.1.4.1.1466.29539.10:LDAP_CONTROL_TRIGGER
+1.3.6.1.4.1.1466.29539.12:nsTransmittedControl
+1.3.6.1.4.1.4203.1.5.1:All Operational Attribute:RFC 3673:An LDAP extension which clients may use to request the return of all operational attributes.
+1.3.6.1.4.1.4203.1.5.2:Requesting Attributes by Object Class:draft-zeilenga-ldap-adlist-10.txt:Extends LDAP to support a mechanism that LDAP clients may use to request the return of all attributes of an object class.
+1.3.6.1.4.1.4203.1.5.3:LDAP Absolute True and False Filters:draft-zeilenga-ldap-t-f-10.txt:Implementations of this extension SHALL allow 'and' and 'or' choices with zero filter elements.
+1.3.6.1.4.1.4203.1.5.4:Language Tags:RFC 3866:Supports storing attributes with language tag options in the DIT
+1.3.6.1.4.1.4203.1.5.5:Language Ranges:RFC 3866:Supports language range matching of attributes with language tag options stored in the DIT
+1.3.6.1.4.1.4203.1.9.1.1:LDAP Content Synchronization Control:draft=zeilenga-ldup-sync-06.txt:The operation allows a client to maintain a copy of a fragment of directory information tree. It supports both polling for changes and listening for changes. The operation is defined as an extension of the LDAP Search Operation.
+1.3.6.1.4.1.4203.1.10.1:Subentries in LDAP:RFC 3672:The subentries control MAY be sent with a searchRequest to control the visibility of entries and subentries which are within scope. Non-visible entries or subentries are not returned in response to the request.
+1.3.6.1.4.1.4203.1.10.2:LDAP No-Op Control:draft-zeilenga-ldap-noop-02.txt:The No-Op control can be used to disable the normal effect of an operation. The control can be used to discover how a server might react to a particular update request without updating the directory.
+1.3.6.1.4.1.4203.1.11.1:LDAP Password Modify Extended Operation:RFC 3062:An LDAP extended operation to allow modification of user passwords which is not dependent upon the form of the authentication identity nor the password storage mechanism used.
+1.3.6.1.4.1.4203.1.11.2:LDAP Cancel Extended Operation
+1.3.6.1.4.1.4203.1.11.3:Who Am I? Extended Operation:draft-zeilenga-ldap-authzid-10.txt:This specification provides a mechanism for Lightweight Directory Access Protocol (LDAP) clients to obtain the authorization identity which the server has associated with the user or application entity.
+1.3.6.1.4.1.4203.666.5.1:Subentries Control
+1.3.6.1.4.1.4203.666.5.2:NO OP Control
+1.3.18.0.2.12.1:The ACL credential controls provide a method to flow a subject's credentials associated with a bind.
+1.3.18.0.2.12.5:tranExtOpInit
+1.3.18.0.2.12.6:tranExtOpInit
+2.16.840.1.113531.18.2.1:LDAP_C_SETOPTIONS_OID
+2.16.840.1.113531.18.2.2:LDAP_C_SETDONTUSECOPY_OID
+2.16.840.1.113531.18.2.3:LDAP_C_SETLOCALSCOPE_OID
+2.16.840.1.113531.18.2.4:Return operational attributes as well as user attributes
+2.16.840.1.113531.18.2.5:Return only subentries
+2.16.840.1.113531.18.2.6:LDAP_C_SETUSEALIAS_OID
+2.16.840.1.113531.18.2.7:LDAP_C_SETPREFERCHAIN_OID
+2.16.840.1.113531.18.2.8:LDAP_C_SETX500DN_OID
+2.16.840.1.113531.18.2.9:LDAP_C_SETCOPYSHALLDO_OID
+2.16.840.1.113531.18.2.10:LDAP_C_SETDONTMAPATTRS_OID
+2.16.840.1.113531.18.2.11:Return normal entries as well as sub-entries
+2.16.840.1.113719.1.27.99.1:Superior References
+2.16.840.1.113719.1.27.100.1:ndsToLdapResponse
+2.16.840.1.113719.1.27.100.2:ndsToLdapRequest
+2.16.840.1.113719.1.27.100.3:createNamingContextRequest
+2.16.840.1.113719.1.27.100.4:createNamingContextResponse
+2.16.840.1.113719.1.27.100.5:mergeNamingContextRequest
+2.16.840.1.113719.1.27.100.6:mergeNamingContextResponse
+2.16.840.1.113719.1.27.100.7:addReplicaRequest
+2.16.840.1.113719.1.27.100.8:addReplicaResponse
+2.16.840.1.113719.1.27.100.9:refreshLDAPServerRequest
+2.16.840.1.113719.1.27.100.10:refreshLDAPServerResponse
+2.16.840.1.113719.1.27.100.11:removeReplicaRequest
+2.16.840.1.113719.1.27.100.12:removeReplicaResponse
+2.16.840.1.113719.1.27.100.13:namingContextEntryCountRequest
+2.16.840.1.113719.1.27.100.14:namingContextEntryCountResponse
+2.16.840.1.113719.1.27.100.15:changeReplicaTypeRequest
+2.16.840.1.113719.1.27.100.16:changeReplicaTypeResponse
+2.16.840.1.113719.1.27.100.17:getReplicaInfoRequest
+2.16.840.1.113719.1.27.100.18:getReplicaInfoResponse
+2.16.840.1.113719.1.27.100.19:listReplicaRequest
+2.16.840.1.113719.1.27.100.20:listReplicaResponse
+2.16.840.1.113719.1.27.100.21:receiveAllUpdatesRequest
+2.16.840.1.113719.1.27.100.22:receiveAllUpdatesResponse
+2.16.840.1.113719.1.27.100.23:sendAllUpdatesRequest
+2.16.840.1.113719.1.27.100.24:sendAllUpdatesResponse
+2.16.840.1.113719.1.27.100.25:requestNamingContextSyncRequest
+2.16.840.1.113719.1.27.100.26:requestNamingContextSyncResponse
+2.16.840.1.113719.1.27.100.27:requestSchemaSyncRequest
+2.16.840.1.113719.1.27.100.28:requestSchemaSyncResponse
+2.16.840.1.113719.1.27.100.29:abortNamingContextOperationRequest
+2.16.840.1.113719.1.27.100.30:abortNamingContextOperationResponse
+2.16.840.1.113719.1.27.100.31:Get Bind DN Request
+2.16.840.1.113719.1.27.100.32:Get Bind DN Response
+2.16.840.1.113719.1.27.100.33:Get Effective Privileges Request
+2.16.840.1.113719.1.27.100.34:Get Effective Privileges Response
+2.16.840.1.113719.1.27.100.35:Set Replication Filter Request
+2.16.840.1.113719.1.27.100.36:Set Replication Filter Response
+2.16.840.1.113719.1.27.100.37:Get Replication Filter Request
+2.16.840.1.113719.1.27.100.38:Get Replication Filter Response
+2.16.840.1.113719.1.27.100.39:Create Orphan Partition Request
+2.16.840.1.113719.1.27.100.40:Create Orphan Partition Response
+2.16.840.1.113719.1.27.100.41:Remove Orphan Partition Request
+2.16.840.1.113719.1.27.100.42:Remove Orphan Partition Response
+2.16.840.1.113719.1.27.100.43:Trigger Backlinker Request
+2.16.840.1.113719.1.27.100.44:Trigger Backlinker Response
+2.16.840.1.113719.1.27.100.47:Trigger Janitor Request
+2.16.840.1.113719.1.27.100.48:Trigger Janitor Response
+2.16.840.1.113719.1.27.100.49:Trigger Limber Request
+2.16.840.1.113719.1.27.100.50:Trigger Limber Response
+2.16.840.1.113719.1.27.100.51:Trigger Skulker Request
+2.16.840.1.113719.1.27.100.52:Trigger Skulker Response
+2.16.840.1.113719.1.27.100.53:Trigger Schema Synch Request
+2.16.840.1.113719.1.27.100.54:Trigger Schema Synch Response
+2.16.840.1.113719.1.27.100.55:Trigger Partition Purge Request
+2.16.840.1.113719.1.27.100.56:Trigger Partition Purge Response
+2.16.840.1.113719.1.27.100.79:Monitor Events Request
+2.16.840.1.113719.1.27.100.80:Monitor Events Response
+2.16.840.1.113719.1.27.100.81:Event Notification
+2.16.840.1.113719.1.27.101.1:Duplicate Entry Request
+2.16.840.1.113719.1.27.101.2:DuplicateSearchResult
+2.16.840.1.113719.1.27.101.3:DuplicateEntryResponseDone
+2.16.840.1.113719.1.27.101.5:Simple Password
+2.16.840.1.113719.1.27.101.6:Forward Reference
+2.16.840.1.113719.1.142.100.1:startFramedProtocolRequest
+2.16.840.1.113719.1.142.100.2:startFramedProtocolResponse
+2.16.840.1.113719.1.142.100.3:ReplicationUpdate
+2.16.840.1.113719.1.142.100.4:endFramedProtocolRequest
+2.16.840.1.113719.1.142.100.5:endFramedProtocolResponse
+2.16.840.1.113719.1.142.100.6:lburpOperationRequest
+2.16.840.1.113719.1.142.100.7:lburpOperationResponse
+2.16.840.1.113730.3.4:Netscape LDAPv3 controls
+2.16.840.1.113730.3.4.2:ManageDsaIT Control:RFC 3296:The client may provide the ManageDsaIT control with an operation to indicate that the operation is intended to manage objects within the DSA (server) Information Tree. The control causes Directory-specific entries (DSEs), regardless of type, to be treated as normal entries allowing clients to interrogate and update these entries using LDAP operations.
+2.16.840.1.113730.3.4.3:Persistent Search LDAPv3 control
+2.16.840.1.113730.3.4.4:Netscape Password Expired LDAPv3 control
+2.16.840.1.113730.3.4.5:Netscape Password Expiring LDAPv3 control
+2.16.840.1.113730.3.4.6:Netscape NT Synchronization Client LDAPv3 control
+2.16.840.1.113730.3.4.7:Entry Change Notification LDAPv3 control
+2.16.840.1.113730.3.4.8:Transaction ID Request Control
+2.16.840.1.113730.3.4.9:VLV Request LDAPv3 control::As defined in the 'LDAPv3 Extensions for Virtual List View' IETF document.
+2.16.840.1.113730.3.4.10:VLV Response LDAPv3 control::As defined in the 'LDAPv3 Extensions for Virtual List View' IETF document.
+2.16.840.1.113730.3.4.11:Transaction ID Response Control
+2.16.840.1.113730.3.4.12:Proxied Authorization (version 1) control:draft-weltman-ldapv3-proxy-05:For assuming the identity of another entry for the duration of a request. This has been replaced by a new 'version 2' Proxied Authorization control.
+2.16.840.1.113730.3.4.13:iPlanet Directory Server Replication Update Information Control
+2.16.840.1.113730.3.4.14:iPlanet Directory Server 'search on specific backend' control
+2.16.840.1.113730.3.4.15:Authentication Response Control
+2.16.840.1.113730.3.4.16:Authentication Request Control
+2.16.840.1.113730.3.4.17:Real Attributes Only Request Control
+2.16.840.1.113730.3.4.18:LDAP Proxied Authorization Control:draft-weltman-ldapv3-proxy-06.txt:The Proxied Authorization Control allows a client to request that an operation be processed under a provided authorization identity [AUTH] instead of as the current authorization identity associated with the connection.
+2.16.840.1.113730.3.4.19:Virtual Attributes Only Request Control
+2.16.840.1.113730.3.4.20:Use One Backend
+2.16.840.1.113730.3.4.999:iPlanet Replication Modrdn Extra Mods Control
+2.16.840.1.113730.3.5.3:iPlanet Start Replication Request Extended Operation
+2.16.840.1.113730.3.5.4:iPlanet Replication Response Extended Operation
+2.16.840.1.113730.3.5.5:iPlanet End Replication Request Extended Operation
+2.16.840.1.113730.3.5.6:iPlanet Replication Entry Request Extended Operation
+2.16.840.1.113730.3.5.7:iPlanet Bulk Import Start Extended Operation
+2.16.840.1.113730.3.5.8:iPlanet Bulk Import Finished Extended Operation
+2.16.840.1.113730.3.5.9:iPlanet Digest authentication calculation
diff --git a/config/ldap_supported_saslmechanisms.txt b/config/ldap_supported_saslmechanisms.txt
new file mode 100644
index 0000000..49ae335
--- /dev/null
+++ b/config/ldap_supported_saslmechanisms.txt
@@ -0,0 +1,16 @@
+# If you find some reliable and more meaningful descriptions to these SASL Mechanisms,
+# then please let the phpldapadmin development know so that this file can be
+# more descriptive.
+
+# Format
+# Mechanisms:Title:RFC Ref:Detail
+SCRAM-SHA-1:Salted Challenge Response Authentication Mechanism (SCRAM) SHA1:RFC 5802:This specification describes a family of authentication mechanisms called the Salted Challenge Response Authentication Mechanism (SCRAM) which addresses the requirements necessary to deploy a challenge- response mechanism more widely than past attempts.
+SCRAM-SHA-256:Salted Challenge Response Authentication Mechanism (SCRAM) SHA256:RFC 7677:The SCRAM-SHA-256 and SCRAM-SHA-256-PLUS SASL mechanisms are defined in the same way that SCRAM-SHA-1 and SCRAM-SHA-1-PLUS are defined in [RFC5802], except that the hash function for HMAC() and H() uses SHA-256 instead of SHA-1 [RFC6234].
+GS2-IAKERB:Initial and Pass Through Authentication Using Kerberos V5 and the GSS-API:draft-ietf-krb-wg-iakerb-02:Extends [RFC4120] and [RFC4121] such that the client can communicate with the KDC using a Generic Security Service Application Program Interface (GSS-API) [RFC2743] acceptor as the proxy.
+GS2-KRB5:Family of mechanisms supports arbitrary GSS-API mechanisms in SASL::GS2 is a protocol bridge between GSS-API and SASL, and allows every GSS-API mechanism that supports mutual authentication and channel bindings to be used as a SASL mechanism. This implements Kerberos V5 authentication.
+GSSAPI:Generic Security Services Application Program Interface:RFC 2744:The Generic Security Service Application Program Interface (GSSAPI, also GSS-API) is an application programming interface for programs to access security services.
+GSS-SPNEGO:GSS-SPNEGO security mechanism for LDAP bind requests:RFC 4178:The DC accepts the GSS-SPNEGO security mechanism for LDAP bind requests. This mechanism is documented in [RFC4178]. Active Directory supports Kerberos (see [MS-KILE]) and NTLM (see [MS-NLMP]) when using GSS-SPNEGO.
+DIGEST-MD5:HTTP Digest compatible (partially) challenge-response scheme based upon MD5, offering a data security layer:RFC 2831:In Digest-MD5, the LDAP server sends data that includes various authentication options that it is willing to support plus a special token to the LDAP client. The client responds by sending an encrypted response that indicates the authentication options that it has selected. The response is encrypted in such a way that proves that the client knows its password. The LDAP server then decrypts and verifies the client's response.
+OTP:One-Time Password Mechanism:RFC 2444:
+CRAM-MD5:Simple challenge-response scheme based on HMAC-MD5:RFC 2195:When using the CRAM-MD5 mechanism, the LDAP server sends some data to the LDAP client. The client responds by encrypting the data with its password by using the MD5 algorithm. The LDAP server then uses the client's stored password to determine whether the client used the right password.
+NTLM:MS Windows NT LAN Manager authentication mechanism:MS Proprietary:
diff --git a/config/logging.php b/config/logging.php
new file mode 100644
index 0000000..432df90
--- /dev/null
+++ b/config/logging.php
@@ -0,0 +1,122 @@
+ env('LOG_CHANNEL', 'stack'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Deprecations Log Channel
+ |--------------------------------------------------------------------------
+ |
+ | This option controls the log channel that should be used to log warnings
+ | regarding deprecated PHP and library features. This allows you to get
+ | your application ready for upcoming major versions of dependencies.
+ |
+ */
+
+ 'deprecations' => [
+ 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
+ 'trace' => false,
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => ['daily'],
+ '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' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
+ 'handler_with' => [
+ 'host' => env('PAPERTRAIL_URL'),
+ 'port' => env('PAPERTRAIL_PORT'),
+ 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.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 0000000..54299aa
--- /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/pla.php b/config/pla.php
new file mode 100644
index 0000000..82b9d6e
--- /dev/null
+++ b/config/pla.php
@@ -0,0 +1,16 @@
+ ['uidNumber','gidNumber','sambaSID'],
+ */
+ 'force_may' => [],
+];
\ No newline at end of file
diff --git a/config/queue.php b/config/queue.php
new file mode 100644
index 0000000..00b76d6
--- /dev/null
+++ b/config/queue.php
@@ -0,0 +1,89 @@
+ 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,
+ ],
+
+ 'beanstalkd' => [
+ 'driver' => 'beanstalkd',
+ 'host' => 'localhost',
+ 'queue' => 'default',
+ 'retry_after' => 90,
+ 'block_for' => 0,
+ ],
+
+ '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', 'your-queue-name'),
+ 'suffix' => env('SQS_SUFFIX'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => 'default',
+ 'queue' => env('REDIS_QUEUE', 'default'),
+ 'retry_after' => 90,
+ 'block_for' => null,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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'),
+ 'database' => env('DB_CONNECTION', 'mysql'),
+ 'table' => 'failed_jobs',
+ ],
+
+];
diff --git a/config/services.php b/config/services.php
new file mode 100644
index 0000000..2a1d616
--- /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 0000000..4e0f66c
--- /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 if it can not 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 0000000..22b8a18
--- /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 0000000..97fc976
--- /dev/null
+++ b/database/.gitignore
@@ -0,0 +1,2 @@
+*.sqlite
+*.sqlite-journal
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
new file mode 100644
index 0000000..956d70f
--- /dev/null
+++ b/database/factories/UserFactory.php
@@ -0,0 +1,30 @@
+define(User::class, function (Faker $faker) {
+ return [
+ 'name' => $faker->name,
+ 'email' => $faker->unique()->safeEmail,
+ 'email_verified_at' => now(),
+ 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
+ 'remember_token' => Str::random(10),
+ ];
+});
+*/
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
new file mode 100644
index 0000000..237dfc5
--- /dev/null
+++ b/database/seeds/DatabaseSeeder.php
@@ -0,0 +1,16 @@
+call(UserSeeder::class);
+ }
+}
diff --git a/doc/demo-reset.sh b/doc/demo-reset.sh
deleted file mode 100755
index a23ad5b..0000000
--- a/doc/demo-reset.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do
- if [ -d $i ]; then
- rm -f $i/*.dbb $i/*.bdb $i/__db.??? $i/alock $i/log.*
- else
- mkdir $i
- fi
-done
-
-slapadd -b "dc=example.com" -l ldif-example.com
-slapadd -b "dc=example,dc=com" -l ldif-example-com
-slapadd -b "o=Simpsons" -l ldif-Simpsons
-slapadd -b "o=Flintstones" -l ldif-Flintstones
-
-for i in $(grep directory phpldapadmin-demo.conf|awk '{print $2}'); do
- chown -R ldap:ldap $i
-done
diff --git a/doc/ldif-example.com b/doc/ldif-example.com
deleted file mode 100644
index 8c6cdfb..0000000
--- a/doc/ldif-example.com
+++ /dev/null
@@ -1,165 +0,0 @@
-# LDIF Export for dc=example.com
-# Server: C5: OpenLDAP 2.3.27: config (c5dev.leenooks.vpn)
-# Search Scope: sub
-# Search Filter: (objectClass=*)
-# Total Entries: 23
-#
-# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on April 26, 2011 9:13 pm
-# Version: 1.2.0.5
-
-#version: 1
-
-# Entry 1: dc=example.com
-dn: dc=example.com
-dc: example.com
-objectclass: dNSDomain
-
-# Entry 2: cn=group,dc=example.com
-dn: cn=group,dc=example.com
-cn: group
-gidnumber: 100
-objectclass: posixGroup
-objectclass: top
-
-# Entry 3: ou=Bad DNs,dc=example.com
-dn: ou=Bad DNs,dc=example.com
-objectclass: organizationalUnit
-ou: Bad DNs
-
-# Entry 4: c=double plus \2B\2B,ou=Bad DNs,dc=example.com
-dn: c=double plus \2B\2B,ou=Bad DNs,dc=example.com
-c: double plus ++
-objectclass: country
-
-# Entry 5: c=end dollar$,ou=Bad DNs,dc=example.com
-dn: c=end dollar$,ou=Bad DNs,dc=example.com
-c: end dollar$
-objectclass: country
-
-# Entry 6: sn=sign@at+uid=multi-mixed,ou=Bad DNs,dc=example.com
-dn: sn=sign@at+uid=multi-mixed,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: sign@at
-uid: multi-mixed
-
-# Entry 7: uid=angle\3Cleft,ou=Bad DNs,dc=example.com
-dn: uid=angle\3Cleft,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: angleright
-
-# Entry 9: uid=brace(left,ou=Bad DNs,dc=example.com
-dn: uid=brace(left,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: brace(left
-
-# Entry 10: uid=brace)right,ou=Bad DNs,dc=example.com
-dn: uid=brace)right,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: brace)right
-
-# Entry 11: uid=colon:full,ou=Bad DNs,dc=example.com
-dn: uid=colon:full,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: colon:full
-
-# Entry 12: uid=colon\3Bsemi,ou=Bad DNs,dc=example.com
-dn: uid=colon\3Bsemi,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: colon;semi
-
-# Entry 13: uid=multi+uid=sign@at,ou=Bad DNs,dc=example.com
-dn: uid=multi+uid=sign@at,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: multi
-uid: sign@at
-
-# Entry 14: uid=multi+uid=value,ou=Bad DNs,dc=example.com
-dn: uid=multi+uid=value,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: multi
-uid: value
-
-# Entry 15: uid=quote\22double,ou=Bad DNs,dc=example.com
-dn: uid=quote\22double,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: quote"double
-
-# Entry 16: uid=quote'single,ou=Bad DNs,dc=example.com
-dn: uid=quote'single,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: quote'single
-
-# Entry 17: uid=sign%percent,ou=Bad DNs,dc=example.com
-dn: uid=sign%percent,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign%percent
-
-# Entry 18: uid=sign\2Bplus,ou=Bad DNs,dc=example.com
-dn: uid=sign\2Bplus,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign+plus
-
-# Entry 19: uid=sign\2Ccomma,ou=Bad DNs,dc=example.com
-dn: uid=sign\2Ccomma,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign,comma
-
-# Entry 20: uid=sign\3Bsemicolon@at,ou=Bad DNs,dc=example.com
-dn: uid=sign\3Bsemicolon@at,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign;semicolon@at
-
-# Entry 21: uid=sign\3Dequal,ou=Bad DNs,dc=example.com
-dn: uid=sign\3Dequal,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign=equal
-
-# Entry 22: uid=sign?question,ou=Bad DNs,dc=example.com
-dn: uid=sign?question,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign?question
-
-# Entry 23: uid=sign@at,ou=Bad DNs,dc=example.com
-dn: uid=sign@at,ou=Bad DNs,dc=example.com
-cn: Test
-objectclass: inetOrgPerson
-sn: Test
-uid: sign@at
diff --git a/doc/phpldapadmin-demo.conf b/doc/phpldapadmin-demo.conf
deleted file mode 100644
index 3ed4063..0000000
--- a/doc/phpldapadmin-demo.conf
+++ /dev/null
@@ -1,107 +0,0 @@
-include /etc/openldap/schema/uidpool.schema
-include /etc/openldap/schema/sudo.schema
-include /etc/openldap/schema/autofs.schema
-
-TLSCACertificateFile /etc/openldap/pla/ca-bundle.crt
-TLSCertificateFile /etc/openldap/pla/slapd.crt
-TLSCertificateKeyFile /etc/openldap/pla/slapd.key
-
-access to dn.regex="o=Simpsons$" attrs=userpassword
- by anonymous auth
- by self write
- by * none
-
-access to dn.base="" by * read
-access to dn.regex="dc=example.com$"
- by dn.regex="o=Flintstones$" none
- by dn.regex="o=Simpsons$" none
- by * write
-access to dn.regex="dc=example,dc=com$"
- by dn.regex="o=Flintstones$" none
- by dn.regex="o=Simpsons$" none
- by * write
-access to dn.regex="o=Flintstones$"
- by dn.regex="o=Simpsons$" none
- by self write
- by dn.regex="cn=.*,ou=People,o=Flintstones" write
- by * read
-access to dn.regex="o=Simpsons$"
- by dn.regex="o=Flintstones$" none
- by self write
- by dn.regex="cn=.*,ou=People,o=Simpsons" write
- by * read
-access to *
- by * read
-
-authz-policy any
-
-database ldbm
-suffix "dc=example.com"
-rootdn "cn=Manager,dc=example.com"
-rootpw NotAllowed
-directory /var/lib/ldap/base-example.com
-dirtyread
-cachesize 2000
-checkpoint 32 1
-# Indices to maintain for this database
-index objectClass eq,pres
-index ou,cn,mail,surname,givenname eq,pres,sub
-index uidNumber,gidNumber,loginShell eq,pres
-index uid,memberUid eq,pres,sub
-index nisMapName,nisMapEntry eq,pres,sub
-
-database ldbm
-suffix "dc=example,dc=com"
-rootdn "cn=Manager,dc=example,dc=com"
-rootpw NotAllowed
-directory /var/lib/ldap/base-example-com
-dirtyread
-cachesize 2000
-checkpoint 32 1
-# Indices to maintain for this database
-index objectClass eq,pres
-index ou,cn,mail,surname,givenname eq,pres,sub
-index uidNumber,gidNumber,loginShell eq,pres
-index uid,memberUid eq,pres,sub
-index nisMapName,nisMapEntry eq,pres,sub
-
-database ldbm
-suffix "o=Simpsons"
-rootdn "cn=Manager,o=Simpsons"
-rootpw NotAllowed
-directory /var/lib/ldap/base-simpsons
-dirtyread
-cachesize 2000
-checkpoint 32 1
-# Indices to maintain for this database
-index objectClass eq,pres
-index ou,cn,mail,surname,givenname eq,pres,sub
-index uidNumber,gidNumber,loginShell eq,pres
-index uid,memberUid eq,pres,sub
-index nisMapName,nisMapEntry eq,pres,sub
-
-sasl-regexp uid=(.*),cn=(.*),cn=gssapi,cn=auth
- ldap:///dc=example.com??sub?(&(uid=$1)(objectClass=inetOrgPerson))
-
-database bdb
-suffix "o=Flintstones"
-rootdn "cn=Manager,o=Flintstones"
-rootpw NotAllowed
-directory /var/lib/ldap/base-flintstones
-dirtyread
-cachesize 2000
-checkpoint 32 1
-# Indices to maintain for this database
-index objectClass eq,pres
-index ou,cn,mail,surname,givenname eq,pres,sub
-index uidNumber,gidNumber,loginShell eq,pres
-index uid,memberUid eq,pres,sub
-index nisMapName,nisMapEntry eq,pres,sub
-
-database monitor
-access to * by * read
-
-database config
-access to * by * read
-rootdn cn=admin,cn=config
-rootpw password
diff --git a/doc/uidpool.schema b/doc/uidpool.schema
old mode 100755
new mode 100644
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000..7a15511
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,10 @@
+FROM registry.dege.au/leenooks/php:8.1-fpm-alpine-ldap
+
+COPY . /var/www/html/
+
+RUN mkdir -p ${COMPOSER_HOME} && \
+ ([ -r auth.json ] && mv auth.json ${COMPOSER_HOME}) || true && \
+ touch .composer.refresh && \
+ mv .env.example .env && \
+ FORCE_PERMS=1 NGINX_START=FALSE /sbin/init && \
+ rm -rf ${COMPOSER_HOME}/* .git* composer.lock
diff --git a/hooks/classes/README b/hooks/classes/README
deleted file mode 100644
index 1a0f343..0000000
--- a/hooks/classes/README
+++ /dev/null
@@ -1,3 +0,0 @@
-Put your hook class files here.
-
-A file wich contains "class MyClass" definition must be called "MyClass.php".
diff --git a/htdocs/cmd.php b/htdocs/cmd.php
deleted file mode 100644
index 0ddf004..0000000
--- a/htdocs/cmd.php
+++ /dev/null
@@ -1,79 +0,0 @@
-getIndex());
-
-# See if we can render the command
-if (trim($www['cmd'])) {
- # If this is a READ-WRITE operation, the LDAP server must not be in READ-ONLY mode.
- if ($app['server']->isReadOnly() && ! in_array(get_request('cmd','REQUEST'),$app['readwrite_cmds']))
- error(_('You cannot perform updates while server is in read-only mode'),'error','index.php');
-
- # If this command has been disabled by the config.
- if (! $_SESSION[APPCONFIG]->isCommandAvailable('script',$www['cmd'])) {
- system_message(array('title'=>_('Command disabled by the server configuration'),
- _('Error'),'body'=>sprintf('%s: %s.',_('The command could not be run'),htmlspecialchars($www['cmd'])),'type'=>'error'),'index.php');
-
- $app['script_cmd'] = null;
- }
-}
-
-if ($app['script_cmd'])
- include $app['script_cmd'];
-
-# Refresh a frame - this is so that one frame can trigger another frame to be refreshed.
-if (isAjaxEnabled() && get_request('refresh','REQUEST') && get_request('refresh','REQUEST') != get_request('frame','REQUEST')) {
- echo '';
-}
-
-# Capture the output and put into the body of the page.
-$www['body'] = new block();
-$www['body']->SetBody(ob_get_contents());
-$www['page']->block_add('body',$www['body']);
-ob_end_clean();
-
-if ($www['meth'] == 'ajax')
- $www['page']->show(get_request('frame','REQUEST',false,'BODY'),true,get_request('raw','REQUEST',false,false));
-else
- $www['page']->display();
-?>
diff --git a/htdocs/images/countries/af.png b/htdocs/images/countries/af.png
deleted file mode 100644
index cda88b0..0000000
Binary files a/htdocs/images/countries/af.png and /dev/null differ
diff --git a/htdocs/images/countries/al.png b/htdocs/images/countries/al.png
deleted file mode 100644
index 5925b27..0000000
Binary files a/htdocs/images/countries/al.png and /dev/null differ
diff --git a/htdocs/images/countries/am.png b/htdocs/images/countries/am.png
deleted file mode 100644
index 45cd749..0000000
Binary files a/htdocs/images/countries/am.png and /dev/null differ
diff --git a/htdocs/images/countries/an.png b/htdocs/images/countries/an.png
deleted file mode 100644
index 2d4d3a7..0000000
Binary files a/htdocs/images/countries/an.png and /dev/null differ
diff --git a/htdocs/images/countries/ao.png b/htdocs/images/countries/ao.png
deleted file mode 100644
index 9463d24..0000000
Binary files a/htdocs/images/countries/ao.png and /dev/null differ
diff --git a/htdocs/images/countries/ar.png b/htdocs/images/countries/ar.png
deleted file mode 100644
index bd73382..0000000
Binary files a/htdocs/images/countries/ar.png and /dev/null differ
diff --git a/htdocs/images/countries/at.png b/htdocs/images/countries/at.png
deleted file mode 100644
index 2a58c49..0000000
Binary files a/htdocs/images/countries/at.png and /dev/null differ
diff --git a/htdocs/images/countries/au.png b/htdocs/images/countries/au.png
deleted file mode 100644
index b20b048..0000000
Binary files a/htdocs/images/countries/au.png and /dev/null differ
diff --git a/htdocs/images/countries/aw.png b/htdocs/images/countries/aw.png
deleted file mode 100644
index 411977e..0000000
Binary files a/htdocs/images/countries/aw.png and /dev/null differ
diff --git a/htdocs/images/countries/az.png b/htdocs/images/countries/az.png
deleted file mode 100644
index ced5af0..0000000
Binary files a/htdocs/images/countries/az.png and /dev/null differ
diff --git a/htdocs/images/countries/ba.png b/htdocs/images/countries/ba.png
deleted file mode 100644
index fb7d190..0000000
Binary files a/htdocs/images/countries/ba.png and /dev/null differ
diff --git a/htdocs/images/countries/bb.png b/htdocs/images/countries/bb.png
deleted file mode 100644
index 9c07e14..0000000
Binary files a/htdocs/images/countries/bb.png and /dev/null differ
diff --git a/htdocs/images/countries/bd.png b/htdocs/images/countries/bd.png
deleted file mode 100644
index 56bba0b..0000000
Binary files a/htdocs/images/countries/bd.png and /dev/null differ
diff --git a/htdocs/images/countries/be.png b/htdocs/images/countries/be.png
deleted file mode 100644
index 9312218..0000000
Binary files a/htdocs/images/countries/be.png and /dev/null differ
diff --git a/htdocs/images/countries/bf.png b/htdocs/images/countries/bf.png
deleted file mode 100644
index 1019379..0000000
Binary files a/htdocs/images/countries/bf.png and /dev/null differ
diff --git a/htdocs/images/countries/bg.png b/htdocs/images/countries/bg.png
deleted file mode 100644
index 0f64f7d..0000000
Binary files a/htdocs/images/countries/bg.png and /dev/null differ
diff --git a/htdocs/images/countries/bh.png b/htdocs/images/countries/bh.png
deleted file mode 100644
index 236693d..0000000
Binary files a/htdocs/images/countries/bh.png and /dev/null differ
diff --git a/htdocs/images/countries/bi.png b/htdocs/images/countries/bi.png
deleted file mode 100644
index 7fa236a..0000000
Binary files a/htdocs/images/countries/bi.png and /dev/null differ
diff --git a/htdocs/images/countries/bj.png b/htdocs/images/countries/bj.png
deleted file mode 100644
index 290016a..0000000
Binary files a/htdocs/images/countries/bj.png and /dev/null differ
diff --git a/htdocs/images/countries/bm.png b/htdocs/images/countries/bm.png
deleted file mode 100644
index 96fb4dc..0000000
Binary files a/htdocs/images/countries/bm.png and /dev/null differ
diff --git a/htdocs/images/countries/bn.png b/htdocs/images/countries/bn.png
deleted file mode 100644
index 53460dc..0000000
Binary files a/htdocs/images/countries/bn.png and /dev/null differ
diff --git a/htdocs/images/countries/bo.png b/htdocs/images/countries/bo.png
deleted file mode 100644
index 5025e7f..0000000
Binary files a/htdocs/images/countries/bo.png and /dev/null differ
diff --git a/htdocs/images/countries/br.png b/htdocs/images/countries/br.png
deleted file mode 100644
index 734ace9..0000000
Binary files a/htdocs/images/countries/br.png and /dev/null differ
diff --git a/htdocs/images/countries/bs.png b/htdocs/images/countries/bs.png
deleted file mode 100644
index 36c4cbe..0000000
Binary files a/htdocs/images/countries/bs.png and /dev/null differ
diff --git a/htdocs/images/countries/bt.png b/htdocs/images/countries/bt.png
deleted file mode 100644
index 3e10663..0000000
Binary files a/htdocs/images/countries/bt.png and /dev/null differ
diff --git a/htdocs/images/countries/bw.png b/htdocs/images/countries/bw.png
deleted file mode 100644
index bd8e293..0000000
Binary files a/htdocs/images/countries/bw.png and /dev/null differ
diff --git a/htdocs/images/countries/by.png b/htdocs/images/countries/by.png
deleted file mode 100644
index 8f5b849..0000000
Binary files a/htdocs/images/countries/by.png and /dev/null differ
diff --git a/htdocs/images/countries/bz.png b/htdocs/images/countries/bz.png
deleted file mode 100644
index fb1bd5a..0000000
Binary files a/htdocs/images/countries/bz.png and /dev/null differ
diff --git a/htdocs/images/countries/ca.png b/htdocs/images/countries/ca.png
deleted file mode 100644
index d06843f..0000000
Binary files a/htdocs/images/countries/ca.png and /dev/null differ
diff --git a/htdocs/images/countries/cf.png b/htdocs/images/countries/cf.png
deleted file mode 100644
index 35e6b47..0000000
Binary files a/htdocs/images/countries/cf.png and /dev/null differ
diff --git a/htdocs/images/countries/cg.png b/htdocs/images/countries/cg.png
deleted file mode 100644
index f2db518..0000000
Binary files a/htdocs/images/countries/cg.png and /dev/null differ
diff --git a/htdocs/images/countries/ch.png b/htdocs/images/countries/ch.png
deleted file mode 100644
index 9899d78..0000000
Binary files a/htdocs/images/countries/ch.png and /dev/null differ
diff --git a/htdocs/images/countries/ci.png b/htdocs/images/countries/ci.png
deleted file mode 100644
index d536e9b..0000000
Binary files a/htdocs/images/countries/ci.png and /dev/null differ
diff --git a/htdocs/images/countries/ck.png b/htdocs/images/countries/ck.png
deleted file mode 100644
index 271f568..0000000
Binary files a/htdocs/images/countries/ck.png and /dev/null differ
diff --git a/htdocs/images/countries/cl.png b/htdocs/images/countries/cl.png
deleted file mode 100644
index 97db9ec..0000000
Binary files a/htdocs/images/countries/cl.png and /dev/null differ
diff --git a/htdocs/images/countries/cm.png b/htdocs/images/countries/cm.png
deleted file mode 100644
index febecad..0000000
Binary files a/htdocs/images/countries/cm.png and /dev/null differ
diff --git a/htdocs/images/countries/cn.png b/htdocs/images/countries/cn.png
deleted file mode 100644
index f3f36da..0000000
Binary files a/htdocs/images/countries/cn.png and /dev/null differ
diff --git a/htdocs/images/countries/co.png b/htdocs/images/countries/co.png
deleted file mode 100644
index 2781663..0000000
Binary files a/htdocs/images/countries/co.png and /dev/null differ
diff --git a/htdocs/images/countries/cr.png b/htdocs/images/countries/cr.png
deleted file mode 100644
index 09bb72d..0000000
Binary files a/htdocs/images/countries/cr.png and /dev/null differ
diff --git a/htdocs/images/countries/cu.png b/htdocs/images/countries/cu.png
deleted file mode 100644
index 9be2138..0000000
Binary files a/htdocs/images/countries/cu.png and /dev/null differ
diff --git a/htdocs/images/countries/cv.png b/htdocs/images/countries/cv.png
deleted file mode 100644
index 6204e60..0000000
Binary files a/htdocs/images/countries/cv.png and /dev/null differ
diff --git a/htdocs/images/countries/cy.png b/htdocs/images/countries/cy.png
deleted file mode 100644
index 14b2deb..0000000
Binary files a/htdocs/images/countries/cy.png and /dev/null differ
diff --git a/htdocs/images/countries/cz.png b/htdocs/images/countries/cz.png
deleted file mode 100644
index 36313b4..0000000
Binary files a/htdocs/images/countries/cz.png and /dev/null differ
diff --git a/htdocs/images/countries/de.png b/htdocs/images/countries/de.png
deleted file mode 100644
index 67e1bd5..0000000
Binary files a/htdocs/images/countries/de.png and /dev/null differ
diff --git a/htdocs/images/countries/dk.png b/htdocs/images/countries/dk.png
deleted file mode 100644
index 9404cf0..0000000
Binary files a/htdocs/images/countries/dk.png and /dev/null differ
diff --git a/htdocs/images/countries/dz.png b/htdocs/images/countries/dz.png
deleted file mode 100644
index 26919b1..0000000
Binary files a/htdocs/images/countries/dz.png and /dev/null differ
diff --git a/htdocs/images/countries/ec.png b/htdocs/images/countries/ec.png
deleted file mode 100644
index 961e5cd..0000000
Binary files a/htdocs/images/countries/ec.png and /dev/null differ
diff --git a/htdocs/images/countries/ee.png b/htdocs/images/countries/ee.png
deleted file mode 100644
index e0a902e..0000000
Binary files a/htdocs/images/countries/ee.png and /dev/null differ
diff --git a/htdocs/images/countries/eg.png b/htdocs/images/countries/eg.png
deleted file mode 100644
index f81b276..0000000
Binary files a/htdocs/images/countries/eg.png and /dev/null differ
diff --git a/htdocs/images/countries/er.png b/htdocs/images/countries/er.png
deleted file mode 100644
index f96b315..0000000
Binary files a/htdocs/images/countries/er.png and /dev/null differ
diff --git a/htdocs/images/countries/es.png b/htdocs/images/countries/es.png
deleted file mode 100644
index c85447d..0000000
Binary files a/htdocs/images/countries/es.png and /dev/null differ
diff --git a/htdocs/images/countries/et.png b/htdocs/images/countries/et.png
deleted file mode 100644
index 48ff7b1..0000000
Binary files a/htdocs/images/countries/et.png and /dev/null differ
diff --git a/htdocs/images/countries/fi.png b/htdocs/images/countries/fi.png
deleted file mode 100644
index d408743..0000000
Binary files a/htdocs/images/countries/fi.png and /dev/null differ
diff --git a/htdocs/images/countries/fj.png b/htdocs/images/countries/fj.png
deleted file mode 100644
index 6818444..0000000
Binary files a/htdocs/images/countries/fj.png and /dev/null differ
diff --git a/htdocs/images/countries/fo.png b/htdocs/images/countries/fo.png
deleted file mode 100644
index 1e12376..0000000
Binary files a/htdocs/images/countries/fo.png and /dev/null differ
diff --git a/htdocs/images/countries/fr.png b/htdocs/images/countries/fr.png
deleted file mode 100644
index 39bed1a..0000000
Binary files a/htdocs/images/countries/fr.png and /dev/null differ
diff --git a/htdocs/images/countries/ga.png b/htdocs/images/countries/ga.png
deleted file mode 100644
index 8337ab9..0000000
Binary files a/htdocs/images/countries/ga.png and /dev/null differ
diff --git a/htdocs/images/countries/gb.png b/htdocs/images/countries/gb.png
deleted file mode 100644
index 30035dd..0000000
Binary files a/htdocs/images/countries/gb.png and /dev/null differ
diff --git a/htdocs/images/countries/ge.png b/htdocs/images/countries/ge.png
deleted file mode 100644
index da1ab41..0000000
Binary files a/htdocs/images/countries/ge.png and /dev/null differ
diff --git a/htdocs/images/countries/gi.png b/htdocs/images/countries/gi.png
deleted file mode 100644
index afb539b..0000000
Binary files a/htdocs/images/countries/gi.png and /dev/null differ
diff --git a/htdocs/images/countries/gl.png b/htdocs/images/countries/gl.png
deleted file mode 100644
index 66cd000..0000000
Binary files a/htdocs/images/countries/gl.png and /dev/null differ
diff --git a/htdocs/images/countries/gp.png b/htdocs/images/countries/gp.png
deleted file mode 100644
index e4a6159..0000000
Binary files a/htdocs/images/countries/gp.png and /dev/null differ
diff --git a/htdocs/images/countries/gr.png b/htdocs/images/countries/gr.png
deleted file mode 100644
index 1fb9d52..0000000
Binary files a/htdocs/images/countries/gr.png and /dev/null differ
diff --git a/htdocs/images/countries/gt.png b/htdocs/images/countries/gt.png
deleted file mode 100644
index 7d63cb8..0000000
Binary files a/htdocs/images/countries/gt.png and /dev/null differ
diff --git a/htdocs/images/countries/gu.png b/htdocs/images/countries/gu.png
deleted file mode 100644
index 4282438..0000000
Binary files a/htdocs/images/countries/gu.png and /dev/null differ
diff --git a/htdocs/images/countries/gy.png b/htdocs/images/countries/gy.png
deleted file mode 100644
index a5d0e8e..0000000
Binary files a/htdocs/images/countries/gy.png and /dev/null differ
diff --git a/htdocs/images/countries/hk.png b/htdocs/images/countries/hk.png
deleted file mode 100644
index e5fa24f..0000000
Binary files a/htdocs/images/countries/hk.png and /dev/null differ
diff --git a/htdocs/images/countries/hr.png b/htdocs/images/countries/hr.png
deleted file mode 100644
index fda7328..0000000
Binary files a/htdocs/images/countries/hr.png and /dev/null differ
diff --git a/htdocs/images/countries/ht.png b/htdocs/images/countries/ht.png
deleted file mode 100644
index d058c3b..0000000
Binary files a/htdocs/images/countries/ht.png and /dev/null differ
diff --git a/htdocs/images/countries/hu.png b/htdocs/images/countries/hu.png
deleted file mode 100644
index dc4eef1..0000000
Binary files a/htdocs/images/countries/hu.png and /dev/null differ
diff --git a/htdocs/images/countries/id.png b/htdocs/images/countries/id.png
deleted file mode 100644
index 95e9ce3..0000000
Binary files a/htdocs/images/countries/id.png and /dev/null differ
diff --git a/htdocs/images/countries/ie.png b/htdocs/images/countries/ie.png
deleted file mode 100644
index 1943e6b..0000000
Binary files a/htdocs/images/countries/ie.png and /dev/null differ
diff --git a/htdocs/images/countries/il.png b/htdocs/images/countries/il.png
deleted file mode 100644
index a9161bb..0000000
Binary files a/htdocs/images/countries/il.png and /dev/null differ
diff --git a/htdocs/images/countries/in.png b/htdocs/images/countries/in.png
deleted file mode 100644
index 1e404ac..0000000
Binary files a/htdocs/images/countries/in.png and /dev/null differ
diff --git a/htdocs/images/countries/iq.png b/htdocs/images/countries/iq.png
deleted file mode 100644
index 1374301..0000000
Binary files a/htdocs/images/countries/iq.png and /dev/null differ
diff --git a/htdocs/images/countries/ir.png b/htdocs/images/countries/ir.png
deleted file mode 100644
index a6f4903..0000000
Binary files a/htdocs/images/countries/ir.png and /dev/null differ
diff --git a/htdocs/images/countries/is.png b/htdocs/images/countries/is.png
deleted file mode 100644
index 9ce9864..0000000
Binary files a/htdocs/images/countries/is.png and /dev/null differ
diff --git a/htdocs/images/countries/it.png b/htdocs/images/countries/it.png
deleted file mode 100644
index 4a4ba95..0000000
Binary files a/htdocs/images/countries/it.png and /dev/null differ
diff --git a/htdocs/images/countries/jm.png b/htdocs/images/countries/jm.png
deleted file mode 100644
index 4274119..0000000
Binary files a/htdocs/images/countries/jm.png and /dev/null differ
diff --git a/htdocs/images/countries/jo.png b/htdocs/images/countries/jo.png
deleted file mode 100644
index 17e4481..0000000
Binary files a/htdocs/images/countries/jo.png and /dev/null differ
diff --git a/htdocs/images/countries/jp.png b/htdocs/images/countries/jp.png
deleted file mode 100644
index 8b52fa8..0000000
Binary files a/htdocs/images/countries/jp.png and /dev/null differ
diff --git a/htdocs/images/countries/ke.png b/htdocs/images/countries/ke.png
deleted file mode 100644
index 7bc3858..0000000
Binary files a/htdocs/images/countries/ke.png and /dev/null differ
diff --git a/htdocs/images/countries/kg.png b/htdocs/images/countries/kg.png
deleted file mode 100644
index b176e4f..0000000
Binary files a/htdocs/images/countries/kg.png and /dev/null differ
diff --git a/htdocs/images/countries/kh.png b/htdocs/images/countries/kh.png
deleted file mode 100644
index 9c94193..0000000
Binary files a/htdocs/images/countries/kh.png and /dev/null differ
diff --git a/htdocs/images/countries/ki.png b/htdocs/images/countries/ki.png
deleted file mode 100644
index fdc58fe..0000000
Binary files a/htdocs/images/countries/ki.png and /dev/null differ
diff --git a/htdocs/images/countries/kp.png b/htdocs/images/countries/kp.png
deleted file mode 100644
index 405332c..0000000
Binary files a/htdocs/images/countries/kp.png and /dev/null differ
diff --git a/htdocs/images/countries/kr.png b/htdocs/images/countries/kr.png
deleted file mode 100644
index 0df561a..0000000
Binary files a/htdocs/images/countries/kr.png and /dev/null differ
diff --git a/htdocs/images/countries/ky.png b/htdocs/images/countries/ky.png
deleted file mode 100644
index ae2ba3e..0000000
Binary files a/htdocs/images/countries/ky.png and /dev/null differ
diff --git a/htdocs/images/countries/kz.png b/htdocs/images/countries/kz.png
deleted file mode 100644
index eb7b9be..0000000
Binary files a/htdocs/images/countries/kz.png and /dev/null differ
diff --git a/htdocs/images/countries/lb.png b/htdocs/images/countries/lb.png
deleted file mode 100644
index 44f9e1b..0000000
Binary files a/htdocs/images/countries/lb.png and /dev/null differ
diff --git a/htdocs/images/countries/lc.png b/htdocs/images/countries/lc.png
deleted file mode 100644
index 6b0389a..0000000
Binary files a/htdocs/images/countries/lc.png and /dev/null differ
diff --git a/htdocs/images/countries/lk.png b/htdocs/images/countries/lk.png
deleted file mode 100644
index 2f2c48b..0000000
Binary files a/htdocs/images/countries/lk.png and /dev/null differ
diff --git a/htdocs/images/countries/lt.png b/htdocs/images/countries/lt.png
deleted file mode 100644
index c6252ce..0000000
Binary files a/htdocs/images/countries/lt.png and /dev/null differ
diff --git a/htdocs/images/countries/lu.png b/htdocs/images/countries/lu.png
deleted file mode 100644
index 6a80e6e..0000000
Binary files a/htdocs/images/countries/lu.png and /dev/null differ
diff --git a/htdocs/images/countries/lv.png b/htdocs/images/countries/lv.png
deleted file mode 100644
index 925ae28..0000000
Binary files a/htdocs/images/countries/lv.png and /dev/null differ
diff --git a/htdocs/images/countries/ly.png b/htdocs/images/countries/ly.png
deleted file mode 100644
index 8741c4c..0000000
Binary files a/htdocs/images/countries/ly.png and /dev/null differ
diff --git a/htdocs/images/countries/ma.png b/htdocs/images/countries/ma.png
deleted file mode 100644
index a5d9234..0000000
Binary files a/htdocs/images/countries/ma.png and /dev/null differ
diff --git a/htdocs/images/countries/mc.png b/htdocs/images/countries/mc.png
deleted file mode 100644
index 8dd6d29..0000000
Binary files a/htdocs/images/countries/mc.png and /dev/null differ
diff --git a/htdocs/images/countries/md.png b/htdocs/images/countries/md.png
deleted file mode 100644
index 9d9d278..0000000
Binary files a/htdocs/images/countries/md.png and /dev/null differ
diff --git a/htdocs/images/countries/mg.png b/htdocs/images/countries/mg.png
deleted file mode 100644
index e93f20e..0000000
Binary files a/htdocs/images/countries/mg.png and /dev/null differ
diff --git a/htdocs/images/countries/mn.png b/htdocs/images/countries/mn.png
deleted file mode 100644
index 9ce7bc9..0000000
Binary files a/htdocs/images/countries/mn.png and /dev/null differ
diff --git a/htdocs/images/countries/mo.png b/htdocs/images/countries/mo.png
deleted file mode 100644
index 21497e9..0000000
Binary files a/htdocs/images/countries/mo.png and /dev/null differ
diff --git a/htdocs/images/countries/mp.png b/htdocs/images/countries/mp.png
deleted file mode 100644
index 9523df6..0000000
Binary files a/htdocs/images/countries/mp.png and /dev/null differ
diff --git a/htdocs/images/countries/ms.png b/htdocs/images/countries/ms.png
deleted file mode 100644
index f92b84d..0000000
Binary files a/htdocs/images/countries/ms.png and /dev/null differ
diff --git a/htdocs/images/countries/mt.png b/htdocs/images/countries/mt.png
deleted file mode 100644
index 7f35e82..0000000
Binary files a/htdocs/images/countries/mt.png and /dev/null differ
diff --git a/htdocs/images/countries/mx.png b/htdocs/images/countries/mx.png
deleted file mode 100644
index 5d481f0..0000000
Binary files a/htdocs/images/countries/mx.png and /dev/null differ
diff --git a/htdocs/images/countries/my.png b/htdocs/images/countries/my.png
deleted file mode 100644
index 9fa6f81..0000000
Binary files a/htdocs/images/countries/my.png and /dev/null differ
diff --git a/htdocs/images/countries/mz.png b/htdocs/images/countries/mz.png
deleted file mode 100644
index 5e6e87b..0000000
Binary files a/htdocs/images/countries/mz.png and /dev/null differ
diff --git a/htdocs/images/countries/na.png b/htdocs/images/countries/na.png
deleted file mode 100644
index 83d63cf..0000000
Binary files a/htdocs/images/countries/na.png and /dev/null differ
diff --git a/htdocs/images/countries/nc.png b/htdocs/images/countries/nc.png
deleted file mode 100644
index 32eb190..0000000
Binary files a/htdocs/images/countries/nc.png and /dev/null differ
diff --git a/htdocs/images/countries/nf.png b/htdocs/images/countries/nf.png
deleted file mode 100644
index efdc438..0000000
Binary files a/htdocs/images/countries/nf.png and /dev/null differ
diff --git a/htdocs/images/countries/nl.png b/htdocs/images/countries/nl.png
deleted file mode 100644
index 99b5e13..0000000
Binary files a/htdocs/images/countries/nl.png and /dev/null differ
diff --git a/htdocs/images/countries/no.png b/htdocs/images/countries/no.png
deleted file mode 100644
index 0199b30..0000000
Binary files a/htdocs/images/countries/no.png and /dev/null differ
diff --git a/htdocs/images/countries/np.png b/htdocs/images/countries/np.png
deleted file mode 100644
index 254744a..0000000
Binary files a/htdocs/images/countries/np.png and /dev/null differ
diff --git a/htdocs/images/countries/nr.png b/htdocs/images/countries/nr.png
deleted file mode 100644
index 7f45229..0000000
Binary files a/htdocs/images/countries/nr.png and /dev/null differ
diff --git a/htdocs/images/countries/nz.png b/htdocs/images/countries/nz.png
deleted file mode 100644
index 841bb97..0000000
Binary files a/htdocs/images/countries/nz.png and /dev/null differ
diff --git a/htdocs/images/countries/om.png b/htdocs/images/countries/om.png
deleted file mode 100644
index ad114e3..0000000
Binary files a/htdocs/images/countries/om.png and /dev/null differ
diff --git a/htdocs/images/countries/pa.png b/htdocs/images/countries/pa.png
deleted file mode 100644
index 26d5b1a..0000000
Binary files a/htdocs/images/countries/pa.png and /dev/null differ
diff --git a/htdocs/images/countries/pe.png b/htdocs/images/countries/pe.png
deleted file mode 100644
index 41794a0..0000000
Binary files a/htdocs/images/countries/pe.png and /dev/null differ
diff --git a/htdocs/images/countries/pf.png b/htdocs/images/countries/pf.png
deleted file mode 100644
index cf744fa..0000000
Binary files a/htdocs/images/countries/pf.png and /dev/null differ
diff --git a/htdocs/images/countries/ph.png b/htdocs/images/countries/ph.png
deleted file mode 100644
index 24007ab..0000000
Binary files a/htdocs/images/countries/ph.png and /dev/null differ
diff --git a/htdocs/images/countries/pk.png b/htdocs/images/countries/pk.png
deleted file mode 100644
index ff220ee..0000000
Binary files a/htdocs/images/countries/pk.png and /dev/null differ
diff --git a/htdocs/images/countries/pl.png b/htdocs/images/countries/pl.png
deleted file mode 100644
index e275d90..0000000
Binary files a/htdocs/images/countries/pl.png and /dev/null differ
diff --git a/htdocs/images/countries/pm.png b/htdocs/images/countries/pm.png
deleted file mode 100644
index 6f9bf90..0000000
Binary files a/htdocs/images/countries/pm.png and /dev/null differ
diff --git a/htdocs/images/countries/pr.png b/htdocs/images/countries/pr.png
deleted file mode 100644
index 0671638..0000000
Binary files a/htdocs/images/countries/pr.png and /dev/null differ
diff --git a/htdocs/images/countries/pt.png b/htdocs/images/countries/pt.png
deleted file mode 100644
index 8d32759..0000000
Binary files a/htdocs/images/countries/pt.png and /dev/null differ
diff --git a/htdocs/images/countries/py.png b/htdocs/images/countries/py.png
deleted file mode 100644
index bac8948..0000000
Binary files a/htdocs/images/countries/py.png and /dev/null differ
diff --git a/htdocs/images/countries/qa.png b/htdocs/images/countries/qa.png
deleted file mode 100644
index 6cf12f1..0000000
Binary files a/htdocs/images/countries/qa.png and /dev/null differ
diff --git a/htdocs/images/countries/ro.png b/htdocs/images/countries/ro.png
deleted file mode 100644
index 8d36c04..0000000
Binary files a/htdocs/images/countries/ro.png and /dev/null differ
diff --git a/htdocs/images/countries/ru.png b/htdocs/images/countries/ru.png
deleted file mode 100644
index 2b7093c..0000000
Binary files a/htdocs/images/countries/ru.png and /dev/null differ
diff --git a/htdocs/images/countries/sa.png b/htdocs/images/countries/sa.png
deleted file mode 100644
index f7982cc..0000000
Binary files a/htdocs/images/countries/sa.png and /dev/null differ
diff --git a/htdocs/images/countries/sb.png b/htdocs/images/countries/sb.png
deleted file mode 100644
index 37f5c89..0000000
Binary files a/htdocs/images/countries/sb.png and /dev/null differ
diff --git a/htdocs/images/countries/sd.png b/htdocs/images/countries/sd.png
deleted file mode 100644
index 32398df..0000000
Binary files a/htdocs/images/countries/sd.png and /dev/null differ
diff --git a/htdocs/images/countries/se.png b/htdocs/images/countries/se.png
deleted file mode 100644
index df1775d..0000000
Binary files a/htdocs/images/countries/se.png and /dev/null differ
diff --git a/htdocs/images/countries/sg.png b/htdocs/images/countries/sg.png
deleted file mode 100644
index 51dc5a8..0000000
Binary files a/htdocs/images/countries/sg.png and /dev/null differ
diff --git a/htdocs/images/countries/si.png b/htdocs/images/countries/si.png
deleted file mode 100644
index e8f8743..0000000
Binary files a/htdocs/images/countries/si.png and /dev/null differ
diff --git a/htdocs/images/countries/sk.png b/htdocs/images/countries/sk.png
deleted file mode 100644
index d605271..0000000
Binary files a/htdocs/images/countries/sk.png and /dev/null differ
diff --git a/htdocs/images/countries/sl.png b/htdocs/images/countries/sl.png
deleted file mode 100644
index beafb9f..0000000
Binary files a/htdocs/images/countries/sl.png and /dev/null differ
diff --git a/htdocs/images/countries/so.png b/htdocs/images/countries/so.png
deleted file mode 100644
index d087512..0000000
Binary files a/htdocs/images/countries/so.png and /dev/null differ
diff --git a/htdocs/images/countries/sr.png b/htdocs/images/countries/sr.png
deleted file mode 100644
index e06354f..0000000
Binary files a/htdocs/images/countries/sr.png and /dev/null differ
diff --git a/htdocs/images/countries/sy.png b/htdocs/images/countries/sy.png
deleted file mode 100644
index be08e92..0000000
Binary files a/htdocs/images/countries/sy.png and /dev/null differ
diff --git a/htdocs/images/countries/tc.png b/htdocs/images/countries/tc.png
deleted file mode 100644
index e24e1ff..0000000
Binary files a/htdocs/images/countries/tc.png and /dev/null differ
diff --git a/htdocs/images/countries/tg.png b/htdocs/images/countries/tg.png
deleted file mode 100644
index 74ed93c..0000000
Binary files a/htdocs/images/countries/tg.png and /dev/null differ
diff --git a/htdocs/images/countries/th.png b/htdocs/images/countries/th.png
deleted file mode 100644
index 5e15d0e..0000000
Binary files a/htdocs/images/countries/th.png and /dev/null differ
diff --git a/htdocs/images/countries/tn.png b/htdocs/images/countries/tn.png
deleted file mode 100644
index f05f134..0000000
Binary files a/htdocs/images/countries/tn.png and /dev/null differ
diff --git a/htdocs/images/countries/to.png b/htdocs/images/countries/to.png
deleted file mode 100644
index b53e46f..0000000
Binary files a/htdocs/images/countries/to.png and /dev/null differ
diff --git a/htdocs/images/countries/tp.png b/htdocs/images/countries/tp.png
deleted file mode 100644
index f8b4dca..0000000
Binary files a/htdocs/images/countries/tp.png and /dev/null differ
diff --git a/htdocs/images/countries/tr.png b/htdocs/images/countries/tr.png
deleted file mode 100644
index 0ecd06c..0000000
Binary files a/htdocs/images/countries/tr.png and /dev/null differ
diff --git a/htdocs/images/countries/tt.png b/htdocs/images/countries/tt.png
deleted file mode 100644
index 927700c..0000000
Binary files a/htdocs/images/countries/tt.png and /dev/null differ
diff --git a/htdocs/images/countries/tv.png b/htdocs/images/countries/tv.png
deleted file mode 100644
index 433deec..0000000
Binary files a/htdocs/images/countries/tv.png and /dev/null differ
diff --git a/htdocs/images/countries/tw.png b/htdocs/images/countries/tw.png
deleted file mode 100644
index 2e82e66..0000000
Binary files a/htdocs/images/countries/tw.png and /dev/null differ
diff --git a/htdocs/images/countries/tz.png b/htdocs/images/countries/tz.png
deleted file mode 100644
index c668335..0000000
Binary files a/htdocs/images/countries/tz.png and /dev/null differ
diff --git a/htdocs/images/countries/ua.png b/htdocs/images/countries/ua.png
deleted file mode 100644
index db85d97..0000000
Binary files a/htdocs/images/countries/ua.png and /dev/null differ
diff --git a/htdocs/images/countries/ug.png b/htdocs/images/countries/ug.png
deleted file mode 100644
index 5c87b92..0000000
Binary files a/htdocs/images/countries/ug.png and /dev/null differ
diff --git a/htdocs/images/countries/us.png b/htdocs/images/countries/us.png
deleted file mode 100644
index 652cb3e..0000000
Binary files a/htdocs/images/countries/us.png and /dev/null differ
diff --git a/htdocs/images/countries/uy.png b/htdocs/images/countries/uy.png
deleted file mode 100644
index aec1979..0000000
Binary files a/htdocs/images/countries/uy.png and /dev/null differ
diff --git a/htdocs/images/countries/va.png b/htdocs/images/countries/va.png
deleted file mode 100644
index 0fc5b5f..0000000
Binary files a/htdocs/images/countries/va.png and /dev/null differ
diff --git a/htdocs/images/countries/ve.png b/htdocs/images/countries/ve.png
deleted file mode 100644
index 0a90e47..0000000
Binary files a/htdocs/images/countries/ve.png and /dev/null differ
diff --git a/htdocs/images/countries/vg.png b/htdocs/images/countries/vg.png
deleted file mode 100644
index 1ff7ca1..0000000
Binary files a/htdocs/images/countries/vg.png and /dev/null differ
diff --git a/htdocs/images/countries/vi.png b/htdocs/images/countries/vi.png
deleted file mode 100644
index c7e8572..0000000
Binary files a/htdocs/images/countries/vi.png and /dev/null differ
diff --git a/htdocs/images/countries/vn.png b/htdocs/images/countries/vn.png
deleted file mode 100644
index 31af3d5..0000000
Binary files a/htdocs/images/countries/vn.png and /dev/null differ
diff --git a/htdocs/images/countries/ws.png b/htdocs/images/countries/ws.png
deleted file mode 100644
index 654b842..0000000
Binary files a/htdocs/images/countries/ws.png and /dev/null differ
diff --git a/htdocs/images/countries/ye.png b/htdocs/images/countries/ye.png
deleted file mode 100644
index 4c547cc..0000000
Binary files a/htdocs/images/countries/ye.png and /dev/null differ
diff --git a/htdocs/images/countries/yu.png b/htdocs/images/countries/yu.png
deleted file mode 100644
index 9947f62..0000000
Binary files a/htdocs/images/countries/yu.png and /dev/null differ
diff --git a/htdocs/images/countries/za.png b/htdocs/images/countries/za.png
deleted file mode 100644
index f9745fa..0000000
Binary files a/htdocs/images/countries/za.png and /dev/null differ
diff --git a/htdocs/images/countries/zw.png b/htdocs/images/countries/zw.png
deleted file mode 100644
index 7e69c9e..0000000
Binary files a/htdocs/images/countries/zw.png and /dev/null differ
diff --git a/htdocs/images/default/key.png b/htdocs/images/default/key.png
old mode 100755
new mode 100644
diff --git a/htdocs/index.php b/htdocs/index.php
deleted file mode 100644
index e5d92ea..0000000
--- a/htdocs/index.php
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-If you are seeing this in your browser,
-PHP is not installed on your web server!!!
-
-
-*******************************************/
-
-/**
- * We will perform some sanity checking here, since this file is normally loaded first when users
- * first access the application.
- */
-
-# The index we will store our config in $_SESSION
-define('APPCONFIG','plaConfig');
-
-define('LIBDIR',sprintf('%s/',realpath('../lib/')));
-ini_set('display_errors',1);
-error_reporting(E_ALL);
-
-# General functions needed to proceed.
-ob_start();
-if (! file_exists(LIBDIR.'functions.php')) {
- if (ob_get_level()) ob_end_clean();
- die(sprintf("Fatal error: Required file '%sfunctions.php' does not exist.",LIBDIR));
-}
-
-if (! is_readable(LIBDIR.'functions.php')) {
- if (ob_get_level()) ob_end_clean();
- die(sprintf("Cannot read the file '%sfunctions.php' its permissions may be too strict.",LIBDIR));
-}
-
-if (ob_get_level())
- ob_end_clean();
-
-# Make sure this PHP install has pcre
-if (! extension_loaded('pcre'))
- die('
Your install of PHP appears to be missing PCRE support.
Please install PCRE support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)
');
-
-require LIBDIR.'functions.php';
-
-# Define the path to our configuration file.
-if (defined('CONFDIR'))
- $app['config_file'] = CONFDIR.'config.php';
-else
- $app['config_file'] = 'config.php';
-
-if (! is_readable($app['config_file'])) {
- if (ob_get_level()) ob_end_clean();
- die(sprintf("Missing configuration file %s - have you created it?",$app['config_file']));
-}
-
-# Make sure this PHP install has session support
-if (! extension_loaded('session'))
- error('
Your install of PHP appears to be missing php-session support.
Please install php-session support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)
','error',null,true);
-
-# Make sure this PHP install has gettext, we use it for language translation
-if (! extension_loaded('gettext'))
- system_message(array(
- 'title'=>_('Missing required extension'),
- 'body'=>'Your install of PHP appears to be missing GETTEXT support.
GETTEXT is used for language translation.
Please install GETTEXT support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)',
- 'type'=>'error'));
-
-# Make sure this PHP install has all our required extensions
-if (! extension_loaded('ldap'))
- system_message(array(
- 'title'=>_('Missing required extension'),
- 'body'=>'Your install of PHP appears to be missing LDAP support.
Please install LDAP support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)',
- 'type'=>'error'));
-
-# Make sure that we have php-xml loaded.
-if (! function_exists('xml_parser_create'))
- system_message(array(
- 'title'=>_('Missing required extension'),
- 'body'=>'Your install of PHP appears to be missing XML support.
Please install XML support before using phpLDAPadmin. (Dont forget to restart your web server afterwards)',
- 'type'=>'error'));
-
-/**
- * Helper functions.
- * Our required helper functions are defined in functions.php
- */
-if (isset($app['function_files']) && is_array($app['function_files']))
- foreach ($app['function_files'] as $file_name ) {
- if (! file_exists($file_name))
- error(sprintf('Fatal error: Required file "%s" does not exist.',$file_name),'error',null,true);
-
- if (! is_readable($file_name))
- error(sprintf('Fatal error: Cannot read the file "%s", its permissions may be too strict.',$file_name),'error',null,true);
-
- ob_start();
- require $file_name;
- if (ob_get_level()) ob_end_clean();
- }
-
-# Configuration File check
-if (! file_exists($app['config_file'])) {
- error(sprintf(_('You need to configure %s. Edit the file "%s" to do so. An example config file is provided in "%s.example".'),app_name(),$app['config_file'],$app['config_file']),'error',null,true);
-
-} elseif (! is_readable($app['config_file'])) {
- error(sprintf('Fatal error: Cannot read your configuration file "%s", its permissions may be too strict.',$app['config_file']),'error',null,true);
-}
-
-# If our config file fails the sanity check, then stop now.
-if (! $config = check_config($app['config_file'])) {
- $www['page'] = new page();
- $www['body'] = new block();
- $www['page']->block_add('body',$www['body']);
- $www['page']->display();
- exit;
-
-} else {
- app_session_start();
- $_SESSION[APPCONFIG] = $config;
-}
-
-if ($uri = get_request('URI','GET')) {
- header(sprintf('Location: cmd.php?%s',base64_decode($uri)));
- exit;
-}
-
-if (! preg_match('/^([0-9]+\.?)+/',app_version())) {
- system_message(array(
- 'title'=>_('This is a development version of phpLDAPadmin'),
- 'body'=>'This is a development version of phpLDAPadmin! You should NOT use it in a production environment (although we dont think it should do any damage).',
- 'type'=>'info','special'=>true));
-
- if (count($_SESSION[APPCONFIG]->untested()))
- system_message(array(
- 'title'=>'Untested configuration paramaters',
- 'body'=>sprintf('The following parameters have not been tested. If you have configured these parameters, and they are working as expected, please let the developers know, so that they can be removed from this message. %s',implode(', ',$_SESSION[APPCONFIG]->untested())),
- 'type'=>'info','special'=>true));
-
- $server = $_SESSION[APPCONFIG]->getServer(get_request('server_id','REQUEST'));
- if (count($server->untested()))
- system_message(array(
- 'title'=>'Untested server configuration paramaters',
- 'body'=>sprintf('The following parameters have not been tested. If you have configured these parameters, and they are working as expected, please let the developers know, so that they can be removed from this message. %s',implode(', ',$server->untested())),
- 'type'=>'info','special'=>true));
-}
-
-include './cmd.php';
-?>
diff --git a/htdocs/purge_cache.php b/htdocs/purge_cache.php
deleted file mode 100644
index 339fe73..0000000
--- a/htdocs/purge_cache.php
+++ /dev/null
@@ -1,33 +0,0 @@
-_('Purge cache'),
- 'body'=>$body,
- 'type'=>'info'),
- get_request('meth','REQUEST') == 'ajax' ? null : 'index.php');
-?>
diff --git a/htdocs/schema.php b/htdocs/schema.php
deleted file mode 100644
index aa4a749..0000000
--- a/htdocs/schema.php
+++ /dev/null
@@ -1,640 +0,0 @@
-%s.
%s
%s
%s
%s
%s
',
- _('Could not retrieve schema from'),$app['server']->getName(),
- _('This could happen for several reasons, the most probable of which are:'),_('The server does not fully support the LDAP protocol.'),
- _('Your version of PHP does not correctly perform the query.'),_('phpLDAPadmin doesn\'t know how to fetch the schema for your server.'),
- _('Or lastly, your LDAP server doesnt provide this information.'));
-
-printf('
';
-?>
diff --git a/index.php b/index.php
deleted file mode 100644
index 716e607..0000000
--- a/index.php
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/lib/AttributeFactory.php b/lib/AttributeFactory.php
index 82cf562..f52e939 100644
--- a/lib/AttributeFactory.php
+++ b/lib/AttributeFactory.php
@@ -96,18 +96,9 @@ class AttributeFactory {
return $this->newMultiLineAttribute($name,$values,$server_id,$source);
}
- if (! strcasecmp($name,'objectClass')) {
- return $this->newObjectClassAttribute($name,$values,$server_id,$source);
-
- } elseif ($app['server']->isJpegPhoto($name) || in_array($name,$app['server']->getValue('server','jpeg_attributes'))) {
- return $this->newJpegAttribute($name,$values,$server_id,$source);
-
- } elseif ($app['server']->isAttrBinary($name)) {
+ if ($app['server']->isAttrBinary($name)) {
return $this->newBinaryAttribute($name,$values,$server_id,$source);
- } elseif (! strcasecmp($name,'userPassword')) {
- return $this->newPasswordAttribute($name,$values,$server_id,$source);
-
} elseif (! strcasecmp($name,'sambaLMPassword') || ! strcasecmp($name,'sambaNTPassword')) {
return $this->newSambaPasswordAttribute($name,$values,$server_id,$source);
@@ -129,26 +120,11 @@ class AttributeFactory {
} elseif ($app['server']->isMultiLineAttr($name)) {
return $this->newMultiLineAttribute($name,$values,$server_id,$source);
- } elseif (! strcasecmp($name,'gidNumber')) {
- return $this->newGidAttribute($name,$values,$server_id,$source);
-
} else {
return new Attribute($name,$values,$server_id,$source);
}
}
- private function newJpegAttribute($name,$values,$server_id,$source) {
- return new JpegAttribute($name,$values,$server_id,$source);
- }
-
- private function newBinaryAttribute($name,$values,$server_id,$source) {
- return new BinaryAttribute($name,$values,$server_id,$source);
- }
-
- private function newPasswordAttribute($name,$values,$server_id,$source) {
- return new PasswordAttribute($name,$values,$server_id,$source);
- }
-
private function newSambaPasswordAttribute($name,$values,$server_id,$source) {
return new SambaPasswordAttribute($name,$values,$server_id,$source);
}
@@ -168,21 +144,5 @@ class AttributeFactory {
private function newMultiLineAttribute($name,$values,$server_id,$source) {
return new MultiLineAttribute($name,$values,$server_id,$source);
}
-
- private function newDateAttribute($name,$values,$server_id,$source) {
- return new DateAttribute($name,$values,$server_id,$source);
- }
-
- private function newObjectClassAttribute($name,$values,$server_id,$source) {
- return new ObjectClassAttribute($name,$values,$server_id,$source);
- }
-
- private function newDnAttribute($name,$values,$server_id,$source) {
- return new DnAttribute($name,$values,$server_id,$source);
- }
-
- private function newGidAttribute($name,$values,$server_id,$source) {
- return new GidAttribute($name,$values,$server_id,$source);
- }
}
?>
diff --git a/lib/BinaryAttribute.php b/lib/BinaryAttribute.php
deleted file mode 100644
index 6b5053b..0000000
--- a/lib/BinaryAttribute.php
+++ /dev/null
@@ -1,60 +0,0 @@
-filepaths = array();
- $this->filenames = array();
- }
-
- public function getFileNames() {
- return $this->filenames;
- }
-
- public function getFileName($i) {
- if (isset($this->filenames[$i])) return $this->filenames[$i];
- else return null;
- }
-
- public function addFileName($name, $i = -1) {
- if ($i < 0) {
- $this->filenames[] = $name;
- } else {
- $this->filenames[$i] = $name;
- }
- }
-
- public function getFilePaths() {
- return $this->filepaths;
- }
-
- public function getFilePath($i) {
- if (isset($this->filepaths[$i])) return $this->filepaths[$i];
- else return null;
- }
-
- public function addFilePath($path, $i = -1) {
- if ($i < 0) {
- $this->filepaths[] = $path;
- } else {
- $this->filepaths[$i] = $path;
- }
- }
-}
-?>
diff --git a/lib/DateAttribute.php b/lib/DateAttribute.php
deleted file mode 100644
index e1a687f..0000000
--- a/lib/DateAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/DnAttribute.php b/lib/DnAttribute.php
deleted file mode 100644
index 1f5c02f..0000000
--- a/lib/DnAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/GidAttribute.php b/lib/GidAttribute.php
deleted file mode 100644
index 7442a07..0000000
--- a/lib/GidAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/JpegAttribute.php b/lib/JpegAttribute.php
deleted file mode 100644
index d440048..0000000
--- a/lib/JpegAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/ObjectClassAttribute.php b/lib/ObjectClassAttribute.php
deleted file mode 100644
index 939094d..0000000
--- a/lib/ObjectClassAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/PageRender.php b/lib/PageRender.php
index d905c96..5d88498 100644
--- a/lib/PageRender.php
+++ b/lib/PageRender.php
@@ -430,49 +430,6 @@ class PageRender extends Visitor {
return '';
}
- #@todo this function shouldnt re-calculate requiredness, it should be known in the template already - need to set the ldaptype when initiating the attribute.
- protected function getNoteRequiredAttribute($attribute) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (DEBUGTMP) printf('%s ',__METHOD__);
-
- $required_by = '';
- $sattr_required = '';
-
- # Is this attribute required by an objectClass ?
- $sattr = $this->getServer()->getSchemaAttribute($attribute->getName());
- if ($sattr)
- $sattr_required = $sattr->getRequiredByObjectClasses();
-
- if ($sattr_required) {
- $oc = $this->template->getAttribute('objectclass');
-
- if ($oc)
- foreach ($oc->getValues() as $objectclass) {
- # If this objectclass is in our required list
- if (in_array_ignore_case($objectclass,$sattr_required)) {
- $required_by .= sprintf('%s ',$objectclass);
- continue;
- }
-
- # If not, see if it is in our parent.
- $sattr = $this->getServer()->getSchemaObjectClass($objectclass);
-
- if (array_intersect($sattr->getParents(),$sattr_required))
- $required_by .= sprintf('%s ',$objectclass);
- }
-
- else
- debug_dump_backtrace('How can there be no objectclasses?',1);
- }
-
- if ($required_by)
- return sprintf('%s',_('Required attribute for objectClass(es)'),$required_by,_('required'));
- else
- return '';
- }
-
protected function getNoteRDNAttribute($attribute) {
if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
debug_log('Entered (%%)',129,0,__FILE__,__LINE__,__METHOD__,$fargs);
diff --git a/lib/PasswordAttribute.php b/lib/PasswordAttribute.php
deleted file mode 100644
index 2667197..0000000
--- a/lib/PasswordAttribute.php
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/lib/ds_ldap.php b/lib/ds_ldap.php
index 6107552..e46a63b 100644
--- a/lib/ds_ldap.php
+++ b/lib/ds_ldap.php
@@ -1155,859 +1155,7 @@ class ldap extends DS {
}
}
- public function getRootDSE($method=null) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $query = array();
- $query['base'] = '';
- $query['scope'] = 'base';
- $query['attrs'] = $this->getValue('server','root_dse_attributes');
- $query['baseok'] = true;
- $results = $this->query($query,$method);
-
- if (is_array($results) && count($results) == 1)
- return array_change_key_case(array_pop($results));
- else
- return array();
- }
-
/** Schema Methods **/
- /**
- * This function will query the ldap server and request the subSchemaSubEntry which should be the Schema DN.
- *
- * If we cant connect to the LDAP server, we'll return false.
- * If we can connect but cant get the entry, then we'll return null.
- *
- * @param string Which connection method resource to use
- * @param dn The DN to use to obtain the schema
- * @return array|false Schema if available, null if its not or false if we cant connect.
- */
- private function getSchemaDN($method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # If we already got the SchemaDN, then return it.
- if ($this->_schemaDN)
- return $this->_schemaDN;
-
- if (! $this->connect($method))
- return false;
-
- $search = @ldap_read($this->connect($method),$dn,'objectclass=*',array('subschemaSubentry'),false,0,10,LDAP_DEREF_NEVER);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned (%s)',24,0,__FILE__,__LINE__,__METHOD__,is_resource($search));
-
- # Fix for broken ldap.conf configuration.
- if (! $search && ! $dn) {
- if (DEBUG_ENABLED)
- debug_log('Trying to find the DN for "broken" ldap.conf',80,0,__FILE__,__LINE__,__METHOD__);
-
- if (isset($this->_baseDN)) {
- foreach ($this->_baseDN as $base) {
- $search = @ldap_read($this->connect($method),$base,'objectclass=*',array('subschemaSubentry'),false,0,10,LDAP_DEREF_NEVER);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned (%s) for base (%s)',24,0,__FILE__,__LINE__,__METHOD__,
- is_resource($search),$base);
-
- if ($search)
- break;
- }
- }
- }
-
- if (! $search)
- return null;
-
- if (! @ldap_count_entries($this->connect($method),$search)) {
- if (DEBUG_ENABLED)
- debug_log('Search returned 0 entries. Returning NULL',25,0,__FILE__,__LINE__,__METHOD__);
-
- return null;
- }
-
- $entries = @ldap_get_entries($this->connect($method),$search);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned [%s]',24,0,__FILE__,__LINE__,__METHOD__,$entries);
-
- if (! $entries || ! is_array($entries))
- return null;
-
- $entry = isset($entries[0]) ? $entries[0] : false;
- if (! $entry) {
- if (DEBUG_ENABLED)
- debug_log('Entry is false, Returning NULL',80,0,__FILE__,__LINE__,__METHOD__);
-
- return null;
- }
-
- $sub_schema_sub_entry = isset($entry[0]) ? $entry[0] : false;
- if (! $sub_schema_sub_entry) {
- if (DEBUG_ENABLED)
- debug_log('Sub Entry is false, Returning NULL',80,0,__FILE__,__LINE__,__METHOD__);
-
- return null;
- }
-
- $this->_schemaDN = isset($entry[$sub_schema_sub_entry][0]) ? $entry[$sub_schema_sub_entry][0] : false;
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$this->_schemaDN);
-
- return $this->_schemaDN;
- }
-
- /**
- * Fetches the raw schema array for the subschemaSubentry of the server. Note,
- * this function has grown many hairs to accomodate more LDAP servers. It is
- * needfully complicated as it now supports many popular LDAP servers that
- * don't necessarily expose their schema "the right way".
- *
- * Please note: On FC systems, it seems that php_ldap uses /etc/openldap/ldap.conf in
- * the search base if it is blank - so edit that file and comment out the BASE line.
- *
- * @param string Which connection method resource to use
- * @param string A string indicating which type of schema to
- * fetch. Five valid values: 'objectclasses', 'attributetypes',
- * 'ldapsyntaxes', 'matchingruleuse', or 'matchingrules'.
- * Case insensitive.
- * @param dn (optional) This paremeter is the DN of the entry whose schema you
- * would like to fetch. Entries have the option of specifying
- * their own subschemaSubentry that points to the DN of the system
- * schema entry which applies to this attribute. If unspecified,
- * this will try to retrieve the schema from the RootDSE subschemaSubentry.
- * Failing that, we use some commonly known schema DNs. Default
- * value is the Root DSE DN (zero-length string)
- * @return array an array of strings of this form:
- * Array (
- * [0] => "(1.3.6.1.4.1.7165.1.2.2.4 NAME 'gidPool' DESC 'Pool ...
- * [1] => "(1.3.6.1.4.1.7165.2.2.3 NAME 'sambaAccount' DESC 'Sa ...
- * etc.
- */
- private function getRawSchema($method,$schema_to_fetch,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $valid_schema_to_fetch = array('objectclasses','attributetypes','ldapsyntaxes','matchingrules','matchingruleuse');
-
- if (! $this->connect($method) || $this->noconnect)
- return false;
-
- # error checking
- $schema_to_fetch = strtolower($schema_to_fetch);
-
- if (! is_null($this->_schema_entries) && isset($this->_schema_entries[$schema_to_fetch])) {
- $schema = $this->_schema_entries[$schema_to_fetch];
-
- if (DEBUG_ENABLED)
- debug_log('Returning CACHED (%s)',25,0,__FILE__,__LINE__,__METHOD__,$schema);
-
- return $schema;
- }
-
- # This error message is not localized as only developers should ever see it
- if (! in_array($schema_to_fetch,$valid_schema_to_fetch))
- error(sprintf('Bad parameter provided to function to %s::getRawSchema(). "%s" is not valid for the schema_to_fetch parameter.',
- get_class($this),$schema_to_fetch),'error','index.php');
-
- # Try to get the schema DN from the specified entry.
- $schema_dn = $this->getSchemaDN($method,$dn);
-
- # Do we need to try again with the Root DSE?
- if (! $schema_dn && trim($dn))
- $schema_dn = $this->getSchemaDN($method,'');
-
- # Store the eventual schema retrieval in $schema_search
- $schema_search = null;
-
- if ($schema_dn) {
- if (DEBUG_ENABLED)
- debug_log('Using Schema DN (%s)',24,0,__FILE__,__LINE__,__METHOD__,$schema_dn);
-
- foreach (array('(objectClass=*)','(objectClass=subschema)') as $schema_filter) {
- if (DEBUG_ENABLED)
- debug_log('Looking for schema with Filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,$schema_filter);
-
- $schema_search = @ldap_read($this->connect($method),$schema_dn,$schema_filter,array($schema_to_fetch),false,0,10,LDAP_DEREF_NEVER);
-
- if (is_null($schema_search))
- continue;
-
- $schema_entries = @ldap_get_entries($this->connect($method),$schema_search);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned [%s]',24,0,__FILE__,__LINE__,__METHOD__,$schema_entries);
-
- if (is_array($schema_entries) && isset($schema_entries['count']) && $schema_entries['count']) {
- if (DEBUG_ENABLED)
- debug_log('Found schema with (DN:%s) (FILTER:%s) (ATTR:%s)',24,0,__FILE__,__LINE__,__METHOD__,
- $schema_dn,$schema_filter,$schema_to_fetch);
-
- break;
- }
-
- if (DEBUG_ENABLED)
- debug_log('Didnt find schema with filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,$schema_filter);
-
- unset($schema_entries);
- $schema_search = null;
- }
- }
-
- /* Second chance: If the DN or Root DSE didn't give us the subschemaSubentry, ie $schema_search
- * is still null, use some common subSchemaSubentry DNs as a work-around. */
- if (is_null($schema_search)) {
- if (DEBUG_ENABLED)
- debug_log('Attempting work-arounds for "broken" LDAP servers...',24,0,__FILE__,__LINE__,__METHOD__);
-
- foreach ($this->getBaseDN() as $base) {
- $ldap['W2K3 AD'][expand_dn_with_base($base,'cn=Aggregate,cn=Schema,cn=configuration,')] = '(objectClass=*)';
- $ldap['W2K AD'][expand_dn_with_base($base,'cn=Schema,cn=configuration,')] = '(objectClass=*)';
- $ldap['W2K AD'][expand_dn_with_base($base,'cn=Schema,ou=Admin,')] = '(objectClass=*)';
- }
-
- # OpenLDAP and Novell
- $ldap['OpenLDAP']['cn=subschema'] = '(objectClass=*)';
-
- foreach ($ldap as $ldap_server_name => $ldap_options) {
- foreach ($ldap_options as $ldap_dn => $ldap_filter) {
- if (DEBUG_ENABLED)
- debug_log('Attempting [%s] (%s) (%s) ',24,0,__FILE__,__LINE__,__METHOD__,
- $ldap_server_name,$ldap_dn,$ldap_filter);
-
- $schema_search = @ldap_read($this->connect($method),$ldap_dn,$ldap_filter,array($schema_to_fetch),false,0,10,LDAP_DEREF_NEVER);
- if (is_null($schema_search))
- continue;
-
- $schema_entries = @ldap_get_entries($this->connect($method),$schema_search);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned [%s]',24,0,__FILE__,__LINE__,__METHOD__,$schema_entries);
-
- if ($schema_entries && isset($schema_entries[0][$schema_to_fetch])) {
- if (DEBUG_ENABLED)
- debug_log('Found schema with filter of (%s)',24,0,__FILE__,__LINE__,__METHOD__,$ldap_filter);
-
- break;
- }
-
- if (DEBUG_ENABLED)
- debug_log('Didnt find schema with filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,$ldap_filter);
-
- unset($schema_entries);
- $schema_search = null;
- }
- if ($schema_search)
- break;
- }
- }
-
- # Option 3: try cn=config
- $olc_schema = 'olc'.$schema_to_fetch;
- $olc_schema_found = false;
- if (is_null($schema_search)) {
- if (DEBUG_ENABLED)
- debug_log('Attempting cn=config work-around...',24,0,__FILE__,__LINE__,__METHOD__);
-
- $ldap_dn = 'cn=schema,cn=config';
- $ldap_filter = '(objectClass=*)';
-
- $schema_search = @ldap_search($this->connect($method),$ldap_dn,$ldap_filter,array($olc_schema),false,0,10,LDAP_DEREF_NEVER);
-
- if (! is_null($schema_search)) {
- $schema_entries = @ldap_get_entries($this->connect($method),$schema_search);
-
- if (DEBUG_ENABLED)
- debug_log('Search returned [%s]',24,0,__FILE__,__LINE__,__METHOD__,$schema_entries);
-
- if ($schema_entries) {
- if (DEBUG_ENABLED)
- debug_log('Found schema with filter of (%s) and attribute filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,$ldap_filter,$olc_schema);
-
- $olc_schema_found = true;
-
- } else {
- if (DEBUG_ENABLED)
- debug_log('Didnt find schema with filter (%s) and attribute filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,$ldap_filter,$olc_schema);
-
- unset($schema_entries);
- $schema_search = null;
- }
- }
- }
-
- if (is_null($schema_search)) {
- /* Still cant find the schema, try with the RootDSE
- * Attempt to pull schema from Root DSE with scope "base", or
- * Attempt to pull schema from Root DSE with scope "one" (work-around for Isode M-Vault X.500/LDAP) */
- foreach (array('base','one') as $ldap_scope) {
- if (DEBUG_ENABLED)
- debug_log('Attempting to find schema with scope (%s), filter (objectClass=*) and a blank base.',24,0,__FILE__,__LINE__,__METHOD__,
- $ldap_scope);
-
- switch ($ldap_scope) {
- case 'base':
- $schema_search = @ldap_read($this->connect($method),'','(objectClass=*)',array($schema_to_fetch),false,0,10,LDAP_DEREF_NEVER);
- break;
-
- case 'one':
- $schema_search = @ldap_list($this->connect($method),'','(objectClass=*)',array($schema_to_fetch),false,0,10,LDAP_DEREF_NEVER);
- break;
- }
-
- if (is_null($schema_search))
- continue;
-
- $schema_entries = @ldap_get_entries($this->connect($method),$schema_search);
- if (DEBUG_ENABLED)
- debug_log('Search returned [%s]',24,0,__FILE__,__LINE__,__METHOD__,$schema_entries);
-
- if ($schema_entries && isset($schema_entries[0][$schema_to_fetch])) {
- if (DEBUG_ENABLED)
- debug_log('Found schema with filter of (%s)',24,0,__FILE__,__LINE__,__METHOD__,'(objectClass=*)');
-
- break;
- }
-
- if (DEBUG_ENABLED)
- debug_log('Didnt find schema with filter (%s)',24,0,__FILE__,__LINE__,__METHOD__,'(objectClass=*)');
-
- unset($schema_entries);
- $schema_search = null;
- }
- }
-
- $schema_error_message = 'Please contact the phpLDAPadmin developers and let them know:
Which LDAP server you are running, including which version
What OS it is running on
Which version of PHP
As well as a link to some documentation that describes how to obtain the SCHEMA information
We\'ll then add support for your LDAP server in an upcoming release.';
- $schema_error_message_array = array('objectclasses','attributetypes');
-
- # Shall we just give up?
- if (is_null($schema_search)) {
- # We need to have objectclasses and attribues, so display an error, asking the user to get us this information.
- if (in_array($schema_to_fetch,$schema_error_message_array))
- system_message(array(
- 'title'=>sprintf('%s (%s)',_('Our attempts to find your SCHEMA have failed'),$schema_to_fetch),
- 'body'=>sprintf('%s: %s',_('Error'),$schema_error_message),
- 'type'=>'error'));
- else
- if (DEBUG_ENABLED)
- debug_log('Returning because schema_search is NULL ()',25,0,__FILE__,__LINE__,__METHOD__);
-
- # We'll set this, so if we return here our cache will return the known false.
- $this->_schema_entries[$schema_to_fetch] = false;
- return false;
- }
-
- if (! $schema_entries) {
- $return = false;
- if (DEBUG_ENABLED)
- debug_log('Returning false since ldap_get_entries() returned false.',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- if ($olc_schema_found) {
- unset ($schema_entries['count']);
-
- foreach ($schema_entries as $entry) {
- if (isset($entry[$olc_schema])) {
- unset($entry[$olc_schema]['count']);
-
- foreach ($entry[$olc_schema] as $schema_definition)
- /* Schema definitions in child nodes prefix the schema entries with "{n}"
- the preg_replace call strips out this prefix. */
- $schema[] = preg_replace('/^\{\d*\}\(/','(',$schema_definition);
- }
- }
-
- if (isset($schema)) {
- $this->_schema_entries[$olc_schema] = $schema;
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$schema);
-
- return $schema;
-
- } else
- return null;
- }
-
- if (! isset($schema_entries[0][$schema_to_fetch])) {
- if (in_array($schema_to_fetch,$schema_error_message_array)) {
- error(sprintf('Our attempts to find your SCHEMA for "%s" have return UNEXPECTED results.
(We expected a "%s" in the $schema array but it wasnt there.)
%s
Dump of $schema_search:
%s
',
- $schema_to_fetch,gettype($schema_search),$schema_error_message,serialize($schema_entries)),'error','index.php');
-
- } else {
- $return = false;
-
- if (DEBUG_ENABLED)
- debug_log('Returning because (%s) isnt in the schema array. (%s)',25,0,__FILE__,__LINE__,__METHOD__,$schema_to_fetch,$return);
-
- return $return;
- }
- }
-
- /* Make a nice array of this form:
- Array (
- [0] => "(1.3.6.1.4.1.7165.1.2.2.4 NAME 'gidPool' DESC 'Pool ...)"
- [1] => "(1.3.6.1.4.1.7165.2.2.3 NAME 'sambaAccount' DESC 'Sa ...)"
- etc.) */
-
- $schema = $schema_entries[0][$schema_to_fetch];
- unset($schema['count']);
- $this->_schema_entries[$schema_to_fetch] = $schema;
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$schema);
-
- return $schema;
- }
-
- /**
- * Gets a single ObjectClass object specified by name.
- *
- * @param string $oclass_name The name of the objectClass to fetch.
- * @param string $dn (optional) It is easier to fetch schema if a DN is provided
- * which defines the subschemaSubEntry attribute (all entries should).
- *
- * @return ObjectClass The specified ObjectClass object or false on error.
- *
- * @see ObjectClass
- * @see SchemaObjectClasses
- */
- public function getSchemaObjectClass($oclass_name,$method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $oclass_name = strtolower($oclass_name);
- $socs = $this->SchemaObjectClasses($method,$dn);
-
- # Default return value
- $return = false;
-
- if (isset($socs[$oclass_name]))
- $return = $socs[$oclass_name];
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * Gets a single AttributeType object specified by name.
- *
- * @param string $oclass_name The name of the AttributeType to fetch.
- * @param string $dn (optional) It is easier to fetch schema if a DN is provided
- * which defines the subschemaSubEntry attribute (all entries should).
- *
- * @return AttributeType The specified AttributeType object or false on error.
- *
- * @see AttributeType
- * @see SchemaAttributes
- */
- public function getSchemaAttribute($attr_name,$method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $attr_name = strtolower($attr_name);
- $sattrs = $this->SchemaAttributes($method,$dn);
-
- # Default return value
- $return = false;
-
- if (isset($sattrs[$attr_name]))
- $return = $sattrs[$attr_name];
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * Gets an associative array of ObjectClass objects for the specified
- * server. Each array entry's key is the name of the objectClass
- * in lower-case and the value is an ObjectClass object.
- *
- * @param string $dn (optional) It is easier to fetch schema if a DN is provided
- * which defines the subschemaSubEntry attribute (all entries should).
- *
- * @return array An array of ObjectClass objects.
- *
- * @see ObjectClass
- * @see getSchemaObjectClass
- */
- public function SchemaObjectClasses($method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # Set default return
- $return = null;
-
- if ($return = get_cached_item($this->index,'schema','objectclasses')) {
- if (DEBUG_ENABLED)
- debug_log('Returning CACHED [%s] (%s)',25,0,__FILE__,__LINE__,__METHOD__,$this->index,'objectclasses');
-
- return $return;
- }
-
- $raw = $this->getRawSchema($method,'objectclasses',$dn);
-
- if ($raw) {
- # Build the array of objectClasses
- $return = array();
-
- foreach ($raw as $line) {
- if (is_null($line) || ! strlen($line))
- continue;
-
- $object_class = new ObjectClass($line,$this);
- $return[$object_class->getName()] = $object_class;
- }
-
- # Now go through and reference the parent/child relationships
- foreach ($return as $oclass)
- foreach ($oclass->getSupClasses() as $parent_name)
- if (isset($return[strtolower($parent_name)]))
- $return[strtolower($parent_name)]->addChildObjectClass($oclass->getName(false));
-
- ksort($return);
-
- # cache the schema to prevent multiple schema fetches from LDAP server
- set_cached_item($this->index,'schema','objectclasses',$return);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * Gets an associative array of AttributeType objects for the specified
- * server. Each array entry's key is the name of the attributeType
- * in lower-case and the value is an AttributeType object.
- *
- * @param string $dn (optional) It is easier to fetch schema if a DN is provided
- * which defines the subschemaSubEntry attribute (all entries should).
- *
- * @return array An array of AttributeType objects.
- */
- public function SchemaAttributes($method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # Set default return
- $return = null;
-
- if ($return = get_cached_item($this->index,'schema','attributes')) {
- if (DEBUG_ENABLED)
- debug_log('(): Returning CACHED [%s] (%s)',25,0,__FILE__,__LINE__,__METHOD__,$this->index,'attributes');
-
- return $return;
- }
-
- $raw = $this->getRawSchema($method,'attributeTypes',$dn);
-
- if ($raw) {
- # build the array of attribueTypes
- $syntaxes = $this->SchemaSyntaxes($method,$dn);
- $attrs = array();
-
- /**
- * bug 856832: create two arrays - one indexed by name (the standard
- * $attrs array above) and one indexed by oid (the new $attrs_oid array
- * below). This will help for directory servers, like IBM's, that use OIDs
- * in their attribute definitions of SUP, etc
- */
- $attrs_oid = array();
- foreach ($raw as $line) {
- if (is_null($line) || ! strlen($line))
- continue;
-
- $attr = new AttributeType($line);
- if (isset($syntaxes[$attr->getSyntaxOID()])) {
- $syntax = $syntaxes[$attr->getSyntaxOID()];
- $attr->setType($syntax->getDescription());
- }
- $attrs[$attr->getName()] = $attr;
-
- /**
- * bug 856832: create an entry in the $attrs_oid array too. This
- * will be a ref to the $attrs entry for maintenance and performance
- * reasons
- */
- $attrs_oid[$attr->getOID()] = &$attrs[$attr->getName()];
- }
-
- # go back and add data from aliased attributeTypes
- foreach ($attrs as $name => $attr) {
- $aliases = $attr->getAliases();
-
- if (is_array($aliases) && count($aliases) > 0) {
- /* foreach of the attribute's aliases, create a new entry in the attrs array
- * with its name set to the alias name, and all other data copied.*/
- foreach ($aliases as $alias_attr_name) {
- $new_attr = clone $attr;
-
- $new_attr->setName($alias_attr_name);
- $new_attr->addAlias($attr->getName(false));
- $new_attr->removeAlias($alias_attr_name);
- $new_attr_key = strtolower($alias_attr_name);
- $attrs[$new_attr_key] = $new_attr;
- }
- }
- }
-
- # go back and add any inherited descriptions from parent attributes (ie, cn inherits name)
- foreach ($attrs as $key => $attr) {
- $sup_attr_name = $attr->getSupAttribute();
- $sup_attr = null;
-
- if (trim($sup_attr_name)) {
-
- /* This loop really should traverse infinite levels of inheritance (SUP) for attributeTypes,
- * but just in case we get carried away, stop at 100. This shouldn't happen, but for
- * some weird reason, we have had someone report that it has happened. Oh well.*/
- $i = 0;
- while ($i++<100 /** 100 == INFINITY ;) */) {
-
- if (isset($attrs_oid[$sup_attr_name])) {
- $attr->setSupAttribute($attrs_oid[$sup_attr_name]->getName());
- $sup_attr_name = $attr->getSupAttribute();
- }
-
- if (! isset($attrs[strtolower($sup_attr_name)])){
- error(sprintf('Schema error: attributeType "%s" inherits from "%s", but attributeType "%s" does not exist.',
- $attr->getName(),$sup_attr_name,$sup_attr_name),'error','index.php');
- return;
- }
-
- $sup_attr = $attrs[strtolower($sup_attr_name)];
- $sup_attr_name = $sup_attr->getSupAttribute();
-
- # Does this superior attributeType not have a superior attributeType?
- if (is_null($sup_attr_name) || strlen(trim($sup_attr_name)) == 0) {
-
- /* Since this attribute's superior attribute does not have another superior
- * attribute, clone its properties for this attribute. Then, replace
- * those cloned values with those that can be explicitly set by the child
- * attribute attr). Save those few properties which the child can set here:*/
- $tmp_name = $attr->getName(false);
- $tmp_oid = $attr->getOID();
- $tmp_sup = $attr->getSupAttribute();
- $tmp_aliases = $attr->getAliases();
- $tmp_single_val = $attr->getIsSingleValue();
- $tmp_desc = $attr->getDescription();
-
- /* clone the SUP attributeType and populate those values
- * that were set by the child attributeType */
- $attr = clone $sup_attr;
-
- $attr->setOID($tmp_oid);
- $attr->setName($tmp_name);
- $attr->setSupAttribute($tmp_sup);
- $attr->setAliases($tmp_aliases);
- $attr->setDescription($tmp_desc);
-
- /* only overwrite the SINGLE-VALUE property if the child explicitly sets it
- * (note: All LDAP attributes default to multi-value if not explicitly set SINGLE-VALUE) */
- if ($tmp_single_val)
- $attr->setIsSingleValue(true);
-
- /* replace this attribute in the attrs array now that we have populated
- new values therein */
- $attrs[$key] = $attr;
-
- # very important: break out after we are done with this attribute
- $sup_attr_name = null;
- $sup_attr = null;
- break;
- }
- }
- }
- }
-
- ksort($attrs);
-
- # Add the used in and required_by values.
- $socs = $this->SchemaObjectClasses($method);
- if (! is_array($socs))
- return array();
-
- foreach ($socs as $object_class) {
- $must_attrs = $object_class->getMustAttrNames();
- $may_attrs = $object_class->getMayAttrNames();
- $oclass_attrs = array_unique(array_merge($must_attrs,$may_attrs));
-
- # Add Used In.
- foreach ($oclass_attrs as $attr_name)
- if (isset($attrs[strtolower($attr_name)]))
- $attrs[strtolower($attr_name)]->addUsedInObjectClass($object_class->getName(false));
-
- # Add Required By.
- foreach ($must_attrs as $attr_name)
- if (isset($attrs[strtolower($attr_name)]))
- $attrs[strtolower($attr_name)]->addRequiredByObjectClass($object_class->getName(false));
-
- # Force May
- foreach ($object_class->getForceMayAttrs() as $attr_name)
- if (isset($attrs[strtolower($attr_name->name)]))
- $attrs[strtolower($attr_name->name)]->setForceMay();
- }
-
- $return = $attrs;
-
- # cache the schema to prevent multiple schema fetches from LDAP server
- set_cached_item($this->index,'schema','attributes',$return);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * Returns an array of MatchingRule objects for the specified server.
- * The key of each entry is the OID of the matching rule.
- */
- public function MatchingRules($method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # Set default return
- $return = null;
-
- if ($return = get_cached_item($this->index,'schema','matchingrules')) {
- if (DEBUG_ENABLED)
- debug_log('Returning CACHED [%s] (%s).',25,0,__FILE__,__LINE__,__METHOD__,$this->index,'matchingrules');
-
- return $return;
- }
-
- # build the array of MatchingRule objects
- $raw = $this->getRawSchema($method,'matchingRules',$dn);
-
- if ($raw) {
- $rules = array();
-
- foreach ($raw as $line) {
- if (is_null($line) || ! strlen($line))
- continue;
-
- $rule = new MatchingRule($line);
- $key = $rule->getName();
- $rules[$key] = $rule;
- }
-
- ksort($rules);
-
- /* For each MatchingRuleUse entry, add the attributes who use it to the
- * MatchingRule in the $rules array.*/
- $raw = $this->getRawSchema($method,'matchingRuleUse');
-
- if ($raw != false) {
- foreach ($raw as $line) {
- if (is_null($line) || ! strlen($line))
- continue;
-
- $rule_use = new MatchingRuleUse($line);
- $key = $rule_use->getName();
-
- if (isset($rules[$key]))
- $rules[$key]->setUsedByAttrs($rule_use->getUsedByAttrs());
- }
-
- } else {
- /* No MatchingRuleUse entry in the subschema, so brute-forcing
- * the reverse-map for the "$rule->getUsedByAttrs()" data.*/
- $sattrs = $this->SchemaAttributes($method,$dn);
- if (is_array($sattrs))
- foreach ($sattrs as $attr) {
- $rule_key = strtolower($attr->getEquality());
-
- if (isset($rules[$rule_key]))
- $rules[$rule_key]->addUsedByAttr($attr->getName(false));
- }
- }
-
- $return = $rules;
-
- # cache the schema to prevent multiple schema fetches from LDAP server
- set_cached_item($this->index,'schema','matchingrules',$return);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * Returns an array of Syntax objects that this LDAP server uses mapped to
- * their descriptions. The key of each entry is the OID of the Syntax.
- */
- public function SchemaSyntaxes($method=null,$dn='') {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',25,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # Set default return
- $return = null;
-
- if ($return = get_cached_item($this->index,'schema','syntaxes')) {
- if (DEBUG_ENABLED)
- debug_log('Returning CACHED [%s] (%s).',25,0,__FILE__,__LINE__,__METHOD__,$this->index,'syntaxes');
-
- return $return;
- }
-
- $raw = $this->getRawSchema($method,'ldapSyntaxes',$dn);
-
- if ($raw) {
- # build the array of attributes
- $return = array();
-
- foreach ($raw as $line) {
- if (is_null($line) || ! strlen($line))
- continue;
-
- $syntax = new Syntax($line);
- $key = strtolower(trim($syntax->getOID()));
-
- if (! $key)
- continue;
-
- $return[$key] = $syntax;
- }
-
- ksort($return);
-
- # cache the schema to prevent multiple schema fetches from LDAP server
- set_cached_item($this->index,'schema','syntaxes',$return);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%s)',25,0,__FILE__,__LINE__,__METHOD__,$return);
-
- return $return;
- }
-
- /**
- * This function determines if the specified attribute is contained in the force_may list
- * as configured in config.php.
- *
- * @return boolean True if the specified attribute is configured to be force as a may attribute
- */
- function isForceMay($attr_name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',17,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- return in_array($attr_name,unserialize(strtolower(serialize($this->getValue('server','force_may')))));
- }
/**
* Much like getDNAttrValues(), but only returns the values for
diff --git a/lib/ds_ldap_pla.php b/lib/ds_ldap_pla.php
index 5c9c15a..7631643 100644
--- a/lib/ds_ldap_pla.php
+++ b/lib/ds_ldap_pla.php
@@ -56,10 +56,6 @@ class ldap_pla extends ldap {
'desc'=>'Custom operational attributes to be treated as internal attributes',
'default'=>array('+'));
- $this->default->server['jpeg_attributes'] = array(
- 'desc'=>'Additional attributes to treat as Jpeg Attributes',
- 'default'=>array());
-
# This was added in case the LDAP server doesnt provide them with a base +,* query.
$this->default->server['root_dse_attributes'] = array(
'desc'=>'RootDSE attributes for use when displaying server info',
diff --git a/lib/functions.php b/lib/functions.php
index 51d856a..a06c813 100644
--- a/lib/functions.php
+++ b/lib/functions.php
@@ -1644,70 +1644,15 @@ function get_icon($server_id,$dn,$object_classes=array()) {
if (in_array('sambaaccount',$object_classes))
return 'nt_user.png';
- elseif (in_array('person',$object_classes) ||
- in_array('organizationalperson',$object_classes) ||
- in_array('inetorgperson',$object_classes) ||
- in_array('account',$object_classes) ||
- in_array('posixaccount',$object_classes))
-
- return 'ldap-user.png';
-
- elseif (in_array('organization',$object_classes))
- return 'ldap-o.png';
-
- elseif (in_array('organizationalunit',$object_classes))
- return 'ldap-ou.png';
-
elseif (in_array('organizationalrole',$object_classes))
return 'ldap-uid.png';
- elseif (in_array('dcobject',$object_classes) ||
- in_array('domainrelatedobject',$object_classes) ||
- in_array('domain',$object_classes) ||
- in_array('builtindomain',$object_classes))
-
- return 'ldap-dc.png';
-
- elseif (in_array('alias',$object_classes))
- return 'ldap-alias.png';
-
- elseif (in_array('room',$object_classes))
- return 'door.png';
-
- elseif (in_array('iphost',$object_classes))
- return 'host.png';
-
- elseif (in_array('device',$object_classes))
- return 'device.png';
-
- elseif (in_array('document',$object_classes))
- return 'document.png';
-
- elseif (in_array('country',$object_classes)) {
- $tmp = pla_explode_dn($dn);
- $cval = explode('=',$tmp[0],2);
- $cval = isset($cval[1]) ? $cval[1] : false;
- if ($cval && false === strpos($cval,'..') &&
- file_exists(realpath(sprintf('%s/../countries/%s.png',IMGDIR,strtolower($cval)))))
-
- return sprintf('../countries/%s.png',strtolower($cval));
-
- else
- return 'country.png';
- }
-
elseif (in_array('jammvirtualdomain',$object_classes))
return 'mail.png';
elseif (in_array('locality',$object_classes))
return 'locality.png';
- elseif (in_array('posixgroup',$object_classes) ||
- in_array('groupofnames',$object_classes) ||
- in_array('group',$object_classes))
-
- return 'ldap-ou.png';
-
elseif (in_array('applicationprocess',$object_classes))
return 'process.png';
@@ -1720,9 +1665,6 @@ function get_icon($server_id,$dn,$object_classes=array()) {
elseif (in_array('ndspkikeymaterial',$object_classes))
return 'lock.png';
- elseif (in_array('server',$object_classes))
- return 'server-small.png';
-
elseif (in_array('volume',$object_classes))
return 'hard-drive.png';
@@ -1841,34 +1783,6 @@ function random_salt($length) {
return $str;
}
-/**
- * Given a DN string, this returns the 'RDN' portion of the string.
- * For example. given 'cn=Manager,dc=example,dc=com', this function returns
- * 'cn=Manager' (it is really the exact opposite of ds_ldap::getContainer()).
- *
- * @param string The DN whose RDN to return.
- * @param boolean If true, include attributes in the RDN string. See http://php.net/ldap_explode_dn for details
- * @return string The RDN
- */
-function get_rdn($dn,$include_attrs=0,$decode=false) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (is_null($dn))
- return null;
-
- $rdn = pla_explode_dn($dn,$include_attrs);
- if (! count($rdn) || ! isset($rdn[0]))
- return $dn;
-
- if ($decode)
- $rdn = dn_unescape($rdn[0]);
- else
- $rdn = $rdn[0];
-
- return $rdn;
-}
-
/**
* Split an RDN into its attributes
*/
@@ -1944,66 +1858,6 @@ function pla_verbose_error($key) {
return array('title' => null,'desc' => null);
}
-/**
- * Given an LDAP OID number, returns a verbose description of the OID.
- * This function parses ldap_supported_oids.txt and looks up the specified
- * OID, and returns the verbose message defined in that file.
- *
- *
- * Array (
- * [title] => All Operational Attribute
- * [ref] => RFC 3673
- * [desc] => An LDAP extension which clients may use to request the return of all operational attributes.
- * )
- *
- *
- * @param string The OID number (ie, "1.3.6.1.4.1.4203.1.5.1") of the OID of interest.
- * @return array An associative array contianing the OID title and description like so:
- */
-function support_oid_to_text($key) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- static $CACHE = array();
-
- $unknown = array();
- $unknown['desc'] = 'We have no description for this OID, if you know what this OID provides, please let us know. Please also include an RFC reference if it is available.';
- $unknown['title'] = 'Can you help with this OID info?';
-
- if (! count($CACHE)) {
- $source_file = LIBDIR.'ldap_supported_oids.txt';
-
- if (! file_exists($source_file) || ! is_readable($source_file) || ! ($f = fopen($source_file,'r')))
- return false;
-
- $contents = fread($f,filesize($source_file));
- fclose($f);
- $entries = array();
- preg_match_all("/[0-9]\..+\s+\"[^\"]*\"\n/",$contents,$entries);
-
- foreach ($entries[0] as $values) {
- $entry = array();
- preg_match("/([0-9]\.([0-9]+\.)*[0-9]+)(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?/",$values,$entry);
- $oid_id = isset($entry[1]) ? $entry[1] : null;
-
- if ($oid_id) {
- $CACHE[$oid_id]['title'] = isset($entry[4]) ? $entry[4] : null;
- $CACHE[$oid_id]['ref'] = isset($entry[6]) ? $entry[6] : null;
- $desc = isset($entry[8]) ? $entry[8] : sprintf('%s',$unknown['desc'],$unknown['title']);
- $CACHE[$oid_id]['desc'] = preg_replace('/\s+/',' ',$desc);
- }
- }
- }
-
- if (isset($CACHE[$key]))
- return $CACHE[$key];
- else
- return array(
- 'title'=>$key,
- 'ref'=>null,
- 'desc'=>sprintf('%s',$unknown['desc'],$unknown['title']));
-}
-
/**
* Print an LDAP error message
*/
@@ -2825,41 +2679,6 @@ function pla_reverse_dn($dn) {
return (implode(',',array_reverse(pla_explode_dn($dn))));
}
-/**
- * Attribute sorting
- */
-function sortAttrs($a,$b) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',1,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if ($a == $b)
- return 0;
-
- $server = $_SESSION[APPCONFIG]->getServer(get_request('server_id','REQUEST'));
- $attrs_display_order = arrayLower($_SESSION[APPCONFIG]->getValue('appearance','attr_display_order'));
-
- # Check if $a is in $attrs_display_order, get its key
- $a_key = array_search($a->getName(),$attrs_display_order);
- $b_key = array_search($b->getName(),$attrs_display_order);
-
- if ((! $a_key) && ($a_key !== 0))
- if ((! $a_key = array_search(strtolower($a->getFriendlyName()),$attrs_display_order)) && ($a_key !== 0))
- $a_key = count($attrs_display_order)+1;
-
- if ((! $b_key) && ($b_key !== 0))
- if ((! $b_key = array_search(strtolower($b->getFriendlyName()),$attrs_display_order)) && ($b_key !== 0))
- $b_key = count($attrs_display_order)+1;
-
- # Case where neither $a, nor $b are in $attrs_display_order, $a_key = $b_key = one greater than num elements.
- # So we sort them alphabetically
- if ($a_key === $b_key)
- return strcasecmp($a->getFriendlyName(),$b->getFriendlyName());
-
- # Case where at least one attribute or its friendly name is in $attrs_display_order
- # return -1 if $a before $b in $attrs_display_order
- return ($a_key < $b_key) ? -1 : 1;
-}
-
/**
* Reads an array and returns the array values back in lower case
*
diff --git a/lib/ldap_supported_oids.txt b/lib/ldap_supported_oids.txt
deleted file mode 100644
index be71505..0000000
--- a/lib/ldap_supported_oids.txt
+++ /dev/null
@@ -1,188 +0,0 @@
-# If you find some reliable and more meaningful descriptions to this OIDS,
-# then please let the phpldapadmin development know so that this file can be
-# more descriptive.
-
-1.2.826.0.1.334810.2.3 "LDAP_CONTROL_VALUESRETURNFILTER"
-1.2.826.0.1.3344810.2.3 "Matched Values Control" "RFC 3876" "Describes a control for the LDAP v3 that is used to return a subset of attribute values from an entry. Specifically, only those values that match a 'values return' filter. Without support for this control, a client must retrieve all of an attribute's values and search for specific values locally."
-1.2.826.0.1050.11.1.1 "Read-Only LDAP Server"
-1.2.826.0.1050.11.2.1 "Read-Write LDAP Server"
-1.2.826.0.1050.11.3.1 "White Pages Application LDAP Server"
-1.2.826.0.1050.11.4.1 "Certificate Application LDAP Server"
-1.2.826.0.1050.11.5.1 "Single Sign On Application LDAP Server"
-1.2.840.113549.6.0.0 "Signed Operation"
-1.2.840.113549.6.0.1 "Demand Signed Result"
-1.2.840.113549.6.0.2 "Signed Result RFC 2649"
-1.2.840.113556.1.4.319 "Simple Paged Results Manipulation Control Extension" "RFC 2696" "This control extension allows a client to control the rate at which an LDAP server returns the results of an LDAP search operation. This control may be useful when the LDAP client has limited resources and may not be able to process the entire result set from a given LDAP query, or when the LDAP client is connected over a low-bandwidth connection."
-1.2.840.113556.1.4.417 "Show deleted control" "" "The LDAP_SERVER_SHOW_DELETED_OID control is used with an extended LDAP search function to specify that the search results include any deleted objects that match the search filter."
-1.2.840.113556.1.4.473 "LDAP Server Sort Result extension" "draft-ietf-ldapext-sorting-01" "This control is included in the searchRequest message as part of the controls field of the LDAPMessage."
-1.2.840.113556.1.4.474 "LDAP Server Sort Result extension response control" "" "This control is included in the searchResultDone message as part of the controls field of the LDAPMessage"
-1.2.840.113556.1.4.521 "Cross-domain move control" "" "The LDAP_SERVER_CROSSDOM_MOVE_TARGET_OID control is used with an extended LDAP rename function to move an LDAP object from one domain to another. The control specifies the DNS hostname of the domain controller in the destination domain."
-1.2.840.113556.1.4.528 "Server search notification control" "" "The LDAP_SERVER_NOTIFICATION_OID control is used with an extended LDAP asynchronous search function to register the client to be notified when changes are made to an object in Active Directory."
-1.2.840.113556.1.4.529 "Extended DN control" "" "The LDAP_SERVER_EXTENDED_DN_OID control is used with an extended LDAP search function to request an extended form of an Active Directory object distinguished name. The extended form includes a string representation of the object objectGUID property. For security principal objects such as users, groups, and computers, the extended form also includes a string representation of the object objectSID property."
-1.2.840.113556.1.4.616 "LDAP_CONTROL_REFERRALS"
-1.2.840.113556.1.4.619 "Lazy commit control" "" "The LDAP_SERVER_LAZY_COMMIT_OID control is used to instruct the server to return the results of a DS modification command, such as add, delete, or replace, after it has been completed in memory, but before it has been committed to disk. The server can then return results quickly, and save the data to disk without holding the client."
-1.2.840.113556.1.4.800 "LDAP_CAP_ACTIVE_DIRECTORY_OID" "" "This is an Actrive Directory Server (Win2k and later)."
-1.2.840.113556.1.4.801 "Security descriptor flags control" "" "The LDAP_SERVER_SD_FLAGS_OID control is used to pass flags to the server to control various security descriptor results."
-1.2.840.113556.1.4.802 "Attribute Range Option" "" "Server supports the Range property enabling clients to incremental retrieve values from multivalue attributes."
-1.2.840.113556.1.4.803 "LDAP_MATCHING_RULE_BIT_AND"
-1.2.840.113556.1.4.804 "LDAP_MATCHING_RULE_BIT_OR"
-1.2.840.113556.1.4.805 "Tree Delete" "" "The LDAP_SERVER_TREE_DELETE_OID control is used with an extended LDAP delete function to delete an entire subtree in the directory."
-1.2.840.113556.1.4.841 "Directory synchronization control" "" "The LDAP_SERVER_DIRSYNC_OID control enables an application to search the directory for objects changed from a previous state. It is also used with the extended LDAP search functions such as ldap_search_ext."
-1.2.840.113556.1.4.906 "Microsoft Large Integer"
-1.2.840.113556.1.4.970 "Get stats control (Stateless)"
-1.2.840.113556.1.4.1302 "Microsoft OID used with DEN Attributes"
-1.2.840.113556.1.4.1338 "Verify name control" "" "The LDAP_SERVER_VERIFY_NAME_OID control is used with extended LDAP add and modify requests to instruct the DC accepting the update which DC it should verify with, the existence of any DN attribute values."
-1.2.840.113556.1.4.1339 "LDAP_SERVER_DOMAIN_SCOPE_OID" "" "The LDAP_SERVER_DOMAIN_SCOPE_OID control is used to instruct the LDAP server not to generate any referrals when completing a request. This control also limits any search using it to a single naming context."
-1.2.840.113556.1.4.1340 "Search options control" "" " The LDAP_SERVER_SEARCH_OPTIONS_OID control is used to pass flags to the server to control various search behaviors."
-1.2.840.113556.1.4.1413 "LDAP ease modify restrictions" "" "Allows an LDAP modify to work under less restrictive conditions. Without it, a delete will fail if an attribute does not exist, and an add will fail if an attribute already exists."
-1.2.840.113556.1.4.1504 "Attribute scoped query control" "" "The LDAP_SERVER_ASQ_OID control is used with an extended LDAP search function to force the query to be based on a specific DN-valued attribute. Only one source attribute can be specified with this control and the search request is limited to base object scoped queries."
-1.2.840.113556.1.4.1670 "LDAP_CAP_ACTIVE_DIRECTORY_V51_OID" "" "This server is a Whistler Active Directory server (Win2k3 and later)."
-1.2.840.113556.1.4.1781 "Fast concurrent bind extended operation" "" "The Microsoft LDAP API will send an extended request with this name to Active Directory to request that all binds on this connection be processed as 'fast' binds."
-1.2.840.113556.1.4.1791 "LDAP_CAP_ACTIVE_DIRECTORY_LDAP_INTEG_OID" "" "LDAP server is capable of doing signing and sealing on an NTLM authenticated connection, and that the server is capable of performing subsequent binds on a signed or sealed connection."
-1.2.840.113556.1.4.1852 "LDAP_SERVER_QUOTA_CONTROL_OID" "" "The LDAP_SERVER_QUOTA_CONTROL_OID control is used to pass the SID of a security principal, whose quota is being queried, to the server in a LDAP search operation."
-1.3.6.1.1.7.1 "LCUP Sync Request Control. RFC 3928 control"
-1.3.6.1.1.7.2 "LCUP Sync Update Control. RFC 3928 control"
-1.3.6.1.1.7.3 "LCUP Sync Done Control. RFC 3928 control"
-1.3.6.1.1.8 "Cancel Operation. RFC 3909 extension"
-1.3.6.1.1.12 "Assertion Control" "RFC 4511" "The assertion control allows the client to specify a condition that must be true for the operation to be processed normally."
-1.3.6.1.1.13.1 "Pre-Read Controls" "" "The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned."
-1.3.6.1.1.13.2 "Post-Read Controls" "" "The Pre-Read request control, indicates that a copy of the entry before application of update is to be returned."
-1.3.6.1.1.14 "Modify-Increment Extension" "RFC 4525" "An extension to the Lightweight Directory Access Protocol (LDAP) Modify operation to support an increment capability."
-1.3.6.1.1.22 "Don't Use Copy Control" "RFC 9171" "When the control is attached to an LDAP request, the requested operation MUST NOT be performed on copied information. That is, the requested operation MUST be performed on original information."
-1.3.6.1.4.1.42.2.27.8.5.1 "passwordPolicyRequest"
-1.3.6.1.4.1.42.2.27.9.5.2 "GetEffectiveRights control" "" "May be used to determine what operations a given user may perform on a specified entry."
-1.3.6.1.4.1.1466.101.119.1 "Dynamic Directory Services Refresh Request" "RFC 2589"
-1.3.6.1.4.1.1466.20036 "LDAP_NOTICE_OF_DISCONNECTION"
-1.3.6.1.4.1.1466.20037 "Transport Layer Security Extension" "RFC 2830" "This operation provides for TLS establishment in an LDAP association and is defined in terms of an LDAP extended request."
-1.3.6.1.4.1.1466.29539.1 "LDAP_CONTROL_ATTR_SIZELIMIT"
-1.3.6.1.4.1.1466.29539.2 "LDAP_CONTROL_NO_COPY"
-1.3.6.1.4.1.1466.29539.3 "LDAP_CONTROL_PARTIAL_COPY"
-1.3.6.1.4.1.1466.29539.5 "LDAP_CONTROL_NO_CHAINING"
-1.3.6.1.4.1.1466.29539.7 "LDAP_CONTROL_ALIAS_ON_UPDATE"
-1.3.6.1.4.1.1466.29539.10 "LDAP_CONTROL_TRIGGER"
-1.3.6.1.4.1.1466.29539.12 "nsTransmittedControl"
-1.3.6.1.4.1.4203.1.5.1 "All Operational Attribute" "RFC 3673" "An LDAP extension which clients may use to request the return of all operational attributes."
-1.3.6.1.4.1.4203.1.5.2 "Requesting Attributes by Object Class" "draft-zeilenga-ldap-adlist-10.txt" "Extends LDAP to support a mechanism that LDAP clients may use to request the return of all attributes of an object class."
-1.3.6.1.4.1.4203.1.5.3 "LDAP Absolute True and False Filters" "draft-zeilenga-ldap-t-f-10.txt" "Implementations of this extension SHALL allow 'and' and 'or' choices with zero filter elements."
-1.3.6.1.4.1.4203.1.5.4 "Language Tags" "RFC 3866" "Supports storing attributes with language tag options in the DIT"
-1.3.6.1.4.1.4203.1.5.5 "Language Ranges" "RFC 3866" "Supports language range matching of attributes with language tag options stored in the DIT"
-1.3.6.1.4.1.4203.1.9.1.1 "LDAP Content Synchronization Control" "draft=zeilenga-ldup-sync-06.txt" "The operation allows a client to maintain a copy of a fragment of directory information tree. It supports both polling for changes and listening for changes. The operation is defined as an extension of the LDAP Search Operation."
-1.3.6.1.4.1.4203.1.10.1 "Subentries in LDAP" "RFC 3672" "The subentries control MAY be sent with a searchRequest to control the visibility of entries and subentries which are within scope. Non-visible entries or subentries are not returned in response to the request."
-1.3.6.1.4.1.4203.1.10.2 "LDAP No-Op Control" "draft-zeilenga-ldap-noop-02.txt" "The No-Op control can be used to disable the normal effect of an operation. The control can be used to discover how a server might react to a particular update request without updating the directory."
-1.3.6.1.4.1.4203.1.11.1 "LDAP Password Modify Extended Operation" "RFC 3062" "An LDAP extended operation to allow modification of user passwords which is not dependent upon the form of the authentication identity nor the password storage mechanism used."
-1.3.6.1.4.1.4203.1.11.2 "LDAP Cancel Extended Operation"
-1.3.6.1.4.1.4203.1.11.3 "Who Am I? Extended Operation" "draft-zeilenga-ldap-authzid-10.txt" "This specification provides a mechanism for Lightweight Directory Access Protocol (LDAP) clients to obtain the authorization identity which the server has associated with the user or application entity."
-1.3.6.1.4.1.4203.666.5.1 "Subentries Control"
-1.3.6.1.4.1.4203.666.5.2 "NO OP Control"
-1.3.18.0.2.12.1 "The ACL credential controls provide a method to flow a subject's credentials associated with a bind."
-1.3.18.0.2.12.5 "tranExtOpInit"
-1.3.18.0.2.12.6 "tranExtOpInit"
-2.16.840.1.113531.18.2.1 "LDAP_C_SETOPTIONS_OID"
-2.16.840.1.113531.18.2.2 "LDAP_C_SETDONTUSECOPY_OID"
-2.16.840.1.113531.18.2.3 "LDAP_C_SETLOCALSCOPE_OID"
-2.16.840.1.113531.18.2.4 "Return operational attributes as well as user attributes"
-2.16.840.1.113531.18.2.5 "Return only subentries"
-2.16.840.1.113531.18.2.6 "LDAP_C_SETUSEALIAS_OID"
-2.16.840.1.113531.18.2.7 "LDAP_C_SETPREFERCHAIN_OID"
-2.16.840.1.113531.18.2.8 "LDAP_C_SETX500DN_OID"
-2.16.840.1.113531.18.2.9 "LDAP_C_SETCOPYSHALLDO_OID"
-2.16.840.1.113531.18.2.10 "LDAP_C_SETDONTMAPATTRS_OID"
-2.16.840.1.113531.18.2.11 "Return normal entries as well as sub-entries"
-2.16.840.1.113719.1.27.99.1 "Superior References"
-2.16.840.1.113719.1.27.100.1 "ndsToLdapResponse"
-2.16.840.1.113719.1.27.100.2 "ndsToLdapRequest"
-2.16.840.1.113719.1.27.100.3 "createNamingContextRequest"
-2.16.840.1.113719.1.27.100.4 "createNamingContextResponse"
-2.16.840.1.113719.1.27.100.5 "mergeNamingContextRequest"
-2.16.840.1.113719.1.27.100.6 "mergeNamingContextResponse"
-2.16.840.1.113719.1.27.100.7 "addReplicaRequest"
-2.16.840.1.113719.1.27.100.8 "addReplicaResponse"
-2.16.840.1.113719.1.27.100.9 "refreshLDAPServerRequest"
-2.16.840.1.113719.1.27.100.10 "refreshLDAPServerResponse"
-2.16.840.1.113719.1.27.100.11 "removeReplicaRequest"
-2.16.840.1.113719.1.27.100.12 "removeReplicaResponse"
-2.16.840.1.113719.1.27.100.13 "namingContextEntryCountRequest"
-2.16.840.1.113719.1.27.100.14 "namingContextEntryCountResponse"
-2.16.840.1.113719.1.27.100.15 "changeReplicaTypeRequest"
-2.16.840.1.113719.1.27.100.16 "changeReplicaTypeResponse"
-2.16.840.1.113719.1.27.100.17 "getReplicaInfoRequest"
-2.16.840.1.113719.1.27.100.18 "getReplicaInfoResponse"
-2.16.840.1.113719.1.27.100.19 "listReplicaRequest"
-2.16.840.1.113719.1.27.100.20 "listReplicaResponse"
-2.16.840.1.113719.1.27.100.21 "receiveAllUpdatesRequest"
-2.16.840.1.113719.1.27.100.22 "receiveAllUpdatesResponse"
-2.16.840.1.113719.1.27.100.23 "sendAllUpdatesRequest"
-2.16.840.1.113719.1.27.100.24 "sendAllUpdatesResponse"
-2.16.840.1.113719.1.27.100.25 "requestNamingContextSyncRequest"
-2.16.840.1.113719.1.27.100.26 "requestNamingContextSyncResponse"
-2.16.840.1.113719.1.27.100.27 "requestSchemaSyncRequest"
-2.16.840.1.113719.1.27.100.28 "requestSchemaSyncResponse"
-2.16.840.1.113719.1.27.100.29 "abortNamingContextOperationRequest"
-2.16.840.1.113719.1.27.100.30 "abortNamingContextOperationResponse"
-2.16.840.1.113719.1.27.100.31 "Get Bind DN Request"
-2.16.840.1.113719.1.27.100.32 "Get Bind DN Response"
-2.16.840.1.113719.1.27.100.33 "Get Effective Privileges Request"
-2.16.840.1.113719.1.27.100.34 "Get Effective Privileges Response"
-2.16.840.1.113719.1.27.100.35 "Set Replication Filter Request"
-2.16.840.1.113719.1.27.100.36 "Set Replication Filter Response"
-2.16.840.1.113719.1.27.100.37 "Get Replication Filter Request"
-2.16.840.1.113719.1.27.100.38 "Get Replication Filter Response"
-2.16.840.1.113719.1.27.100.39 "Create Orphan Partition Request"
-2.16.840.1.113719.1.27.100.40 "Create Orphan Partition Response"
-2.16.840.1.113719.1.27.100.41 "Remove Orphan Partition Request"
-2.16.840.1.113719.1.27.100.42 "Remove Orphan Partition Response"
-2.16.840.1.113719.1.27.100.43 "Trigger Backlinker Request"
-2.16.840.1.113719.1.27.100.44 "Trigger Backlinker Response"
-2.16.840.1.113719.1.27.100.47 "Trigger Janitor Request"
-2.16.840.1.113719.1.27.100.48 "Trigger Janitor Response"
-2.16.840.1.113719.1.27.100.49 "Trigger Limber Request"
-2.16.840.1.113719.1.27.100.50 "Trigger Limber Response"
-2.16.840.1.113719.1.27.100.51 "Trigger Skulker Request"
-2.16.840.1.113719.1.27.100.52 "Trigger Skulker Response"
-2.16.840.1.113719.1.27.100.53 "Trigger Schema Synch Request"
-2.16.840.1.113719.1.27.100.54 "Trigger Schema Synch Response"
-2.16.840.1.113719.1.27.100.55 "Trigger Partition Purge Request"
-2.16.840.1.113719.1.27.100.56 "Trigger Partition Purge Response"
-2.16.840.1.113719.1.27.100.79 "Monitor Events Request"
-2.16.840.1.113719.1.27.100.80 "Monitor Events Response"
-2.16.840.1.113719.1.27.100.81 "Event Notification"
-2.16.840.1.113719.1.27.101.1 "Duplicate Entry Request"
-2.16.840.1.113719.1.27.101.2 "DuplicateSearchResult"
-2.16.840.1.113719.1.27.101.3 "DuplicateEntryResponseDone"
-2.16.840.1.113719.1.27.101.5 "Simple Password"
-2.16.840.1.113719.1.27.101.6 "Forward Reference"
-2.16.840.1.113719.1.142.100.1 "startFramedProtocolRequest"
-2.16.840.1.113719.1.142.100.2 "startFramedProtocolResponse"
-2.16.840.1.113719.1.142.100.3 "ReplicationUpdate"
-2.16.840.1.113719.1.142.100.4 "endFramedProtocolRequest"
-2.16.840.1.113719.1.142.100.5 "endFramedProtocolResponse"
-2.16.840.1.113719.1.142.100.6 "lburpOperationRequest"
-2.16.840.1.113719.1.142.100.7 "lburpOperationResponse"
-2.16.840.1.113730.3.4 "Netscape LDAPv3 controls"
-2.16.840.1.113730.3.4.2 "ManageDsaIT Control" "RFC 3296" "The client may provide the ManageDsaIT control with an operation to indicate that the operation is intended to manage objects within the DSA (server) Information Tree. The control causes Directory-specific entries (DSEs), regardless of type, to be treated as normal entries allowing clients to interrogate and update these entries using LDAP operations."
-2.16.840.1.113730.3.4.3 "Persistent Search LDAPv3 control"
-2.16.840.1.113730.3.4.4 "Netscape Password Expired LDAPv3 control"
-2.16.840.1.113730.3.4.5 "Netscape Password Expiring LDAPv3 control"
-2.16.840.1.113730.3.4.6 "Netscape NT Synchronization Client LDAPv3 control"
-2.16.840.1.113730.3.4.7 "Entry Change Notification LDAPv3 control"
-2.16.840.1.113730.3.4.8 "Transaction ID Request Control"
-2.16.840.1.113730.3.4.9 "VLV Request LDAPv3 control" "" "As defined in the 'LDAPv3 Extensions for Virtual List View' IETF document."
-2.16.840.1.113730.3.4.10 "VLV Response LDAPv3 control" "" "As defined in the 'LDAPv3 Extensions for Virtual List View' IETF document."
-2.16.840.1.113730.3.4.11 "Transaction ID Response Control"
-2.16.840.1.113730.3.4.12 "Proxied Authorization (version 1) control" "draft-weltman-ldapv3-proxy-05" "For assuming the identity of another entry for the duration of a request. This has been replaced by a new 'version 2' Proxied Authorization control."
-2.16.840.1.113730.3.4.13 "iPlanet Directory Server Replication Update Information Control"
-2.16.840.1.113730.3.4.14 "iPlanet Directory Server 'search on specific backend' control"
-2.16.840.1.113730.3.4.15 "Authentication Response Control"
-2.16.840.1.113730.3.4.16 "Authentication Request Control"
-2.16.840.1.113730.3.4.17 "Real Attributes Only Request Control"
-2.16.840.1.113730.3.4.18 "LDAP Proxied Authorization Control" "draft-weltman-ldapv3-proxy-06.txt" "The Proxied Authorization Control allows a client to request that an operation be processed under a provided authorization identity [AUTH] instead of as the current authorization identity associated with the connection."
-2.16.840.1.113730.3.4.19 "Virtual Attributes Only Request Control"
-2.16.840.1.113730.3.4.20 "Use One Backend"
-2.16.840.1.113730.3.4.999 "iPlanet Replication Modrdn Extra Mods Control"
-2.16.840.1.113730.3.5.3 "iPlanet Start Replication Request Extended Operation"
-2.16.840.1.113730.3.5.4 "iPlanet Replication Response Extended Operation"
-2.16.840.1.113730.3.5.5 "iPlanet End Replication Request Extended Operation"
-2.16.840.1.113730.3.5.6 "iPlanet Replication Entry Request Extended Operation"
-2.16.840.1.113730.3.5.7 "iPlanet Bulk Import Start Extended Operation"
-2.16.840.1.113730.3.5.8 "iPlanet Bulk Import Finished Extended Operation"
-2.16.840.1.113730.3.5.9 "iPlanet Digest authentication calculation"
diff --git a/lib/schema_functions.php b/lib/schema_functions.php
deleted file mode 100644
index efa0cbc..0000000
--- a/lib/schema_functions.php
+++ /dev/null
@@ -1,1539 +0,0 @@
-oid = $oid;
- }
-
- public function setDescription($desc) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->description = $desc;
- }
-
- public function getOID() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->oid);
-
- return $this->oid;
- }
-
- public function getDescription() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->description);
-
- return $this->description;
- }
-
- /**
- * Gets whether this objectClass is flagged as obsolete by the LDAP server.
- */
- public function getIsObsolete() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->is_obsolete);
-
- return $this->is_obsolete;
- }
-
- /**
- * Return the objects name.
- *
- * param boolean $lower Return the name in lower case (default)
- * @return string The name
- */
- public function getName($lower=true) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->name);
-
- return $lower ? strtolower($this->name) : $this->name;
- }
-}
-
-/**
- * Represents an LDAP objectClass
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class ObjectClass extends SchemaItem {
- # The server ID that this objectclass belongs to.
- private $server_id = null;
- # Array of objectClass names from which this objectClass inherits
- private $sup_classes = array();
- # One of STRUCTURAL, ABSTRACT, or AUXILIARY
- private $type;
- # Arrays of attribute names that this objectClass requires
- private $must_attrs = array();
- # Arrays of attribute names that this objectClass allows, but does not require
- private $may_attrs = array();
- # Arrays of attribute names that this objectClass has been forced to MAY attrs, due to configuration
- private $force_may = array();
- # Array of objectClasses which inherit from this one (must be set at runtime explicitly by the caller)
- private $children_objectclasses = array();
- # The objectclass hierarchy
- private $hierarchy = array();
-
- /**
- * Creates a new ObjectClass object given a raw LDAP objectClass string.
- */
- public function __construct($class,$server) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->server_id = $server->getIndex();
- $this->type = $server->getValue('server','schema_oclass_default');
-
- $strings = preg_split('/[\s,]+/',$class,-1,PREG_SPLIT_DELIM_CAPTURE);
- $str_count = count($strings);
-
- for ($i=0; $i < $str_count; $i++) {
-
- switch ($strings[$i]) {
- case '(':
- break;
-
- case 'NAME':
- if ($strings[$i+1]!='(') {
- do {
- $i++;
- if (strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
-
- } while (! preg_match('/\'$/s',$strings[$i]));
-
- } else {
- $i++;
- do {
- $i++;
- if (strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
-
- } while (! preg_match('/\'$/s',$strings[$i]));
-
- do {
- $i++;
- } while (! preg_match('/\)+\)?/',$strings[$i]));
- }
-
- $this->name = preg_replace('/^\'/','',$this->name);
- $this->name = preg_replace('/\'$/','',$this->name);
-
- if (DEBUG_ENABLED)
- debug_log('Case NAME returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->name);
- break;
-
- case 'DESC':
- do {
- $i++;
- if (strlen($this->description) == 0)
- $this->description=$this->description.$strings[$i];
- else
- $this->description=$this->description.' '.$strings[$i];
-
- } while (! preg_match('/\'$/s',$strings[$i]));
-
- if (DEBUG_ENABLED)
- debug_log('Case DESC returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->description);
- break;
-
- case 'OBSOLETE':
- $this->is_obsolete = TRUE;
-
- if (DEBUG_ENABLED)
- debug_log('Case OBSOLETE returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->is_obsolete);
- break;
-
- case 'SUP':
- if ($strings[$i+1] != '(') {
- $i++;
- array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i]));
-
- } else {
- $i++;
- do {
- $i++;
- if ($strings[$i] != '$')
- array_push($this->sup_classes,preg_replace("/'/",'',$strings[$i]));
-
- } while (! preg_match('/\)+\)?/',$strings[$i+1]));
- }
-
- if (DEBUG_ENABLED)
- debug_log('Case SUP returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->sup_classes);
- break;
-
- case 'ABSTRACT':
- $this->type = 'abstract';
-
- if (DEBUG_ENABLED)
- debug_log('Case ABSTRACT returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->type);
- break;
-
- case 'STRUCTURAL':
- $this->type = 'structural';
-
- if (DEBUG_ENABLED)
- debug_log('Case STRUCTURAL returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->type);
- break;
-
- case 'AUXILIARY':
- $this->type = 'auxiliary';
-
- if (DEBUG_ENABLED)
- debug_log('Case AUXILIARY returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->type);
- break;
-
- case 'MUST':
- $attrs = array();
-
- $i = $this->parseList(++$i,$strings,$attrs);
-
- if (DEBUG_ENABLED)
- debug_log('parseList returned %d (%s)',8,0,__FILE__,__LINE__,__METHOD__,$i,$attrs);
-
- foreach ($attrs as $string) {
- $attr = new ObjectClass_ObjectClassAttribute($string,$this->name);
-
- if ($server->isForceMay($attr->getName())) {
- array_push($this->force_may,$attr);
- array_push($this->may_attrs,$attr);
-
- } else
- array_push($this->must_attrs,$attr);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Case MUST returned (%s) (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->must_attrs,$this->force_may);
- break;
-
- case 'MAY':
- $attrs = array();
-
- $i = $this->parseList(++$i,$strings,$attrs);
-
- if (DEBUG_ENABLED)
- debug_log('parseList returned %d (%s)',8,0,__FILE__,__LINE__,__METHOD__,$i,$attrs);
-
- foreach ($attrs as $string) {
- $attr = new ObjectClass_ObjectClassAttribute($string,$this->name);
- array_push($this->may_attrs,$attr);
- }
-
- if (DEBUG_ENABLED)
- debug_log('Case MAY returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->may_attrs);
- break;
-
- default:
- if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) {
- $this->setOID($strings[$i]);
-
- if (DEBUG_ENABLED)
- debug_log('Case default returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->getOID());
- }
- break;
- }
- }
-
- $this->description = preg_replace("/^\'/",'',$this->description);
- $this->description = preg_replace("/\'$/",'',$this->description);
-
- if (DEBUG_ENABLED)
- debug_log('Returning () - NAME (%s), DESCRIPTION (%s), MUST (%s), MAY (%s), FORCE MAY (%s)',9,0,__FILE__,__LINE__,__METHOD__,
- $this->name,$this->description,$this->must_attrs,$this->may_attrs,$this->force_may);
- }
-
- /**
- * Parse an LDAP schema list
- */
- private function parseList($i,$strings,&$attrs) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- /*
- * A list starts with a ( followed by a list of attributes separated by $ terminated by )
- * The first token can therefore be a ( or a (NAME or a (NAME)
- * The last token can therefore be a ) or NAME)
- * The last token may be terminate by more than one bracket
- */
-
- $string = $strings[$i];
- if (! preg_match('/^\(/',$string)) {
- # A bareword only - can be terminated by a ) if the last item
- if (preg_match('/\)+$/',$string))
- $string = preg_replace('/\)+$/','',$string);
-
- array_push($attrs,$string);
-
- } elseif (preg_match('/^\(.*\)$/',$string)) {
- $string = preg_replace('/^\(/','',$string);
- $string = preg_replace('/\)+$/','',$string);
- array_push($attrs,$string);
-
- } else {
- # Handle the opening cases first
- if ($string == '(') {
- $i++;
-
- } elseif (preg_match('/^\(./',$string)) {
- $string = preg_replace('/^\(/','',$string);
- array_push($attrs,$string);
- $i++;
- }
-
- # Token is either a name, a $ or a ')'
- # NAME can be terminated by one or more ')'
- while (! preg_match('/\)+$/',$strings[$i])) {
- $string = $strings[$i];
- if ($string == '$') {
- $i++;
- continue;
- }
-
- if (preg_match('/\)$/',$string))
- $string = preg_replace('/\)+$/','',$string);
- else
- $i++;
-
- array_push($attrs,$string);
- }
- }
-
- sort($attrs);
-
- if (DEBUG_ENABLED)
- debug_log('Returning (%d,[%s],[%s])',9,0,__FILE__,__LINE__,__METHOD__,$i,$strings,$attrs);
-
- return $i;
- }
-
- /**
- * This will return all our parent ObjectClass Objects
- */
- public function getParents() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if ((count($this->sup_classes) == 1) && ($this->sup_classes[0] == 'top'))
- return array();
-
- $server = $_SESSION[APPCONFIG]->getServer($this->server_id);
- $return = array();
-
- foreach ($this->sup_classes as $object_class) {
- array_push($return,$object_class);
-
- $oc = $server->getSchemaObjectClass($object_class);
-
- if ($oc)
- $return = array_merge($return,$oc->getParents());
- }
-
- return $return;
- }
-
- /**
- * Gets an array of AttributeType objects that entries of this ObjectClass must define.
- * This differs from getMustAttrNames in that it returns an array of AttributeType objects
- *
- * @param array $parents An array of ObjectClass objects to use when traversing
- * the inheritance tree. This presents some what of a bootstrapping problem
- * as we must fetch all objectClasses to determine through inheritance which
- * attributes this objectClass requires.
- * @return array The array of required AttributeType objects.
- *
- * @see getMustAttrNames
- * @see getMayAttrs
- * @see getMayAttrNames
- */
- public function getMustAttrs($parents=false) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (! $parents)
- return $this->must_attrs;
-
- $server = $_SESSION[APPCONFIG]->getServer($this->server_id);
- $attrs = $this->must_attrs;
-
- foreach ($this->getParents() as $sup_class) {
- $sc = $server->getSchemaObjectClass($sup_class);
- $attrs = array_merge($attrs,$sc->getMustAttrs());
- }
-
- masort($attrs,'name,source');
-
- # Remove any duplicates
- foreach ($attrs as $index => $attr)
- if (isset($allattr[$attr->getName()]))
- unset($attrs[$index]);
- else
- $allattr[$attr->getName()] = 1;
-
- return $attrs;
- }
-
- /**
- * Gets an array of AttributeType objects that entries of this ObjectClass may define.
- * This differs from getMayAttrNames in that it returns an array of AttributeType objects
- *
- * @param array $parents An array of ObjectClass objects to use when traversing
- * the inheritance tree. This presents some what of a bootstrapping problem
- * as we must fetch all objectClasses to determine through inheritance which
- * attributes this objectClass provides.
- * @return array The array of allowed AttributeType objects.
- *
- * @see getMustAttrNames
- * @see getMustAttrs
- * @see getMayAttrNames
- * @see AttributeType
- */
- public function getMayAttrs($parents=false) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (! $parents)
- return $this->may_attrs;
-
- $server = $_SESSION[APPCONFIG]->getServer($this->server_id);
- $attrs = $this->may_attrs;
-
- foreach ($this->getParents() as $sup_class) {
- $sc = $server->getSchemaObjectClass($sup_class);
- $attrs = array_merge($attrs,$sc->getMayAttrs());
- }
-
- masort($attrs,'name,source');
-
- # Remove any duplicates
- foreach ($attrs as $index => $attr)
- if (isset($allattr[$attr->name]))
- unset($attrs[$index]);
- else
- $allattr[$attr->name] = 1;
-
- return $attrs;
- }
-
- public function getForceMayAttrs() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- return $this->force_may;
- }
-
- /**
- * Gets an array of attribute names (strings) that entries of this ObjectClass must define.
- * This differs from getMustAttrs in that it returns an array of strings rather than
- * array of AttributeType objects
- *
- * @param array $parents An array of ObjectClass objects to use when traversing
- * the inheritance tree. This presents some what of a bootstrapping problem
- * as we must fetch all objectClasses to determine through inheritance which
- * attributes this objectClass provides.
- * @return array The array of allowed attribute names (strings).
- *
- * @see getMustAttrs
- * @see getMayAttrs
- * @see getMayAttrNames
- */
- public function getMustAttrNames($parents=false) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $attr_names = array();
-
- foreach ($this->getMustAttrs($parents) as $attr)
- array_push($attr_names,$attr->getName());
-
- return $attr_names;
- }
-
- /**
- * Gets an array of attribute names (strings) that entries of this ObjectClass must define.
- * This differs from getMayAttrs in that it returns an array of strings rather than
- * array of AttributeType objects
- *
- * @param array $parents An array of ObjectClass objects to use when traversing
- * the inheritance tree. This presents some what of a bootstrapping problem
- * as we must fetch all objectClasses to determine through inheritance which
- * attributes this objectClass provides.
- * @return array The array of allowed attribute names (strings).
- *
- * @see getMustAttrs
- * @see getMayAttrs
- * @see getMustAttrNames
- */
- public function getMayAttrNames($parents=false) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $attr_names = array();
-
- foreach ($this->getMayAttrs($parents) as $attr)
- array_push($attr_names,$attr->getName());
-
- return $attr_names;
- }
-
- /**
- * Adds an objectClass to the list of objectClasses that inherit
- * from this objectClass.
- *
- * @param String $name The name of the objectClass to add
- * @return boolean Returns true on success or false on failure (objectclass already existed for example)
- */
- public function addChildObjectClass($name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $name = trim($name);
-
- foreach ($this->children_objectclasses as $existing_objectclass)
- if (strcasecmp($name,$existing_objectclass) == 0)
- return false;
-
- array_push($this->children_objectclasses,$name);
- }
-
- /**
- * Returns the array of objectClass names which inherit from this objectClass.
- *
- * @return Array Names of objectClasses which inherit from this objectClass.
- */
- public function getChildObjectClasses() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- return $this->children_objectclasses;
- }
-
- /**
- * Gets the objectClass names from which this objectClass inherits.
- *
- * @return array An array of objectClass names (strings)
- */
- public function getSupClasses() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- return $this->sup_classes;
- }
-
- /**
- * Return if this objectClass is related to $oclass
- *
- * @param array ObjectClasses that this attribute may be related to
- */
- public function isRelated($oclass) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- # If I am in the array, we'll just return false
- if (in_array_ignore_case($this->name,$oclass))
- return false;
-
- $server = $_SESSION[APPCONFIG]->getServer($this->server_id);
-
- foreach ($oclass as $object_class) {
- $oc = $server->getSchemaObjectClass($object_class);
-
- if ($oc->isStructural() && in_array_ignore_case($this->getName(),$oc->getParents()))
- return true;
- }
-
- return false;
- }
-
- /**
- * Gets the type of this objectClass: STRUCTURAL, ABSTRACT, or AUXILIARY.
- */
- public function getType() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->type);
-
- return $this->type;
- }
-
- /**
- * Adds the specified array of attributes to this objectClass' list of
- * MUST attributes. The resulting array of must attributes will contain
- * unique members.
- *
- * @param array $attr An array of attribute names (strings) to add.
- */
- private function addMustAttrs($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (! is_array($attr) || ! count($attr))
- return;
-
- $this->must_attrs = array_values(array_unique(array_merge($this->must_attrs,$attr)));
- }
-
- /**
- * Behaves identically to addMustAttrs, but it operates on the MAY
- * attributes of this objectClass.
- *
- * @param array $attr An array of attribute names (strings) to add.
- */
- private function addMayAttrs($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if (! is_array($attr) || ! count($attr))
- return;
-
- $this->may_attrs = array_values(array_unique(array_merge($this->may_attrs,$attr)));
- }
-
- /**
- * Determine if an array is listed in the force_may attrs
- */
- public function isForceMay($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->force_may as $forcemay)
- if ($forcemay->getName() == $attr)
- return true;
-
- return false;
- }
-
- public function isStructural() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- if ($this->type == 'structural')
- return true;
- else
- return false;
- }
-}
-
-/**
- * A simple class for representing AttributeTypes used only by the ObjectClass class.
- * Users should never instantiate this class. It represents an attribute internal to
- * an ObjectClass. If PHP supported inner-classes and variable permissions, this would
- * be interior to class ObjectClass and flagged private. The reason this class is used
- * and not the "real" class AttributeType is because this class supports the notion of
- * a "source" objectClass, meaning that it keeps track of which objectClass originally
- * specified it. This class is therefore used by the class ObjectClass to determine
- * inheritance.
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class ObjectClass_ObjectClassAttribute {
- # This Attribute's name (needs to be public, as we sort on it with masort).
- public $name;
- # This Attribute's root (needs to be public, as we sort on it with masort).
- public $source;
-
- /**
- * Creates a new ObjectClass_ObjectClassAttribute with specified name and source objectClass.
- *
- * @param string $name the name of the new attribute.
- * @param string $source the name of the ObjectClass which specifies this attribute.
- */
- public function __construct($name,$source) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->name = $name;
- $this->source = $source;
- }
-
- # Gets this attribute's name
- public function getName($lower=true) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->name);
-
- return $lower ? strtolower($this->name) : $this->name;
- }
-
- # Gets the name of the ObjectClass which originally specified this attribute.
- public function getSource() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->source);
-
- return $this->source;
- }
-}
-
-/**
- * Represents an LDAP AttributeType
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class AttributeType extends SchemaItem {
- # The attribute from which this attribute inherits (if any)
- private $sup_attribute = null;
- # The equality rule used
- private $equality = null;
- # The ordering of the attributeType
- private $ordering = null;
- # Boolean: supports substring matching?
- private $sub_str = null;
- # The full syntax string, ie 1.2.3.4{16}
- private $syntax = null;
- private $syntax_oid = null;
- # boolean: is single valued only?
- private $is_single_value = false;
- # boolean: is collective?
- private $is_collective = false;
- # boolean: can use modify?
- private $is_no_user_modification = false;
- # The usage string set by the LDAP schema
- private $usage = null;
- # An array of alias attribute names, strings
- private $aliases = array();
- # The max number of characters this attribute can be
- private $max_length = null;
- # A string description of the syntax type (taken from the LDAPSyntaxes)
- private $type = null;
- # An array of objectClasses which use this attributeType (must be set by caller)
- private $used_in_object_classes = array();
- # A list of object class names that require this attribute type.
- private $required_by_object_classes = array();
- # This attribute has been forced a MAY attribute by the configuration.
- private $forced_as_may = false;
-
- /**
- * Creates a new AttributeType object from a raw LDAP AttributeType string.
- */
- public function __construct($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $strings = preg_split('/[\s,]+/',$attr,-1,PREG_SPLIT_DELIM_CAPTURE);
-
- for($i=0; $iname)==0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
-
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- # This attribute has no aliases
- $this->aliases = array();
-
- } else {
- $i++;
- do {
- # In case we came here becaues of a ('
- if (preg_match('/^\(/',$strings[$i]))
- $strings[$i] = preg_replace('/^\(/','',$strings[$i]);
- else
- $i++;
-
- if (strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
-
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- # Add alias names for this attribute
- while ($strings[++$i] != ')') {
- $alias = $strings[$i];
- $alias = preg_replace("/^\'/",'',$alias);
- $alias = preg_replace("/\'$/",'',$alias);
- $this->addAlias($alias);
- }
- }
-
- if (DEBUG_ENABLED)
- debug_log('Case NAME returned (%s) (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->name,$this->aliases);
- break;
-
- case 'DESC':
- do {
- $i++;
- if (strlen($this->description)==0)
- $this->description=$this->description.$strings[$i];
- else
- $this->description=$this->description.' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- if (DEBUG_ENABLED)
- debug_log('Case DESC returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->description);
- break;
-
- case 'OBSOLETE':
- $this->is_obsolete = TRUE;
-
- if (DEBUG_ENABLED)
- debug_log('Case OBSOLETE returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->is_obsolete);
- break;
-
- case 'SUP':
- $i++;
- $this->sup_attribute = $strings[$i];
-
- if (DEBUG_ENABLED)
- debug_log('Case SUP returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->sup_attribute);
- break;
-
- case 'EQUALITY':
- $i++;
- $this->equality = $strings[$i];
-
- if (DEBUG_ENABLED)
- debug_log('Case EQUALITY returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->equality);
- break;
-
- case 'ORDERING':
- $i++;
- $this->ordering = $strings[$i];
-
- if (DEBUG_ENABLED)
- debug_log('Case ORDERING returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->ordering);
- break;
-
- case 'SUBSTR':
- $i++;
- $this->sub_str = $strings[$i];
-
- if (DEBUG_ENABLED)
- debug_log('Case SUBSTR returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->sub_str);
- break;
-
- case 'SYNTAX':
- $i++;
- $this->syntax = $strings[$i];
- $this->syntax_oid = preg_replace('/{\d+}$/','',$this->syntax);
-
- # Does this SYNTAX string specify a max length (ie, 1.2.3.4{16})
- if (preg_match('/{(\d+)}$/',$this->syntax,$this->max_length))
- $this->max_length = $this->max_length[1];
- else
- $this->max_length = null;
-
- if ($i < count($strings) - 1 && $strings[$i+1] == '{') {
- do {
- $i++;
- $this->name .= ' '.$strings[$i];
- } while ($strings[$i] != '}');
- }
-
- if (DEBUG_ENABLED)
- debug_log('Case SYNTAX returned (%s) (%s) (%s)',8,0,__FILE__,__LINE__,__METHOD__,
- $this->syntax,$this->syntax_oid,$this->max_length);
- break;
-
- case 'SINGLE-VALUE':
- $this->is_single_value = TRUE;
- if (DEBUG_ENABLED)
- debug_log('Case SINGLE-VALUE returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->is_single_value);
- break;
-
- case 'COLLECTIVE':
- $this->is_collective = TRUE;
-
- if (DEBUG_ENABLED)
- debug_log('Case COLLECTIVE returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->is_collective);
- break;
-
- case 'NO-USER-MODIFICATION':
- $this->is_no_user_modification = TRUE;
-
- if (DEBUG_ENABLED)
- debug_log('Case NO-USER-MODIFICATION returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->is_no_user_modification);
- break;
-
- case 'USAGE':
- $i++;
- $this->usage = $strings[$i];
-
- if (DEBUG_ENABLED)
- debug_log('Case USAGE returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->usage);
- break;
-
- default:
- if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1) {
- $this->setOID($strings[$i]);
-
- if (DEBUG_ENABLED)
- debug_log('Case default returned (%s)',8,0,__FILE__,__LINE__,__METHOD__,$this->getOID());
- }
- }
- }
-
- $this->name = preg_replace("/^\'/",'',$this->name);
- $this->name = preg_replace("/\'$/",'',$this->name);
- $this->description = preg_replace("/^\'/",'',$this->description);
- $this->description = preg_replace("/\'$/",'',$this->description);
- $this->syntax = preg_replace("/^\'/",'',$this->syntax);
- $this->syntax = preg_replace("/\'$/",'',$this->syntax);
- $this->syntax_oid = preg_replace("/^\'/",'',$this->syntax_oid);
- $this->syntax_oid = preg_replace("/\'$/",'',$this->syntax_oid);
- $this->sup_attribute = preg_replace("/^\'/",'',$this->sup_attribute);
- $this->sup_attribute = preg_replace("/\'$/",'',$this->sup_attribute);
-
- if (DEBUG_ENABLED)
- debug_log('Returning ()',9,0,__FILE__,__LINE__,__METHOD__);
- }
-
- /**
- * Gets this attribute's usage string as defined by the LDAP server
- *
- * @return string
- */
- public function getUsage() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->usage);
-
- return $this->usage;
- }
-
- /**
- * Gets this attribute's parent attribute (if any). If this attribute does not
- * inherit from another attribute, null is returned.
- *
- * @return string
- */
- public function getSupAttribute() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->sup_attribute);
-
- return $this->sup_attribute;
- }
-
- /**
- * Gets this attribute's equality string
- *
- * @return string
- */
- public function getEquality() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->equality);
-
- return $this->equality;
- }
-
- /**
- * Gets this attribute's ordering specification.
- *
- * @return string
- */
- public function getOrdering() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->ordering);
-
- return $this->ordering;
- }
-
- /**
- * Gets this attribute's substring matching specification
- *
- * @return string
- */
- public function getSubstr() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->sub_str);
-
- return $this->sub_str;
- }
-
- /**
- * Gets the names of attributes that are an alias for this attribute (if any).
- *
- * @return array An array of names of attributes which alias this attribute or
- * an empty array if no attribute aliases this object.
- */
- public function getAliases() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->aliases);
-
- return $this->aliases;
- }
-
- /**
- * Returns whether the specified attribute is an alias for this one (based on this attribute's alias list).
- *
- * @param string $attr_name The name of the attribute to check.
- * @return boolean True if the specified attribute is an alias for this one, or false otherwise.
- */
- public function isAliasFor($attr_name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->aliases as $alias_attr_name)
- if (strcasecmp($alias_attr_name,$attr_name) == 0)
- return true;
-
- return false;
- }
-
- /**
- * Gets this attribute's raw syntax string (ie: "1.2.3.4{16}").
- *
- * @return string The raw syntax string
- */
- public function getSyntaxString() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->syntax);
-
- return $this->syntax;
- }
-
- /**
- * Gets this attribute's syntax OID. Differs from getSyntaxString() in that this
- * function only returns the actual OID with any length specification removed.
- * Ie, if the syntax string is "1.2.3.4{16}", this function only retruns
- * "1.2.3.4".
- *
- * @return string The syntax OID string.
- */
- public function getSyntaxOID() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->syntax_oid);
-
- return $this->syntax_oid;
- }
-
- /**
- * Gets this attribute's the maximum length. If no maximum is defined by the LDAP server, null is returned.
- *
- * @return int The maximum length (in characters) of this attribute or null if no maximum is specified.
- */
- public function getMaxLength() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->max_length);
-
- return $this->max_length;
- }
-
- /**
- * Gets whether this attribute is single-valued. If this attribute only supports single values, true
- * is returned. If this attribute supports multiple values, false is returned.
- *
- * @return boolean Returns true if this attribute is single-valued or false otherwise.
- */
- public function getIsSingleValue() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->is_single_value);
-
- return $this->is_single_value;
- }
-
- /**
- * Sets whether this attribute is single-valued.
- *
- * @param boolean $is
- */
- public function setIsSingleValue($is) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->is_single_value = $is;
- }
-
- /**
- * Gets whether this attribute is collective.
- *
- * @return boolean Returns true if this attribute is collective and false otherwise.
- */
- public function getIsCollective() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->is_collective);
-
- return $this->is_collective;
- }
-
- /**
- * Gets whether this attribute is not modifiable by users.
- *
- * @return boolean Returns true if this attribute is not modifiable by users.
- */
- public function getIsNoUserModification() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->is_no_user_modification);
-
- return $this->is_no_user_modification;
- }
-
- /**
- * Gets this attribute's type
- *
- * @return string The attribute's type.
- */
- public function getType() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->type);
-
- return $this->type;
- }
-
- /**
- * Removes an attribute name from this attribute's alias array.
- *
- * @param string $remove_alias_name The name of the attribute to remove.
- * @return boolean true on success or false on failure (ie, if the specified
- * attribute name is not found in this attribute's list of aliases)
- */
- public function removeAlias($remove_alias_name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->aliases as $i => $alias_name) {
-
- if (strcasecmp($alias_name,$remove_alias_name) == 0) {
- unset($this->aliases[$i]);
-
- $this->aliases = array_values($this->aliases);
- return true;
- }
- }
- return false;
- }
-
- /**
- * Adds an attribute name to the alias array.
- *
- * @param string $alias The name of a new attribute to add to this attribute's list of aliases.
- */
- public function addAlias($alias) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- array_push($this->aliases,$alias);
- }
-
- /**
- * Sets this attriute's name.
- *
- * @param string $name The new name to give this attribute.
- */
- public function setName($name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->name = $name;
- }
-
- /**
- * Sets this attriute's SUP attribute (ie, the attribute from which this attribute inherits).
- *
- * @param string $attr The name of the new parent (SUP) attribute
- */
- public function setSupAttribute($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->sup_attribute = $attr;
- }
-
- /**
- * Sets this attribute's list of aliases.
- *
- * @param array $aliases The array of alias names (strings)
- */
- public function setAliases($aliases) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->aliases = $aliases;
- }
-
- /**
- * Sets this attribute's type.
- *
- * @param string $type The new type.
- */
- public function setType($type) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->type = $type;
- }
-
- /**
- * Adds an objectClass name to this attribute's list of "used in" objectClasses,
- * that is the list of objectClasses which provide this attribute.
- *
- * @param string $name The name of the objectClass to add.
- */
- public function addUsedInObjectClass($name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->used_in_object_classes as $used_in_object_class) {
- if (DEBUG_ENABLED)
- debug_log('Checking (%s) with (%s)',8,0,__FILE__,__LINE__,__METHOD__,$used_in_object_class,$name);
-
- if (strcasecmp($used_in_object_class,$name) == 0)
- return false;
- }
-
- array_push($this->used_in_object_classes,$name);
- }
-
- /**
- * Gets the list of "used in" objectClasses, that is the list of objectClasses
- * which provide this attribute.
- *
- * @return array An array of names of objectclasses (strings) which provide this attribute
- */
- public function getUsedInObjectClasses() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->used_in_object_classes);
-
- return $this->used_in_object_classes;
- }
-
- /**
- * Adds an objectClass name to this attribute's list of "required by" objectClasses,
- * that is the list of objectClasses which must have this attribute.
- *
- * @param string $name The name of the objectClass to add.
- */
- public function addRequiredByObjectClass($name) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->required_by_object_classes as $required_by_object_class)
- if (strcasecmp($required_by_object_class,$name) == 0)
- return false;
-
- array_push($this->required_by_object_classes,$name);
- }
-
- /**
- * Gets the list of "required by" objectClasses, that is the list of objectClasses
- * which provide must have attribute.
- *
- * @return array An array of names of objectclasses (strings) which provide this attribute
- */
- public function getRequiredByObjectClasses() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->required_by_object_classes);
-
- return $this->required_by_object_classes;
- }
-
- /**
- * This function will mark this attribute as a forced MAY attribute
- */
- public function setForceMay() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->forced_as_may = true;
- }
-
- public function isForceMay() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->forced_as_may);
-
- return $this->forced_as_may;
- }
-}
-
-/**
- * Represents an LDAP Syntax
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class Syntax extends SchemaItem {
- /**
- * Creates a new Syntax object from a raw LDAP syntax string.
- */
- public function __construct($class) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $strings = preg_split('/[\s,]+/',$class,-1,PREG_SPLIT_DELIM_CAPTURE);
-
- for($i=0; $idescription) == 0)
- $this->description=$this->description.$strings[$i];
- else
- $this->description=$this->description.' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
- break;
-
- default:
- if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1)
- $this->setOID($strings[$i]);
- }
- }
-
- $this->description = preg_replace("/^\'/",'',$this->description);
- $this->description = preg_replace("/\'$/",'',$this->description);
- }
-}
-
-/**
- * Represents an LDAP MatchingRule
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class MatchingRule extends SchemaItem {
- # This rule's syntax OID
- private $syntax = null;
- # An array of attribute names who use this MatchingRule
- private $used_by_attrs = array();
-
- /**
- * Creates a new MatchingRule object from a raw LDAP MatchingRule string.
- */
- function __construct($strings) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $strings = preg_split('/[\s,]+/',$strings,-1,PREG_SPLIT_DELIM_CAPTURE);
-
- for ($i=0; $iname) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- } else {
- $i++;
- do {
- $i++;
- if (strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- do {
- $i++;
- } while (! preg_match('/\)+\)?/',$strings[$i]));
- }
-
- $this->name = preg_replace("/^\'/",'',$this->name);
- $this->name = preg_replace("/\'$/",'',$this->name);
- break;
-
- case 'DESC':
- do {
- $i++;
- if (strlen($this->description)==0)
- $this->description=$this->description.$strings[$i];
- else
- $this->description=$this->description.' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
- break;
-
- case 'OBSOLETE':
- $this->is_obsolete = TRUE;
- break;
-
- case 'SYNTAX':
- $this->syntax = $strings[++$i];
- break;
-
- default:
- if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1)
- $this->setOID($strings[$i]);
- }
- }
- $this->description = preg_replace("/^\'/",'',$this->description);
- $this->description = preg_replace("/\'$/",'',$this->description);
- }
-
- /**
- * Sets the list of used_by_attrs to the array specified by $attrs;
- *
- * @param array $attrs The array of attribute names (strings) which use this MatchingRule
- */
- public function setUsedByAttrs($attrs) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $this->used_by_attrs = $attrs;
- }
-
- /**
- * Adds an attribute name to the list of attributes who use this MatchingRule
- *
- * @return true if the attribute was added and false otherwise (already in the list)
- */
- public function addUsedByAttr($attr) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- foreach ($this->used_by_attrs as $attr_name)
- if (strcasecmp($attr_name,$attr) == 0)
- return false;
-
- array_push($this->used_by_attrs,$attr);
-
- return true;
- }
-
- /**
- * Gets an array of attribute names (strings) which use this MatchingRule
- *
- * @return array The array of attribute names (strings).
- */
- public function getUsedByAttrs() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->used_by_attrs);
-
- return $this->used_by_attrs;
- }
-}
-
-/**
- * Represents an LDAP schema matchingRuleUse entry
- *
- * @package phpLDAPadmin
- * @subpackage Schema
- */
-class MatchingRuleUse extends SchemaItem {
- # An array of attribute names who use this MatchingRule
- private $used_by_attrs = array();
-
- function __construct($strings) {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,0,__FILE__,__LINE__,__METHOD__,$fargs);
-
- $strings = preg_split('/[\s,]+/',$strings,-1,PREG_SPLIT_DELIM_CAPTURE);
-
- for($i=0; $iname) || strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
-
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- } else {
- $i++;
- do {
- $i++;
- if (strlen($this->name) == 0)
- $this->name = $strings[$i];
- else
- $this->name .= ' '.$strings[$i];
- } while (! preg_match("/\'$/s",$strings[$i]));
-
- do {
- $i++;
- } while (! preg_match('/\)+\)?/',$strings[$i]));
- }
-
- $this->name = preg_replace("/^\'/",'',$this->name);
- $this->name = preg_replace("/\'$/",'',$this->name);
- break;
-
- case 'APPLIES':
- if ($strings[$i+1] != '(') {
- # Has a single attribute name
- $i++;
- $this->used_by_attrs = array($strings[$i]);
-
- } else {
- # Has multiple attribute names
- $i++;
- while ($strings[$i] != ')') {
- $i++;
- $new_attr = $strings[$i];
- $new_attr = preg_replace("/^\'/",'',$new_attr);
- $new_attr = preg_replace("/\'$/",'',$new_attr);
- array_push($this->used_by_attrs,$new_attr);
- $i++;
- }
- }
- break;
-
- default:
- if (preg_match('/[\d\.]+/i',$strings[$i]) && $i == 1)
- $this->setOID($strings[$i]);
- }
- }
-
- sort($this->used_by_attrs);
- }
-
- /**
- * Gets an array of attribute names (strings) which use this MatchingRuleUse object.
- *
- * @return array The array of attribute names (strings).
- */
- public function getUsedByAttrs() {
- if (DEBUG_ENABLED && (($fargs=func_get_args())||$fargs='NOARGS'))
- debug_log('Entered (%%)',9,1,__FILE__,__LINE__,__METHOD__,$fargs,$this->used_by_attrs);
-
- return $this->used_by_attrs;
- }
-}
-?>
diff --git a/locale/ca_ES/LC_MESSAGES/messages.mo b/locale/ca_ES/LC_MESSAGES/messages.mo
deleted file mode 100644
index b3dabc8..0000000
Binary files a/locale/ca_ES/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/cs_CZ/LC_MESSAGES/messages.mo b/locale/cs_CZ/LC_MESSAGES/messages.mo
deleted file mode 100644
index fb39b76..0000000
Binary files a/locale/cs_CZ/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/da_DK/LC_MESSAGES/messages.mo b/locale/da_DK/LC_MESSAGES/messages.mo
deleted file mode 100644
index 350f4ee..0000000
Binary files a/locale/da_DK/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/de_DE/LC_MESSAGES/messages.mo b/locale/de_DE/LC_MESSAGES/messages.mo
deleted file mode 100644
index 0ae7fc2..0000000
Binary files a/locale/de_DE/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/es_ES/LC_MESSAGES/messages.mo b/locale/es_ES/LC_MESSAGES/messages.mo
deleted file mode 100644
index a03a9a4..0000000
Binary files a/locale/es_ES/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/fi_FI/LC_MESSAGES/messages.mo b/locale/fi_FI/LC_MESSAGES/messages.mo
deleted file mode 100644
index 0318b4d..0000000
Binary files a/locale/fi_FI/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/fr_FR/LC_MESSAGES/messages.mo b/locale/fr_FR/LC_MESSAGES/messages.mo
deleted file mode 100644
index da77e75..0000000
Binary files a/locale/fr_FR/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/gn_PY/LC_MESSAGES/messages.mo b/locale/gn_PY/LC_MESSAGES/messages.mo
deleted file mode 100644
index c7a17b7..0000000
Binary files a/locale/gn_PY/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/hu_HU/LC_MESSAGES/messages.mo b/locale/hu_HU/LC_MESSAGES/messages.mo
deleted file mode 100644
index 029ceec..0000000
Binary files a/locale/hu_HU/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/it_IT/LC_MESSAGES/messages.mo b/locale/it_IT/LC_MESSAGES/messages.mo
deleted file mode 100644
index cace961..0000000
Binary files a/locale/it_IT/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/ja_JP/LC_MESSAGES/messages.mo b/locale/ja_JP/LC_MESSAGES/messages.mo
deleted file mode 100644
index e96e6e4..0000000
Binary files a/locale/ja_JP/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/nb_NO/LC_MESSAGES/messages.mo b/locale/nb_NO/LC_MESSAGES/messages.mo
deleted file mode 100644
index d2ebacd..0000000
Binary files a/locale/nb_NO/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/nl_BE/LC_MESSAGES/messages.mo b/locale/nl_BE/LC_MESSAGES/messages.mo
deleted file mode 100644
index bafeef9..0000000
Binary files a/locale/nl_BE/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/oc_FR/LC_MESSAGES/messages.mo b/locale/oc_FR/LC_MESSAGES/messages.mo
deleted file mode 100644
index 7823c66..0000000
Binary files a/locale/oc_FR/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/pl_PL/LC_MESSAGES/messages.mo b/locale/pl_PL/LC_MESSAGES/messages.mo
deleted file mode 100644
index ed781a0..0000000
Binary files a/locale/pl_PL/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/pt_BR/LC_MESSAGES/messages.mo b/locale/pt_BR/LC_MESSAGES/messages.mo
deleted file mode 100644
index ab7cad5..0000000
Binary files a/locale/pt_BR/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/ru_RU/LC_MESSAGES/messages.mo b/locale/ru_RU/LC_MESSAGES/messages.mo
deleted file mode 100644
index feeb91e..0000000
Binary files a/locale/ru_RU/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/sk_SK/LC_MESSAGES/messages.mo b/locale/sk_SK/LC_MESSAGES/messages.mo
deleted file mode 100644
index d02eb47..0000000
Binary files a/locale/sk_SK/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/sv_FI/LC_MESSAGES/messages.mo b/locale/sv_FI/LC_MESSAGES/messages.mo
deleted file mode 100644
index 83f78db..0000000
Binary files a/locale/sv_FI/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/tr_TR/LC_MESSAGES/messages.mo b/locale/tr_TR/LC_MESSAGES/messages.mo
deleted file mode 100644
index d547e71..0000000
Binary files a/locale/tr_TR/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/uk_UA/LC_MESSAGES/messages.mo b/locale/uk_UA/LC_MESSAGES/messages.mo
deleted file mode 100644
index c461e15..0000000
Binary files a/locale/uk_UA/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/zh_CN/LC_MESSAGES/messages.mo b/locale/zh_CN/LC_MESSAGES/messages.mo
deleted file mode 100644
index b49a118..0000000
Binary files a/locale/zh_CN/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/locale/zh_TW/LC_MESSAGES/messages.mo b/locale/zh_TW/LC_MESSAGES/messages.mo
deleted file mode 100644
index 7a20875..0000000
Binary files a/locale/zh_TW/LC_MESSAGES/messages.mo and /dev/null differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d3debf3
--- /dev/null
+++ b/package.json
@@ -0,0 +1,26 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "mix",
+ "watch": "mix watch",
+ "watch-poll": "mix watch -- --watch-options-poll=1000",
+ "hot": "mix watch --hot",
+ "prod": "npm run production",
+ "production": "mix --production"
+ },
+ "devDependencies": {
+ "axios": "^0.21",
+ "jquery": "^3.6.3",
+ "laravel-mix": "^6.0.6",
+ "lodash": "^4.17.19",
+ "mix": "^0.0.1",
+ "postcss": "^8.1.14",
+ "resolve-url-loader": "^5.0.0",
+ "sass": "^1.57.1",
+ "sass-loader": "^12.1.0",
+ "yarn": "^1.22.19"
+ },
+ "dependencies": {
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..2ac86a1
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,31 @@
+
+
+
+
+ ./tests/Unit
+
+
+ ./tests/Feature
+
+
+
+
+ ./app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..3aec5e2
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,21 @@
+
+
+ Options -MultiViews -Indexes
+
+
+ RewriteEngine On
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_URI} (.+)/$
+ RewriteRule ^ %1 [L,R=301]
+
+ # Send Requests To Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/public/VERSION b/public/VERSION
new file mode 100644
index 0000000..853153e
--- /dev/null
+++ b/public/VERSION
@@ -0,0 +1 @@
+v2.0.0-dev
diff --git a/public/css/architect.min.css b/public/css/architect.min.css
new file mode 100644
index 0000000..a9e3e93
--- /dev/null
+++ b/public/css/architect.min.css
@@ -0,0 +1,23 @@
+/*!
+ =========================================================
+ * ArchitectUI HTML Theme Dashboard - v1.0.0
+ =========================================================
+ * Product Page: https://dashboardpack.com
+ * Copyright 2019 DashboardPack (https://dashboardpack.com)
+ * Licensed under MIT (https://github.com/DashboardPack/architectui-html-theme-free/blob/master/LICENSE)
+ =========================================================
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+ */.border-primary{border-color:#3f6ad8}.border-secondary{border-color:#6c757d}.border-success{border-color:#3ac47d}.border-info{border-color:#16aaff}.border-warning{border-color:#f7b924}.border-danger{border-color:#d92550}.border-light{border-color:#eee}.border-dark{border-color:#343a40}.border-focus{border-color:#444054}.border-alternate{border-color:#794c8a}.list-group-item-primary{color:#213770;background-color:#c9d5f4}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#213770;background-color:#b4c5f0}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#213770;border-color:#213770}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#1e6641;background-color:#c8eedb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1e6641;background-color:#b5e8ce}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1e6641;border-color:#1e6641}.list-group-item-info{color:#0b5885;background-color:#bee7ff}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0b5885;background-color:#a5deff}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0b5885;border-color:#0b5885}.list-group-item-warning{color:#806013;background-color:#fdebc2}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#806013;background-color:#fce3a9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#806013;border-color:#806013}.list-group-item-danger{color:#71132a;background-color:#f4c2ce}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#71132a;background-color:#f0acbd}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#71132a;border-color:#71132a}.list-group-item-light{color:#7c7c7c;background-color:#fafafa}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#7c7c7c;background-color:#ededed}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7c7c7c;border-color:#7c7c7c}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.list-group-item-focus{color:#23212c;background-color:#cbcacf}.list-group-item-focus.list-group-item-action:hover,.list-group-item-focus.list-group-item-action:focus{color:#23212c;background-color:#bebdc3}.list-group-item-focus.list-group-item-action.active{color:#fff;background-color:#23212c;border-color:#23212c}.list-group-item-alternate{color:#3f2848;background-color:#d9cdde}.list-group-item-alternate.list-group-item-action:hover,.list-group-item-alternate.list-group-item-action:focus{color:#3f2848;background-color:#cdbed4}.list-group-item-alternate.list-group-item-action.active{color:#fff;background-color:#3f2848;border-color:#3f2848}.bg-primary{background-color:#3f6ad8 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#2651be !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#3ac47d !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#2e9d64 !important}.bg-info{background-color:#16aaff !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#0090e2 !important}.bg-warning{background-color:#f7b924 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e0a008 !important}.bg-danger{background-color:#d92550 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#ad1e40 !important}.bg-light{background-color:#eee !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#d5d5d5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-focus{background-color:#444054 !important}a.bg-focus:hover,a.bg-focus:focus,button.bg-focus:hover,button.bg-focus:focus{background-color:#2d2a37 !important}.bg-alternate{background-color:#794c8a !important}a.bg-alternate:hover,a.bg-alternate:focus,button.bg-alternate:hover,button.bg-alternate:focus{background-color:#5c3a69 !important}:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #3f6ad8;--secondary: #6c757d;--success: #3ac47d;--info: #16aaff;--warning: #f7b924;--danger: #d92550;--light: #eee;--dark: #343a40;--focus: #444054;--alternate: #794c8a;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:.88rem;font-weight:400;line-height:1.5;color:#495057;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#3f6ad8;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.55rem;padding-bottom:.55rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:400;line-height:1.2;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;background-color:rgba(0,0,0,0)}.table th,.table td{padding:.55rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered th,.table-bordered td{border:1px solid #e9ecef}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.03)}.table-hover tbody tr:hover{background-color:#e0f3ff}.table-primary,.table-primary>th,.table-primary>td{background-color:#c9d5f4}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#9bb2eb}.table-hover .table-primary:hover{background-color:#b4c5f0}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b4c5f0}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c8eedb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#99e0bb}.table-hover .table-success:hover{background-color:#b5e8ce}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b5e8ce}.table-info,.table-info>th,.table-info>td{background-color:#bee7ff}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86d3ff}.table-hover .table-info:hover{background-color:#a5deff}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a5deff}.table-warning,.table-warning>th,.table-warning>td{background-color:#fdebc2}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#fbdb8d}.table-hover .table-warning:hover{background-color:#fce3a9}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fce3a9}.table-danger,.table-danger>th,.table-danger>td{background-color:#f4c2ce}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#eb8ea4}.table-hover .table-danger:hover{background-color:#f0acbd}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f0acbd}.table-light,.table-light>th,.table-light>td{background-color:#fafafa}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#f6f6f6}.table-hover .table-light:hover{background-color:#ededed}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ededed}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-focus,.table-focus>th,.table-focus>td{background-color:#cbcacf}.table-focus th,.table-focus td,.table-focus thead th,.table-focus tbody+tbody{border-color:#9e9ca6}.table-hover .table-focus:hover{background-color:#bebdc3}.table-hover .table-focus:hover>td,.table-hover .table-focus:hover>th{background-color:#bebdc3}.table-alternate,.table-alternate>th,.table-alternate>td{background-color:#d9cdde}.table-alternate th,.table-alternate td,.table-alternate thead th,.table-alternate tbody+tbody{border-color:#b9a2c2}.table-hover .table-alternate:hover{background-color:#cdbed4}.table-hover .table-alternate:hover>td,.table-hover .table-alternate:hover>th{background-color:#cdbed4}.table-active,.table-active>th,.table-active>td{background-color:#e0f3ff}.table-hover .table-active:hover{background-color:#c7e9ff}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#c7e9ff}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#6c757d;background-color:#f8f9fa;border-color:#e9ecef}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#a9bcee;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.8125rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(2.875rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#3ac47d}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(58,196,125,0.9);border-radius:.25rem}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3ac47d;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3ac47d;box-shadow:0 0 0 .2rem rgba(58,196,125,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#3ac47d;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") no-repeat center right 1.75rem/1.125rem 1.125rem}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#3ac47d;box-shadow:0 0 0 .2rem rgba(58,196,125,0.25)}.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#3ac47d}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#3ac47d}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#3ac47d}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#61d097;background-color:#61d097}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{box-shadow:0 0 0 .2rem rgba(58,196,125,0.25)}.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#3ac47d}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#3ac47d}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#3ac47d;box-shadow:0 0 0 .2rem rgba(58,196,125,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#d92550}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(217,37,80,0.9);border-radius:.25rem}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#d92550;padding-right:2.25rem;background-repeat:no-repeat;background-position:center right calc(2.25rem / 4);background-size:calc(2.25rem / 2) calc(2.25rem / 2);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E")}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#d92550;box-shadow:0 0 0 .2rem rgba(217,37,80,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:2.25rem;background-position:top calc(2.25rem / 4) right calc(2.25rem / 4)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#d92550;padding-right:3.4375rem;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") no-repeat center right 1.75rem/1.125rem 1.125rem}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#d92550;box-shadow:0 0 0 .2rem rgba(217,37,80,0.25)}.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#d92550}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#d92550}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#d92550}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#e15073;background-color:#e15073}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{box-shadow:0 0 0 .2rem rgba(217,37,80,0.25)}.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#d92550}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#d92550}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#d92550;box-shadow:0 0 0 .2rem rgba(217,37,80,0.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#495057;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s,background-color 0.15s,border-color 0.15s,box-shadow 0.15s}@media screen and (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#495057;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:none}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-primary:hover{color:#fff;background-color:#2955c8;border-color:#2651be}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 0 rgba(92,128,222,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2651be;border-color:#244cb3}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(92,128,222,0.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{box-shadow:0 0 0 0 rgba(130,138,145,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(130,138,145,0.5)}.btn-success{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-success:hover{color:#fff;background-color:#31a66a;border-color:#2e9d64}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 0 rgba(88,205,145,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#2e9d64;border-color:#2b935e}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(88,205,145,0.5)}.btn-info{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-info:hover{color:#fff;background-color:#0098ef;border-color:#0090e2}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 0 rgba(57,183,255,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0090e2;border-color:#0087d5}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(57,183,255,0.5)}.btn-warning{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-warning:hover{color:#212529;background-color:#eca909;border-color:#e0a008}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 0 rgba(215,163,37,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#e0a008;border-color:#d49808}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(215,163,37,0.5)}.btn-danger{color:#fff;background-color:#d92550;border-color:#d92550}.btn-danger:hover{color:#fff;background-color:#b81f44;border-color:#ad1e40}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 0 rgba(223,70,106,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#d92550;border-color:#d92550}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#ad1e40;border-color:#a31c3c}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(223,70,106,0.5)}.btn-light{color:#212529;background-color:#eee;border-color:#eee}.btn-light:hover{color:#212529;background-color:#dbdbdb;border-color:#d5d5d5}.btn-light:focus,.btn-light.focus{box-shadow:0 0 0 0 rgba(207,208,208,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#eee;border-color:#eee}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#d5d5d5;border-color:#cecece}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(207,208,208,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:0 0 0 0 rgba(82,88,93,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(82,88,93,0.5)}.btn-focus{color:#fff;background-color:#444054;border-color:#444054}.btn-focus:hover{color:#fff;background-color:#322f3e;border-color:#2d2a37}.btn-focus:focus,.btn-focus.focus{box-shadow:0 0 0 0 rgba(96,93,110,0.5)}.btn-focus.disabled,.btn-focus:disabled{color:#fff;background-color:#444054;border-color:#444054}.btn-focus:not(:disabled):not(.disabled):active,.btn-focus:not(:disabled):not(.disabled).active,.show>.btn-focus.dropdown-toggle{color:#fff;background-color:#2d2a37;border-color:#272430}.btn-focus:not(:disabled):not(.disabled):active:focus,.btn-focus:not(:disabled):not(.disabled).active:focus,.show>.btn-focus.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(96,93,110,0.5)}.btn-alternate{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-alternate:hover{color:#fff;background-color:#633e71;border-color:#5c3a69}.btn-alternate:focus,.btn-alternate.focus{box-shadow:0 0 0 0 rgba(141,103,156,0.5)}.btn-alternate.disabled,.btn-alternate:disabled{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-alternate:not(:disabled):not(.disabled):active,.btn-alternate:not(:disabled):not(.disabled).active,.show>.btn-alternate.dropdown-toggle{color:#fff;background-color:#5c3a69;border-color:#553561}.btn-alternate:not(:disabled):not(.disabled):active:focus,.btn-alternate:not(:disabled):not(.disabled).active:focus,.show>.btn-alternate.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(141,103,156,0.5)}.btn-outline-primary{color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:hover{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 0 rgba(63,106,216,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3f6ad8;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(63,106,216,0.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 0 rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(108,117,125,0.5)}.btn-outline-success{color:#3ac47d;border-color:#3ac47d}.btn-outline-success:hover{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 0 rgba(58,196,125,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3ac47d;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(58,196,125,0.5)}.btn-outline-info{color:#16aaff;border-color:#16aaff}.btn-outline-info:hover{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 0 rgba(22,170,255,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#16aaff;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(22,170,255,0.5)}.btn-outline-warning{color:#f7b924;border-color:#f7b924}.btn-outline-warning:hover{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 0 rgba(247,185,36,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f7b924;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(247,185,36,0.5)}.btn-outline-danger{color:#d92550;border-color:#d92550}.btn-outline-danger:hover{color:#fff;background-color:#d92550;border-color:#d92550}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 0 rgba(217,37,80,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d92550;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d92550;border-color:#d92550}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(217,37,80,0.5)}.btn-outline-light{color:#eee;border-color:#eee}.btn-outline-light:hover{color:#212529;background-color:#eee;border-color:#eee}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 0 rgba(238,238,238,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#eee;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#eee;border-color:#eee}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(238,238,238,0.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-focus{color:#444054;border-color:#444054}.btn-outline-focus:hover{color:#fff;background-color:#444054;border-color:#444054}.btn-outline-focus:focus,.btn-outline-focus.focus{box-shadow:0 0 0 0 rgba(68,64,84,0.5)}.btn-outline-focus.disabled,.btn-outline-focus:disabled{color:#444054;background-color:transparent}.btn-outline-focus:not(:disabled):not(.disabled):active,.btn-outline-focus:not(:disabled):not(.disabled).active,.show>.btn-outline-focus.dropdown-toggle{color:#fff;background-color:#444054;border-color:#444054}.btn-outline-focus:not(:disabled):not(.disabled):active:focus,.btn-outline-focus:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-focus.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(68,64,84,0.5)}.btn-outline-alternate{color:#794c8a;border-color:#794c8a}.btn-outline-alternate:hover{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-outline-alternate:focus,.btn-outline-alternate.focus{box-shadow:0 0 0 0 rgba(121,76,138,0.5)}.btn-outline-alternate.disabled,.btn-outline-alternate:disabled{color:#794c8a;background-color:transparent}.btn-outline-alternate:not(:disabled):not(.disabled):active,.btn-outline-alternate:not(:disabled):not(.disabled).active,.show>.btn-outline-alternate.dropdown-toggle{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-outline-alternate:not(:disabled):not(.disabled):active:focus,.btn-outline-alternate:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-alternate.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(121,76,138,0.5)}.btn-link{font-weight:400;color:#3f6ad8}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{transition:opacity 0.15s linear}@media screen and (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height 0.35s ease}@media screen and (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:15rem;padding:.65rem 0;margin:.125rem 0 0;font-size:.88rem;color:#495057;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-right{right:0;left:auto}}.dropdown-menu-left{right:auto;left:0}@media (min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}}@media (min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}}@media (min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.4rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#e0f3ff}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3f6ad8}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.65rem 1.5rem;margin-bottom:0;font-size:.968rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.4rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.88rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eff9ff;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(2.875rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.8125rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.32rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#007bff;background-color:#3f6ad8}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#d3ddf6;border-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.16rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.16rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#007bff;background-color:#3f6ad8}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(63,106,216,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(63,106,216,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(63,106,216,0.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.16rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(63,106,216,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(128,189,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-file-input:disabled ~ .custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#3f6ad8;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#d3ddf6}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3f6ad8;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#d3ddf6}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#3f6ad8;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#d3ddf6}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3f6ad8}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(26,54,126,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;color:inherit;background-color:#fff;border-bottom:1px solid rgba(26,54,126,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:#fff;border-top:1px solid rgba(26,54,126,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card{overflow:hidden}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion .card .card-header{margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:none}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link,.pagination .page-number:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link,.pagination .page-number:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link,.pagination .active.page-number .page-link{z-index:1;color:#fff;background-color:#3f6ad8;border-color:#007bff}.page-item.disabled .page-link,.pagination .disabled.page-number .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.1rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link,.pagination-lg .pagination .page-number:first-child .page-link,.pagination .pagination-lg .page-number:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link,.pagination-lg .pagination .page-number:last-child .page-link,.pagination .pagination-lg .page-number:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.968rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link,.pagination-sm .pagination .page-number:first-child .page-link,.pagination .pagination-sm .page-number:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link,.pagination-sm .pagination .page-number:last-child .page-link,.pagination .pagination-sm .page-number:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#3f6ad8}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#2651be}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}.badge-success{color:#fff;background-color:#3ac47d}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#2e9d64}.badge-info{color:#fff;background-color:#16aaff}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#0090e2}.badge-warning{color:#212529;background-color:#f7b924}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#e0a008}.badge-danger{color:#fff;background-color:#d92550}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#ad1e40}.badge-light{color:#212529;background-color:#eee}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#d5d5d5}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}.badge-focus{color:#fff;background-color:#444054}a.badge-focus:hover,a.badge-focus:focus{color:#fff;background-color:#2d2a37}.badge-alternate{color:#fff;background-color:#794c8a}a.badge-alternate:hover,a.badge-alternate:focus{color:#fff;background-color:#5c3a69}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#213770;background-color:#d9e1f7;border-color:#c9d5f4}.alert-primary hr{border-top-color:#b4c5f0}.alert-primary .alert-link{color:#152449}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#1e6641;background-color:#d8f3e5;border-color:#c8eedb}.alert-success hr{border-top-color:#b5e8ce}.alert-success .alert-link{color:#123f28}.alert-info{color:#0b5885;background-color:#d0eeff;border-color:#bee7ff}.alert-info hr{border-top-color:#a5deff}.alert-info .alert-link{color:#073956}.alert-warning{color:#806013;background-color:#fdf1d3;border-color:#fdebc2}.alert-warning hr{border-top-color:#fce3a9}.alert-warning .alert-link{color:#543f0c}.alert-danger{color:#71132a;background-color:#f7d3dc;border-color:#f4c2ce}.alert-danger hr{border-top-color:#f0acbd}.alert-danger .alert-link{color:#450c1a}.alert-light{color:#7c7c7c;background-color:#fcfcfc;border-color:#fafafa}.alert-light hr{border-top-color:#ededed}.alert-light .alert-link{color:#636363}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}.alert-focus{color:#23212c;background-color:#dad9dd;border-color:#cbcacf}.alert-focus hr{border-top-color:#bebdc3}.alert-focus .alert-link{color:#0c0b0f}.alert-alternate{color:#3f2848;background-color:#e4dbe8;border-color:#d9cdde}.alert-alternate hr{border-top-color:#cdbed4}.alert-alternate .alert-link{color:#221627}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#3f6ad8;transition:width 0.6s ease}@media screen and (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3f6ad8;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#213770;background-color:#c9d5f4}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#213770;background-color:#b4c5f0}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#213770;border-color:#213770}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#1e6641;background-color:#c8eedb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1e6641;background-color:#b5e8ce}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1e6641;border-color:#1e6641}.list-group-item-info{color:#0b5885;background-color:#bee7ff}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0b5885;background-color:#a5deff}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0b5885;border-color:#0b5885}.list-group-item-warning{color:#806013;background-color:#fdebc2}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#806013;background-color:#fce3a9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#806013;border-color:#806013}.list-group-item-danger{color:#71132a;background-color:#f4c2ce}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#71132a;background-color:#f0acbd}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#71132a;border-color:#71132a}.list-group-item-light{color:#7c7c7c;background-color:#fafafa}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#7c7c7c;background-color:#ededed}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7c7c7c;border-color:#7c7c7c}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.list-group-item-focus{color:#23212c;background-color:#cbcacf}.list-group-item-focus.list-group-item-action:hover,.list-group-item-focus.list-group-item-action:focus{color:#23212c;background-color:#bebdc3}.list-group-item-focus.list-group-item-action.active{color:#fff;background-color:#23212c;border-color:#23212c}.list-group-item-alternate{color:#3f2848;background-color:#d9cdde}.list-group-item-alternate.list-group-item-action:hover,.list-group-item-alternate.list-group-item-action:focus{color:#3f2848;background-color:#cdbed4}.list-group-item-alternate.list-group-item-action.active{color:#fff;background-color:#3f2848;border-color:#3f2848}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);border-radius:.25rem;box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);backdrop-filter:blur(10px);opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -50px)}@media screen and (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-dialog-centered::before{display:block;height:calc(100vh - (.5rem * 2));content:""}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-dialog-centered::before{height:calc(100vh - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:320px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(26,54,126,0.125);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:.5rem .5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:.5rem .5rem .5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 .5rem .5rem .5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #fff}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:.5rem 0 .5rem .5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.88rem;color:inherit;background-color:#fff;border-bottom:1px solid #f2f2f2;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media screen and (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media screen and (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity 0.15s ease}@media screen and (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.6s ease}@media screen and (prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#3f6ad8 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#2651be !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#3ac47d !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#2e9d64 !important}.bg-info{background-color:#16aaff !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#0090e2 !important}.bg-warning{background-color:#f7b924 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e0a008 !important}.bg-danger{background-color:#d92550 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#ad1e40 !important}.bg-light{background-color:#eee !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#d5d5d5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-focus{background-color:#444054 !important}a.bg-focus:hover,a.bg-focus:focus,button.bg-focus:hover,button.bg-focus:focus{background-color:#2d2a37 !important}.bg-alternate{background-color:#794c8a !important}a.bg-alternate:hover,a.bg-alternate:focus,button.bg-alternate:hover,button.bg-alternate:focus{background-color:#5c3a69 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#3f6ad8 !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#3ac47d !important}.border-info{border-color:#16aaff !important}.border-warning{border-color:#f7b924 !important}.border-danger{border-color:#d92550 !important}.border-light{border-color:#eee !important}.border-dark{border-color:#343a40 !important}.border-focus{border-color:#444054 !important}.border-alternate{border-color:#794c8a !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-3by4::before{padding-top:133.33333%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-.25rem !important}.mt-n1,.my-n1{margin-top:-.25rem !important}.mr-n1,.mx-n1{margin-right:-.25rem !important}.mb-n1,.my-n1{margin-bottom:-.25rem !important}.ml-n1,.mx-n1{margin-left:-.25rem !important}.m-n2{margin:-.5rem !important}.mt-n2,.my-n2{margin-top:-.5rem !important}.mr-n2,.mx-n2{margin-right:-.5rem !important}.mb-n2,.my-n2{margin-bottom:-.5rem !important}.ml-n2,.mx-n2{margin-left:-.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem !important}.m-md-n2{margin:-.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#3f6ad8 !important}a.text-primary:hover,a.text-primary:focus{color:#2248a8 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#3ac47d !important}a.text-success:hover,a.text-success:focus{color:#298957 !important}.text-info{color:#16aaff !important}a.text-info:hover,a.text-info:focus{color:#007fc9 !important}.text-warning{color:#f7b924 !important}a.text-warning:hover,a.text-warning:focus{color:#c78f07 !important}.text-danger{color:#d92550 !important}a.text-danger:hover,a.text-danger:focus{color:#981a38 !important}.text-light{color:#eee !important}a.text-light:hover,a.text-light:focus{color:#c8c8c8 !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-focus{color:#444054 !important}a.text-focus:hover,a.text-focus:focus{color:#211f29 !important}.text-alternate{color:#794c8a !important}a.text-alternate:hover,a.text-alternate:focus{color:#4e3159 !important}.text-body{color:#495057 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}a,button,.btn{outline:none !important}.app-container{display:flex;min-height:100vh;flex-direction:column;margin:0}.table th,.table td{vertical-align:middle}.app-header{height:60px;display:flex;align-items:center;align-content:center;position:relative;z-index:10;transition:all .2s}.app-header.header-shadow{box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03)}.app-header .app-header__content{display:flex;align-items:center;align-content:center;flex:1;padding:0 1.5rem;height:60px}.app-header .app-header__content .app-header-left{display:flex;align-items:center}.app-header .app-header__content .header-menu .nav-link{color:#6c757d}.app-header .app-header__content .header-menu .nav-link i{color:#adb5bd}.app-header .app-header__content .header-menu .nav-link:hover{color:#212529}.app-header .app-header__content .app-header-right{align-items:center;display:flex;margin-left:auto}.app-header .header-user-info>.widget-heading,.app-header .header-user-info>.widget-subheading{white-space:nowrap}.app-header .header-user-info>.widget-subheading{font-size:.8rem}.app-header__logo{padding:0 1.5rem;height:60px;width:350px;display:flex;align-items:center;transition:width .2s}.app-header__logo .logo-src{height:23px;width:150px;background:url("/img/logo-h.png")}.app-header__menu,.app-header__mobile-menu{display:none;padding:0 1.5rem;height:60px;align-items:center}.fixed-header .app-header{position:fixed;width:100%;top:0}.fixed-header .app-header .app-header__logo{visibility:visible}.fixed-header .app-main{padding-top:60px}.fixed-header:not(.fixed-sidebar):not(.closed-sidebar) .app-sidebar .app-header__logo{visibility:hidden}.app-header.header-text-light .app-header-left>.nav>li>.nav-link{color:rgba(255,255,255,0.7)}.app-header.header-text-light .app-header-left>.nav>li>.nav-link .nav-link-icon{color:rgba(255,255,255,0.8)}.app-header.header-text-light .app-header-left>.nav>li>.nav-link:hover{color:#fff}.app-header.header-text-light .app-header-right .icon-wrapper-alt .fa,.app-header.header-text-light .app-header-right .icon-wrapper-alt .icon{color:rgba(255,255,255,0.7) !important;transition:all .2s}.app-header.header-text-light .app-header-right .icon-wrapper-alt .icon-wrapper-bg{background:rgba(255,255,255,0.1) !important;transition:all .2s;opacity:1}.app-header.header-text-light .app-header-right .icon-wrapper-alt:hover .fa,.app-header.header-text-light .app-header-right .icon-wrapper-alt:hover .icon{color:rgba(255,255,255,0.9) !important}.app-header.header-text-light .app-header-right .icon-wrapper-alt:hover .icon-wrapper-bg{background:rgba(255,255,255,0.15) !important}.app-header.header-text-light .app-header-right .icon-wrapper-alt .badge-dot{border-color:transparent}.app-header.header-text-light .app-header-right>.header-btn-lg .widget-content-left .btn-group>.btn,.app-header.header-text-light .app-header-right>.header-btn-lg .widget-heading,.app-header.header-text-light .app-header-right>.header-btn-lg .widget-subheading{color:rgba(255,255,255,0.8)}.app-header.header-text-light .app-header-right>.header-btn-lg .header-user-info>.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(0,0,0,0.1),0 0.0625rem 0.125rem rgba(0,0,0,0.2)}.app-header.header-text-light .search-wrapper .input-holder .search-icon{background:rgba(0,0,0,0.1)}.app-header.header-text-light .search-wrapper .input-holder .search-input::placeholder,.app-header.header-text-light .search-wrapper .input-holder .search-input::-webkit-input-placeholder,.app-header.header-text-light .search-wrapper .input-holder .search-input:-ms-input-placeholder,.app-header.header-text-light .search-wrapper .input-holder .search-input:-moz-placeholder,.app-header.header-text-light .search-wrapper .input-holder .search-input::-moz-placeholder{color:rgba(255,255,255,0.5) !important}.app-header.header-text-light .search-wrapper.active .input-holder{background:rgba(255,255,255,0.1)}.app-header.header-text-light .search-wrapper.active .input-holder .search-input{color:rgba(255,255,255,0.8)}.app-header.header-text-light .search-wrapper.active .input-holder .search-icon{background:rgba(255,255,255,0.1)}.app-header.header-text-light .header-btn-lg::before{background:rgba(255,255,255,0.2)}.app-header.header-text-light .header-btn-lg .hamburger-inner,.app-header.header-text-light .header-btn-lg .hamburger.is-active .hamburger-inner,.app-header.header-text-light .header-btn-lg .hamburger-inner::before,.app-header.header-text-light .header-btn-lg .hamburger-inner::after,.app-header.header-text-light .header__pane .hamburger-inner,.app-header.header-text-light .header__pane .hamburger.is-active .hamburger-inner,.app-header.header-text-light .header__pane .hamburger-inner::before,.app-header.header-text-light .header__pane .hamburger-inner::after{background-color:rgba(255,255,255,0.8) !important}.app-header.header-text-light .search-wrapper .input-holder .search-icon span::after{border-color:rgba(255,255,255,0.8)}.app-header.header-text-light .search-wrapper .close::before,.app-header.header-text-light .search-wrapper .close::after,.app-header.header-text-light .search-wrapper .input-holder .search-icon span::before{background:rgba(255,255,255,0.8)}.app-header.header-text-light .app-header__logo .logo-src{background:url("/img/logo-h.png")}.app-header.header-text-light .app-header__mobile-menu .hamburger-inner,.app-header.header-text-light .app-header__mobile-menu .hamburger-inner::before,.app-header.header-text-light .app-header__mobile-menu .hamburger-inner::after{background:rgba(255,255,255,0.9)}.app-header.header-text-dark .app-header-left>.nav>li>.nav-link{color:rgba(0,0,0,0.7)}.app-header.header-text-dark .app-header-left>.nav>li>.nav-link .nav-link-icon{color:rgba(0,0,0,0.8)}.app-header.header-text-dark .app-header-left>.nav>li>.nav-link:hover{color:#000}.app-header.header-text-dark .app-header-right .icon-wrapper-alt .fa,.app-header.header-text-dark .app-header-right .icon-wrapper-alt .icon{color:rgba(0,0,0,0.7) !important;transition:all .2s}.app-header.header-text-dark .app-header-right .icon-wrapper-alt .icon-wrapper-bg{background:rgba(0,0,0,0.1) !important;transition:all .2s;opacity:1}.app-header.header-text-dark .app-header-right .icon-wrapper-alt:hover .fa,.app-header.header-text-dark .app-header-right .icon-wrapper-alt:hover .icon{color:rgba(0,0,0,0.95) !important}.app-header.header-text-dark .app-header-right .icon-wrapper-alt:hover .icon-wrapper-bg{background:rgba(0,0,0,0.15) !important}.app-header.header-text-dark .app-header-right .icon-wrapper-alt .badge-dot{border-color:transparent}.app-header.header-text-dark .app-header-right>.header-btn-lg .widget-content-left .btn-group>.btn,.app-header.header-text-dark .app-header-right>.header-btn-lg .widget-heading,.app-header.header-text-dark .app-header-right>.header-btn-lg .widget-subheading{color:rgba(0,0,0,0.8)}.app-header.header-text-dark .app-header-right>.header-btn-lg .header-user-info>.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(0,0,0,0.1),0 0.0625rem 0.125rem rgba(0,0,0,0.2)}.app-header.header-text-dark .search-wrapper .input-holder .search-icon{background:rgba(0,0,0,0.1)}.app-header.header-text-dark .search-wrapper.active .input-holder{background:rgba(0,0,0,0.1)}.app-header.header-text-dark .search-wrapper.active .input-holder .search-input{color:rgba(0,0,0,0.8)}.app-header.header-text-dark .search-wrapper.active .input-holder .search-icon{background:rgba(0,0,0,0.1)}.app-header.header-text-dark .header-btn-lg::before{background:rgba(0,0,0,0.2)}.app-header.header-text-dark .header-btn-lg .hamburger-inner,.app-header.header-text-dark .header-btn-lg .hamburger.is-active .hamburger-inner,.app-header.header-text-dark .header-btn-lg .hamburger-inner::before,.app-header.header-text-dark .header-btn-lg .hamburger-inner::after,.app-header.header-text-dark .header__pane .hamburger-inner,.app-header.header-text-dark .header__pane .hamburger.is-active .hamburger-inner,.app-header.header-text-dark .header__pane .hamburger-inner::before,.app-header.header-text-dark .header__pane .hamburger-inner::after{background-color:rgba(0,0,0,0.8) !important}.app-header.header-text-dark .search-wrapper .input-holder .search-icon span::after{border-color:rgba(0,0,0,0.8)}.app-header.header-text-dark .search-wrapper .close::before,.app-header.header-text-dark .search-wrapper .close::after,.app-header.header-text-dark .search-wrapper .input-holder .search-icon span::before{background:rgba(0,0,0,0.8)}.app-header.header-text-dark .app-header__logo .logo-src{background:url("/img/logo-h.png")}.app-sidebar{width:350px;display:flex;z-index:11;overflow:hidden;min-width:350px;position:relative;flex:0 0 350px;margin-top:-60px;padding-top:60px;transition:all .2s}.app-sidebar .app-sidebar__inner{padding:2px 1.5rem 1.5rem}.app-sidebar .scrollbar-sidebar{z-index:15;width:100%}.app-sidebar .app-sidebar-bg{position:absolute;left:0;top:0;height:100%;width:100%;opacity:0.05;background-size:cover;z-index:10}.app-sidebar .app-header__logo{position:absolute;left:0;top:0;display:none;z-index:11}.app-sidebar.sidebar-shadow{box-shadow:7px 0 60px rgba(0,0,0,0.05)}.app-sidebar__heading{text-transform:uppercase;font-size:.8rem;margin:.75rem 0;font-weight:bold;color:#3f6ad8;white-space:nowrap;position:relative}.sidebar-mobile-overlay{display:none;position:fixed;width:100%;height:100%;background:#333;opacity:.6;left:0;top:0;z-index:12}.vertical-nav-menu{margin:0;padding:0;position:relative;list-style:none}.vertical-nav-menu::after{content:" ";pointer-events:none;position:absolute;bottom:0;left:0;right:0;top:0}.vertical-nav-menu .mm-collapse:not(.mm-show){display:none}.vertical-nav-menu .mm-collapsing{position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.25s;transition-property:height, visibility}.vertical-nav-menu ul{margin:0;padding:0;position:relative;list-style:none}.vertical-nav-menu:before{opacity:0;transition:opacity 300ms}.vertical-nav-menu li a{display:block;line-height:2.4rem;height:2.4rem;padding:0 1.5rem 0 45px;position:relative;border-radius:.25rem;color:#343a40;white-space:nowrap;transition:all .2s;margin:.1rem 0}.vertical-nav-menu li a:hover{background:#e0f3ff;text-decoration:none}.vertical-nav-menu li a:hover i.metismenu-icon{opacity:.6}.vertical-nav-menu li a:hover i.metismenu-state-icon{opacity:1}.vertical-nav-menu li.mm-active>a{font-weight:bold}.vertical-nav-menu li.mm-active>a i.metismenu-state-icon{transform:rotate(-180deg)}.vertical-nav-menu li a.mm-active{color:#343a40;background:#e0f3ff;font-weight:bold}.vertical-nav-menu i.metismenu-state-icon,.vertical-nav-menu i.metismenu-icon{text-align:center;width:34px;height:34px;line-height:34px;position:absolute;left:5px;top:50%;margin-top:-17px;font-size:1.5rem;opacity:.3;transition:color 300ms}.vertical-nav-menu i.metismenu-state-icon{transition:transform 300ms;left:auto;right:0}.vertical-nav-menu ul{transition:padding 300ms;padding:.5em 0 0 2rem}.vertical-nav-menu ul:before{content:'';height:100%;opacity:1;width:3px;background:#e0f3ff;position:absolute;left:20px;top:0;border-radius:15px}.vertical-nav-menu ul>li>a{color:#6c757d;height:2rem;line-height:2rem;padding:0 1.5rem 0}.vertical-nav-menu ul>li>a:hover{color:#3f6ad8}.vertical-nav-menu ul>li>a .metismenu-icon{display:none}.vertical-nav-menu ul>li>a.mm-active{color:#3f6ad8;background:#e0f3ff;font-weight:bold}.app-sidebar.sidebar-text-light{border-right:0 !important}.app-sidebar.sidebar-text-light .app-sidebar__heading{color:rgba(255,255,255,0.6)}.app-sidebar.sidebar-text-light .app-sidebar__heading::before{background:rgba(255,255,255,0.5) !important}.app-sidebar.sidebar-text-light .vertical-nav-menu li a{color:rgba(255,255,255,0.7)}.app-sidebar.sidebar-text-light .vertical-nav-menu li a i.metismenu-icon{opacity:.5}.app-sidebar.sidebar-text-light .vertical-nav-menu li a i.metismenu-state-icon{opacity:.5}.app-sidebar.sidebar-text-light .vertical-nav-menu li a:hover{background:rgba(255,255,255,0.15);color:#fff}.app-sidebar.sidebar-text-light .vertical-nav-menu li a:hover i.metismenu-icon{opacity:.8}.app-sidebar.sidebar-text-light .vertical-nav-menu li a:hover i.metismenu-state-icon{opacity:1}.app-sidebar.sidebar-text-light .vertical-nav-menu li a.mm-active{color:rgba(255,255,255,0.7);background:rgba(255,255,255,0.15)}.app-sidebar.sidebar-text-light .vertical-nav-menu ul:before{background:rgba(255,255,255,0.1)}.app-sidebar.sidebar-text-light .vertical-nav-menu ul>li>a{color:rgba(255,255,255,0.6)}.app-sidebar.sidebar-text-light .vertical-nav-menu ul>li>a:hover{color:#fff}.app-sidebar.sidebar-text-light .vertical-nav-menu ul>li>a.mm-active{color:#fff;background:rgba(255,255,255,0.15)}.app-sidebar.sidebar-text-light .ps__thumb-y{background:rgba(255,255,255,0.3)}.app-sidebar.sidebar-text-light .ps__rail-y:hover .ps__thumb-y{background:rgba(255,255,255,0.2)}.app-sidebar.sidebar-text-light .app-header__logo .logo-src{background:url("/img/logo-h.png")}.app-sidebar.sidebar-text-light .app-header__logo .hamburger-inner,.app-sidebar.sidebar-text-light .app-header__logo .hamburger-inner::before,.app-sidebar.sidebar-text-light .app-header__logo .hamburger-inner::after{background-color:rgba(255,255,255,0.8)}.app-sidebar.sidebar-text-dark{border-right:0 !important}.app-sidebar.sidebar-text-dark .app-sidebar__heading{color:rgba(0,0,0,0.6)}.app-sidebar.sidebar-text-dark .app-sidebar__heading::before{background:rgba(0,0,0,0.5) !important}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a{color:rgba(0,0,0,0.6)}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a i.metismenu-icon{opacity:.5}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a i.metismenu-state-icon{opacity:.5}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a:hover{background:rgba(0,0,0,0.15);color:rgba(0,0,0,0.7)}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a:hover i.metismenu-icon{opacity:.7}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a:hover i.metismenu-state-icon{opacity:1}.app-sidebar.sidebar-text-dark .vertical-nav-menu li a.mm-active{color:rgba(0,0,0,0.7);background:rgba(0,0,0,0.15)}.app-sidebar.sidebar-text-dark .vertical-nav-menu ul:before{background:rgba(0,0,0,0.1)}.app-sidebar.sidebar-text-dark .vertical-nav-menu ul>li>a{color:rgba(0,0,0,0.4)}.app-sidebar.sidebar-text-dark .vertical-nav-menu ul>li>a:hover{color:rgba(0,0,0,0.7)}.app-sidebar.sidebar-text-dark .vertical-nav-menu ul>li>a.mm-active{color:rgba(0,0,0,0.7);background:rgba(0,0,0,0.15)}.app-sidebar.sidebar-text-dark .ps__thumb-y{background:rgba(0,0,0,0.3)}.app-sidebar.sidebar-text-dark .ps__rail-y:hover .ps__thumb-y{background:rgba(0,0,0,0.2)}.app-sidebar.sidebar-text-dark .app-header__logo .hamburger-inner,.app-sidebar.sidebar-text-dark .app-header__logo .hamburger-inner::before,.app-sidebar.sidebar-text-dark .app-header__logo .hamburger-inner::after{background-color:rgba(0,0,0,0.8)}.fixed-sidebar .app-sidebar{position:fixed;height:100vh}.fixed-sidebar .app-main .app-main__outer{z-index:9;padding-left:350px}.fixed-sidebar.fixed-header .app-sidebar .app-header__logo{display:none}.fixed-sidebar:not(.fixed-header) .app-sidebar .app-header__logo{display:flex}.fixed-sidebar:not(.fixed-header) .app-header{margin-left:350px}.fixed-sidebar:not(.fixed-header) .app-header .app-header__logo{display:none}.fixed-sidebar.closed-sidebar:not(.fixed-header) .app-header{margin-left:80px}.fixed-sidebar.closed-sidebar:not(.fixed-header) .app-sidebar .app-header__logo{width:80px;padding:0}.fixed-sidebar.closed-sidebar:not(.fixed-header) .app-sidebar .app-header__logo .logo-src{display:none}.fixed-sidebar.closed-sidebar:not(.fixed-header) .app-sidebar .app-header__logo .header__pane{margin-right:auto}.closed-sidebar .app-sidebar{transition:all .3s ease;width:80px;min-width:80px;flex:0 0 80px;z-index:13}.closed-sidebar .app-sidebar .app-sidebar__inner .app-sidebar__heading{text-indent:-999em}.closed-sidebar .app-sidebar .app-sidebar__inner .app-sidebar__heading::before{content:'';position:absolute;top:50%;left:0;width:100%;height:1px;background:#e0f3ff;text-indent:1px}.closed-sidebar .app-sidebar .app-sidebar__inner ul li a{text-indent:-99rem;padding:0}.closed-sidebar .app-sidebar .app-sidebar__inner .metismenu-icon{text-indent:0;left:50%;margin-left:-17px}.closed-sidebar .app-sidebar .app-sidebar__inner .metismenu-state-icon{visibility:hidden}.closed-sidebar .app-sidebar .app-sidebar__inner ul::before{display:none}.closed-sidebar .app-sidebar .app-sidebar__inner ul.mm-show{padding:0}.closed-sidebar .app-sidebar .app-sidebar__inner ul.mm-show>li>a{height:0}.closed-sidebar .app-sidebar:hover{flex:0 0 350px !important;width:350px !important}.closed-sidebar .app-sidebar:hover .app-sidebar__inner .app-sidebar__heading{text-indent:initial}.closed-sidebar .app-sidebar:hover .app-sidebar__inner .app-sidebar__heading::before{display:none}.closed-sidebar .app-sidebar:hover .app-sidebar__inner ul::before{display:block}.closed-sidebar .app-sidebar:hover .app-sidebar__inner ul li a{text-indent:initial;padding:0 1.5rem 0 45px}.closed-sidebar .app-sidebar:hover .app-sidebar__inner .metismenu-icon{text-indent:initial;left:5px;margin-left:0}.closed-sidebar .app-sidebar:hover .app-sidebar__inner .metismenu-state-icon{visibility:visible}.closed-sidebar .app-sidebar:hover .app-sidebar__inner ul.mm-show{padding:.5em 0 0 2rem}.closed-sidebar .app-sidebar:hover .app-sidebar__inner ul.mm-show>li>a{height:2.3em}.closed-sidebar .app-sidebar:hover .app-sidebar__inner ul ul li a{padding-left:1em}.closed-sidebar:not(.sidebar-mobile-open) .app-sidebar .scrollbar-sidebar{position:static;height:auto;overflow:initial !important}.closed-sidebar:not(.sidebar-mobile-open) .app-sidebar:hover .scrollbar-sidebar{position:absolute;height:100%;overflow:hidden !important}.closed-sidebar:not(.closed-sidebar-mobile) .app-header .app-header__logo{width:80px}.closed-sidebar:not(.closed-sidebar-mobile) .app-header .app-header__logo .logo-src{display:none}.closed-sidebar:not(.closed-sidebar-mobile) .app-header .app-header__logo .header__pane{margin-right:auto}.closed-sidebar.fixed-sidebar .app-main__outer{padding-left:80px}.closed-sidebar.fixed-header:not(.fixed-sidebar) .app-sidebar .app-header__logo{visibility:hidden}.closed-sidebar.closed-sidebar-mobile .app-sidebar .app-header__logo,.closed-sidebar.closed-sidebar-mobile .app-header .app-header__logo{width:auto;display:flex}.closed-sidebar.closed-sidebar-mobile .app-sidebar .app-header__logo .header__pane,.closed-sidebar.closed-sidebar-mobile .app-header .app-header__logo .header__pane{display:none}.closed-sidebar.closed-sidebar-mobile .app-sidebar .app-header__logo{display:flex;width:80px;padding:0 1.5rem !important}.closed-sidebar.closed-sidebar-mobile .app-sidebar .app-header__logo .logo-src{display:block !important;margin:0 auto;width:74px}.closed-sidebar.closed-sidebar-mobile .app-sidebar .app-header__logo .header__pane{display:none}.closed-sidebar.closed-sidebar-mobile .app-sidebar:hover .app-header__logo{width:350px}.closed-sidebar.closed-sidebar-mobile .app-sidebar:hover .app-header__logo .logo-src{width:150px;margin:0}.closed-sidebar.closed-sidebar-mobile .app-header{margin-left:0 !important}.closed-sidebar.fixed-footer .app-footer__inner{margin-left:0 !important}.app-main{flex:1;display:flex;z-index:8;position:relative}.app-main .app-main__outer{flex:1;flex-direction:column;display:flex;z-index:12}.app-main .app-main__inner{padding:30px 30px 0;flex:1}.app-theme-white.app-container{background:#f1f4f6}.app-theme-white .app-sidebar{background:#fff}.app-theme-white .app-page-title{background:rgba(255,255,255,0.45)}.app-theme-white .app-footer .app-footer__inner,.app-theme-white .app-header{background:#fafbfc}.app-theme-white.fixed-header .app-header__logo{background:rgba(250,251,252,0.1)}.app-footer{height:60px}.app-footer .app-footer__inner{padding:0 1.5rem 0 .75rem;height:60px;display:flex;align-content:center;align-items:center}.app-footer .app-footer__inner .app-footer-left{display:flex;align-items:center}.app-footer .app-footer__inner .app-footer-right{margin-left:auto;display:flex}.fixed-footer .app-footer{position:fixed;width:100%;bottom:0;left:0;z-index:7}.fixed-footer .app-footer .app-footer__inner{margin-left:350px;box-shadow:0.3rem -0.46875rem 2.1875rem rgba(4,9,20,0.02),0.3rem -0.9375rem 1.40625rem rgba(4,9,20,0.02),0.3rem -0.25rem 0.53125rem rgba(4,9,20,0.04),0.3rem -0.125rem 0.1875rem rgba(4,9,20,0.02)}.fixed-footer .app-main .app-main__outer{padding-bottom:60px}.app-page-title{padding:30px;margin:-30px -30px 30px;position:relative}.app-page-title+.body-tabs-layout{margin-top:-30px !important}.app-page-title .page-title-wrapper{position:relative;display:flex;align-items:center}.app-page-title .page-title-heading,.app-page-title .page-title-subheading{margin:0;padding:0}.app-page-title .page-title-heading{font-size:1.25rem;font-weight:400;display:flex;align-content:center;align-items:center}.app-page-title .page-title-subheading{padding:3px 0 0;font-size:.88rem;opacity:.6}.app-page-title .page-title-subheading .breadcrumb{padding:0;margin:3px 0 0;background:transparent}.app-page-title .page-title-actions{margin-left:auto}.app-page-title .page-title-actions .breadcrumb{margin:0;padding:0;background:transparent}.app-page-title .page-title-icon{font-size:2rem;display:flex;align-items:center;align-content:center;text-align:center;padding:.83333rem;margin:0 30px 0 0;background:#fff;box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);border-radius:.25rem;width:60px;height:60px}.app-page-title .page-title-icon i{margin:auto}.app-page-title .page-title-icon.rounded-circle{margin:0 20px 0 0}.app-page-title+.RRT__container{margin-top:-23.07692px}.app-page-title.app-page-title-simple{margin:0;background:none !important;padding-left:0;padding-right:0;padding-top:0}.page-title-icon-rounded .page-title-icon{border-radius:50px}.search-wrapper{position:relative;margin-right:.66667rem}.search-wrapper .input-holder{height:42px;width:42px;overflow:hidden;position:relative;transition:all 0.3s ease-in-out}.search-wrapper .input-holder .search-input{width:100%;padding:0 70px 0 20px;opacity:0;position:absolute;top:0;left:0;background:transparent;box-sizing:border-box;border:none;outline:none;transform:translate(0, 60px);transition:all 0.3s cubic-bezier(0, 0.105, 0.035, 1.57);transition-delay:0.3s;font-size:.88rem}.search-wrapper .input-holder .search-icon{width:42px;height:42px;border:none;padding:0;outline:none;position:relative;z-index:2;float:right;cursor:pointer;transition:all 0.3s ease-in-out;background:rgba(0,0,0,0.06);border-radius:30px}.search-wrapper .input-holder .search-icon span{width:22px;height:22px;display:inline-block;vertical-align:middle;position:relative;transform:rotate(45deg);transition:all 0.4s cubic-bezier(0.65, -0.6, 0.24, 1.65)}.search-wrapper .input-holder .search-icon span::before,.search-wrapper .input-holder .search-icon span::after{position:absolute;content:''}.search-wrapper .input-holder .search-icon span::before{width:4px;height:11px;left:9px;top:13px;border-radius:2px;background:#3f6ad8}.search-wrapper .input-holder .search-icon span::after{width:14px;height:14px;left:4px;top:0;border-radius:16px;border:2px solid #3f6ad8}.search-wrapper .close{position:absolute;z-index:1;top:50%;left:0;width:20px;height:20px;margin-top:-10px;cursor:pointer;opacity:0 !important;transform:rotate(-180deg);transition:all 0.2s cubic-bezier(0.285, -0.45, 0.935, 0.11);transition-delay:0.1s}.search-wrapper .close::before,.search-wrapper .close::after{position:absolute;content:'';background:#3f6ad8;border-radius:2px}.search-wrapper .close::before{width:2px;height:20px;left:9px;top:0}.search-wrapper .close::after{width:20px;height:2px;left:0;top:9px}.search-wrapper.active{width:330px}.search-wrapper.active .input-holder{width:290px;border-radius:50px;background:rgba(0,0,0,0.05);transition:all 0.5s cubic-bezier(0, 0.105, 0.035, 1.57)}.search-wrapper.active .input-holder .search-input{opacity:1;transform:translate(0, 11px)}.search-wrapper.active .input-holder .search-icon{width:42px;height:42px;margin:0;border-radius:30px}.search-wrapper.active .input-holder .search-icon span{transform:rotate(-45deg)}.search-wrapper.active .close{left:300px;opacity:.6 !important;transform:rotate(45deg);transition:all 0.6s cubic-bezier(0, 0.105, 0.035, 1.57);transition-delay:0.5s}.search-wrapper.active .close:hover{opacity:1 !important}.search-wrapper.active+.header-menu{opacity:0}.opacity-01{opacity:.01 !important}.opacity-02{opacity:.02 !important}.opacity-03{opacity:.03 !important}.opacity-04{opacity:.04 !important}.opacity-05{opacity:.05 !important}.opacity-06{opacity:.06 !important}.opacity-07{opacity:.07 !important}.opacity-08{opacity:.08 !important}.opacity-09{opacity:.09 !important}.opacity-1{opacity:.1 !important}.opacity-15{opacity:.15 !important}.opacity-2{opacity:.2 !important}.opacity-3{opacity:.3 !important}.opacity-4{opacity:.4 !important}.opacity-5{opacity:.5 !important}.opacity-6{opacity:.6 !important}.opacity-7{opacity:.7 !important}.opacity-8{opacity:.8 !important}.opacity-9{opacity:.9 !important}.opacity-10{opacity:1 !important}.filter-grayscale-5{filter:grayscale(5%) !important}.filter-grayscale-10{filter:grayscale(10%) !important}.filter-grayscale-20{filter:grayscale(20%) !important}.filter-grayscale-30{filter:grayscale(30%) !important}.filter-grayscale-40{filter:grayscale(40%) !important}.filter-grayscale-50{filter:grayscale(50%) !important}.filter-grayscale-80{filter:grayscale(80%) !important}.filter-grayscale-100{filter:grayscale(100%) !important}.br-tl{border-top-left-radius:.25rem !important}.br-tr{border-top-right-radius:.25rem !important}.br-bl{border-bottom-left-radius:.25rem !important}.br-br{border-bottom-right-radius:.25rem !important}.b-radius-0{border-radius:0 !important}.rm-border{border-width:0 !important}.br-a{border-radius:.25rem}.margin-h-center{margin-left:auto !important;margin-right:auto !important}.center-svg{margin:0 auto}.center-svg svg{margin:0 auto}.apexcharts-canvas{margin:0 auto}.apexcharts-donut{display:flex;align-items:center;align-content:center}.alert-dismissible .close{top:0;right:5px;padding:5px}.icon-gradient{-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;text-fill-color:transparent}.font-size-xlg{font-size:1.3rem !important}.font-size-md{font-size:.9rem !important}.font-size-lg{font-size:1.1rem !important}.no-shadow{box-shadow:0 0 0 transparent !important}.h-100{height:100vh !important}.he-auto{height:auto !important}.he-100{height:100%}.h-sm{height:150px}.text-nowrap{white-space:nowrap}.fsize-1{font-size:.95rem !important}.fsize-2{font-size:1.3rem !important}.fsize-3{font-size:1.6rem !important}.fsize-4{font-size:2rem !important}.z-index-6{z-index:6}.line-height-1{line-height:1}.center-elem{display:flex;align-items:center;align-content:center}.flex2{flex:2}.divider{margin-top:1rem;margin-bottom:1rem;height:1px;overflow:hidden;background:#e9ecef}.list-group-item:hover{z-index:initial}.no-results{padding:1.5rem;text-align:center}.no-results .results-title{color:#495057;font-size:1.25rem}.no-results .results-subtitle{color:#adb5bd;font-size:1.1rem}.bg-animation{animation:bg-pan-left 8s both}@-webkit-keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0% 50%}}@keyframes bg-pan-left{0%{background-position:100% 50%}100%{background-position:0% 50%}}.w-100{width:100%}.mb--2{margin-bottom:-1.5rem}.mbg-3{margin-bottom:30px}.circle-progress{position:relative}.circle-progress small{position:absolute;height:100%;width:100%;font-weight:bold;left:0;top:0;vertical-align:middle;text-align:center;display:flex;align-items:center;align-content:center}.circle-progress small span{margin:0 auto}.circle-progress canvas{display:block}.bg-warm-flame{background-image:linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%) !important}.bg-night-fade{background-image:linear-gradient(to top, #a18cd1 0%, #fbc2eb 100%) !important}.bg-sunny-morning{background-image:linear-gradient(120deg, #f6d365 0%, #fda085 100%) !important}.bg-tempting-azure{background-image:linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%) !important}.bg-amy-crisp{background-image:linear-gradient(120deg, #a6c0fe 0%, #f68084 100%) !important}.bg-heavy-rain{background-image:linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%) !important}.bg-mean-fruit{background-image:linear-gradient(120deg, #fccb90 0%, #d57eeb 100%) !important}.bg-malibu-beach{background-image:linear-gradient(to right, #4facfe 0%, #00f2fe 100%) !important}.bg-deep-blue{background-image:linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%) !important}.bg-ripe-malin{background-image:linear-gradient(120deg, #f093fb 0%, #f5576c 100%) !important}.bg-arielle-smile{background-image:radial-gradient(circle 248px at center, #16d9e3 0%, #30c7ec 47%, #46aef7 100%) !important}.bg-plum-plate{background-image:linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important}.bg-happy-fisher{background-image:linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%) !important}.bg-happy-itmeo{background-image:linear-gradient(180deg, #2af598 0%, #009efd 100%) !important}.bg-mixed-hopes{background-image:linear-gradient(to top, #c471f5 0%, #fa71cd 100%) !important}.bg-strong-bliss{background-image:linear-gradient(to right, #f78ca0 0%, #f9748f 19%, #fd868c 60%, #fe9a8b 100%) !important}.bg-grow-early{background-image:linear-gradient(to top, #0ba360 0%, #3cba92 100%) !important}.bg-love-kiss{background-image:linear-gradient(to top, #ff0844 0%, #ffb199 100%) !important}.bg-premium-dark{background-image:linear-gradient(to right, #434343 0%, black 100%) !important}.bg-happy-green{background-image:linear-gradient(to bottom, #00b09b, #96c93d) !important}.bg-vicious-stance{background-image:linear-gradient(60deg, #29323c 0%, #485563 100%) !important}.bg-midnight-bloom{background-image:linear-gradient(-20deg, #2b5876 0%, #4e4376 100%) !important}.bg-night-sky{background-image:linear-gradient(to top, #1e3c72 0%, #1e3c72 1%, #2a5298 100%) !important}.bg-slick-carbon{background-image:linear-gradient(to bottom, #323232 0%, #3F3F3F 40%, #1C1C1C 150%),linear-gradient(to top, rgba(255,255,255,0.4) 0%, rgba(0,0,0,0.25) 200%) !important;background-blend-mode:multiply}.bg-royal{background-image:linear-gradient(to right, #141e30, #243b55) !important}.bg-asteroid{background-image:linear-gradient(to right, #0f2027, #203a43, #2c5364) !important}.bg-transparent{background:transparent !important}/*!
+Animate.css - http://daneden.me/animate
+Licensed under the MIT license - http://opensource.org/licenses/MIT
+Copyright (c) 2015 Daniel Eden
+*/body{-webkit-backface-visibility:hidden}.animated{-webkit-animation-duration:calc( 1s);animation-duration:calc( 1s);-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:calc( 1s * 2);animation-duration:calc( 1s * 2)}.animated.bounceIn,.animated.bounceOut{-webkit-animation-duration:calc( 1s * 0.75);animation-duration:calc( 1s * 0.75)}.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:calc( 1s * 0.75);animation-duration:calc( 1s * 0.75)}@-webkit-keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0)}40%{-webkit-transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px)}}@keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-30px)}60%{transform:translateY(-15px)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px)}}@keyframes shake{0%,100%{transform:translateX(0)}10%,30%,50%,70%,90%{transform:translateX(-10px)}20%,40%,60%,80%{transform:translateX(10px)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%,40%,60%,80%,100%{-webkit-transform-origin:top center}20%{-webkit-transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg)}100%{-webkit-transform:rotate(0deg)}}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}100%{transform:rotate(0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes wiggle{0%{-webkit-transform:skewX(9deg)}10%{-webkit-transform:skewX(-8deg)}20%{-webkit-transform:skewX(7deg)}30%{-webkit-transform:skewX(-6deg)}40%{-webkit-transform:skewX(5deg)}50%{-webkit-transform:skewX(-4deg)}60%{-webkit-transform:skewX(3deg)}70%{-webkit-transform:skewX(-2deg)}80%{-webkit-transform:skewX(1deg)}90%{-webkit-transform:skewX(0deg)}100%{-webkit-transform:skewX(0deg)}}@keyframes wiggle{0%{transform:skewX(9deg)}10%{transform:skewX(-8deg)}20%{transform:skewX(7deg)}30%{transform:skewX(-6deg)}40%{transform:skewX(5deg)}50%{transform:skewX(-4deg)}60%{transform:skewX(3deg)}70%{transform:skewX(-2deg)}80%{transform:skewX(1deg)}90%{transform:skewX(0deg)}100%{transform:skewX(0deg)}}.wiggle{-webkit-animation-name:wiggle;animation-name:wiggle;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0%)}15%{-webkit-transform:translateX(-25%) rotate(-5deg)}30%{-webkit-transform:translateX(20%) rotate(3deg)}45%{-webkit-transform:translateX(-15%) rotate(-3deg)}60%{-webkit-transform:translateX(10%) rotate(2deg)}75%{-webkit-transform:translateX(-5%) rotate(-1deg)}100%{-webkit-transform:translateX(0%)}}@keyframes wobble{0%{transform:translateX(0%)}15%{transform:translateX(-25%) rotate(-5deg)}30%{transform:translateX(20%) rotate(3deg)}45%{transform:translateX(-15%) rotate(-3deg)}60%{transform:translateX(10%) rotate(2deg)}75%{transform:translateX(-5%) rotate(-1deg)}100%{transform:translateX(0%)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes tada{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0)}}@keyframes tada{0%{transform:scale(1)}10%,20%{transform:scale(0.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale(1.1) rotate(3deg)}40%,60%,80%{transform:scale(1.1) rotate(-3deg)}100%{transform:scale(1) rotate(0)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(0.3)}50%{opacity:1;-webkit-transform:scale(1.05)}70%{-webkit-transform:scale(0.9)}100%{-webkit-transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;transform:scale(0.3)}50%{opacity:1;transform:scale(1.05)}70%{transform:scale(0.9)}100%{transform:scale(1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px)}60%{opacity:1;-webkit-transform:translateY(30px)}80%{-webkit-transform:translateY(-10px)}100%{-webkit-transform:translateY(0)}}@keyframes bounceInDown{0%{opacity:0;transform:translateY(-2000px)}60%{opacity:1;transform:translateY(30px)}80%{transform:translateY(-10px)}100%{transform:translateY(0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px)}60%{opacity:1;-webkit-transform:translateX(30px)}80%{-webkit-transform:translateX(-10px)}100%{-webkit-transform:translateX(0)}}@keyframes bounceInLeft{0%{opacity:0;transform:translateX(-2000px)}60%{opacity:1;transform:translateX(30px)}80%{transform:translateX(-10px)}100%{transform:translateX(0)}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px)}60%{opacity:1;-webkit-transform:translateX(-30px)}80%{-webkit-transform:translateX(10px)}100%{-webkit-transform:translateX(0)}}@keyframes bounceInRight{0%{opacity:0;transform:translateX(2000px)}60%{opacity:1;transform:translateX(-30px)}80%{transform:translateX(10px)}100%{transform:translateX(0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px)}60%{opacity:1;-webkit-transform:translateY(-30px)}80%{-webkit-transform:translateY(10px)}100%{-webkit-transform:translateY(0)}}@keyframes bounceInUp{0%{opacity:0;transform:translateY(2000px)}60%{opacity:1;transform:translateY(-30px)}80%{transform:translateY(10px)}100%{transform:translateY(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{0%{-webkit-transform:scale(1)}25%{-webkit-transform:scale(0.95)}50%{opacity:1;-webkit-transform:scale(1.1)}100%{opacity:0;-webkit-transform:scale(0.3)}}@keyframes bounceOut{0%{transform:scale(1)}25%{transform:scale(0.95)}50%{opacity:1;transform:scale(1.1)}100%{opacity:0;transform:scale(0.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{0%{-webkit-transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(-20px)}100%{opacity:0;-webkit-transform:translateY(2000px)}}@keyframes bounceOutDown{0%{transform:translateY(0)}20%{opacity:1;transform:translateY(-20px)}100%{opacity:0;transform:translateY(2000px)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{0%{-webkit-transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(20px)}100%{opacity:0;-webkit-transform:translateX(-2000px)}}@keyframes bounceOutLeft{0%{transform:translateX(0)}20%{opacity:1;transform:translateX(20px)}100%{opacity:0;transform:translateX(-2000px)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{0%{-webkit-transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(-20px)}100%{opacity:0;-webkit-transform:translateX(2000px)}}@keyframes bounceOutRight{0%{transform:translateX(0)}20%{opacity:1;transform:translateX(-20px)}100%{opacity:0;transform:translateX(2000px)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{0%{-webkit-transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(20px)}100%{opacity:0;-webkit-transform:translateY(-2000px)}}@keyframes bounceOutUp{0%{transform:translateY(0)}20%{opacity:1;transform:translateY(20px)}100%{opacity:0;transform:translateY(-2000px)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;transform:translateY(-20px)}100%{opacity:1;transform:translateY(0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInDownBig{0%{opacity:0;transform:translateY(-2000px)}100%{opacity:1;transform:translateY(0)}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;transform:translateX(-20px)}100%{opacity:1;transform:translateX(0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px)}100%{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInLeftBig{0%{opacity:0;transform:translateX(-2000px)}100%{opacity:1;transform:translateX(0)}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;transform:translateX(20px)}100%{opacity:1;transform:translateX(0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px)}100%{opacity:1;-webkit-transform:translateX(0)}}@keyframes fadeInRightBig{0%{opacity:0;transform:translateX(2000px)}100%{opacity:1;transform:translateX(0)}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;transform:translateY(2000px)}100%{opacity:1;transform:translateY(0)}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(20px)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(2000px)}}@keyframes fadeOutDownBig{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(2000px)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(-20px)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px)}}@keyframes fadeOutLeftBig{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(-2000px)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(20px)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px)}}@keyframes fadeOutRightBig{0%{opacity:1;transform:translateX(0)}100%{opacity:0;transform:translateX(2000px)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-20px)}}@keyframes fadeOutUp{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-20px)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px)}}@keyframes fadeOutUpBig{0%{opacity:1;transform:translateY(0)}100%{opacity:0;transform:translateY(-2000px)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(0);-webkit-animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(170deg);-webkit-animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-webkit-animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) rotateY(360deg) scale(0.95);-webkit-animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px) scale(1);-webkit-animation-timing-function:ease-in}}@keyframes flip{0%{transform:perspective(400px) rotateY(0);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(170deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);animation-timing-function:ease-in}80%{transform:perspective(400px) rotateY(360deg) scale(0.95);animation-timing-function:ease-in}100%{transform:perspective(400px) scale(1);animation-timing-function:ease-in}}.flip{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-10deg)}70%{-webkit-transform:perspective(400px) rotateX(10deg)}100%{-webkit-transform:perspective(400px) rotateX(0deg);opacity:1}}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);opacity:0}40%{transform:perspective(400px) rotateX(-10deg)}70%{transform:perspective(400px) rotateX(10deg)}100%{transform:perspective(400px) rotateX(0deg);opacity:1}}.flipInX{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-10deg)}70%{-webkit-transform:perspective(400px) rotateY(10deg)}100%{-webkit-transform:perspective(400px) rotateY(0deg);opacity:1}}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);opacity:0}40%{transform:perspective(400px) rotateY(-10deg)}70%{transform:perspective(400px) rotateY(10deg)}100%{transform:perspective(400px) rotateY(0deg);opacity:1}}.flipInY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px) rotateX(0deg);opacity:1}100%{-webkit-transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{transform:perspective(400px) rotateX(0deg);opacity:1}100%{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible !important;backface-visibility:visible !important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px) rotateY(0deg);opacity:1}100%{-webkit-transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{transform:perspective(400px) rotateY(0deg);opacity:1}100%{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%) skewX(-30deg);opacity:0}60%{-webkit-transform:translateX(-20%) skewX(30deg);opacity:1}80%{-webkit-transform:translateX(0%) skewX(-15deg);opacity:1}100%{-webkit-transform:translateX(0%) skewX(0deg);opacity:1}}@keyframes lightSpeedIn{0%{transform:translateX(100%) skewX(-30deg);opacity:0}60%{transform:translateX(-20%) skewX(30deg);opacity:1}80%{transform:translateX(0%) skewX(-15deg);opacity:1}100%{transform:translateX(0%) skewX(0deg);opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{-webkit-transform:translateX(0%) skewX(0deg);opacity:1}100%{-webkit-transform:translateX(100%) skewX(-30deg);opacity:0}}@keyframes lightSpeedOut{0%{transform:translateX(0%) skewX(0deg);opacity:1}100%{transform:translateX(100%) skewX(-30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center center;-webkit-transform:rotate(-200deg);opacity:0}100%{-webkit-transform-origin:center center;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateIn{0%{transform-origin:center center;transform:rotate(-200deg);opacity:0}100%{transform-origin:center center;transform:rotate(0);opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(-90deg);opacity:0}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-90deg);opacity:0}100%{transform-origin:left bottom;transform:rotate(0);opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(90deg);opacity:0}100%{transform-origin:right bottom;transform:rotate(0);opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(90deg);opacity:0}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(90deg);opacity:0}100%{transform-origin:left bottom;transform:rotate(0);opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}100%{transform-origin:right bottom;transform:rotate(0);opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center center;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:center center;-webkit-transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{transform-origin:center center;transform:rotate(0);opacity:1}100%{transform-origin:center center;transform:rotate(200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(90deg);opacity:0}}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;transform:rotate(0);opacity:1}100%{transform-origin:left bottom;transform:rotate(90deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(-90deg);opacity:0}}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;transform:rotate(0);opacity:1}100%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:left bottom;-webkit-transform:rotate(-90deg);opacity:0}}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;transform:rotate(0);opacity:1}100%{-transform-origin:left bottom;-transform:rotate(-90deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(0);opacity:1}100%{-webkit-transform-origin:right bottom;-webkit-transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;transform:rotate(0);opacity:1}100%{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0, -100%, 0);visibility:visible}100%{-webkit-transform:translate3d(0, 0, 0)}}@keyframes slideInDown{0%{transform:translate3d(0, -100%, 0);visibility:visible}100%{transform:translate3d(0, 0, 0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(0, 0, 0)}}@keyframes slideInLeft{0%{transform:translate3d(-100%, 0, 0);visibility:visible}100%{transform:translate3d(0, 0, 0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(0, 0, 0)}}@keyframes slideInRight{0%{transform:translate3d(100%, 0, 0);visibility:visible}100%{transform:translate3d(0, 0, 0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0, 100%, 0);visibility:visible}100%{-webkit-transform:translate3d(0, 0, 0)}}@keyframes slideInUp{0%{transform:translate3d(0, 100%, 0);visibility:visible}100%{transform:translate3d(0, 0, 0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translate3d(0, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(0, 100%, 0)}}@keyframes slideOutDown{0%{transform:translate3d(0, 0, 0);visibility:visible}100%{transform:translate3d(0, 100%, 0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translate3d(0, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(-100%, 0, 0)}}@keyframes slideOutLeft{0%{transform:translate3d(0, 0, 0);visibility:visible}100%{transform:translate3d(-100%, 0, 0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translate3d(0, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(100%, 0, 0)}}@keyframes slideOutRight{0%{transform:translate3d(0, 0, 0);visibility:visible}100%{transform:translate3d(100%, 0, 0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0, 0, 0);visibility:visible}100%{-webkit-transform:translate3d(0, -100%, 0)}}@keyframes slideOutUp{0%{transform:translate3d(0, 0, 0);visibility:visible}100%{transform:translate3d(0, -100%, 0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}@-webkit-keyframes hinge{0%{-webkit-transform:rotate(0);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}40%{-webkit-transform:rotate(60deg);-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}80%{-webkit-transform:rotate(60deg) translateY(0);opacity:1;-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out}100%{-webkit-transform:translateY(700px);opacity:0}}@keyframes hinge{0%{transform:rotate(0);transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out}80%{transform:rotate(60deg) translateY(0);opacity:1;transform-origin:top left;animation-timing-function:ease-in-out}100%{transform:translateY(700px);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg)}}@keyframes rollIn{0%{opacity:0;transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;transform:translateX(0px) rotate(0deg)}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg)}100%{opacity:0;-webkit-transform:translateX(100%) rotate(120deg)}}@keyframes rollOut{0%{opacity:1;transform:translateX(0px) rotate(0deg)}100%{opacity:0;transform:translateX(100%) rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}60%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(0.3, 0.3, 0.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);-webkit-transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;-webkit-transform:scale3d(0.1) translate3d(-2000px, 0, 0);-webkit-transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0)}100%{opacity:0;transform:scale3d(0.1) translate3d(-2000px, 0, 0);transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;-webkit-transform:scale3d(0.1) translate3d(2000px, 0, 0);-webkit-transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0)}100%{opacity:0;transform:scale3d(0.1) translate3d(2000px, 0, 0);transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);-webkit-animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;-webkit-transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);-webkit-transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);animation-timing-function:cubic-bezier(0.55, 0.055, 0.675, 0.19)}100%{opacity:0;transform:scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);transform-origin:center bottom;animation-timing-function:cubic-bezier(0.175, 0.885, 0.32, 1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}.dropdown-menu.show{animation:fade-in2 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both}.popover:not([data-placement^="top"]).show{animation:fade-in2 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both}.dropdown-menu[data-placement^="top"].show{animation:fade-in3 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) both;bottom:auto !important;top:auto !important}@keyframes fade-in2{0%{margin-top:-50px;visibility:hidden;opacity:0}100%{margin-top:0px;visibility:visible;opacity:1}}.form-control{transition:all .2s}.dropdown-toggle::after{position:relative;top:2px;opacity:.8}.dropright .dropdown-toggle::after{top:0}.dropdown-toggle-split{border-left:rgba(255,255,255,0.1) solid 1px}.btn-outline-primary{color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:hover{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 0 rgba(63,106,216,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3f6ad8;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3f6ad8;border-color:#3f6ad8}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(63,106,216,0.5)}.btn-outline-primary.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(63,106,216,0.4),0 0.0625rem 0.125rem rgba(63,106,216,0.5)}.btn-outline-primary.btn-shadow.active:hover,.btn-outline-primary.btn-shadow.disabled:hover,.btn-outline-primary.btn-shadow:active:hover,.btn-outline-primary.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(63,106,216,0.5),0 0.0625rem 0.125rem rgba(63,106,216,0.6)}.btn-outline-primary.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(63,106,216,0.19)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 0 rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(108,117,125,0.5)}.btn-outline-secondary.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(108,117,125,0.4),0 0.0625rem 0.125rem rgba(108,117,125,0.5)}.btn-outline-secondary.btn-shadow.active:hover,.btn-outline-secondary.btn-shadow.disabled:hover,.btn-outline-secondary.btn-shadow:active:hover,.btn-outline-secondary.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(108,117,125,0.5),0 0.0625rem 0.125rem rgba(108,117,125,0.6)}.btn-outline-secondary.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(108,117,125,0.19)}.btn-outline-success{color:#3ac47d;border-color:#3ac47d}.btn-outline-success:hover{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 0 rgba(58,196,125,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3ac47d;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#3ac47d;border-color:#3ac47d}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(58,196,125,0.5)}.btn-outline-success.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(58,196,125,0.4),0 0.0625rem 0.125rem rgba(58,196,125,0.5)}.btn-outline-success.btn-shadow.active:hover,.btn-outline-success.btn-shadow.disabled:hover,.btn-outline-success.btn-shadow:active:hover,.btn-outline-success.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(58,196,125,0.5),0 0.0625rem 0.125rem rgba(58,196,125,0.6)}.btn-outline-success.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(58,196,125,0.19)}.btn-outline-info{color:#16aaff;border-color:#16aaff}.btn-outline-info:hover{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 0 rgba(22,170,255,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#16aaff;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#16aaff;border-color:#16aaff}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(22,170,255,0.5)}.btn-outline-info.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(22,170,255,0.4),0 0.0625rem 0.125rem rgba(22,170,255,0.5)}.btn-outline-info.btn-shadow.active:hover,.btn-outline-info.btn-shadow.disabled:hover,.btn-outline-info.btn-shadow:active:hover,.btn-outline-info.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(22,170,255,0.5),0 0.0625rem 0.125rem rgba(22,170,255,0.6)}.btn-outline-info.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(22,170,255,0.19)}.btn-outline-warning{color:#f7b924;border-color:#f7b924}.btn-outline-warning:hover{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 0 rgba(247,185,36,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f7b924;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#f7b924;border-color:#f7b924}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(247,185,36,0.5)}.btn-outline-warning.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(247,185,36,0.4),0 0.0625rem 0.125rem rgba(247,185,36,0.5)}.btn-outline-warning.btn-shadow.active:hover,.btn-outline-warning.btn-shadow.disabled:hover,.btn-outline-warning.btn-shadow:active:hover,.btn-outline-warning.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(247,185,36,0.5),0 0.0625rem 0.125rem rgba(247,185,36,0.6)}.btn-outline-warning.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(247,185,36,0.19)}.btn-outline-danger{color:#d92550;border-color:#d92550}.btn-outline-danger:hover{color:#fff;background-color:#d92550;border-color:#d92550}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 0 rgba(217,37,80,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d92550;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d92550;border-color:#d92550}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(217,37,80,0.5)}.btn-outline-danger.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(217,37,80,0.4),0 0.0625rem 0.125rem rgba(217,37,80,0.5)}.btn-outline-danger.btn-shadow.active:hover,.btn-outline-danger.btn-shadow.disabled:hover,.btn-outline-danger.btn-shadow:active:hover,.btn-outline-danger.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(217,37,80,0.5),0 0.0625rem 0.125rem rgba(217,37,80,0.6)}.btn-outline-danger.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(217,37,80,0.19)}.btn-outline-light{color:#eee;border-color:#eee}.btn-outline-light:hover{color:#212529;background-color:#eee;border-color:#eee}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 0 rgba(238,238,238,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#eee;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#eee;border-color:#eee}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(238,238,238,0.5)}.btn-outline-light.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(238,238,238,0.4),0 0.0625rem 0.125rem rgba(238,238,238,0.5)}.btn-outline-light.btn-shadow.active:hover,.btn-outline-light.btn-shadow.disabled:hover,.btn-outline-light.btn-shadow:active:hover,.btn-outline-light.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(238,238,238,0.5),0 0.0625rem 0.125rem rgba(238,238,238,0.6)}.btn-outline-light.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(238,238,238,0.19)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(52,58,64,0.5)}.btn-outline-dark.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(52,58,64,0.4),0 0.0625rem 0.125rem rgba(52,58,64,0.5)}.btn-outline-dark.btn-shadow.active:hover,.btn-outline-dark.btn-shadow.disabled:hover,.btn-outline-dark.btn-shadow:active:hover,.btn-outline-dark.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(52,58,64,0.5),0 0.0625rem 0.125rem rgba(52,58,64,0.6)}.btn-outline-dark.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(52,58,64,0.19)}.btn-outline-focus{color:#444054;border-color:#444054}.btn-outline-focus:hover{color:#fff;background-color:#444054;border-color:#444054}.btn-outline-focus:focus,.btn-outline-focus.focus{box-shadow:0 0 0 0 rgba(68,64,84,0.5)}.btn-outline-focus.disabled,.btn-outline-focus:disabled{color:#444054;background-color:transparent}.btn-outline-focus:not(:disabled):not(.disabled):active,.btn-outline-focus:not(:disabled):not(.disabled).active,.show>.btn-outline-focus.dropdown-toggle{color:#fff;background-color:#444054;border-color:#444054}.btn-outline-focus:not(:disabled):not(.disabled):active:focus,.btn-outline-focus:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-focus.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(68,64,84,0.5)}.btn-outline-focus.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(68,64,84,0.4),0 0.0625rem 0.125rem rgba(68,64,84,0.5)}.btn-outline-focus.btn-shadow.active:hover,.btn-outline-focus.btn-shadow.disabled:hover,.btn-outline-focus.btn-shadow:active:hover,.btn-outline-focus.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(68,64,84,0.5),0 0.0625rem 0.125rem rgba(68,64,84,0.6)}.btn-outline-focus.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(68,64,84,0.19)}.btn-outline-alternate{color:#794c8a;border-color:#794c8a}.btn-outline-alternate:hover{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-outline-alternate:focus,.btn-outline-alternate.focus{box-shadow:0 0 0 0 rgba(121,76,138,0.5)}.btn-outline-alternate.disabled,.btn-outline-alternate:disabled{color:#794c8a;background-color:transparent}.btn-outline-alternate:not(:disabled):not(.disabled):active,.btn-outline-alternate:not(:disabled):not(.disabled).active,.show>.btn-outline-alternate.dropdown-toggle{color:#fff;background-color:#794c8a;border-color:#794c8a}.btn-outline-alternate:not(:disabled):not(.disabled):active:focus,.btn-outline-alternate:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-alternate.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(121,76,138,0.5)}.btn-outline-alternate.btn-shadow{box-shadow:0 0.125rem 0.625rem rgba(121,76,138,0.4),0 0.0625rem 0.125rem rgba(121,76,138,0.5)}.btn-outline-alternate.btn-shadow.active:hover,.btn-outline-alternate.btn-shadow.disabled:hover,.btn-outline-alternate.btn-shadow:active:hover,.btn-outline-alternate.btn-shadow:disabled:hover{box-shadow:0 0.125rem 0.625rem rgba(121,76,138,0.5),0 0.0625rem 0.125rem rgba(121,76,138,0.6)}.btn-outline-alternate.btn-shadow:hover{box-shadow:0px 5px 15px 2px rgba(121,76,138,0.19)}.btn{position:relative;transition:color 0.15s,background-color 0.15s,border-color 0.15s,box-shadow 0.15s;font-size:.8rem}@media screen and (prefers-reduced-motion: reduce){.btn{transition:none}}.btn-light{border-color:#dcdcdc}.btn-outline-light{color:#8f8f8f}.dropdown-menu{box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);margin:.125rem}.dropdown-menu.dropdown-menu-right{right:0 !important}.dropdown-menu .dropdown-header{text-transform:uppercase;font-size:.73333rem;color:#3f6ad8;font-weight:bold}.dropdown-menu .dropdown-item{font-size:.88rem;display:flex;align-items:center;transition:background-color 0.3s ease, color 0.3s ease;cursor:pointer;z-index:6;position:relative}.dropdown-menu .dropdown-item .dropdown-icon{font-size:1rem;margin-right:.325rem;width:30px;text-align:center;opacity:.3;margin-left:-10px}.dropdown-menu .dropdown-item:hover .dropdown-icon{opacity:.7}.dropdown-menu.dropdown-menu-shadow{box-shadow:0 0.66875rem 2.3875rem rgba(4,9,20,0.03),0 1.1375rem 1.60625rem rgba(4,9,20,0.03),0 0.45rem 0.73125rem rgba(4,9,20,0.05),0 0.325rem 0.3875rem rgba(4,9,20,0.03)}.dropdown-toggle::after{position:relative;top:2px;opacity:.8;margin-left:5px}.dropdown-toggle-split::after{margin-left:0}.dropright .dropdown-toggle::after{top:0}.dropdown-toggle-split{border-left:rgba(255,255,255,0.1) solid 2px}.badge-primary{color:#fff;background-color:#3f6ad8}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#2651be}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}.badge-success{color:#fff;background-color:#3ac47d}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#2e9d64}.badge-info{color:#fff;background-color:#16aaff}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#0090e2}.badge-warning{color:#212529;background-color:#f7b924}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#e0a008}.badge-danger{color:#fff;background-color:#d92550}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#ad1e40}.badge-light{color:#212529;background-color:#eee}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#d5d5d5}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}.badge-focus{color:#fff;background-color:#444054}a.badge-focus:hover,a.badge-focus:focus{color:#fff;background-color:#2d2a37}.badge-alternate{color:#fff;background-color:#794c8a}a.badge-alternate:hover,a.badge-alternate:focus{color:#fff;background-color:#5c3a69}.badge{font-weight:bold;text-transform:uppercase;padding:5px 10px;min-width:19px}.badge-light{background:#fff}.btn .badge{margin-left:8px}.btn-sm .badge-pill,.btn-group-sm>.btn .badge-pill{position:absolute;top:-4px;right:-4px}.badge-abs{position:absolute;right:-3px;top:-3px}.card{box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);border-width:0;transition:all .2s}.card>.dropdown-menu-header{margin:0}.card>.dropdown-menu-header .dropdown-menu-header-inner{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card.text-dark.text-white .card-footer,.card.text-dark.text-white .card-header,.card.text-white .card-footer,.card.text-white .card-header{background:rgba(255,255,255,0.1);color:rgba(255,255,255,0.9)}.card.text-dark.text-white .card-footer,.card.text-dark.text-white .card-header{color:rgba(0,0,0,0.9)}.card .card-footer{display:flex;align-items:center}.btn-actions-pane-right{margin-left:auto;white-space:nowrap}.btn-actions-pane-right a{text-transform:none}.btn-actions-pane-left{margin-right:auto}.actions-icon-btn .btn-icon-only{padding-left:0;padding-right:0;color:#495057}.actions-icon-btn .btn-icon-only .btn-icon-wrapper{font-size:1.3rem;width:30px;text-align:center}.actions-icon-btn .btn-icon-only:hover{color:#3f6ad8}.card-header,.card-title{text-transform:uppercase;color:rgba(13,27,62,0.7);font-weight:bold;font-size:.88rem}.card-header{display:flex;align-items:center;border-bottom-width:1px;padding-top:0;padding-bottom:0;padding-right:.625rem;height:3.5rem}.card-header.no-border{border:0;padding:0;height:auto}.card-header .menu-header-subtitle{display:block}.card-header.card-header-tab .nav{width:auto;margin-left:auto}.card-header.card-header-tab .card-header-title{display:flex;align-items:center;white-space:nowrap}.card-header .header-icon{font-size:1.65rem;margin-right:.625rem}.card-header>.nav{margin-left:-.625rem;height:100%;width:100%}.card-header>.nav .nav-item{position:relative;height:100%;display:flex;align-items:center}.card-header>.nav .nav-link{text-transform:none;width:100%;display:block;color:#495057}.card-header>.nav .nav-link::before{content:'';border-radius:15px;background:#3f6ad8;transition:all .2s;height:4px;width:100%;position:absolute;left:0;bottom:-2px;opacity:0}.card-header>.nav .nav-link:hover{color:#3f6ad8}.card-header>.nav .nav-link.active{color:#3f6ad8}.card-header>.nav .nav-link.active::before{opacity:1}.card-border{box-shadow:0 0 0 transparent;border-width:1px}.card-subtitle{margin-bottom:.75rem;font-size:.968rem;color:rgba(13,27,62,0.55)}.card-shadow-primary{box-shadow:0 0.46875rem 2.1875rem rgba(63,106,216,0.03),0 0.9375rem 1.40625rem rgba(63,106,216,0.03),0 0.25rem 0.53125rem rgba(63,106,216,0.05),0 0.125rem 0.1875rem rgba(63,106,216,0.03)}.card-shadow-secondary{box-shadow:0 0.46875rem 2.1875rem rgba(108,117,125,0.03),0 0.9375rem 1.40625rem rgba(108,117,125,0.03),0 0.25rem 0.53125rem rgba(108,117,125,0.05),0 0.125rem 0.1875rem rgba(108,117,125,0.03)}.card-shadow-success{box-shadow:0 0.46875rem 2.1875rem rgba(58,196,125,0.03),0 0.9375rem 1.40625rem rgba(58,196,125,0.03),0 0.25rem 0.53125rem rgba(58,196,125,0.05),0 0.125rem 0.1875rem rgba(58,196,125,0.03)}.card-shadow-info{box-shadow:0 0.46875rem 2.1875rem rgba(22,170,255,0.03),0 0.9375rem 1.40625rem rgba(22,170,255,0.03),0 0.25rem 0.53125rem rgba(22,170,255,0.05),0 0.125rem 0.1875rem rgba(22,170,255,0.03)}.card-shadow-warning{box-shadow:0 0.46875rem 2.1875rem rgba(247,185,36,0.03),0 0.9375rem 1.40625rem rgba(247,185,36,0.03),0 0.25rem 0.53125rem rgba(247,185,36,0.05),0 0.125rem 0.1875rem rgba(247,185,36,0.03)}.card-shadow-danger{box-shadow:0 0.46875rem 2.1875rem rgba(217,37,80,0.03),0 0.9375rem 1.40625rem rgba(217,37,80,0.03),0 0.25rem 0.53125rem rgba(217,37,80,0.05),0 0.125rem 0.1875rem rgba(217,37,80,0.03)}.card-shadow-light{box-shadow:0 0.46875rem 2.1875rem rgba(238,238,238,0.03),0 0.9375rem 1.40625rem rgba(238,238,238,0.03),0 0.25rem 0.53125rem rgba(238,238,238,0.05),0 0.125rem 0.1875rem rgba(238,238,238,0.03)}.card-shadow-dark{box-shadow:0 0.46875rem 2.1875rem rgba(52,58,64,0.03),0 0.9375rem 1.40625rem rgba(52,58,64,0.03),0 0.25rem 0.53125rem rgba(52,58,64,0.05),0 0.125rem 0.1875rem rgba(52,58,64,0.03)}.card-shadow-focus{box-shadow:0 0.46875rem 2.1875rem rgba(68,64,84,0.03),0 0.9375rem 1.40625rem rgba(68,64,84,0.03),0 0.25rem 0.53125rem rgba(68,64,84,0.05),0 0.125rem 0.1875rem rgba(68,64,84,0.03)}.card-shadow-alternate{box-shadow:0 0.46875rem 2.1875rem rgba(121,76,138,0.03),0 0.9375rem 1.40625rem rgba(121,76,138,0.03),0 0.25rem 0.53125rem rgba(121,76,138,0.05),0 0.125rem 0.1875rem rgba(121,76,138,0.03)}.card-header-lg{padding:1.5rem 2.5rem;height:auto}.nav-pills,.nav-tabs{margin-bottom:1rem}.nav-link{font-weight:bold}.nav-link:hover{cursor:pointer}.nav-tabs .nav-link:hover{color:#3f6ad8 !important}.nav-tabs .nav-link.active{color:#3f6ad8}.nav-pills .nav-link:hover{color:#3f6ad8 !important}.nav-pills .nav-link.active{background:#3f6ad8}.nav-pills .nav-link.active:hover{color:#fff !important}.tabs-animated .nav-link{position:relative;padding:1rem;margin:0 .75rem 0 0;color:#495057}.tabs-animated .nav-link::before{transform:scale(0);opacity:1;width:100%;left:0;bottom:-2px;content:"";position:absolute;display:block;border-radius:.25rem;background:#3f6ad8;transition:all .2s;height:4px}.tabs-animated .nav-link.active,.tabs-animated .nav-link:hover{color:#3f6ad8}.tabs-animated .nav-link.active::before,.tabs-animated .nav-link:hover::before{transform:scale(1)}.tabs-animated-shadow .nav-link{padding:.5rem .75rem;margin-bottom:.75rem}.tabs-animated-shadow .nav-link span{position:relative;z-index:5;display:inline-block;width:100%}.tabs-animated-shadow .nav-link::before{height:100%;top:0;z-index:4;bottom:auto;box-shadow:0 16px 26px -10px rgba(63,106,216,0.56),0 4px 25px 0px rgba(0,0,0,0.12),0 8px 10px -5px rgba(63,106,216,0.2);border-radius:100%;opacity:.5}.tabs-animated-shadow .nav-link.active,.tabs-animated-shadow .nav-link:hover{color:#fff}.tabs-animated-shadow .nav-link.active::before,.tabs-animated-shadow .nav-link:hover::before{border-radius:.25rem;opacity:1}.tabs-animated-shadow .nav-item:last-child .nav-link{margin-right:0}.tabs-animated-shadow.tabs-shadow-bordered{border-bottom:rgba(26,54,126,0.125) solid 1px}.tabs-animated-shadow.tabs-shadow-bordered .nav-link{margin-bottom:0}.body-tabs-shadow .body-tabs-animated{padding:.75rem 0}.body-tabs-shadow .body-tabs-animated .nav-link span{position:relative;z-index:5}.body-tabs-shadow .body-tabs-animated .nav-link::before{height:70%;top:15%;z-index:4;bottom:auto;box-shadow:0 16px 26px -10px rgba(63,106,216,0.56),0 4px 25px 0px rgba(0,0,0,0.12),0 8px 10px -5px rgba(63,106,216,0.2);border-radius:100%;opacity:.5}.body-tabs-shadow .body-tabs-animated .nav-link.active,.body-tabs-shadow .body-tabs-animated .nav-link:hover{color:#fff}.body-tabs-shadow .body-tabs-animated .nav-link.active::before,.body-tabs-shadow .body-tabs-animated .nav-link:hover::before{border-radius:.25rem;opacity:1}.body-tabs-line .body-tabs-layout{margin:0 -30px;padding:0 30px;margin-bottom:30px;border-bottom:#dee2e6 solid 1px}.accordion-wrapper{border-radius:.25rem;border:#e9ecef solid 1px}.accordion-wrapper>.card{box-shadow:0 0 0 0 transparent}.accordion-wrapper>.card>.card-header{padding:1rem;height:auto}.accordion-wrapper>.card>.card-header .btn:active,.accordion-wrapper>.card>.card-header .btn:focus,.accordion-wrapper>.card>.card-header .btn:hover{text-decoration:none}.accordion-wrapper>.card>.card-header .form-heading p{margin:0}.accordion-wrapper>.card .collapse{border-bottom:transparent solid 1px}.accordion-wrapper>.card .collapse.show{border-bottom-color:#e9ecef}.modal-header,.modal-footer{background:#f8f9fa}.modal-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.modal-dialog{box-shadow:0 0.76875rem 2.4875rem rgba(52,58,64,0.3),0 1.3375rem 1.70625rem rgba(52,58,64,0.3),0 0.55rem 0.53125rem rgba(0,0,0,0.05),0 0.225rem 0.4375rem rgba(52,58,64,0.3);border-radius:.25rem}.nav-item .nav-link{font-weight:normal}.nav-link{display:flex;align-items:center;transition:background-color 0.3s ease, color 0.3s ease;cursor:pointer}.nav-link .nav-link-icon{color:#3f6ad8;font-size:1rem;width:30px;text-align:center;opacity:.45;margin-left:-10px}.nav-link:hover{color:#495057}.nav-link:hover .nav-link-icon{opacity:.9;color:#3f6ad8}.nav-link:disabled .nav-link-icon,.nav-link.disabled .nav-link-icon{opacity:.3}.nav-item.nav-item-header{text-transform:uppercase;font-size:.73333rem;color:#6c757d;font-weight:bold;padding:.5rem 1rem}.nav-item.nav-item-btn{padding:.5rem 1rem}.nav-item.nav-item-divider{margin:.5rem 0;height:1px;overflow:hidden;background:#dee2e6}.nav .badge{margin-left:8px}.nav-pills .nav-link.active,.nav-pills .nav-link.active:hover{color:#fff}.nav-pills .nav-link.active .nav-link-icon,.nav-pills .nav-link.active:hover .nav-link-icon{color:#fff;opacity:.8}.nav-pills .nav-link:hover{color:#495057 !important}.nav-justified .nav-link .nav-text{display:block;width:100%;text-align:center}.list-group-flush+.card-footer{border-top:0}.rm-list-borders .list-group-item{border:0;padding:.5rem 0}.rm-list-borders-scroll .list-group-item{border:0;padding-right:1.125rem}legend{font-size:.88rem;font-weight:bold}.form-heading{font-size:1.1rem;margin:0;color:#3f6ad8}.form-heading p{color:#6c757d;padding:0.3rem 0 0;font-size:.88rem}.custom-select{-webkit-appearance:none;-moz-appearance:none}.pagination li a{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.pagination li a:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.pagination li a:focus{z-index:2;outline:0;box-shadow:none}.pagination li a:not(:disabled):not(.disabled){cursor:pointer}.pagination li:first-child a{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.pagination li:last-child a{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination li.active a{z-index:1;color:#fff;background-color:#3f6ad8;border-color:#007bff}.pagination li.active a:hover{color:#fff}.pagination li.disabled a{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.widget-content{padding:1rem;flex-direction:row;align-items:center}.widget-content .widget-content-wrapper{display:flex;flex:1;position:relative;align-items:center}.widget-content .widget-content-left .widget-heading{opacity:.8;font-weight:bold}.widget-content .widget-content-left .widget-subheading{opacity:.5}.widget-content .widget-content-right{margin-left:auto}.widget-content .widget-numbers{font-weight:bold;font-size:1.8rem;display:block}.widget-content .widget-content-outer{display:flex;flex:1;flex-direction:column}.widget-content .widget-progress-wrapper{margin-top:1rem}.widget-content .widget-progress-wrapper .progress-sub-label{margin-top:.33333rem;opacity:.5;display:flex;align-content:center;align-items:center}.widget-content .widget-progress-wrapper .progress-sub-label .sub-label-right{margin-left:auto}.widget-content .widget-content-right.widget-content-actions{visibility:hidden;opacity:0;transition:opacity .2s}.widget-content:hover .widget-content-right.widget-content-actions{visibility:visible;opacity:1}.ps{overflow:hidden !important;overflow-anchor:none;touch-action:auto}.ps__rail-x{display:none !important;opacity:0;transition:background-color .2s linear, opacity .2s linear;height:15px;bottom:0;position:absolute;z-index:7}.ps__rail-y{display:none;opacity:0;transition:background-color .2s linear, opacity .2s linear;width:15px;right:0;position:absolute;border-radius:50px;z-index:7}.ps--active-x>.ps__rail-x,.ps--active-y>.ps__rail-y{display:block;background-color:transparent}.ps:hover>.ps__rail-x,.ps:hover>.ps__rail-y,.ps--focus>.ps__rail-x,.ps--focus>.ps__rail-y,.ps--scrolling-x>.ps__rail-x,.ps--scrolling-y>.ps__rail-y{opacity:0.6}.ps__rail-x:hover,.ps__rail-y:hover,.ps__rail-x:focus,.ps__rail-y:focus{background-color:rgba(0,0,0,0.1);opacity:0.9}.ps__thumb-x{background-color:rgba(0,0,0,0.1);border-radius:6px;transition:background-color .2s linear, height .2s ease-in-out;height:6px;bottom:2px;position:absolute}.ps__thumb-y{background-color:rgba(0,0,0,0.1);border-radius:6px;transition:background-color .2s linear, width .2s ease-in-out;width:6px;right:2px;position:absolute}.ps__rail-x:hover>.ps__thumb-x,.ps__rail-x:focus>.ps__thumb-x{background-color:rgba(0,0,0,0.12);height:11px}.ps__rail-y:hover>.ps__thumb-y,.ps__rail-y:focus>.ps__thumb-y{background-color:rgba(0,0,0,0.12);width:11px}@supports (-ms-overflow-style: none){.ps{overflow:auto !important}}@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){.ps{overflow:auto !important}}.scrollbar-sidebar,.scrollbar-container{position:relative;height:100%}.scroll-area{overflow-x:hidden;height:400px}.scroll-area-xs{height:150px;overflow-x:hidden}.scroll-area-sm{height:200px;overflow-x:hidden}.scroll-area-md{height:300px;overflow-x:hidden}.scroll-area-lg{height:400px;overflow-x:hidden}.scroll-area-x{overflow-x:auto;width:100%;max-width:100%}.shadow-overflow{position:relative}.shadow-overflow::after,.shadow-overflow::before{width:100%;bottom:auto;top:0;left:0;height:1.5rem;position:absolute;z-index:10;content:'';background:linear-gradient(to bottom, #fff 20%, rgba(255,255,255,0) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#00ffffff', GradientType=0)}.shadow-overflow::after{bottom:0;top:auto;background:linear-gradient(to bottom, rgba(255,255,255,0) 0%, #fff 80%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffffff', endColorstr='#ffffff', GradientType=0)}/*!
+ * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:block;src:url(assets/fonts/fa-solid-900.eot);src:url(assets/fonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(assets/fonts/fa-solid-900.woff2) format("woff2"),url(assets/fonts/fa-solid-900.woff) format("woff"),url(assets/fonts/fa-solid-900.ttf) format("truetype"),url(assets/fonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:'Font Awesome 5 Free';font-weight:900}.fa,.fas,.far,.fal,.fad,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid 0.08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1, -1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-flip-both{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.fa-2x{line-height:2}/*!
+ * Hamburgers
+ * @description Tasty CSS-animated hamburgers
+ * @author Jonathan Suh @jonsuh
+ * @site https://jonsuh.com/hamburgers
+ * @link https://github.com/jonsuh/hamburgers
+ */.hamburger{padding:0px 0px;display:inline-block;cursor:pointer;transition-property:opacity, filter;transition-duration:0.15s;transition-timing-function:linear;font:inherit;color:inherit;text-transform:none;background-color:transparent;border:0;margin:0;overflow:visible}.hamburger:hover{opacity:.7}.hamburger.is-active:hover{opacity:.7}.hamburger.is-active .hamburger-inner,.hamburger.is-active .hamburger-inner::before,.hamburger.is-active .hamburger-inner::after{background-color:#3f6ad8}.hamburger-box{width:24px;height:14px;display:inline-block;position:relative}.hamburger-inner{display:block;top:50%;margin-top:-1px}.hamburger-inner,.hamburger-inner::before,.hamburger-inner::after{width:24px;height:2px;background-color:#3f6ad8;border-radius:10px;position:absolute;transition-property:transform;transition-duration:0.15s;transition-timing-function:ease}.hamburger-inner::before,.hamburger-inner::after{content:"";display:block}.hamburger-inner::before{top:-6px}.hamburger-inner::after{bottom:-6px}.hamburger--elastic .hamburger-inner{top:1px;transition-duration:0.275s;transition-timing-function:cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic .hamburger-inner::before{top:6px;transition:opacity 0.125s 0.275s ease}.hamburger--elastic .hamburger-inner::after{top:12px;transition:transform 0.275s cubic-bezier(0.68, -0.55, 0.265, 1.55)}.hamburger--elastic.is-active .hamburger-inner{transform:translate3d(0, 6px, 0) rotate(135deg);transition-delay:0.075s}.hamburger--elastic.is-active .hamburger-inner::before{transition-delay:0s;opacity:0}.hamburger--elastic.is-active .hamburger-inner::after{transform:translate3d(0, -12px, 0) rotate(-270deg);transition-delay:0.075s}.toast-title{font-weight:bold}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#cccccc;text-decoration:none}.toast-close-button{position:relative;right:-0.3em;top:-0.3em;float:right;font-weight:bold;color:#fff;opacity:0.8}.toast-close-button:hover,.toast-close-button:focus{color:#000;text-decoration:none;cursor:pointer;opacity:0.4}button.toast-close-button{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.toast-top-center{top:0;right:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{top:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{position:fixed;z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container>div{position:relative;overflow:hidden;margin:0 0 .6rem;padding:.6rem .6rem .6rem 50px;width:300px;border-radius:.25rem;background-position:15px center;background-repeat:no-repeat;box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);color:#fff;opacity:0.9}#toast-container>div:hover{opacity:1;cursor:pointer}#toast-container>.toast-info{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;box-shadow:0 0.66875rem 2.3875rem rgba(22,170,255,0.03),0 1.1375rem 1.60625rem rgba(22,170,255,0.03),0 0.45rem 0.73125rem rgba(22,170,255,0.05),0 0.325rem 0.3875rem rgba(22,170,255,0.03)}#toast-container>.toast-error{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;box-shadow:0 0.66875rem 2.3875rem rgba(217,37,80,0.03),0 1.1375rem 1.60625rem rgba(217,37,80,0.03),0 0.45rem 0.73125rem rgba(217,37,80,0.05),0 0.325rem 0.3875rem rgba(217,37,80,0.03)}#toast-container>.toast-success{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;box-shadow:0 0.66875rem 2.3875rem rgba(58,196,125,0.03),0 1.1375rem 1.60625rem rgba(58,196,125,0.03),0 0.45rem 0.73125rem rgba(58,196,125,0.05),0 0.325rem 0.3875rem rgba(58,196,125,0.03)}#toast-container>.toast-warning{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;box-shadow:0 0.66875rem 2.3875rem rgba(247,185,36,0.03),0 1.1375rem 1.60625rem rgba(247,185,36,0.03),0 0.45rem 0.73125rem rgba(247,185,36,0.05),0 0.325rem 0.3875rem rgba(247,185,36,0.03);color:#212529}#toast-container.toast-top-center>div,#toast-container.toast-bottom-center>div{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-top-full-width>div,#toast-container.toast-bottom-full-width>div{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#343a40}.toast-success{background-color:#3ac47d}.toast-error{background-color:#d92550}.toast-info{background-color:#16aaff}.toast-warning{background-color:#f7b924}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:0.4}@media all and (max-width: 240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 241px) and (max-width: 480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width: 481px) and (max-width: 768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.popover,.tooltip{opacity:0;transition:opacity .2s ease}.popover.show,.tooltip.show{opacity:1}.popover{box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03)}.rm-pointers .popover .arrow{display:none !important}.jvectormap-container{width:100%;height:100%;position:relative;overflow:hidden}.jvectormap-tip{position:absolute;display:none;border:solid 1px #CDCDCD;border-radius:3px;background:#292929;color:white;font-family:sans-serif, Verdana;font-size:smaller;padding:3px}.jvectormap-zoomin,.jvectormap-zoomout,.jvectormap-goback{position:absolute;left:10px;border-radius:3px;background:#292929;padding:3px;color:white;cursor:pointer;line-height:10px;text-align:center}.jvectormap-zoomin{top:10px}.jvectormap-zoomout{top:30px}.jvectormap-goback{bottom:10px;z-index:1000;padding:6px}.jvectormap-spinner{position:absolute;left:0;top:0;right:0;bottom:0;background:center no-repeat url(data:image/gif;base64,R0lGODlhIAAgAPMAAP///wAAAMbGxoSEhLa2tpqamjY2NlZWVtjY2OTk5Ly8vB4eHgQEBAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ/V/nmOM82XiHRLYKhKP1oZmADdEAAAh+QQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY/CZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB+A4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6+Ho7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq+B6QDtuetcaBPnW6+O7wDHpIiK9SaVK5GgV543tzjgGcghAgAh+QQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK++G+w48edZPK+M6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE+G+cD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm+FNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk+aV+oJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0/VNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc+XiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30/iI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE/jiuL04RGEBgwWhShRgQExHBAAh+QQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR+ipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq+E71SRQeyqUToLA7VxF0JDyIQh/MVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY+Yip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd+MFCN6HAAIKgNggY0KtEBAAh+QQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1+vsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d+jYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg+ygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0+bm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h+Kr0SJ8MFihpNbx+4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX+BP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA==)}.jvectormap-legend-title{font-weight:bold;font-size:14px;text-align:center}.jvectormap-legend-cnt{position:absolute}.jvectormap-legend-cnt-h{bottom:0;right:0}.jvectormap-legend-cnt-v{top:0;right:0}.jvectormap-legend{background:black;color:white;border-radius:3px}.jvectormap-legend-cnt-h .jvectormap-legend{float:left;margin:0 10px 10px 0;padding:3px 3px 1px 3px}.jvectormap-legend-cnt-h .jvectormap-legend .jvectormap-legend-tick{float:left}.jvectormap-legend-cnt-v .jvectormap-legend{margin:10px 10px 0 0;padding:3px}.jvectormap-legend-cnt-h .jvectormap-legend-tick{width:40px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-sample{height:15px}.jvectormap-legend-cnt-v .jvectormap-legend-tick-sample{height:20px;width:20px;display:inline-block;vertical-align:middle}.jvectormap-legend-tick-text{font-size:12px}.jvectormap-legend-cnt-h .jvectormap-legend-tick-text{text-align:center}.jvectormap-legend-cnt-v .jvectormap-legend-tick-text{display:inline-block;vertical-align:middle;line-height:20px;padding-left:3px}@media only screen and (max-width: 1320px){.header-user-info{display:none}}@media (max-width: 991.98px){.app-main{display:block}.dropdown-menu::before,.dropdown-menu::after{display:none}.app-sidebar{flex:0 0 350px !important;width:350px !important;transform:translateX(-350px);position:fixed}.app-sidebar .app-header__logo{display:none}.sidebar-mobile-open .app-sidebar{transform:translateX(0)}.sidebar-mobile-open .app-sidebar .app-sidebar__inner .app-sidebar__heading{text-indent:initial}.sidebar-mobile-open .app-sidebar .app-sidebar__inner .app-sidebar__heading::before{display:none}.sidebar-mobile-open .app-sidebar .app-sidebar__inner ul li a{text-indent:initial;padding:0 1.5rem 0 45px}.sidebar-mobile-open .app-sidebar .app-sidebar__inner .metismenu-icon{text-indent:initial;left:5px;margin-left:0}.sidebar-mobile-open .app-sidebar .app-sidebar__inner .metismenu-state-icon{visibility:visible}.sidebar-mobile-open .app-sidebar .app-sidebar__inner ul::before{display:block}.sidebar-mobile-open .app-sidebar .app-sidebar__inner ul ul li a{padding-left:1em}.sidebar-mobile-open .app-sidebar .app-sidebar__inner ul.mm-show{padding:.5em 0 0 2rem}.sidebar-mobile-open .app-sidebar .app-sidebar__inner ul.mm-show>li>a{height:2rem;line-height:2rem}.sidebar-mobile-open .app-sidebar .app-header__logo{width:auto !important}.sidebar-mobile-open .app-sidebar .app-header__logo .logo-src{width:150px !important;margin-left:auto;margin-right:0}.sidebar-mobile-open .fixed-sidebar .app-sidebar{height:100%}.sidebar-mobile-open .sidebar-mobile-overlay{display:block}.app-main .app-main__outer{padding-left:0 !important}.app-header{justify-content:space-between}.app-header .app-header__logo{display:none;order:2;background:transparent !important;border:0 !important}.app-header .app-header__content{visibility:hidden;opacity:0;box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);position:absolute;left:5%;width:90%;top:0;transition:all .2s;background:#fff;border-radius:50px;padding:0 10px;overflow:hidden}.app-header .app-header__content .header-btn-lg{margin-left:.5rem;padding:0 .5rem}.app-header .app-header__content .app-header-left .nav{display:none}.app-header .app-header__content.header-mobile-open{visibility:visible;opacity:1;top:80px}.app-header .app-header__mobile-menu{display:flex;order:1}.app-header .app-header__menu{display:flex;order:3}.app-header.header-text-light .app-header__menu>span .btn,.app-header.header-text-light .app-header__menu>.btn{background:rgba(255,255,255,0.1);border-color:rgba(255,255,255,0.1)}.app-header.header-text-light .header-mobile-open{background:#343a40}.popover,.dropdown-menu{position:fixed !important;z-index:50;left:5% !important;top:50% !important;width:90% !important;transform:translateY(-50%) !important;min-width:10px !important}.popover .btn-icon-vertical .btn-icon-wrapper,.dropdown-menu .btn-icon-vertical .btn-icon-wrapper{display:none}.popover{max-width:initial}.popover .arrow{display:none !important}.app-page-title{text-align:center}.app-page-title .page-title-heading,.app-page-title .page-title-wrapper{margin:0 auto;display:block}.app-page-title .page-title-actions{margin:15px auto 0}.app-page-title .page-title-actions .breadcrumb-item,.app-page-title .page-title-actions .breadcrumb,.app-page-title .page-title-subheading .breadcrumb-item,.app-page-title .page-title-subheading .breadcrumb{display:inline-block}.app-footer .app-footer__inner .app-footer-right{display:none}.app-footer .app-footer__inner .app-footer-left{width:100%}.app-footer .app-footer__inner .app-footer-left .footer-dots{margin:0 auto}.widget-content .widget-numbers{font-size:1.6rem;line-height:1}.slick-slider-sm .slick-slider{max-width:650px !important}.bg-transparent.list-group-item{border-color:transparent}.tabs-lg-alternate.card-header>.nav .nav-item .widget-number{font-size:1.5rem}.page-title-head{display:block}}@media (max-width: 991.98px){.app-page-title .page-title-icon,.ui-theme-settings{display:none}.card-header.responsive-center{display:block;text-align:center;height:auto;padding:1.5rem}.card-header.responsive-center .nav,.card-header.responsive-center .btn-actions-pane-right{margin:.75rem 0 0}.card-header.responsive-center .nav .d-inline-block.ml-2,.card-header.responsive-center .btn-actions-pane-right .d-inline-block.ml-2{width:100% !important;text-align:left;margin:0 !important}.slick-slider-sm .slick-slider{max-width:650px !important}}@media (min-width: 992px){.slick-slider-sm .slick-slider{max-width:850px !important}}@media (max-width: 1199.98px){.-hide-paging .-pagination .-center{display:none}}@media (max-width: 767.98px){.app-main .app-main__inner{padding:15px 15px 0}.mbg-3,body .card.mb-3{margin-bottom:15px !important}.app-page-title{padding:15px;margin:-15px -15px 15px}.app-page-title+.body-tabs-layout{margin-top:-15px !important}.body-tabs-line .body-tabs-layout{margin-bottom:15px;margin-left:-15px;margin-right:-15px;padding:0 15px}.body-tabs{padding:0 15px;display:block}.body-tabs .nav-item .nav-link{margin:0}.popover,.dropdown-menu{width:80%;left:10%}body .card-header{height:auto;display:block;padding:.75rem 1.5rem;text-align:center}body .card-header .btn-actions-pane-right{padding:.75rem 0 0}body .card-header .actions-icon-btn{padding:0}.card-header.card-header-tab .card-header-title{display:inline-flex !important;line-height:1}.card-header.card-header-tab>.nav{margin:.75rem 0 -.75rem;display:table !important;width:100%}.card-header.card-header-tab>.nav .nav-item{display:table-cell}.header-icon{display:none}.profile-responsive-sm .dropdown-menu-header .menu-header-content.btn-pane-right,.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right{display:block;text-align:center}.profile-responsive-sm .dropdown-menu-header .menu-header-content.btn-pane-right .avatar-icon-wrapper,.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right .avatar-icon-wrapper{margin-right:0 !important}.profile-responsive-sm .dropdown-menu-header .menu-header-content.btn-pane-right .menu-header-btn-pane,.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right .menu-header-btn-pane{margin-top:1rem}.slick-slider-sm .slick-slider .slick-prev{left:15px}.slick-slider-sm .slick-slider .slick-next{right:15px}}@media only screen and (min-width: 1200px) and (max-width: 1500px){.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right{display:block;text-align:center}.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right .avatar-icon-wrapper{margin-right:0 !important}.profile-responsive .dropdown-menu-header .menu-header-content.btn-pane-right .menu-header-btn-pane{margin-top:1rem}}.ui-theme-settings{position:fixed;z-index:155;right:-30px;top:0;height:100vh;transform:translate(500px);transition:all .2s;box-shadow:-0.46875rem 0 2.1875rem rgba(4,9,20,0.03),-0.9375rem 0 1.40625rem rgba(4,9,20,0.03),-0.25rem 0 0.53125rem rgba(4,9,20,0.05),-0.125rem 0 0.1875rem rgba(4,9,20,0.03)}.ui-theme-settings .btn-open-options{border-radius:50px;position:absolute;left:-114px;bottom:80px;padding:0;height:54px;line-height:54px;width:54px;text-align:center;display:block;box-shadow:0 0.46875rem 2.1875rem rgba(4,9,20,0.03),0 0.9375rem 1.40625rem rgba(4,9,20,0.03),0 0.25rem 0.53125rem rgba(4,9,20,0.05),0 0.125rem 0.1875rem rgba(4,9,20,0.03);margin-top:-27px}.ui-theme-settings .btn-open-options svg{top:50%;left:50%;position:absolute;margin:-0.5em 0 0 -0.5em}.ui-theme-settings .theme-settings__inner{background:#fff;width:500px;height:100vh;padding:0}.ui-theme-settings.settings-open{transform:translate(0);right:0}.ui-theme-settings .theme-settings-swatches{text-align:center}.ui-theme-settings .theme-settings-swatches .swatch-holder-img{width:72px;height:auto;border-radius:3px}.ui-theme-settings .theme-settings-swatches .swatch-holder-img img{width:100%}.ui-theme-settings .themeoptions-heading{font-size:1.1rem;color:#495057;margin:0;background:#f8f9fa;padding:.75rem 1.5rem;border-bottom:#dee2e6 solid 1px;border-top:#dee2e6 solid 1px;display:flex;align-items:center;align-content:center}.ui-theme-settings .themeoptions-heading:first-child{border-top:0}.ui-theme-settings .list-group-item h5{color:#3f6ad8;font-size:.968rem;text-transform:uppercase;margin:0;text-align:center}.swatch-holder{width:24px;height:24px;line-height:24px;margin:5px 5px 0;transition:all .2s;opacity:.7;display:inline-block;border-radius:30px}.swatch-holder.active{border:#fff solid 2px;box-shadow:0 0 0 5px #3f6ad8;opacity:1}.swatch-holder:hover{opacity:1}.swatch-holder-lg{width:48px;height:48px;line-height:48px}.font-icon-wrapper{text-align:center;border:#e9ecef solid 1px;border-radius:.25rem;margin:0 0 10px;padding:5px}.font-icon-wrapper.font-icon-lg{float:left;padding:10px;text-align:center;margin-right:15px;min-width:64px}.font-icon-wrapper.font-icon-lg i{font-size:2.5rem}.font-icon-wrapper:hover{background:#f8f9fa;color:#3f6ad8}.font-icon-wrapper:hover p{color:#6c757d}.font-icon-wrapper i{font-size:1.65rem}.font-icon-wrapper p{color:#adb5bd;font-size:.80667rem;margin:5px 0 0}.btn-icon-vertical{min-width:100px}.card.mb-3{margin-bottom:30px !important}.demo-image-bg{height:350px;margin-bottom:30px;background-size:100%}
diff --git a/public/css/assets/fonts/fa-solid-900.eot b/public/css/assets/fonts/fa-solid-900.eot
new file mode 100644
index 0000000..52883b9
Binary files /dev/null and b/public/css/assets/fonts/fa-solid-900.eot differ
diff --git a/public/css/assets/fonts/fa-solid-900.svg b/public/css/assets/fonts/fa-solid-900.svg
new file mode 100644
index 0000000..d5e4d52
--- /dev/null
+++ b/public/css/assets/fonts/fa-solid-900.svg
@@ -0,0 +1,5015 @@
+
+
+
+
diff --git a/public/css/assets/fonts/fa-solid-900.ttf b/public/css/assets/fonts/fa-solid-900.ttf
new file mode 100644
index 0000000..7c59512
Binary files /dev/null and b/public/css/assets/fonts/fa-solid-900.ttf differ
diff --git a/public/css/assets/fonts/fa-solid-900.woff b/public/css/assets/fonts/fa-solid-900.woff
new file mode 100644
index 0000000..aff125d
Binary files /dev/null and b/public/css/assets/fonts/fa-solid-900.woff differ
diff --git a/public/css/assets/fonts/fa-solid-900.woff2 b/public/css/assets/fonts/fa-solid-900.woff2
new file mode 100644
index 0000000..aa2b791
Binary files /dev/null and b/public/css/assets/fonts/fa-solid-900.woff2 differ
diff --git a/public/css/custom.css b/public/css/custom.css
new file mode 100644
index 0000000..2a90b2d
--- /dev/null
+++ b/public/css/custom.css
@@ -0,0 +1,5 @@
+img.jpegphoto {
+ display:block;
+ max-width:100px;
+ height:100px;
+}
\ No newline at end of file
diff --git a/public/css/fixes.css b/public/css/fixes.css
new file mode 100644
index 0000000..21ef33e
--- /dev/null
+++ b/public/css/fixes.css
@@ -0,0 +1,171 @@
+body {
+ font-size: 0.85em;
+}
+
+/* Trim our sidebar down to 250px */
+.app-sidebar {
+ width: 250px;
+ min-width: 250px;
+}
+
+.app-header__logo {
+ width: 250px;
+}
+
+.fixed-sidebar:not(.fixed-header) .app-header {
+ margin-left: 250px;
+}
+
+.fixed-sidebar .app-main .app-main__outer {
+ padding-left: 250px;
+}
+
+.font-icon-wrapper i {
+ font-size: 1.2rem;
+}
+
+/* Fixes for data tables */
+/* Fix pagination buttons */
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+ padding: 0 0;
+ margin-left: 0;
+ border: 0 solid;
+}
+
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ border: 0 solid;
+ background: #fff;
+}
+
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ box-shadow: 0 0 0 #fff;
+ background-color: #fff;
+}
+
+/* Remove multiple sorting images on tables */
+table.dataTable thead .sorting_asc {
+ background-image: none !important;
+}
+
+table.dataTable thead .sorting_desc {
+ background-image: none !important;
+}
+
+table.dataTable thead .sorting {
+ background-image: none !important;
+}
+
+/* Remove blue border from chrome on buttons */
+/* Remove outline for non-keyboard :focus */
+*:focus:not(.focus-visible) {
+ outline: none !important;
+ box-shadow: none !important;
+}
+
+/* Optional: Customize .focus-visible */
+.focus-visible {
+ outline-color: lightgreen;
+}
+
+*:disabled {
+ cursor: not-allowed;
+}
+
+/* A selected indicator - used with icons */
+.tag-selected {
+ color: orange;
+}
+
+.tag-selected:hover {
+ cursor: pointer;
+}
+
+.card-header h3.card-title {
+ font-size: 1.0rem;
+}
+
+/** SIDEBAR FIXES **/
+
+/**
+ The sidebar has a few states:
+ + Wide Screen
+ - Open (app-container fixed-sidebar) &
+ - Closed (app-container fixed-sidebar closed-sidebar) &
+ - Hover Open (app-sidebar:hover)
+ + Medium Screen
+ - Closed (app-container fixed-sidebar closed-sidebar-mobile closed-sidebar) &
+ - Hover Open (app-sidebar:hover)
+ + Small Screen
+ - Missing (?) &
+ - Click Open (app-container fixed-sidebar closed-sidebar-mobile closed-sidebar sidebar-mobile-open)
+ */
+
+/* Fancy Tree Fixes */
+/** Remove the border around the tree **/
+ul.fancytree-container {
+ border: 0;
+}
+
+/** Tree Placement **/
+#tree > ul {
+ padding-left: 0;
+}
+/** Fix tree rendering **/
+.fancytree-node {
+ line-height: 1.75em;
+}
+/** Fix position of tree expander and checkbox */
+span.fancytree-checkbox, span.fancytree-custom-icon, span.fancytree-expander, span.fancytree-icon {
+ margin-top: 4px;
+}
+/* Position branch center of icon */
+ul.fancytree-container ul {
+ padding: 0 0 0 20px;
+}
+
+/* Show treeicon when collapsed and remove it when open */
+/* @todo treeicon appears when not hovering on page in small mode */
+.sidebar-mobile-open:hover #treeicon, /* small */
+.fixed-sidebar #treeicon, /* wide */
+.fixed-sidebar .app-sidebar:hover #treeicon /* wide & closed:hover */
+{
+ display: none;
+}
+
+.closed-sidebar #treeicon
+{
+ opacity: 1;
+ display: inline;
+}
+
+/* Architect Fixes */
+/** Remove the Cyan vertical line from the tree **/
+.vertical-nav-menu #tree ul:before {
+ opacity: 0;
+}
+
+/** Fix elipse icon (top right) on small display */
+.closed-sidebar .app-header.header-text-light .app-header__menu .mobile-toggle-header-nav {
+ background: #343a40;
+}
+
+/* Hide tree when collapsed and show it when open */
+/* @todo tree disappears when not hovering on page in small mode - related to #treeicon - see server icons they work? */
+.sidebar-mobile-open:hover #tree, /* small */
+.fixed-sidebar #tree, /* wide */
+.fixed-sidebar .app-sidebar:hover #tree /* wide & closed:hover */
+{
+ display: block;
+}
+
+.closed-sidebar #tree {
+ display: none;
+}
+
+/** Server icons **/
+.closed-sidebar .server-icon {
+ display: none;
+}
+.closed-sidebar .app-sidebar:hover .server-icon, .sidebar-mobile-open .server-icon {
+ display: flex;
+}
diff --git a/public/css/flags16-both.css b/public/css/flags16-both.css
new file mode 100644
index 0000000..2be171c
--- /dev/null
+++ b/public/css/flags16-both.css
@@ -0,0 +1,258 @@
+.f16 .flag {display:inline-block;height:16px;width:16px;vertical-align:text-top;line-height:16px;padding:0;margin:0;background:url(flags16.png) no-repeat;}
+.f16 ._African_Union {background-position: 0 -16px;}
+.f16 ._Arab_League {background-position: 0 -32px;}
+.f16 ._ASEAN {background-position: 0 -48px;}
+.f16 ._CARICOM {background-position: 0 -64px;}
+.f16 ._CIS {background-position: 0 -80px;}
+.f16 ._Commonwealth {background-position: 0 -96px;}
+.f16 ._England {background-position: 0 -112px;}
+.f16 ._European_Union, .f16 .eu {background-position: 0 -128px;}
+.f16 ._Islamic_Conference {background-position: 0 -144px;}
+.f16 ._Kosovo {background-position: 0 -160px;}
+.f16 ._NATO {background-position: 0 -176px;}
+.f16 ._Northern_Cyprus {background-position: 0 -192px;}
+.f16 ._Northern_Ireland {background-position: 0 -208px;}
+.f16 ._Olimpic_Movement {background-position: 0 -224px;}
+.f16 ._OPEC {background-position: 0 -240px;}
+.f16 ._Red_Cross {background-position: 0 -256px;}
+.f16 ._Scotland {background-position: 0 -272px;}
+.f16 ._Somaliland {background-position: 0 -288px;}
+.f16 ._Tibet {background-position: 0 -304px;}
+.f16 ._United_Nations {background-position: 0 -320px;}
+.f16 ._Wales {background-position: 0 -336px;}
+.f16 .ad, .f16 .and {background-position: 0 -352px;}
+.f16 .ae, .f16 .are {background-position: 0 -368px;}
+.f16 .af, .f16 .afg {background-position: 0 -384px;}
+.f16 .ag, .f16 .atg {background-position: 0 -400px;}
+.f16 .ai, .f16 .aia {background-position: 0 -416px;}
+.f16 .al, .f16 .alb {background-position: 0 -432px;}
+.f16 .am, .f16 .arm {background-position: 0 -448px;}
+.f16 .ao, .f16 .ago {background-position: 0 -464px;}
+.f16 .aq, .f16 .ata {background-position: 0 -480px;}
+.f16 .ar, .f16 .arg {background-position: 0 -496px;}
+.f16 .as, .f16 .asm {background-position: 0 -512px;}
+.f16 .at, .f16 .aut {background-position: 0 -528px;}
+.f16 .au, .f16 .aus {background-position: 0 -544px;}
+.f16 .aw, .f16 .abw {background-position: 0 -560px;}
+.f16 .ax, .f16 .ala {background-position: 0 -576px;}
+.f16 .az, .f16 .aze {background-position: 0 -592px;}
+.f16 .ba, .f16 .bih {background-position: 0 -608px;}
+.f16 .bb, .f16 .brb {background-position: 0 -624px;}
+.f16 .bd, .f16 .bgd {background-position: 0 -640px;}
+.f16 .be, .f16 .bel {background-position: 0 -656px;}
+.f16 .bf, .f16 .bfa {background-position: 0 -672px;}
+.f16 .bg, .f16 .bgr {background-position: 0 -688px;}
+.f16 .bh, .f16 .bhr {background-position: 0 -704px;}
+.f16 .bi, .f16 .bdi {background-position: 0 -720px;}
+.f16 .bj, .f16 .ben {background-position: 0 -736px;}
+.f16 .bl, .f16 .blm {background-position: 0 -1424px;}
+.f16 .bm, .f16 .bmu {background-position: 0 -752px;}
+.f16 .bn, .f16 .brn {background-position: 0 -768px;}
+.f16 .bo, .f16 .bol {background-position: 0 -784px;}
+.f16 .bq, .f16 .bes {background-position: 0 -2752px;}
+.f16 .br, .f16 .bra {background-position: 0 -800px;}
+.f16 .bs, .f16 .bhs {background-position: 0 -816px;}
+.f16 .bt, .f16 .btn {background-position: 0 -832px;}
+.f16 .bv, .f16 .bvt {background-position: 0 -2768px;}
+.f16 .bw, .f16 .bwa {background-position: 0 -848px;}
+.f16 .by, .f16 .blr {background-position: 0 -864px;}
+.f16 .bz, .f16 .blz {background-position: 0 -880px;}
+.f16 .ca, .f16 .can {background-position: 0 -896px;}
+.f16 .cd, .f16 .cod {background-position: 0 -912px;}
+.f16 .cf, .f16 .rca {background-position: 0 -928px;}
+.f16 .cg, .f16 .cog {background-position: 0 -944px;}
+.f16 .ch, .f16 .che {background-position: 0 -960px;}
+.f16 .ci, .f16 .civ {background-position: 0 -976px;}
+.f16 .ck, .f16 .cok {background-position: 0 -992px;}
+.f16 .cl, .f16 .chl {background-position: 0 -1008px;}
+.f16 .cm, .f16 .cmr {background-position: 0 -1024px;}
+.f16 .cn, .f16 .chn {background-position: 0 -1040px;}
+.f16 .co, .f16 .col {background-position: 0 -1056px;}
+.f16 .cp, .f16 .cpt {background-position: 0 -1424px;}
+.f16 .cr, .f16 .cri {background-position: 0 -1072px;}
+.f16 .cu, .f16 .cub {background-position: 0 -1088px;}
+.f16 .cv, .f16 .cpv {background-position: 0 -1104px;}
+.f16 .cw, .f16 .cuw {background-position: 0 -3920px;}
+.f16 .cy, .f16 .cyp {background-position: 0 -1120px;}
+.f16 .cz, .f16 .cze {background-position: 0 -1136px;}
+.f16 .de, .f16 .deu {background-position: 0 -1152px;}
+.f16 .dj, .f16 .dji {background-position: 0 -1168px;}
+.f16 .dk, .f16 .dnk {background-position: 0 -1184px;}
+.f16 .dm, .f16 .dma {background-position: 0 -1200px;}
+.f16 .do, .f16 .dom {background-position: 0 -1216px;}
+.f16 .dz, .f16 .dza {background-position: 0 -1232px;}
+.f16 .ec, .f16 .ecu {background-position: 0 -1248px;}
+.f16 .ee, .f16 .est {background-position: 0 -1264px;}
+.f16 .eg, .f16 .egy {background-position: 0 -1280px;}
+.f16 .eh, .f16 .esh {background-position: 0 -1296px;}
+.f16 .er, .f16 .eri {background-position: 0 -1312px;}
+.f16 .es, .f16 .esp {background-position: 0 -1328px;}
+.f16 .et, .f16 .eth {background-position: 0 -1344px;}
+.f16 .fi, .f16 .fin {background-position: 0 -1360px;}
+.f16 .fj, .f16 .fji {background-position: 0 -1376px;}
+.f16 .fm, .f16 .fsm {background-position: 0 -1392px;}
+.f16 .fo, .f16 .fro {background-position: 0 -1408px;}
+.f16 .fr, .f16 .fra {background-position: 0 -1424px;}
+.f16 .ga, .f16 .gab {background-position: 0 -1440px;}
+.f16 .gb, .f16 .gbr {background-position: 0 -1456px;}
+.f16 .gd, .f16 .grd {background-position: 0 -1472px;}
+.f16 .ge, .f16 .geo {background-position: 0 -1488px;}
+.f16 .gg, .f16 .ggy {background-position: 0 -1504px;}
+.f16 .gh, .f16 .gha {background-position: 0 -1520px;}
+.f16 .gi, .f16 .gib {background-position: 0 -1536px;}
+.f16 .gl, .f16 .grl {background-position: 0 -1552px;}
+.f16 .gm, .f16 .gmb {background-position: 0 -1568px;}
+.f16 .gn, .f16 .gin {background-position: 0 -1584px;}
+.f16 .gp, .f16 .glp {background-position: 0 -1600px;}
+.f16 .gq, .f16 .gnq {background-position: 0 -1616px;}
+.f16 .gr, .f16 .grc {background-position: 0 -1632px;}
+.f16 .gt, .f16 .gtm {background-position: 0 -1648px;}
+.f16 .gu, .f16 .gum {background-position: 0 -1664px;}
+.f16 .gw, .f16 .gnb {background-position: 0 -1680px;}
+.f16 .gy, .f16 .guy {background-position: 0 -1696px;}
+.f16 .hk, .f16 .hkg {background-position: 0 -1712px;}
+.f16 .hn, .f16 .hnd {background-position: 0 -1728px;}
+.f16 .hr, .f16 .hrv {background-position: 0 -1744px;}
+.f16 .ht, .f16 .hti {background-position: 0 -1760px;}
+.f16 .hu, .f16 .hun {background-position: 0 -1776px;}
+.f16 .id, .f16 .idn {background-position: 0 -1792px;}
+.f16 .ie, .f16 .irl {background-position: 0 -1808px;}
+.f16 .il, .f16 .isr {background-position: 0 -1824px;}
+.f16 .im, .f16 .imn {background-position: 0 -1840px;}
+.f16 .in, .f16 .ind {background-position: 0 -1856px;}
+.f16 .iq, .f16 .irq {background-position: 0 -1872px;}
+.f16 .ir, .f16 .irn {background-position: 0 -1888px;}
+.f16 .is, .f16 .isl {background-position: 0 -1904px;}
+.f16 .it, .f16 .ita {background-position: 0 -1920px;}
+.f16 .je, .f16 .jey {background-position: 0 -1936px;}
+.f16 .jm, .f16 .jam {background-position: 0 -1952px;}
+.f16 .jo, .f16 .jor {background-position: 0 -1968px;}
+.f16 .jp, .f16 .jpn {background-position: 0 -1984px;}
+.f16 .ke, .f16 .ken {background-position: 0 -2000px;}
+.f16 .kg, .f16 .kgz {background-position: 0 -2016px;}
+.f16 .kh, .f16 .khm {background-position: 0 -2032px;}
+.f16 .ki, .f16 .kir {background-position: 0 -2048px;}
+.f16 .km, .f16 .com {background-position: 0 -2064px;}
+.f16 .kn, .f16 .kna {background-position: 0 -2080px;}
+.f16 .kp, .f16 .prk {background-position: 0 -2096px;}
+.f16 .kr, .f16 .kor {background-position: 0 -2112px;}
+.f16 .kw, .f16 .kwt {background-position: 0 -2128px;}
+.f16 .ky, .f16 .cym {background-position: 0 -2144px;}
+.f16 .kz, .f16 .kaz {background-position: 0 -2160px;}
+.f16 .la, .f16 .lao {background-position: 0 -2176px;}
+.f16 .lb, .f16 .lbn {background-position: 0 -2192px;}
+.f16 .lc, .f16 .lca {background-position: 0 -2208px;}
+.f16 .li, .f16 .lie {background-position: 0 -2224px;}
+.f16 .lk, .f16 .lka {background-position: 0 -2240px;}
+.f16 .lr, .f16 .lbr {background-position: 0 -2256px;}
+.f16 .ls, .f16 .lso {background-position: 0 -2272px;}
+.f16 .lt, .f16 .ltu {background-position: 0 -2288px;}
+.f16 .lu, .f16 .lux {background-position: 0 -2304px;}
+.f16 .lv, .f16 .lva {background-position: 0 -2320px;}
+.f16 .ly, .f16 .lby {background-position: 0 -2336px;}
+.f16 .ma, .f16 .mar {background-position: 0 -2352px;}
+.f16 .mc, .f16 .mco {background-position: 0 -1792px;}
+.f16 .md, .f16 .mda {background-position: 0 -2368px;}
+.f16 .me, .f16 .mne {background-position: 0 -2384px;}
+.f16 .mf, .f16 .maf {background-position: 0 -1424px;}
+.f16 .mg, .f16 .mdg {background-position: 0 -2400px;}
+.f16 .mh, .f16 .mhl {background-position: 0 -2416px;}
+.f16 .mk, .f16 .mkd {background-position: 0 -2432px;}
+.f16 .ml, .f16 .mli {background-position: 0 -2448px;}
+.f16 .mm, .f16 .mmr {background-position: 0 -2464px;}
+.f16 .mn, .f16 .mng {background-position: 0 -2480px;}
+.f16 .mo, .f16 .mac {background-position: 0 -2496px;}
+.f16 .mq, .f16 .mtq {background-position: 0 -2512px;}
+.f16 .mr, .f16 .mrt {background-position: 0 -2528px;}
+.f16 .ms, .f16 .msr {background-position: 0 -2544px;}
+.f16 .mt, .f16 .mlt {background-position: 0 -2560px;}
+.f16 .mu, .f16 .mus {background-position: 0 -2576px;}
+.f16 .mv, .f16 .mdv {background-position: 0 -2592px;}
+.f16 .mw, .f16 .mwi {background-position: 0 -2608px;}
+.f16 .mx, .f16 .mex {background-position: 0 -2624px;}
+.f16 .my, .f16 .mys {background-position: 0 -2640px;}
+.f16 .mz, .f16 .moz {background-position: 0 -2656px;}
+.f16 .na, .f16 .nam {background-position: 0 -2672px;}
+.f16 .nc, .f16 .ncl {background-position: 0 -2688px;}
+.f16 .ne, .f16 .ner {background-position: 0 -2704px;}
+.f16 .ng, .f16 .nga {background-position: 0 -2720px;}
+.f16 .ni, .f16 .nic {background-position: 0 -2736px;}
+.f16 .nl, .f16 .nld {background-position: 0 -2752px;}
+.f16 .no, .f16 .nor {background-position: 0 -2768px;}
+.f16 .np, .f16 .npl {background-position: 0 -2784px;}
+.f16 .nq, .f16 .atn {background-position: 0 -2768px;}
+.f16 .nr, .f16 .nru {background-position: 0 -2800px;}
+.f16 .nu, .f16 .niu {background-position: 0 -3952px;}
+.f16 .nz, .f16 .nzl {background-position: 0 -2816px;}
+.f16 .om, .f16 .omn {background-position: 0 -2832px;}
+.f16 .pa, .f16 .pan {background-position: 0 -2848px;}
+.f16 .pe, .f16 .per {background-position: 0 -2864px;}
+.f16 .pf, .f16 .pyf {background-position: 0 -2880px;}
+.f16 .pg, .f16 .png {background-position: 0 -2896px;}
+.f16 .ph, .f16 .phl {background-position: 0 -2912px;}
+.f16 .pk, .f16 .pak {background-position: 0 -2928px;}
+.f16 .pl, .f16 .pol {background-position: 0 -2944px;}
+.f16 .pr, .f16 .pri {background-position: 0 -2960px;}
+.f16 .ps, .f16 .pse {background-position: 0 -2976px;}
+.f16 .pt, .f16 .prt {background-position: 0 -2992px;}
+.f16 .pw, .f16 .plw {background-position: 0 -3008px;}
+.f16 .py, .f16 .pry {background-position: 0 -3024px;}
+.f16 .qa, .f16 .qat {background-position: 0 -3040px;}
+.f16 .re, .f16 .reu {background-position: 0 -3056px;}
+.f16 .ro, .f16 .rou {background-position: 0 -3072px;}
+.f16 .rs, .f16 .srb {background-position: 0 -3088px;}
+.f16 .ru, .f16 .rus {background-position: 0 -3104px;}
+.f16 .rw, .f16 .rwa {background-position: 0 -3120px;}
+.f16 .sa, .f16 .sau {background-position: 0 -3136px;}
+.f16 .sb, .f16 .slb {background-position: 0 -3152px;}
+.f16 .sc, .f16 .syc {background-position: 0 -3168px;}
+.f16 .sd, .f16 .sdn {background-position: 0 -3184px;}
+.f16 .se, .f16 .swe {background-position: 0 -3200px;}
+.f16 .sg, .f16 .sgp {background-position: 0 -3216px;}
+.f16 .sh, .f16 .shn {background-position: 0 -1456px;}
+.f16 .si, .f16 .svn {background-position: 0 -3232px;}
+.f16 .sj, .f16 .sjm {background-position: 0 -2768px;}
+.f16 .sk, .f16 .svk {background-position: 0 -3248px;}
+.f16 .sl, .f16 .sle {background-position: 0 -3264px;}
+.f16 .sm, .f16 .smr {background-position: 0 -3280px;}
+.f16 .sn, .f16 .sen {background-position: 0 -3296px;}
+.f16 .so, .f16 .som {background-position: 0 -3312px;}
+.f16 .sr, .f16 .sur {background-position: 0 -3328px;}
+.f16 .ss, .f16 .ssd {background-position: 0 -3936px;}
+.f16 .st, .f16 .stp {background-position: 0 -3344px;}
+.f16 .sv, .f16 .slv {background-position: 0 -3360px;}
+.f16 .sx, .f16 .sxm {background-position: 0 -3904px;}
+.f16 .sy, .f16 .syr {background-position: 0 -3376px;}
+.f16 .sz, .f16 .swz {background-position: 0 -3392px;}
+.f16 .tc, .f16 .tca {background-position: 0 -3408px;}
+.f16 .td, .f16 .tcd {background-position: 0 -3424px;}
+.f16 .tg, .f16 .tgo {background-position: 0 -3440px;}
+.f16 .th, .f16 .tha {background-position: 0 -3456px;}
+.f16 .tj, .f16 .tjk {background-position: 0 -3472px;}
+.f16 .tl, .f16 .tls {background-position: 0 -3488px;}
+.f16 .tm, .f16 .tkm {background-position: 0 -3504px;}
+.f16 .tn, .f16 .tun {background-position: 0 -3520px;}
+.f16 .to, .f16 .ton {background-position: 0 -3536px;}
+.f16 .tr, .f16 .tur {background-position: 0 -3552px;}
+.f16 .tt, .f16 .tto {background-position: 0 -3568px;}
+.f16 .tv, .f16 .tuv {background-position: 0 -3584px;}
+.f16 .tw, .f16 .twn {background-position: 0 -3600px;}
+.f16 .tz, .f16 .tza {background-position: 0 -3616px;}
+.f16 .ua, .f16 .ukr {background-position: 0 -3632px;}
+.f16 .ug, .f16 .uga {background-position: 0 -3648px;}
+.f16 .us, .f16 .usa {background-position: 0 -3664px;}
+.f16 .uy, .f16 .ury {background-position: 0 -3680px;}
+.f16 .uz, .f16 .uzb {background-position: 0 -3696px;}
+.f16 .va, .f16 .vat {background-position: 0 -3712px;}
+.f16 .vc, .f16 .vct {background-position: 0 -3728px;}
+.f16 .ve, .f16 .ven {background-position: 0 -3744px;}
+.f16 .vg, .f16 .vgb {background-position: 0 -3760px;}
+.f16 .vi, .f16 .vir {background-position: 0 -3776px;}
+.f16 .vn, .f16 .vnm {background-position: 0 -3792px;}
+.f16 .vu, .f16 .vut {background-position: 0 -3808px;}
+.f16 .ws, .f16 .wsm {background-position: 0 -3824px;}
+.f16 .ye, .f16 .yem {background-position: 0 -3840px;}
+.f16 .yt, .f16 .myt {background-position: 0 -1424px;}
+.f16 .za, .f16 .zaf {background-position: 0 -3856px;}
+.f16 .zm, .f16 .zmb {background-position: 0 -3872px;}
+.f16 .zw, .f16 .zwe {background-position: 0 -3888px;}
diff --git a/public/css/flags16.png b/public/css/flags16.png
new file mode 100644
index 0000000..12a2346
Binary files /dev/null and b/public/css/flags16.png differ
diff --git a/public/css/flags32-both.css b/public/css/flags32-both.css
new file mode 100644
index 0000000..3e0efec
--- /dev/null
+++ b/public/css/flags32-both.css
@@ -0,0 +1,259 @@
+.f32 .flag{display:inline-block;height:32px;width:32px;vertical-align:text-top;line-height:32px;background:url(flags32.png) no-repeat;}
+.f32 ._African_Union{background-position:0 -32px;}
+.f32 ._Arab_League{background-position:0 -64px;}
+.f32 ._ASEAN{background-position:0 -96px;}
+.f32 ._CARICOM{background-position:0 -128px;}
+.f32 ._CIS{background-position:0 -160px;}
+.f32 ._Commonwealth{background-position:0 -192px;}
+.f32 ._England{background-position:0 -224px;}
+.f32 ._European_Union, .f32 .eu{background-position:0 -256px;}
+.f32 ._Islamic_Conference{background-position:0 -288px;}
+.f32 ._Kosovo{background-position:0 -320px;}
+.f32 ._NATO{background-position:0 -352px;}
+.f32 ._Northern_Cyprus{background-position:0 -384px;}
+.f32 ._Northern_Ireland{background-position:0 -416px;}
+.f32 ._Olimpic_Movement{background-position:0 -448px;}
+.f32 ._OPEC{background-position:0 -480px;}
+.f32 ._Red_Cross{background-position:0 -512px;}
+.f32 ._Scotland{background-position:0 -544px;}
+.f32 ._Somaliland{background-position:0 -576px;}
+.f32 ._Tibet{background-position:0 -608px;}
+.f32 ._United_Nations{background-position:0 -640px;}
+.f32 ._Wales{background-position:0 -672px;}
+.f32 .ad, .f32 .and {background-position: 0 -704px;}
+.f32 .ae, .f32 .are {background-position: 0 -736px;}
+.f32 .af, .f32 .afg {background-position: 0 -768px;}
+.f32 .ag, .f32 .atg {background-position: 0 -800px;}
+.f32 .ai, .f32 .aia {background-position: 0 -832px;}
+.f32 .al, .f32 .alb {background-position: 0 -864px;}
+.f32 .am, .f32 .arm {background-position: 0 -896px;}
+.f32 .ao, .f32 .ago {background-position: 0 -928px;}
+.f32 .aq, .f32 .ata {background-position: 0 -960px;}
+.f32 .ar, .f32 .arg {background-position: 0 -992px;}
+.f32 .as, .f32 .asm {background-position: 0 -1024px;}
+.f32 .at, .f32 .aut {background-position: 0 -1056px;}
+.f32 .au, .f32 .aus {background-position: 0 -1088px;}
+.f32 .aw, .f32 .abw {background-position: 0 -1120px;}
+.f32 .ax, .f32 .ala {background-position: 0 -1152px;}
+.f32 .az, .f32 .aze {background-position: 0 -1184px;}
+.f32 .ba, .f32 .bih {background-position: 0 -1216px;}
+.f32 .bb, .f32 .brb {background-position: 0 -1248px;}
+.f32 .bd, .f32 .bgd {background-position: 0 -1280px;}
+.f32 .be, .f32 .bel {background-position: 0 -1312px;}
+.f32 .bf, .f32 .bfa {background-position: 0 -1344px;}
+.f32 .bg, .f32 .bgr {background-position: 0 -1376px;}
+.f32 .bh, .f32 .bhr {background-position: 0 -1408px;}
+.f32 .bi, .f32 .bdi {background-position: 0 -1440px;}
+.f32 .bj, .f32 .ben {background-position: 0 -1472px;}
+.f32 .bm, .f32 .bmu {background-position: 0 -1504px;}
+.f32 .bn, .f32 .brn {background-position: 0 -1536px;}
+.f32 .bo, .f32 .bol {background-position: 0 -1568px;}
+.f32 .br, .f32 .bra {background-position: 0 -1600px;}
+.f32 .bs, .f32 .bhs {background-position: 0 -1632px;}
+.f32 .bt, .f32 .btn {background-position: 0 -1664px;}
+.f32 .bw, .f32 .bwa {background-position: 0 -1696px;}
+.f32 .by, .f32 .blr {background-position: 0 -1728px;}
+.f32 .bz, .f32 .blz {background-position: 0 -1760px;}
+.f32 .ca, .f32 .can {background-position: 0 -1792px;}
+.f32 .cd, .f32 .cod {background-position: 0 -1824px;}
+.f32 .cf, .f32 .rca {background-position: 0 -1856px;}
+.f32 .cg, .f32 .cog {background-position: 0 -1888px;}
+.f32 .ch, .f32 .che {background-position: 0 -1920px;}
+.f32 .ci, .f32 .civ {background-position: 0 -1952px;}
+.f32 .ck, .f32 .cok {background-position: 0 -1984px;}
+.f32 .cl, .f32 .chl {background-position: 0 -2016px;}
+.f32 .cm, .f32 .cmr {background-position: 0 -2048px;}
+.f32 .cn, .f32 .chn {background-position: 0 -2080px;}
+.f32 .co, .f32 .col {background-position: 0 -2112px;}
+.f32 .cr, .f32 .cri {background-position: 0 -2144px;}
+.f32 .cu, .f32 .cub {background-position: 0 -2176px;}
+.f32 .cv, .f32 .cpv {background-position: 0 -2208px;}
+.f32 .cy, .f32 .cyp {background-position: 0 -2240px;}
+.f32 .cz, .f32 .cze {background-position: 0 -2272px;}
+.f32 .de, .f32 .deu {background-position: 0 -2304px;}
+.f32 .dj, .f32 .dji {background-position: 0 -2336px;}
+.f32 .dk, .f32 .dnk {background-position: 0 -2368px;}
+.f32 .dm, .f32 .dma {background-position: 0 -2400px;}
+.f32 .do, .f32 .dom {background-position: 0 -2432px;}
+.f32 .dz, .f32 .dza {background-position: 0 -2464px;}
+.f32 .ec, .f32 .ecu {background-position: 0 -2496px;}
+.f32 .ee, .f32 .est {background-position: 0 -2528px;}
+.f32 .eg, .f32 .egy {background-position: 0 -2560px;}
+.f32 .eh, .f32 .esh {background-position: 0 -2592px;}
+.f32 .er, .f32 .eri {background-position: 0 -2624px;}
+.f32 .es, .f32 .esp {background-position: 0 -2656px;}
+.f32 .et, .f32 .eth {background-position: 0 -2688px;}
+.f32 .fi, .f32 .fin {background-position: 0 -2720px;}
+.f32 .fj, .f32 .fji {background-position: 0 -2752px;}
+.f32 .fm, .f32 .fsm {background-position: 0 -2784px;}
+.f32 .fo, .f32 .fro {background-position: 0 -2816px;}
+.f32 .fr, .f32 .fra {background-position: 0 -2848px;}
+.f32 .bl, .f32 .blm {background-position: 0 -2848px;}
+.f32 .cp, .f32 .cpt {background-position: 0 -2848px;}
+.f32 .mf, .f32 .maf {background-position: 0 -2848px;}
+.f32 .yt, .f32 .myt {background-position: 0 -2848px;}
+.f32 .ga, .f32 .gab {background-position: 0 -2880px;}
+.f32 .gb, .f32 .gbr {background-position: 0 -2912px;}
+.f32 .sh, .f32 .shn {background-position: 0 -2912px;}
+.f32 .gd, .f32 .grd {background-position: 0 -2944px;}
+.f32 .ge, .f32 .geo {background-position: 0 -2976px;}
+.f32 .gg, .f32 .ggy {background-position: 0 -3008px;}
+.f32 .gh, .f32 .gha {background-position: 0 -3040px;}
+.f32 .gi, .f32 .gib {background-position: 0 -3072px;}
+.f32 .gl, .f32 .grl {background-position: 0 -3104px;}
+.f32 .gm, .f32 .gmb {background-position: 0 -3136px;}
+.f32 .gn, .f32 .gin {background-position: 0 -3168px;}
+.f32 .gp, .f32 .glp {background-position: 0 -3200px;}
+.f32 .gq, .f32 .gnq {background-position: 0 -3232px;}
+.f32 .gr, .f32 .grc {background-position: 0 -3264px;}
+.f32 .gt, .f32 .gtm {background-position: 0 -3296px;}
+.f32 .gu, .f32 .gum {background-position: 0 -3328px;}
+.f32 .gw, .f32 .gnb {background-position: 0 -3360px;}
+.f32 .gy, .f32 .guy {background-position: 0 -3392px;}
+.f32 .hk, .f32 .hkg {background-position: 0 -3424px;}
+.f32 .hn, .f32 .hnd {background-position: 0 -3456px;}
+.f32 .hr, .f32 .hrv {background-position: 0 -3488px;}
+.f32 .ht, .f32 .hti {background-position: 0 -3520px;}
+.f32 .hu, .f32 .hun {background-position: 0 -3552px;}
+.f32 .id, .f32 .idn {background-position: 0 -3584px;}
+.f32 .mc, .f32 .mco {background-position: 0 -3584px;}
+.f32 .ie {background-position: 0 -3616px;}
+.f32 .il, .f32 .isr {background-position: 0 -3648px;}
+.f32 .im, .f32 .imn {background-position: 0 -3680px;}
+.f32 .in, .f32 .ind {background-position: 0 -3712px;}
+.f32 .iq, .f32 .irq {background-position: 0 -3744px;}
+.f32 .ir, .f32 .irn {background-position: 0 -3776px;}
+.f32 .is, .f32 .isl {background-position: 0 -3808px;}
+.f32 .it, .f32 .ita {background-position: 0 -3840px;}
+.f32 .je, .f32 .jey {background-position: 0 -3872px;}
+.f32 .jm, .f32 .jam {background-position: 0 -3904px;}
+.f32 .jo, .f32 .jor {background-position: 0 -3936px;}
+.f32 .jp, .f32 .jpn {background-position: 0 -3968px;}
+.f32 .ke, .f32 .ken {background-position: 0 -4000px;}
+.f32 .kg, .f32 .kgz {background-position: 0 -4032px;}
+.f32 .kh, .f32 .khm {background-position: 0 -4064px;}
+.f32 .ki, .f32 .kir {background-position: 0 -4096px;}
+.f32 .km, .f32 .com {background-position: 0 -4128px;}
+.f32 .kn, .f32 .kna {background-position: 0 -4160px;}
+.f32 .kp, .f32 .prk {background-position: 0 -4192px;}
+.f32 .kr, .f32 .kor {background-position: 0 -4224px;}
+.f32 .kw, .f32 .kwt {background-position: 0 -4256px;}
+.f32 .ky, .f32 .cym {background-position: 0 -4288px;}
+.f32 .kz, .f32 .kaz {background-position: 0 -4320px;}
+.f32 .la, .f32 .lao {background-position: 0 -4352px;}
+.f32 .lb, .f32 .lbn {background-position: 0 -4384px;}
+.f32 .lc, .f32 .lca {background-position: 0 -4416px;}
+.f32 .li, .f32 .lie {background-position: 0 -4448px;}
+.f32 .lk, .f32 .lka {background-position: 0 -4480px;}
+.f32 .lr, .f32 .lbr {background-position: 0 -4512px;}
+.f32 .ls, .f32 .lso {background-position: 0 -4544px;}
+.f32 .lt, .f32 .ltu {background-position: 0 -4576px;}
+.f32 .lu, .f32 .lux {background-position: 0 -4608px;}
+.f32 .lv, .f32 .lva {background-position: 0 -4640px;}
+.f32 .ly, .f32 .lby {background-position: 0 -4672px;}
+.f32 .ma, .f32 .mar {background-position: 0 -4704px;}
+.f32 .md, .f32 .mda {background-position: 0 -4736px;}
+.f32 .me, .f32 .mne {background-position: 0 -4768px;}
+.f32 .mg, .f32 .mdg {background-position: 0 -4800px;}
+.f32 .mh, .f32 .mhl {background-position: 0 -4832px;}
+.f32 .mk, .f32 .mkd {background-position: 0 -4864px;}
+.f32 .ml, .f32 .mli {background-position: 0 -4896px;}
+.f32 .mm, .f32 .mmr {background-position: 0 -4928px;}
+.f32 .mn, .f32 .mng {background-position: 0 -4960px;}
+.f32 .mo, .f32 .mac {background-position: 0 -4992px;}
+.f32 .mq, .f32 .mtq {background-position: 0 -5024px;}
+.f32 .mr, .f32 .mrt {background-position: 0 -5056px;}
+.f32 .ms, .f32 .msr {background-position: 0 -5088px;}
+.f32 .mt, .f32 .mlt {background-position: 0 -5120px;}
+.f32 .mu, .f32 .mus {background-position: 0 -5152px;}
+.f32 .mv, .f32 .mdv {background-position: 0 -5184px;}
+.f32 .mw, .f32 .mwi {background-position: 0 -5216px;}
+.f32 .mx, .f32 .mex {background-position: 0 -5248px;}
+.f32 .my, .f32 .mys {background-position: 0 -5280px;}
+.f32 .mz, .f32 .moz {background-position: 0 -5312px;}
+.f32 .na, .f32 .nam {background-position: 0 -5344px;}
+.f32 .nc, .f32 .ncl {background-position: 0 -5376px;}
+.f32 .ne, .f32 .ner {background-position: 0 -5408px;}
+.f32 .ng, .f32 .nga {background-position: 0 -5440px;}
+.f32 .ni, .f32 .nic {background-position: 0 -5472px;}
+.f32 .nl, .f32 .nld {background-position: 0 -5504px;}
+.f32 .nl{background-position:0 -5504px;} .f32 .bq{background-position:0 -5504px;}.f32 .no{background-position:0 -5536px;} .f32 .bv, .f32 .nq, .f32 .sj{background-position:0 -5536px;}
+.f32 .bq, .f32 .bes {background-position: 0 -5504px;}
+.f32 .no, .f32 .nor {background-position: 0 -5536px;}
+.f32 .bv, .f32 .bvt {background-position: 0 -5536px;}
+.f32 .nq, .f32 .atn {background-position: 0 -5536px;}
+.f32 .sj, .f32 .sjm {background-position: 0 -5536px;}
+.f32 .np, .f32 .npl {background-position: 0 -5568px;}
+.f32 .nr, .f32 .nru {background-position: 0 -5600px;}
+.f32 .nz, .f32 .nzl {background-position: 0 -5632px;}
+.f32 .om, .f32 .omn {background-position: 0 -5664px;}
+.f32 .pa, .f32 .pan {background-position: 0 -5696px;}
+.f32 .pe, .f32 .per {background-position: 0 -5728px;}
+.f32 .pf, .f32 .pyf {background-position: 0 -5760px;}
+.f32 .pg, .f32 .png {background-position: 0 -5792px;}
+.f32 .ph, .f32 .phl {background-position: 0 -5824px;}
+.f32 .pk, .f32 .pak {background-position: 0 -5856px;}
+.f32 .pl, .f32 .pol {background-position: 0 -5888px;}
+.f32 .pr, .f32 .pri {background-position: 0 -5920px;}
+.f32 .ps, .f32 .pse {background-position: 0 -5952px;}
+.f32 .pt, .f32 .prt {background-position: 0 -5984px;}
+.f32 .pw, .f32 .plw {background-position: 0 -6016px;}
+.f32 .py, .f32 .pry {background-position: 0 -6048px;}
+.f32 .qa, .f32 .qat {background-position: 0 -6080px;}
+.f32 .re, .f32 .reu {background-position: 0 -6112px;}
+.f32 .ro, .f32 .rou {background-position: 0 -6144px;}
+.f32 .rs, .f32 .srb {background-position: 0 -6176px;}
+.f32 .ru, .f32 .rus {background-position: 0 -6208px;}
+.f32 .rw, .f32 .rwa {background-position: 0 -6240px;}
+.f32 .sa, .f32 .sau {background-position: 0 -6272px;}
+.f32 .sb, .f32 .slb {background-position: 0 -6304px;}
+.f32 .sc, .f32 .syc {background-position: 0 -6336px;}
+.f32 .sd, .f32 .sdn {background-position: 0 -6368px;}
+.f32 .se, .f32 .swe {background-position: 0 -6400px;}
+.f32 .sg, .f32 .sgp {background-position: 0 -6432px;}
+.f32 .si, .f32 .svn {background-position: 0 -6464px;}
+.f32 .sk, .f32 .svk {background-position: 0 -6496px;}
+.f32 .sl, .f32 .sle {background-position: 0 -6528px;}
+.f32 .sm, .f32 .smr {background-position: 0 -6560px;}
+.f32 .sn, .f32 .sen {background-position: 0 -6592px;}
+.f32 .so, .f32 .som {background-position: 0 -6624px;}
+.f32 .sr, .f32 .sur {background-position: 0 -6656px;}
+.f32 .st, .f32 .stp {background-position: 0 -6688px;}
+.f32 .sv, .f32 .slv {background-position: 0 -6720px;}
+.f32 .sy, .f32 .syr {background-position: 0 -6752px;}
+.f32 .sz, .f32 .swz {background-position: 0 -6784px;}
+.f32 .tc, .f32 .tca {background-position: 0 -6816px;}
+.f32 .td, .f32 .tcd {background-position: 0 -6848px;}
+.f32 .tg, .f32 .tgo {background-position: 0 -6880px;}
+.f32 .th, .f32 .tha {background-position: 0 -6912px;}
+.f32 .tj, .f32 .tjk {background-position: 0 -6944px;}
+.f32 .tl, .f32 .tls {background-position: 0 -6976px;}
+.f32 .tm, .f32 .tkm {background-position: 0 -7008px;}
+.f32 .tn, .f32 .tun {background-position: 0 -7040px;}
+.f32 .to, .f32 .ton {background-position: 0 -7072px;}
+.f32 .tr, .f32 .tur {background-position: 0 -7104px;}
+.f32 .tt, .f32 .tto {background-position: 0 -7136px;}
+.f32 .tv, .f32 .tuv {background-position: 0 -7168px;}
+.f32 .tw, .f32 .twn {background-position: 0 -7200px;}
+.f32 .tz, .f32 .tza {background-position: 0 -7232px;}
+.f32 .ua, .f32 .ukr {background-position: 0 -7264px;}
+.f32 .ug, .f32 .uga {background-position: 0 -7296px;}
+.f32 .us, .f32 .usa {background-position: 0 -7328px;}
+.f32 .uy, .f32 .ury {background-position: 0 -7360px;}
+.f32 .uz, .f32 .uzb {background-position: 0 -7392px;}
+.f32 .va, .f32 .vat {background-position: 0 -7424px;}
+.f32 .vc, .f32 .vct {background-position: 0 -7456px;}
+.f32 .ve, .f32 .ven {background-position: 0 -7488px;}
+.f32 .vg, .f32 .vgb {background-position: 0 -7520px;}
+.f32 .vi, .f32 .vir {background-position: 0 -7552px;}
+.f32 .vn, .f32 .vnm {background-position: 0 -7584px;}
+.f32 .vu, .f32 .vut {background-position: 0 -7616px;}
+.f32 .ws, .f32 .wsm {background-position: 0 -7648px;}
+.f32 .ye, .f32 .yem {background-position: 0 -7680px;}
+.f32 .za, .f32 .zaf {background-position: 0 -7712px;}
+.f32 .zm, .f32 .zmb {background-position: 0 -7744px;}
+.f32 .zw, .f32 .zwe {background-position: 0 -7776px;}
+.f32 .sx, .f32 .sxm {background-position: 0 -7808px;}
+.f32 .cw, .f32 .cuw {background-position: 0 -7840px;}
+.f32 .ss, .f32 .ssd {background-position: 0 -7872px;}
+.f32 .nu, .f32 .niu {background-position: 0 -7904px;}
diff --git a/public/css/flags32.png b/public/css/flags32.png
new file mode 100644
index 0000000..a9a45ae
Binary files /dev/null and b/public/css/flags32.png differ
diff --git a/public/css/print.css b/public/css/print.css
new file mode 100644
index 0000000..7bbd287
--- /dev/null
+++ b/public/css/print.css
@@ -0,0 +1,19 @@
+@media print {
+ body {
+ color: #333;
+ font-weight: 400;
+ font-size: 0.85em;
+ }
+
+ label {
+ font-weight: bold;
+ }
+
+ tr { page-break-inside:avoid; }
+ thead { display:table-header-group; }
+ tfoot { display:table-footer-group; }
+
+ .table-responsive {
+ overflow: visible !important;
+ }
+}
\ No newline at end of file
diff --git a/htdocs/images/favicon.ico b/public/favicon.ico
similarity index 100%
rename from htdocs/images/favicon.ico
rename to public/favicon.ico
diff --git a/public/img/logo-h-lg.png b/public/img/logo-h-lg.png
new file mode 100644
index 0000000..824e5be
Binary files /dev/null and b/public/img/logo-h-lg.png differ
diff --git a/public/img/logo-h.png b/public/img/logo-h.png
new file mode 100644
index 0000000..da1ffac
Binary files /dev/null and b/public/img/logo-h.png differ
diff --git a/public/img/logo.png b/public/img/logo.png
new file mode 100644
index 0000000..a318ea7
Binary files /dev/null and b/public/img/logo.png differ
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..1d69f3a
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,55 @@
+make(Kernel::class);
+
+$response = $kernel->handle(
+ $request = Request::capture()
+)->send();
+
+$kernel->terminate($request, $response);
diff --git a/public/js/app.js b/public/js/app.js
new file mode 100644
index 0000000..cc4ee3e
--- /dev/null
+++ b/public/js/app.js
@@ -0,0 +1,2 @@
+/*! For license information please see app.js.LICENSE.txt */
+!function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="/",n(n.s=10)}([function(t,e,n){"use strict";var r=n(2),i=Object.prototype.toString;function o(t){return"[object Array]"===i.call(t)}function u(t){return void 0===t}function a(t){return null!==t&&"object"==typeof t}function s(t){return"[object Function]"===i.call(t)}function c(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),o(t))for(var n=0,r=t.length;n0&&e-1 in t)}T.fn=T.prototype={jquery:"3.5.1",constructor:T,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=T.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return T.each(this,t)},map:function(t){return this.pushStack(T.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(T.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(T.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+$+")"+$+"*"),U=new RegExp($+"|>"),X=new RegExp(B),V=new RegExp("^"+H+"$"),K={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+B),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+$+"*(even|odd|(([+-]|)(\\d*)n|)"+$+"*(?:([+-]|)"+$+"*(\\d+)|))"+$+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+$+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+$+"*((?:-\\d)?\\d*)"+$+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,J=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,tt=/[+~]/,et=new RegExp("\\\\[\\da-fA-F]{1,6}"+$+"?|\\\\([^\\r\\n\\f])","g"),nt=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},rt=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,it=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},ot=function(){p()},ut=xt((function(t){return!0===t.disabled&&"fieldset"===t.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{D.apply(O=R.call(w.childNodes),w.childNodes),O[w.childNodes.length].nodeType}catch(t){D={apply:O.length?function(t,e){L.apply(t,R.call(e))}:function(t,e){for(var n=t.length,r=0;t[n++]=e[r++];);t.length=n-1}}}function at(t,e,r,i){var o,a,c,f,l,d,y,m=e&&e.ownerDocument,w=e?e.nodeType:9;if(r=r||[],"string"!=typeof t||!t||1!==w&&9!==w&&11!==w)return r;if(!i&&(p(e),e=e||h,v)){if(11!==w&&(l=Q.exec(t)))if(o=l[1]){if(9===w){if(!(c=e.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(m&&(c=m.getElementById(o))&&b(e,c)&&c.id===o)return r.push(c),r}else{if(l[2])return D.apply(r,e.getElementsByTagName(t)),r;if((o=l[3])&&n.getElementsByClassName&&e.getElementsByClassName)return D.apply(r,e.getElementsByClassName(o)),r}if(n.qsa&&!E[t+" "]&&(!g||!g.test(t))&&(1!==w||"object"!==e.nodeName.toLowerCase())){if(y=t,m=e,1===w&&(U.test(t)||z.test(t))){for((m=tt.test(t)&&yt(e.parentNode)||e)===e&&n.scope||((f=e.getAttribute("id"))?f=f.replace(rt,it):e.setAttribute("id",f=x)),a=(d=u(t)).length;a--;)d[a]=(f?"#"+f:":scope")+" "+bt(d[a]);y=d.join(",")}try{return D.apply(r,m.querySelectorAll(y)),r}catch(e){E(t,!0)}finally{f===x&&e.removeAttribute("id")}}}return s(t.replace(F,"$1"),e,r,i)}function st(){var t=[];return function e(n,i){return t.push(n+" ")>r.cacheLength&&delete e[t.shift()],e[n+" "]=i}}function ct(t){return t[x]=!0,t}function ft(t){var e=h.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function lt(t,e){for(var n=t.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=e}function pt(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ht(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function dt(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function vt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ut(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function gt(t){return ct((function(e){return e=+e,ct((function(n,r){for(var i,o=t([],n.length,e),u=o.length;u--;)n[i=o[u]]&&(n[i]=!(r[i]=n[i]))}))}))}function yt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=at.support={},o=at.isXML=function(t){var e=t.namespaceURI,n=(t.ownerDocument||t).documentElement;return!G.test(e||n&&n.nodeName||"HTML")},p=at.setDocument=function(t){var e,i,u=t?t.ownerDocument||t:w;return u!=h&&9===u.nodeType&&u.documentElement?(d=(h=u).documentElement,v=!o(h),w!=h&&(i=h.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",ot,!1):i.attachEvent&&i.attachEvent("onunload",ot)),n.scope=ft((function(t){return d.appendChild(t).appendChild(h.createElement("div")),void 0!==t.querySelectorAll&&!t.querySelectorAll(":scope fieldset div").length})),n.attributes=ft((function(t){return t.className="i",!t.getAttribute("className")})),n.getElementsByTagName=ft((function(t){return t.appendChild(h.createComment("")),!t.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(h.getElementsByClassName),n.getById=ft((function(t){return d.appendChild(t).id=x,!h.getElementsByName||!h.getElementsByName(x).length})),n.getById?(r.filter.ID=function(t){var e=t.replace(et,nt);return function(t){return t.getAttribute("id")===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n=e.getElementById(t);return n?[n]:[]}}):(r.filter.ID=function(t){var e=t.replace(et,nt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&v){var n,r,i,o=e.getElementById(t);if(o){if((n=o.getAttributeNode("id"))&&n.value===t)return[o];for(i=e.getElementsByName(t),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===t)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,o=e.getElementsByTagName(t);if("*"===t){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&v)return e.getElementsByClassName(t)},y=[],g=[],(n.qsa=Z.test(h.querySelectorAll))&&(ft((function(t){var e;d.appendChild(t).innerHTML="",t.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+$+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||g.push("\\["+$+"*(?:value|"+I+")"),t.querySelectorAll("[id~="+x+"-]").length||g.push("~="),(e=h.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||g.push("\\["+$+"*name"+$+"*="+$+"*(?:''|\"\")"),t.querySelectorAll(":checked").length||g.push(":checked"),t.querySelectorAll("a#"+x+"+*").length||g.push(".#.+[+~]"),t.querySelectorAll("\\\f"),g.push("[\\r\\n\\f]")})),ft((function(t){t.innerHTML="";var e=h.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&g.push("name"+$+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),d.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),g.push(",.*:")}))),(n.matchesSelector=Z.test(m=d.matches||d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ft((function(t){n.disconnectedMatch=m.call(t,"*"),m.call(t,"[s!='']:x"),y.push("!=",B)})),g=g.length&&new RegExp(g.join("|")),y=y.length&&new RegExp(y.join("|")),e=Z.test(d.compareDocumentPosition),b=e||Z.test(d.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},j=e?function(t,e){if(t===e)return l=!0,0;var r=!t.compareDocumentPosition-!e.compareDocumentPosition;return r||(1&(r=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===r?t==h||t.ownerDocument==w&&b(w,t)?-1:e==h||e.ownerDocument==w&&b(w,e)?1:f?q(f,t)-q(f,e):0:4&r?-1:1)}:function(t,e){if(t===e)return l=!0,0;var n,r=0,i=t.parentNode,o=e.parentNode,u=[t],a=[e];if(!i||!o)return t==h?-1:e==h?1:i?-1:o?1:f?q(f,t)-q(f,e):0;if(i===o)return pt(t,e);for(n=t;n=n.parentNode;)u.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;u[r]===a[r];)r++;return r?pt(u[r],a[r]):u[r]==w?-1:a[r]==w?1:0},h):h},at.matches=function(t,e){return at(t,null,null,e)},at.matchesSelector=function(t,e){if(p(t),n.matchesSelector&&v&&!E[e+" "]&&(!y||!y.test(e))&&(!g||!g.test(e)))try{var r=m.call(t,e);if(r||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(t){E(e,!0)}return at(e,h,null,[t]).length>0},at.contains=function(t,e){return(t.ownerDocument||t)!=h&&p(t),b(t,e)},at.attr=function(t,e){(t.ownerDocument||t)!=h&&p(t);var i=r.attrHandle[e.toLowerCase()],o=i&&A.call(r.attrHandle,e.toLowerCase())?i(t,e,!v):void 0;return void 0!==o?o:n.attributes||!v?t.getAttribute(e):(o=t.getAttributeNode(e))&&o.specified?o.value:null},at.escape=function(t){return(t+"").replace(rt,it)},at.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},at.uniqueSort=function(t){var e,r=[],i=0,o=0;if(l=!n.detectDuplicates,f=!n.sortStable&&t.slice(0),t.sort(j),l){for(;e=t[o++];)e===t[o]&&(i=r.push(o));for(;i--;)t.splice(r[i],1)}return f=null,t},i=at.getText=function(t){var e,n="",r=0,o=t.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=i(t)}else if(3===o||4===o)return t.nodeValue}else for(;e=t[r++];)n+=i(e);return n},(r=at.selectors={cacheLength:50,createPseudo:ct,match:K,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(et,nt),t[3]=(t[3]||t[4]||t[5]||"").replace(et,nt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||at.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&at.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return K.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&X.test(n)&&(e=u(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(et,nt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=C[t+" "];return e||(e=new RegExp("(^|"+$+")"+t+"("+$+"|$)"))&&C(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(r){var i=at.attr(r,t);return null==i?"!="===e:!e||(i+="","="===e?i===n:"!="===e?i!==n:"^="===e?n&&0===i.indexOf(n):"*="===e?n&&i.indexOf(n)>-1:"$="===e?n&&i.slice(-n.length)===n:"~="===e?(" "+i.replace(M," ")+" ").indexOf(n)>-1:"|="===e&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,r,i){var o="nth"!==t.slice(0,3),u="last"!==t.slice(-4),a="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,s){var c,f,l,p,h,d,v=o!==u?"nextSibling":"previousSibling",g=e.parentNode,y=a&&e.nodeName.toLowerCase(),m=!s&&!a,b=!1;if(g){if(o){for(;v;){for(p=e;p=p[v];)if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=v="only"===t&&!d&&"nextSibling"}return!0}if(d=[u?g.firstChild:g.lastChild],u&&m){for(b=(h=(c=(f=(l=(p=g)[x]||(p[x]={}))[p.uniqueID]||(l[p.uniqueID]={}))[t]||[])[0]===_&&c[1])&&c[2],p=h&&g.childNodes[h];p=++h&&p&&p[v]||(b=h=0)||d.pop();)if(1===p.nodeType&&++b&&p===e){f[t]=[_,h,b];break}}else if(m&&(b=h=(c=(f=(l=(p=e)[x]||(p[x]={}))[p.uniqueID]||(l[p.uniqueID]={}))[t]||[])[0]===_&&c[1]),!1===b)for(;(p=++h&&p&&p[v]||(b=h=0)||d.pop())&&((a?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++b||(m&&((f=(l=p[x]||(p[x]={}))[p.uniqueID]||(l[p.uniqueID]={}))[t]=[_,b]),p!==e)););return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(t,e){var n,i=r.pseudos[t]||r.setFilters[t.toLowerCase()]||at.error("unsupported pseudo: "+t);return i[x]?i(e):i.length>1?(n=[t,t,"",e],r.setFilters.hasOwnProperty(t.toLowerCase())?ct((function(t,n){for(var r,o=i(t,e),u=o.length;u--;)t[r=q(t,o[u])]=!(n[r]=o[u])})):function(t){return i(t,0,n)}):i}},pseudos:{not:ct((function(t){var e=[],n=[],r=a(t.replace(F,"$1"));return r[x]?ct((function(t,e,n,i){for(var o,u=r(t,null,i,[]),a=t.length;a--;)(o=u[a])&&(t[a]=!(e[a]=o))})):function(t,i,o){return e[0]=t,r(e,null,o,n),e[0]=null,!n.pop()}})),has:ct((function(t){return function(e){return at(t,e).length>0}})),contains:ct((function(t){return t=t.replace(et,nt),function(e){return(e.textContent||i(e)).indexOf(t)>-1}})),lang:ct((function(t){return V.test(t||"")||at.error("unsupported lang: "+t),t=t.replace(et,nt).toLowerCase(),function(e){var n;do{if(n=v?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===d},focus:function(t){return t===h.activeElement&&(!h.hasFocus||h.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:vt(!1),disabled:vt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!r.pseudos.empty(t)},header:function(t){return Y.test(t.nodeName)},input:function(t){return J.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:gt((function(){return[0]})),last:gt((function(t,e){return[e-1]})),eq:gt((function(t,e,n){return[n<0?n+e:n]})),even:gt((function(t,e){for(var n=0;ne?e:n;--r>=0;)t.push(r);return t})),gt:gt((function(t,e,n){for(var r=n<0?n+e:n;++r1?function(e,n,r){for(var i=t.length;i--;)if(!t[i](e,n,r))return!1;return!0}:t[0]}function _t(t,e,n,r,i){for(var o,u=[],a=0,s=t.length,c=null!=e;a-1&&(o[c]=!(u[c]=l))}}else y=_t(y===u?y.splice(d,y.length):y),i?i(null,u,y,s):D.apply(u,y)}))}function Ct(t){for(var e,n,i,o=t.length,u=r.relative[t[0].type],a=u||r.relative[" "],s=u?1:0,f=xt((function(t){return t===e}),a,!0),l=xt((function(t){return q(e,t)>-1}),a,!0),p=[function(t,n,r){var i=!u&&(r||n!==c)||((e=n).nodeType?f(t,n,r):l(t,n,r));return e=null,i}];s1&&wt(p),s>1&&bt(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(F,"$1"),n,s0,i=t.length>0,o=function(o,u,a,s,f){var l,d,g,y=0,m="0",b=o&&[],x=[],w=c,T=o||i&&r.find.TAG("*",f),C=_+=null==w?1:Math.random()||.1,k=T.length;for(f&&(c=u==h||u||f);m!==k&&null!=(l=T[m]);m++){if(i&&l){for(d=0,u||l.ownerDocument==h||(p(l),a=!v);g=t[d++];)if(g(l,u||h,a)){s.push(l);break}f&&(_=C)}n&&((l=!g&&l)&&y--,o&&b.push(l))}if(y+=m,n&&m!==y){for(d=0;g=e[d++];)g(b,x,u,a);if(o){if(y>0)for(;m--;)b[m]||x[m]||(x[m]=N.call(s));x=_t(x)}D.apply(s,x),f&&!o&&x.length>0&&y+e.length>1&&at.uniqueSort(s)}return f&&(_=C,c=w),b};return n?ct(o):o}(o,i))).selector=t}return a},s=at.select=function(t,e,n,i){var o,s,c,f,l,p="function"==typeof t&&t,h=!i&&u(t=p.selector||t);if(n=n||[],1===h.length){if((s=h[0]=h[0].slice(0)).length>2&&"ID"===(c=s[0]).type&&9===e.nodeType&&v&&r.relative[s[1].type]){if(!(e=(r.find.ID(c.matches[0].replace(et,nt),e)||[])[0]))return n;p&&(e=e.parentNode),t=t.slice(s.shift().value.length)}for(o=K.needsContext.test(t)?0:s.length;o--&&(c=s[o],!r.relative[f=c.type]);)if((l=r.find[f])&&(i=l(c.matches[0].replace(et,nt),tt.test(s[0].type)&&yt(e.parentNode)||e))){if(s.splice(o,1),!(t=i.length&&bt(s)))return D.apply(n,i),n;break}}return(p||a(t,h))(i,e,!v,n,!e||tt.test(t)&&yt(e.parentNode)||e),n},n.sortStable=x.split("").sort(j).join("")===x,n.detectDuplicates=!!l,p(),n.sortDetached=ft((function(t){return 1&t.compareDocumentPosition(h.createElement("fieldset"))})),ft((function(t){return t.innerHTML="","#"===t.firstChild.getAttribute("href")}))||lt("type|href|height|width",(function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)})),n.attributes&&ft((function(t){return t.innerHTML="",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")}))||lt("value",(function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue})),ft((function(t){return null==t.getAttribute("disabled")}))||lt(I,(function(t,e,n){var r;if(!n)return!0===t[e]?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null})),at}(n);T.find=k,T.expr=k.selectors,T.expr[":"]=T.expr.pseudos,T.uniqueSort=T.unique=k.uniqueSort,T.text=k.getText,T.isXMLDoc=k.isXML,T.contains=k.contains,T.escapeSelector=k.escape;var S=function(t,e,n){for(var r=[],i=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(i&&T(t).is(n))break;r.push(t)}return r},E=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},j=T.expr.match.needsContext;function A(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var O=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(t,e,n){return y(e)?T.grep(t,(function(t,r){return!!e.call(t,r,t)!==n})):e.nodeType?T.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?T.grep(t,(function(t){return f.call(e,t)>-1!==n})):T.filter(e,t,n)}T.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?T.find.matchesSelector(r,t)?[r]:[]:T.find.matches(t,T.grep(e,(function(t){return 1===t.nodeType})))},T.fn.extend({find:function(t){var e,n,r=this.length,i=this;if("string"!=typeof t)return this.pushStack(T(t).filter((function(){for(e=0;e1?T.uniqueSort(n):n},filter:function(t){return this.pushStack(N(this,t||[],!1))},not:function(t){return this.pushStack(N(this,t||[],!0))},is:function(t){return!!N(this,"string"==typeof t&&j.test(t)?T(t):t||[],!1).length}});var L,D=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(T.fn.init=function(t,e,n){var r,i;if(!t)return this;if(n=n||L,"string"==typeof t){if(!(r="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:D.exec(t))||!r[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(r[1]){if(e=e instanceof T?e[0]:e,T.merge(this,T.parseHTML(r[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),O.test(r[1])&&T.isPlainObject(e))for(r in e)y(this[r])?this[r](e[r]):this.attr(r,e[r]);return this}return(i=b.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):y(t)?void 0!==n.ready?n.ready(t):t(T):T.makeArray(t,this)}).prototype=T.fn,L=T(b);var R=/^(?:parents|prev(?:Until|All))/,q={children:!0,contents:!0,next:!0,prev:!0};function I(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}T.fn.extend({has:function(t){var e=T(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&T.find.matchesSelector(n,t))){o.push(n);break}return this.pushStack(o.length>1?T.uniqueSort(o):o)},index:function(t){return t?"string"==typeof t?f.call(T(t),this[0]):f.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(T.uniqueSort(T.merge(this.get(),T(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),T.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return S(t,"parentNode")},parentsUntil:function(t,e,n){return S(t,"parentNode",n)},next:function(t){return I(t,"nextSibling")},prev:function(t){return I(t,"previousSibling")},nextAll:function(t){return S(t,"nextSibling")},prevAll:function(t){return S(t,"previousSibling")},nextUntil:function(t,e,n){return S(t,"nextSibling",n)},prevUntil:function(t,e,n){return S(t,"previousSibling",n)},siblings:function(t){return E((t.parentNode||{}).firstChild,t)},children:function(t){return E(t.firstChild)},contents:function(t){return null!=t.contentDocument&&u(t.contentDocument)?t.contentDocument:(A(t,"template")&&(t=t.content||t),T.merge([],t.childNodes))}},(function(t,e){T.fn[t]=function(n,r){var i=T.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=T.filter(r,i)),this.length>1&&(q[t]||T.uniqueSort(i),R.test(t)&&i.reverse()),this.pushStack(i)}}));var $=/[^\x20\t\r\n\f]+/g;function H(t){return t}function P(t){throw t}function B(t,e,n,r){var i;try{t&&y(i=t.promise)?i.call(t).done(e).fail(n):t&&y(i=t.then)?i.call(t,e,n):e.apply(void 0,[t].slice(r))}catch(t){n.apply(void 0,[t])}}T.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return T.each(t.match($)||[],(function(t,n){e[n]=!0})),e}(t):T.extend({},t);var e,n,r,i,o=[],u=[],a=-1,s=function(){for(i=i||t.once,r=e=!0;u.length;a=-1)for(n=u.shift();++a-1;)o.splice(n,1),n<=a&&a--})),this},has:function(t){return t?T.inArray(t,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=u=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=u=[],n||e||(o=n=""),this},locked:function(){return!!i},fireWith:function(t,n){return i||(n=[t,(n=n||[]).slice?n.slice():n],u.push(n),e||s()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},T.extend({Deferred:function(t){var e=[["notify","progress",T.Callbacks("memory"),T.Callbacks("memory"),2],["resolve","done",T.Callbacks("once memory"),T.Callbacks("once memory"),0,"resolved"],["reject","fail",T.Callbacks("once memory"),T.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(t){return i.then(null,t)},pipe:function(){var t=arguments;return T.Deferred((function(n){T.each(e,(function(e,r){var i=y(t[r[4]])&&t[r[4]];o[r[1]]((function(){var t=i&&i.apply(this,arguments);t&&y(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[t]:arguments)}))})),t=null})).promise()},then:function(t,r,i){var o=0;function u(t,e,r,i){return function(){var a=this,s=arguments,c=function(){var n,c;if(!(t=o&&(r!==P&&(a=void 0,s=[n]),e.rejectWith(a,s))}};t?f():(T.Deferred.getStackHook&&(f.stackTrace=T.Deferred.getStackHook()),n.setTimeout(f))}}return T.Deferred((function(n){e[0][3].add(u(0,n,y(i)?i:H,n.notifyWith)),e[1][3].add(u(0,n,y(t)?t:H)),e[2][3].add(u(0,n,y(r)?r:P))})).promise()},promise:function(t){return null!=t?T.extend(t,i):i}},o={};return T.each(e,(function(t,n){var u=n[2],a=n[5];i[n[1]]=u.add,a&&u.add((function(){r=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),u.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=u.fireWith})),i.promise(o),t&&t.call(o,o),o},when:function(t){var e=arguments.length,n=e,r=Array(n),i=a.call(arguments),o=T.Deferred(),u=function(t){return function(n){r[t]=this,i[t]=arguments.length>1?a.call(arguments):n,--e||o.resolveWith(r,i)}};if(e<=1&&(B(t,o.done(u(n)).resolve,o.reject,!e),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)B(i[n],u(n),o.reject);return o.promise()}});var M=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;T.Deferred.exceptionHook=function(t,e){n.console&&n.console.warn&&t&&M.test(t.name)&&n.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},T.readyException=function(t){n.setTimeout((function(){throw t}))};var F=T.Deferred();function W(){b.removeEventListener("DOMContentLoaded",W),n.removeEventListener("load",W),T.ready()}T.fn.ready=function(t){return F.then(t).catch((function(t){T.readyException(t)})),this},T.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--T.readyWait:T.isReady)||(T.isReady=!0,!0!==t&&--T.readyWait>0||F.resolveWith(b,[T]))}}),T.ready.then=F.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?n.setTimeout(T.ready):(b.addEventListener("DOMContentLoaded",W),n.addEventListener("load",W));var z=function(t,e,n,r,i,o,u){var a=0,s=t.length,c=null==n;if("object"===_(n))for(a in i=!0,n)z(t,e,a,n[a],!0,o,u);else if(void 0!==r&&(i=!0,y(r)||(u=!0),c&&(u?(e.call(t,r),e=null):(c=e,e=function(t,e,n){return c.call(T(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){Z.remove(this,t)}))}}),T.extend({queue:function(t,e,n){var r;if(t)return e=(e||"fx")+"queue",r=Y.get(t,e),n&&(!r||Array.isArray(n)?r=Y.access(t,e,T.makeArray(n)):r.push(n)),r||[]},dequeue:function(t,e){e=e||"fx";var n=T.queue(t,e),r=n.length,i=n.shift(),o=T._queueHooks(t,e);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete o.stop,i.call(t,(function(){T.dequeue(t,e)}),o)),!r&&o&&o.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return Y.get(t,n)||Y.access(t,n,{empty:T.Callbacks("once memory").add((function(){Y.remove(t,[e+"queue",n])}))})}}),T.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;ht=b.createDocumentFragment().appendChild(b.createElement("div")),(dt=b.createElement("input")).setAttribute("type","radio"),dt.setAttribute("checked","checked"),dt.setAttribute("name","t"),ht.appendChild(dt),g.checkClone=ht.cloneNode(!0).cloneNode(!0).lastChild.checked,ht.innerHTML="",g.noCloneChecked=!!ht.cloneNode(!0).lastChild.defaultValue,ht.innerHTML="",g.option=!!ht.lastChild;var mt={thead:[1,"
+@endsection
\ No newline at end of file
diff --git a/resources/views/frames/schema.blade.php b/resources/views/frames/schema.blade.php
new file mode 100644
index 0000000..71201e2
--- /dev/null
+++ b/resources/views/frames/schema.blade.php
@@ -0,0 +1,80 @@
+@extends('layouts.dn')
+
+@section('page_title')
+
+
+
\ No newline at end of file
diff --git a/resources/views/frames/schema/ldapsyntaxes.blade.php b/resources/views/frames/schema/ldapsyntaxes.blade.php
new file mode 100644
index 0000000..3988199
--- /dev/null
+++ b/resources/views/frames/schema/ldapsyntaxes.blade.php
@@ -0,0 +1,29 @@
+
\ No newline at end of file
diff --git a/resources/views/frames/schema/matchingrules.blade.php b/resources/views/frames/schema/matchingrules.blade.php
new file mode 100644
index 0000000..044aba2
--- /dev/null
+++ b/resources/views/frames/schema/matchingrules.blade.php
@@ -0,0 +1,101 @@
+
+
+
\ No newline at end of file
diff --git a/resources/views/frames/schema/objectclasses.blade.php b/resources/views/frames/schema/objectclasses.blade.php
new file mode 100644
index 0000000..ab65a96
--- /dev/null
+++ b/resources/views/frames/schema/objectclasses.blade.php
@@ -0,0 +1,147 @@
+
+
+
\ No newline at end of file
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
new file mode 100644
index 0000000..dd97d27
--- /dev/null
+++ b/resources/views/home.blade.php
@@ -0,0 +1,56 @@
+@extends('architect::layouts.app')
+
+{{--
+@section('htmlheader_title')
+ @lang('Home')
+@endsection
+
+@section('page_title')
+@endsection
+@section('page_icon')
+@endsection
+--}}
+
+@section('main-content')
+
+
+
+
+
phpLDAPadmin
+
+
+
+
+
Welcome to phpLDAPadmin
+
{{ config('app.version') }}
+
phpLDAPadmin (or PLA for short) is an LDAP data management tool for administrators.
+
PLA aims to adhere to the LDAP standards so that it can interact with any LDAP server that implements those standards.
+
+
+
+
+
+
+
Version 2 is a complete re-write of PLA, leveraging the advancements and modernisation of web tools and methods, libraries since version 1 was released.
+
You can support this application by letting us know which LDAP server you use (including version and platform).