diff --git a/app/Http/Controllers/DUNGA.php b/app/Http/Controllers/DUNGA.php index 2167850..8abd0d0 100644 --- a/app/Http/Controllers/DUNGA.php +++ b/app/Http/Controllers/DUNGA.php @@ -6,48 +6,136 @@ use Illuminate\Http\Request; use App\Http\Resources\ContactResource; use App\Models\Contact; use App\Http\Resources\MomoResource; +use App\Http\Resources\HistoryResource; use App\Models\Momo; +use App\Models\Setting; +use App\Models\HistoryPlay; +use App\Models\HistoryDayMission; +use Carbon\Carbon; class DUNGA extends Controller { - public function settings() { + public function settings() + { + + $setting = Setting::first(); + return response()->json(array( 'status' => true, 'message' => 'Thành công', 'contacts' => ContactResource::collection(Contact::where('status', 1)->get()), - 'note' => '

HỆ THỐNG CHẲN LẺ TÀI XỈU UY TÍN AUTO THANH TOÁN TỰ ĐỘNG



ĐỌC THÔNG BÁO TRÁNH MẤT TIỀN : (MỚI)

- CHÚ Ý: KHÔNG NÊN MÃI CHƠI 1 SỐ VÌ SỐ THAY ĐỔI LIÊN TỤC , NÊN TẢI LẠI TRANG SAU 10-20P VÀ LẤY SỐ HẠN MỨC THẤP CHƠI TIẾP . NẾU SỐ TRÊN WED ĐÃ TẮT VUI LÒNG KHÔNG CHƠI , KHI CHƠI TRÁNH KHÔNG TRẢ ĐƠN


- Lỗi phải báo ngay trong 6 tiếng , tránh mất giao dịch sẽ không xữ lý được


', - 'ads' => '', - 'active' => 1, - 'history' => 1, - 'only_win' => 1, - 'limit' => 10, - 'week_top' => 1, - 'day_mission' => array( - 'active' => 1, - ) + 'note' => $setting->note, + 'ads' => $setting->ads, + 'active' => $setting->active, + 'history' => $setting->history, + 'only_win' => $setting->only_win, + 'limit' => $setting->limit, + 'week_top' => $setting->week_top, + 'day_mission' => $setting->day_mission, + 'hu' => array( + 'active' => $setting->hu, + 'roles' => array( + '111' + ), + 'amount' => 10000 + ), )); } - public function momo() { + public function momo() + { + $setting = Setting::first(); + $momo = Momo::where('status', '!=', 3)->get(); return response()->json(array( 'status' => true, 'message' => 'Thành công', 'data_momo' => MomoResource::collection(Momo::where('status', 1)->get()), 'game' => array( 'active' => array('chanle2', 'chanle', 'taixiu2', 'taixiu', 'x3', 'hieu2so', 'lo', 'gap3'), - 'html' => view('game')->render() + 'html' => view('game', compact('momo', 'setting'))->render() ) )); } - public function minigame(Request $request) { + public function minigame(Request $request) + { + $setting = Setting::first(); if ($request->game == 'day_mission') { - $game = view('dayMission')->render(); + $total = HistoryDayMission::sum('receive'); + $dayLevel = explode('|', $setting->level_day); + $receiveLevel = explode('|', $setting->gift_day); + $gift = array(); + for ($i = 0; $i < count($receiveLevel); $i++) { + $json = array( + 'level' => $dayLevel[$i], + 'gift' => $receiveLevel[$i] + ); + array_push($gift, $json); + } + $day_mission = array( + 'data' => $gift + ); + $game = view('dayMission', compact('day_mission', 'setting', 'total'))->render(); } return response()->json(array( + 'status' => true, 'message' => 'Thành công', 'html' => $game, - 'game' => $request->game + 'game' => $request->game )); } + + public function history() + { + $setting = Setting::first(); + return response()->json(array( + 'status' => true, + 'message' => 'Thành công', + 'history' => array( + 'status' => true, + 'message' => 'SUCCESS', + 'data' => HistoryResource::collection(HistoryPlay::limit($setting->limit)->get()), + ) + )); + } + + public function hu() + { + return response()->json(array( + 'status' => true, + 'message' => 'Thành công', + 'amount' => 11111 + )); + } + + public function checkDayMission(Request $request) + { + $setting = Setting::first(); + $phone = HistoryPlay::whereDate('created_at', Carbon::today())->where('partnerId', $request->phone)->count(); + $amount = HistoryPlay::whereDate('created_at', Carbon::today())->where('partnerId', $request->phone)->sum('amount'); + $turn = HistoryDayMission::whereDate('created_at', Carbon::today())->where('phone', $request->phone)->count(); + if ($phone <= 0) { + return response()->json(array('status' => false, 'message' => 'Oh !! Số điện thoại này chưa chơi game nào, hãy kiểm tra lại')); + } else { + $dayLevel = explode('|', $setting->level_day); + $receiveLevel = explode('|', $setting->gift_day); + for ($i = 0; $i < count($receiveLevel); $i++) { + if ($turn < count($receiveLevel) && $amount >= $dayLevel[$i] && $amount >= $dayLevel[$turn]) { + HistoryDayMission::create([ + 'phone' => $request->phone, + 'amount' => $amount, + 'level' => $dayLevel[$i], + 'receive' => $receiveLevel[$i], + 'status' => 1, + 'pay' => 0 + ]); + } else if ($amount < (int)$dayLevel[$i]) { + return response()->json(array('status' => false, 'message' => 'Bạn cần chơi '.number_format($dayLevel[$i] - $amount).' nữa !')); + } + } + return response()->json(array('status' => true, 'html' => 'Thành công vui lòng đợi xử lý')); + } + } + + } diff --git a/app/Http/Controllers/dgaAdmin/Crypt/AES.php b/app/Http/Controllers/dgaAdmin/Crypt/AES.php new file mode 100644 index 0000000..594011e --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/AES.php @@ -0,0 +1,197 @@ + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $aes->decrypt($aes->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_AES + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Rijndael + */ +if (!class_exists('Crypt_Rijndael')) { + include_once 'Rijndael.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of AES. + * + * @package Crypt_AES + * @author Jim Wigginton + * @access public + */ +class Crypt_AES extends Crypt_Rijndael +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'AES'; + + /** + * Dummy function + * + * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. + * + * @see Crypt_Rijndael::setBlockLength() + * @access public + * @param int $length + */ + function setBlockLength($length) + { + return; + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @see Crypt_Rijndael:setKeyLength() + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch ($length) { + case 160: + $length = 192; + break; + case 224: + $length = 256; + } + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Rijndael supports five different key lengths, AES only supports three. + * + * @see Crypt_Rijndael:setKey() + * @see setKeyLength() + * @access public + * @param string $key + */ + function setKey($key) + { + parent::setKey($key); + + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_length = 16; + break; + case $length <= 24: + $this->key_length = 24; + break; + default: + $this->key_length = 32; + } + $this->_setEngine(); + } + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Base.php b/app/Http/Controllers/dgaAdmin/Crypt/Base.php new file mode 100644 index 0000000..1f11cf3 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Base.php @@ -0,0 +1,2684 @@ + + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_MODE_CTR', -1); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_MODE_ECB', 1); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_MODE_CBC', 2); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_MODE_CFB', 3); +/** + * Encrypt / decrypt using the Output Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_MODE_OFB', 4); +/** + * Encrypt / decrypt using streaming mode. + */ +define('CRYPT_MODE_STREAM', 5); +/**#@-*/ + +/**#@+ + * @access private + * @see self::Crypt_Base() + * @internal These constants are for internal use only + */ +/** + * Base value for the internal implementation $engine switch + */ +define('CRYPT_ENGINE_INTERNAL', 1); +/** + * Base value for the mcrypt implementation $engine switch + */ +define('CRYPT_ENGINE_MCRYPT', 2); +/** + * Base value for the OpenSSL implementation $engine switch + */ +define('CRYPT_ENGINE_OPENSSL', 3); +/**#@-*/ + +/** + * Base Class for all Crypt_* cipher classes + * + * @package Crypt_Base + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Base +{ + /** + * The Encryption Mode + * + * @see self::Crypt_Base() + * @var int + * @access private + */ + var $mode; + + /** + * The Block Length of the block cipher + * + * @var int + * @access private + */ + var $block_size = 16; + + /** + * The Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + + /** + * The Initialization Vector + * + * @see self::setIV() + * @var string + * @access private + */ + var $iv; + + /** + * A "sliding" Initialization Vector + * + * @see self::enableContinuousBuffer() + * @see self::_clearBuffers() + * @var string + * @access private + */ + var $encryptIV; + + /** + * A "sliding" Initialization Vector + * + * @see self::enableContinuousBuffer() + * @see self::_clearBuffers() + * @var string + * @access private + */ + var $decryptIV; + + /** + * Continuous Buffer status + * + * @see self::enableContinuousBuffer() + * @var bool + * @access private + */ + var $continuousBuffer = false; + + /** + * Encryption buffer for CTR, OFB and CFB modes + * + * @see self::encrypt() + * @see self::_clearBuffers() + * @var array + * @access private + */ + var $enbuffer; + + /** + * Decryption buffer for CTR, OFB and CFB modes + * + * @see self::decrypt() + * @see self::_clearBuffers() + * @var array + * @access private + */ + var $debuffer; + + /** + * mcrypt resource for encryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see self::encrypt() + * @var resource + * @access private + */ + var $enmcrypt; + + /** + * mcrypt resource for decryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see self::decrypt() + * @var resource + * @access private + */ + var $demcrypt; + + /** + * Does the enmcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var bool + * @access private + */ + var $enchanged = true; + + /** + * Does the demcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var bool + * @access private + */ + var $dechanged = true; + + /** + * mcrypt resource for CFB mode + * + * mcrypt's CFB mode, in (and only in) buffered context, + * is broken, so phpseclib implements the CFB mode by it self, + * even when the mcrypt php extension is available. + * + * In order to do the CFB-mode work (fast) phpseclib + * use a separate ECB-mode mcrypt resource. + * + * @link http://phpseclib.sourceforge.net/cfb-demo.phps + * @see self::encrypt() + * @see self::decrypt() + * @see self::_setupMcrypt() + * @var resource + * @access private + */ + var $ecb; + + /** + * Optimizing value while CFB-encrypting + * + * Only relevant if $continuousBuffer enabled + * and $engine == CRYPT_ENGINE_MCRYPT + * + * It's faster to re-init $enmcrypt if + * $buffer bytes > $cfb_init_len than + * using the $ecb resource furthermore. + * + * This value depends of the chosen cipher + * and the time it would be needed for it's + * initialization [by mcrypt_generic_init()] + * which, typically, depends on the complexity + * on its internaly Key-expanding algorithm. + * + * @see self::encrypt() + * @var int + * @access private + */ + var $cfb_init_len = 600; + + /** + * Does internal cipher state need to be (re)initialized? + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @var bool + * @access private + */ + var $changed = true; + + /** + * Padding status + * + * @see self::enablePadding() + * @var bool + * @access private + */ + var $padding = true; + + /** + * Is the mode one that is paddable? + * + * @see self::Crypt_Base() + * @var bool + * @access private + */ + var $paddable = false; + + /** + * Holds which crypt engine internaly should be use, + * which will be determined automatically on __construct() + * + * Currently available $engines are: + * - CRYPT_ENGINE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) + * - CRYPT_ENGINE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) + * - CRYPT_ENGINE_INTERNAL (slower, pure php-engine, no php-extension required) + * + * @see self::_setEngine() + * @see self::encrypt() + * @see self::decrypt() + * @var int + * @access private + */ + var $engine; + + /** + * Holds the preferred crypt engine + * + * @see self::_setEngine() + * @see self::setPreferredEngine() + * @var int + * @access private + */ + var $preferredEngine; + + /** + * The mcrypt specific name of the cipher + * + * Only used if $engine == CRYPT_ENGINE_MCRYPT + * + * @link http://www.php.net/mcrypt_module_open + * @link http://www.php.net/mcrypt_list_algorithms + * @see self::_setupMcrypt() + * @var string + * @access private + */ + var $cipher_name_mcrypt; + + /** + * The openssl specific name of the cipher + * + * Only used if $engine == CRYPT_ENGINE_OPENSSL + * + * @link http://www.php.net/openssl-get-cipher-methods + * @var string + * @access private + */ + var $cipher_name_openssl; + + /** + * The openssl specific name of the cipher in ECB mode + * + * If OpenSSL does not support the mode we're trying to use (CTR) + * it can still be emulated with ECB mode. + * + * @link http://www.php.net/openssl-get-cipher-methods + * @var string + * @access private + */ + var $cipher_name_openssl_ecb; + + /** + * The default salt used by setPassword() + * + * @see self::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib/salt'; + + /** + * The namespace used by the cipher for its constants. + * + * ie: AES.php is using CRYPT_AES_MODE_* for its constants + * so $const_namespace is AES + * + * DES.php is using CRYPT_DES_MODE_* for its constants + * so $const_namespace is DES... and so on + * + * All CRYPT_<$const_namespace>_MODE_* are aliases of + * the generic CRYPT_MODE_* constants, so both could be used + * for each cipher. + * + * Example: + * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode + * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical + * + * @see self::Crypt_Base() + * @var string + * @access private + */ + var $const_namespace; + + /** + * The name of the performance-optimized callback function + * + * Used by encrypt() / decrypt() + * only if $engine == CRYPT_ENGINE_INTERNAL + * + * @see self::encrypt() + * @see self::decrypt() + * @see self::_setupInlineCrypt() + * @see self::$use_inline_crypt + * @var Callback + * @access private + */ + var $inline_crypt; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see self::encrypt() + * @see self::decrypt() + * @see self::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt; + + /** + * If OpenSSL can be used in ECB but not in CTR we can emulate CTR + * + * @see self::_openssl_ctr_process() + * @var bool + * @access private + */ + var $openssl_emulate_ctr = false; + + /** + * Determines what options are passed to openssl_encrypt/decrypt + * + * @see self::isValidEngine() + * @var mixed + * @access private + */ + var $openssl_options; + + /** + * Has the key length explicitly been set or should it be derived from the key, itself? + * + * @see self::setKeyLength() + * @var bool + * @access private + */ + var $explicit_key_length = false; + + /** + * Don't truncate / null pad key + * + * @see self::_clearBuffers() + * @var bool + * @access private + */ + var $skip_key_adjustment = false; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_MODE_ECB + * + * - CRYPT_MODE_CBC + * + * - CRYPT_MODE_CTR + * + * - CRYPT_MODE_CFB + * + * - CRYPT_MODE_OFB + * + * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...) + * + * If not explicitly set, CRYPT_MODE_CBC will be used. + * + * @param int $mode + * @access public + */ + function __construct($mode = CRYPT_MODE_CBC) + { + // $mode dependent settings + switch ($mode) { + case CRYPT_MODE_ECB: + $this->paddable = true; + $this->mode = CRYPT_MODE_ECB; + break; + case CRYPT_MODE_CTR: + case CRYPT_MODE_CFB: + case CRYPT_MODE_OFB: + case CRYPT_MODE_STREAM: + $this->mode = $mode; + break; + case CRYPT_MODE_CBC: + default: + $this->paddable = true; + $this->mode = CRYPT_MODE_CBC; + } + + $this->_setEngine(); + + // Determining whether inline crypting can be used by the cipher + if ($this->use_inline_crypt !== false) { + $this->use_inline_crypt = version_compare(PHP_VERSION, '5.3.0') >= 0 || function_exists('create_function'); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function Crypt_Base($mode = CRYPT_MODE_CBC) + { + $this->__construct($mode); + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * @access public + * @param string $iv + * @internal Can be overwritten by a sub class, but does not have to be + */ + function setIV($iv) + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->iv = $iv; + $this->changed = true; + } + + /** + * Sets the key length. + * + * Keys with explicitly set lengths need to be treated accordingly + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + $this->explicit_key_length = true; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Returns the current key length in bits + * + * @access public + * @return int + */ + function getKeyLength() + { + return $this->key_length << 3; + } + + /** + * Returns the current block length in bits + * + * @access public + * @return int + */ + function getBlockLength() + { + return $this->block_size << 3; + } + + /** + * Sets the key. + * + * The min/max length(s) of the key depends on the cipher which is used. + * If the key not fits the length(s) of the cipher it will paded with null bytes + * up to the closest valid key length. If the key is more than max length, + * we trim the excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * @access public + * @param string $key + * @internal Could, but not must, extend by the child Crypt_* class + */ + function setKey($key) + { + if (!$this->explicit_key_length) { + $this->setKeyLength(strlen($key) << 3); + $this->explicit_key_length = false; + } + + $this->key = $key; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Sets the password. + * + * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: + * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: + * $hash, $salt, $count, $dkLen + * + * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php + * + * @see Crypt/Hash.php + * @param string $password + * @param string $method + * @return bool + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function setPassword($password, $method = 'pbkdf2') + { + $key = ''; + + switch ($method) { + default: // 'pbkdf2' or 'pbkdf1' + $func_args = func_get_args(); + + // Hash function + $hash = isset($func_args[2]) ? $func_args[2] : 'sha1'; + + // WPA and WPA2 use the SSID as the salt + $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt; + + // RFC2898#section-4.2 uses 1,000 iterations by default + // WPA and WPA2 use 4,096. + $count = isset($func_args[4]) ? $func_args[4] : 1000; + + // Keylength + if (isset($func_args[5]) && $func_args[5] > 0) { + $dkLen = $func_args[5]; + } else { + $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length; + } + + switch (true) { + case $method == 'pbkdf1': + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hashObj = new Crypt_Hash(); + $hashObj->setHash($hash); + if ($dkLen > $hashObj->getLength()) { + user_error('Derived key too long'); + return false; + } + $t = $password . $salt; + for ($i = 0; $i < $count; ++$i) { + $t = $hashObj->hash($t); + } + $key = substr($t, 0, $dkLen); + + $this->setKey(substr($key, 0, $dkLen >> 1)); + $this->setIV(substr($key, $dkLen >> 1)); + + return true; + // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable + case !function_exists('hash_pbkdf2'): + case !function_exists('hash_algos'): + case !in_array($hash, hash_algos()): + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $i = 1; + $hmac = new Crypt_Hash(); + $hmac->setHash($hash); + $hmac->setKey($password); + while (strlen($key) < $dkLen) { + $f = $u = $hmac->hash($salt . pack('N', $i++)); + for ($j = 2; $j <= $count; ++$j) { + $u = $hmac->hash($u); + $f^= $u; + } + $key.= $f; + } + $key = substr($key, 0, $dkLen); + break; + default: + $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); + } + } + + $this->setKey($key); + + return true; + } + + /** + * Encrypts a message. + * + * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher + * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's + * necessary are discussed in the following + * URL: + * + * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} + * + * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. + * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that + * length. + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + * @internal Could, but not must, extend by the child Crypt_* class + */ + function encrypt($plaintext) + { + if ($this->paddable) { + $plaintext = $this->_pad($plaintext); + } + + if ($this->engine === CRYPT_ENGINE_OPENSSL) { + if ($this->changed) { + $this->_clearBuffers(); + $this->changed = false; + } + switch ($this->mode) { + case CRYPT_MODE_STREAM: + return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + case CRYPT_MODE_ECB: + $result = @openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + return !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result; + case CRYPT_MODE_CBC: + $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->encryptIV); + if (!defined('OPENSSL_RAW_DATA')) { + $result = substr($result, 0, -$this->block_size); + } + if ($this->continuousBuffer) { + $this->encryptIV = substr($result, -$this->block_size); + } + return $result; + case CRYPT_MODE_CTR: + return $this->_openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer); + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + $ciphertext = ''; + if ($this->continuousBuffer) { + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + } else { + $iv = $this->encryptIV; + $pos = 0; + } + $len = strlen($plaintext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $this->block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $plaintext = substr($plaintext, $i); + } + + $overflow = $len % $this->block_size; + + if ($overflow) { + $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = $this->_string_pop($ciphertext, $this->block_size); + + $size = $len - $overflow; + $block = $iv ^ substr($plaintext, -$overflow); + $iv = substr_replace($iv, $block, 0, $overflow); + $ciphertext.= $block; + $pos = $overflow; + } elseif ($len) { + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = substr($ciphertext, -$this->block_size); + } + + return $ciphertext; + case CRYPT_MODE_OFB: + return $this->_openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer); + } + } + + if ($this->engine === CRYPT_ENGINE_MCRYPT) { + set_error_handler(array($this, 'do_nothing')); + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->enchanged) { + mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + $this->enchanged = false; + } + + // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's + // rewritten CFB implementation the above outputs the same thing twice. + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $block_size = $this->block_size; + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + $len = strlen($plaintext); + $ciphertext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $this->enbuffer['enmcrypt_init'] = true; + } + if ($len >= $block_size) { + if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { + if ($this->enbuffer['enmcrypt_init'] === true) { + mcrypt_generic_init($this->enmcrypt, $this->key, $iv); + $this->enbuffer['enmcrypt_init'] = false; + } + $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); + $iv = substr($ciphertext, -$block_size); + $len%= $block_size; + } else { + while ($len >= $block_size) { + $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + } + } + + if ($len) { + $iv = mcrypt_generic($this->ecb, $iv); + $block = $iv ^ substr($plaintext, -$len); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + + restore_error_handler(); + + return $ciphertext; + } + + $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); + + if (!$this->continuousBuffer) { + mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + } + + restore_error_handler(); + + return $ciphertext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('encrypt', $this, $plaintext); + } + + $buffer = &$this->enbuffer; + $block_size = $this->block_size; + $ciphertext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->encryptIV; + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $block = $this->_encryptBlock($block ^ $xor); + $xor = $block; + $ciphertext.= $block; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->encryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'].= $this->_encryptBlock($xor); + } + $this->_increment_str($xor); + $key = $this->_string_shift($buffer['ciphertext'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $key = $this->_encryptBlock($xor); + $this->_increment_str($xor); + $ciphertext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + break; + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + if ($this->continuousBuffer) { + $iv = &$this->encryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->encryptIV; + $pos = 0; + } + $len = strlen($plaintext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $block = $iv ^ substr($plaintext, $i); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->encryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_string_shift($buffer['xor'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $ciphertext = $this->_encryptBlock($plaintext); + break; + } + + return $ciphertext; + } + + /** + * Decrypts a message. + * + * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until + * it is. + * + * @see self::encrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + * @internal Could, but not must, extend by the child Crypt_* class + */ + function decrypt($ciphertext) + { + if ($this->paddable) { + // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}: + // "The data is padded with "\0" to make sure the length of the data is n * blocksize." + $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($this->block_size - strlen($ciphertext) % $this->block_size) % $this->block_size, chr(0)); + } + + if ($this->engine === CRYPT_ENGINE_OPENSSL) { + if ($this->changed) { + $this->_clearBuffers(); + $this->changed = false; + } + switch ($this->mode) { + case CRYPT_MODE_STREAM: + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + break; + case CRYPT_MODE_ECB: + if (!defined('OPENSSL_RAW_DATA')) { + $ciphertext.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true); + } + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + break; + case CRYPT_MODE_CBC: + if (!defined('OPENSSL_RAW_DATA')) { + $padding = str_repeat(chr($this->block_size), $this->block_size) ^ substr($ciphertext, -$this->block_size); + $ciphertext.= substr(@openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size); + $offset = 2 * $this->block_size; + } else { + $offset = $this->block_size; + } + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->decryptIV); + if ($this->continuousBuffer) { + $this->decryptIV = substr($ciphertext, -$offset, $this->block_size); + } + break; + case CRYPT_MODE_CTR: + $plaintext = $this->_openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer); + break; + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + $plaintext = ''; + if ($this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$this->buffer['pos']; + } else { + $iv = $this->decryptIV; + $pos = 0; + } + $len = strlen($ciphertext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $this->block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + $ciphertext = substr($ciphertext, $i); + } + $overflow = $len % $this->block_size; + if ($overflow) { + $plaintext.= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + if ($len - $overflow) { + $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow); + } + $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $plaintext.= $iv ^ substr($ciphertext, -$overflow); + $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow); + $pos = $overflow; + } elseif ($len) { + $plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = substr($ciphertext, -$this->block_size); + } + break; + case CRYPT_MODE_OFB: + $plaintext = $this->_openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer); + } + + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + if ($this->engine === CRYPT_ENGINE_MCRYPT) { + set_error_handler(array($this, 'do_nothing')); + $block_size = $this->block_size; + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->dechanged) { + mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + $this->dechanged = false; + } + + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$this->debuffer['pos']; + $len = strlen($ciphertext); + $plaintext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + if ($len >= $block_size) { + $cb = substr($ciphertext, $i, $len - $len % $block_size); + $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; + $iv = substr($cb, -$block_size); + $len%= $block_size; + } + if ($len) { + $iv = mcrypt_generic($this->ecb, $iv); + $plaintext.= $iv ^ substr($ciphertext, -$len); + $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); + $pos = $len; + } + + restore_error_handler(); + + return $plaintext; + } + + $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); + + if (!$this->continuousBuffer) { + mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + } + + restore_error_handler(); + + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('decrypt', $this, $ciphertext); + } + + $block_size = $this->block_size; + + $buffer = &$this->debuffer; + $plaintext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->decryptIV; + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $plaintext.= $this->_decryptBlock($block) ^ $xor; + $xor = $block; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->decryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'].= $this->_encryptBlock($xor); + $this->_increment_str($xor); + } + $key = $this->_string_shift($buffer['ciphertext'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $key = $this->_encryptBlock($xor); + $this->_increment_str($xor); + $plaintext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + break; + case CRYPT_MODE_CFB: + if ($this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->decryptIV; + $pos = 0; + } + $len = strlen($ciphertext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv); + $cb = substr($ciphertext, $i, $block_size); + $plaintext.= $iv ^ $cb; + $iv = $cb; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $plaintext.= $iv ^ substr($ciphertext, $i); + $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->decryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_string_shift($buffer['xor'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $plaintext = $this->_decryptBlock($ciphertext); + break; + } + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + /** + * OpenSSL CTR Processor + * + * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream + * for CTR is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt() + * and Crypt_Base::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this + * function will emulate CTR with ECB when necessary. + * + * @see self::encrypt() + * @see self::decrypt() + * @param string $plaintext + * @param string $encryptIV + * @param array $buffer + * @return string + * @access private + */ + function _openssl_ctr_process($plaintext, &$encryptIV, &$buffer) + { + $ciphertext = ''; + + $block_size = $this->block_size; + $key = $this->key; + + if ($this->openssl_emulate_ctr) { + $xor = $encryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $result = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + $result = !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result; + $buffer['ciphertext'].= $result; + } + $this->_increment_str($xor); + $otp = $this->_string_shift($buffer['ciphertext'], $block_size); + $ciphertext.= $block ^ $otp; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $otp = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + $otp = !defined('OPENSSL_RAW_DATA') ? substr($otp, 0, -$this->block_size) : $otp; + $this->_increment_str($xor); + $ciphertext.= $block ^ $otp; + } + } + if ($this->continuousBuffer) { + $encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + + return $ciphertext; + } + + if (strlen($buffer['ciphertext'])) { + $ciphertext = $plaintext ^ $this->_string_shift($buffer['ciphertext'], strlen($plaintext)); + $plaintext = substr($plaintext, strlen($ciphertext)); + + if (!strlen($plaintext)) { + return $ciphertext; + } + } + + $overflow = strlen($plaintext) % $block_size; + if ($overflow) { + $plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 + $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $temp = $this->_string_pop($encrypted, $block_size); + $ciphertext.= $encrypted . ($plaintext2 ^ $temp); + if ($this->continuousBuffer) { + $buffer['ciphertext'] = substr($temp, $overflow); + $encryptIV = $temp; + } + } elseif (!strlen($buffer['ciphertext'])) { + $ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $temp = $this->_string_pop($ciphertext, $block_size); + if ($this->continuousBuffer) { + $encryptIV = $temp; + } + } + if ($this->continuousBuffer) { + if (!defined('OPENSSL_RAW_DATA')) { + $encryptIV.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + } + $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + if ($overflow) { + $this->_increment_str($encryptIV); + } + } + + return $ciphertext; + } + + /** + * OpenSSL OFB Processor + * + * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream + * for OFB is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt() + * and Crypt_Base::decrypt(). + * + * @see self::encrypt() + * @see self::decrypt() + * @param string $plaintext + * @param string $encryptIV + * @param array $buffer + * @return string + * @access private + */ + function _openssl_ofb_process($plaintext, &$encryptIV, &$buffer) + { + if (strlen($buffer['xor'])) { + $ciphertext = $plaintext ^ $buffer['xor']; + $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext)); + $plaintext = substr($plaintext, strlen($ciphertext)); + } else { + $ciphertext = ''; + } + + $block_size = $this->block_size; + + $len = strlen($plaintext); + $key = $this->key; + $overflow = $len % $block_size; + + if (strlen($plaintext)) { + if ($overflow) { + $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $xor = $this->_string_pop($ciphertext, $block_size); + if ($this->continuousBuffer) { + $encryptIV = $xor; + } + $ciphertext.= $this->_string_shift($xor, $overflow) ^ substr($plaintext, -$overflow); + if ($this->continuousBuffer) { + $buffer['xor'] = $xor; + } + } else { + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + if ($this->continuousBuffer) { + $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size); + } + } + } + + return $ciphertext; + } + + /** + * phpseclib <-> OpenSSL Mode Mapper + * + * May need to be overwritten by classes extending this one in some cases + * + * @return int + * @access private + */ + function _openssl_translate_mode() + { + switch ($this->mode) { + case CRYPT_MODE_ECB: + return 'ecb'; + case CRYPT_MODE_CBC: + return 'cbc'; + case CRYPT_MODE_CTR: + return 'ctr'; + case CRYPT_MODE_CFB: + return 'cfb'; + case CRYPT_MODE_OFB: + return 'ofb'; + } + } + + /** + * Pad "packets". + * + * Block ciphers working by encrypting between their specified [$this->]block_size at a time + * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to + * pad the input so that it is of the proper length. + * + * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, + * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping + * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is + * transmitted separately) + * + * @see self::disablePadding() + * @access public + */ + function enablePadding() + { + $this->padding = true; + } + + /** + * Do not pad packets. + * + * @see self::enablePadding() + * @access public + */ + function disablePadding() + { + $this->padding = false; + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->encrypt(substr($plaintext, 16, 16)); + * + * + * echo $rijndael->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * @see self::disableContinuousBuffer() + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function enableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->continuousBuffer = true; + + $this->_setEngine(); + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * @see self::enableContinuousBuffer() + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function disableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + if (!$this->continuousBuffer) { + return; + } + + $this->continuousBuffer = false; + $this->changed = true; + + $this->_setEngine(); + } + + /** + * Test for engine validity + * + * @see self::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->mode == CRYPT_MODE_STREAM && $this->continuousBuffer) { + return false; + } + $this->openssl_emulate_ctr = false; + $result = $this->cipher_name_openssl && + extension_loaded('openssl') && + // PHP 5.3.0 - 5.3.2 did not let you set IV's + version_compare(PHP_VERSION, '5.3.3', '>='); + if (!$result) { + return false; + } + + // prior to PHP 5.4.0 OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING were not defined. instead of expecting an integer + // $options openssl_encrypt expected a boolean $raw_data. + if (!defined('OPENSSL_RAW_DATA')) { + $this->openssl_options = true; + } else { + $this->openssl_options = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING; + } + + $methods = openssl_get_cipher_methods(); + if (in_array($this->cipher_name_openssl, $methods)) { + return true; + } + // not all of openssl's symmetric cipher's support ctr. for those + // that don't we'll emulate it + switch ($this->mode) { + case CRYPT_MODE_CTR: + if (in_array($this->cipher_name_openssl_ecb, $methods)) { + $this->openssl_emulate_ctr = true; + return true; + } + } + return false; + case CRYPT_ENGINE_MCRYPT: + set_error_handler(array($this, 'do_nothing')); + $result = $this->cipher_name_mcrypt && + extension_loaded('mcrypt') && + in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()); + restore_error_handler(); + return $result; + case CRYPT_ENGINE_INTERNAL: + return true; + } + + return false; + } + + /** + * Sets the preferred crypt engine + * + * Currently, $engine could be: + * + * - CRYPT_ENGINE_OPENSSL [very fast] + * + * - CRYPT_ENGINE_MCRYPT [fast] + * + * - CRYPT_ENGINE_INTERNAL [slow] + * + * If the preferred crypt engine is not available the fastest available one will be used + * + * @see self::Crypt_Base() + * @param int $engine + * @access public + */ + function setPreferredEngine($engine) + { + switch ($engine) { + //case CRYPT_ENGINE_OPENSSL: + case CRYPT_ENGINE_MCRYPT: + case CRYPT_ENGINE_INTERNAL: + $this->preferredEngine = $engine; + break; + default: + $this->preferredEngine = CRYPT_ENGINE_OPENSSL; + } + + $this->_setEngine(); + } + + /** + * Returns the engine currently being utilized + * + * @see self::_setEngine() + * @access public + */ + function getEngine() + { + return $this->engine; + } + + /** + * Sets the engine as appropriate + * + * @see self::Crypt_Base() + * @access private + */ + function _setEngine() + { + $this->engine = null; + + $candidateEngines = array( + $this->preferredEngine, + CRYPT_ENGINE_OPENSSL, + CRYPT_ENGINE_MCRYPT + ); + foreach ($candidateEngines as $engine) { + if ($this->isValidEngine($engine)) { + $this->engine = $engine; + break; + } + } + if (!$this->engine) { + $this->engine = CRYPT_ENGINE_INTERNAL; + } + + if ($this->engine != CRYPT_ENGINE_MCRYPT && $this->enmcrypt) { + set_error_handler(array($this, 'do_nothing')); + // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, + // (re)open them with the module named in $this->cipher_name_mcrypt + mcrypt_module_close($this->enmcrypt); + mcrypt_module_close($this->demcrypt); + $this->enmcrypt = null; + $this->demcrypt = null; + + if ($this->ecb) { + mcrypt_module_close($this->ecb); + $this->ecb = null; + } + restore_error_handler(); + } + + $this->changed = true; + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + * @internal Must be extended by the child Crypt_* class + */ + function _encryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + * @internal Must be extended by the child Crypt_* class + */ + function _decryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the key (expansion) + * + * Only used if $engine == CRYPT_ENGINE_INTERNAL + * + * @see self::_setup() + * @access private + * @internal Must be extended by the child Crypt_* class + */ + function _setupKey() + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the CRYPT_ENGINE_INTERNAL $engine + * + * (re)init, if necessary, the internal cipher $engine and flush all $buffers + * Used (only) if $engine == CRYPT_ENGINE_INTERNAL + * + * _setup() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() with no init-settings + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @access private + * @internal _setup() is always called before en/decryption. + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _setup() + { + $this->_clearBuffers(); + $this->_setupKey(); + + if ($this->use_inline_crypt) { + $this->_setupInlineCrypt(); + } + } + + /** + * Setup the CRYPT_ENGINE_MCRYPT $engine + * + * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers + * Used (only) if $engine = CRYPT_ENGINE_MCRYPT + * + * _setupMcrypt() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @access private + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _setupMcrypt() + { + $this->_clearBuffers(); + $this->enchanged = $this->dechanged = true; + + if (!isset($this->enmcrypt)) { + static $mcrypt_modes = array( + CRYPT_MODE_CTR => 'ctr', + CRYPT_MODE_ECB => MCRYPT_MODE_ECB, + CRYPT_MODE_CBC => MCRYPT_MODE_CBC, + CRYPT_MODE_CFB => 'ncfb', + CRYPT_MODE_OFB => MCRYPT_MODE_NOFB, + CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM, + ); + + $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + + // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() + // to workaround mcrypt's broken ncfb implementation in buffered mode + // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + if ($this->mode == CRYPT_MODE_CFB) { + $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); + } + } // else should mcrypt_generic_deinit be called? + + if ($this->mode == CRYPT_MODE_CFB) { + mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); + } + } + + /** + * Pads a string + * + * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. + * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to + * chr($this->block_size - (strlen($text) % $this->block_size) + * + * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless + * and padding will, hence forth, be enabled. + * + * @see self::_unpad() + * @param string $text + * @access private + * @return string + */ + function _pad($text) + { + $length = strlen($text); + + if (!$this->padding) { + if ($length % $this->block_size == 0) { + return $text; + } else { + user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})"); + $this->padding = true; + } + } + + $pad = $this->block_size - ($length % $this->block_size); + + return str_pad($text, $length + $pad, chr($pad)); + } + + /** + * Unpads a string. + * + * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong + * and false will be returned. + * + * @see self::_pad() + * @param string $text + * @access private + * @return string + */ + function _unpad($text) + { + if (!$this->padding) { + return $text; + } + + $length = ord($text[strlen($text) - 1]); + + if (!$length || $length > $this->block_size) { + return false; + } + + return substr($text, 0, -$length); + } + + /** + * Clears internal buffers + * + * Clearing/resetting the internal buffers is done everytime + * after disableContinuousBuffer() or on cipher $engine (re)init + * ie after setKey() or setIV() + * + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _clearBuffers() + { + $this->enbuffer = $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true); + + // mcrypt's handling of invalid's $iv: + // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size); + $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0"); + + if (!$this->skip_key_adjustment) { + $this->key = str_pad(substr($this->key, 0, $this->key_length), $this->key_length, "\0"); + } + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @access private + * @return string + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * String Pop + * + * Inspired by array_pop + * + * @param string $string + * @param int $index + * @access private + * @return string + */ + function _string_pop(&$string, $index = 1) + { + $substr = substr($string, -$index); + $string = substr($string, 0, -$index); + return $substr; + } + + /** + * Increment the current string + * + * @see self::decrypt() + * @see self::encrypt() + * @param string $var + * @access private + */ + function _increment_str(&$var) + { + for ($i = 4; $i <= strlen($var); $i+= 4) { + $temp = substr($var, -$i, 4); + switch ($temp) { + case "\xFF\xFF\xFF\xFF": + $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4); + break; + case "\x7F\xFF\xFF\xFF": + $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4); + return; + default: + $temp = unpack('Nnum', $temp); + $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4); + return; + } + } + + $remainder = strlen($var) % 4; + + if ($remainder == 0) { + return; + } + + $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT)); + $temp = substr(pack('N', $temp['num'] + 1), -$remainder); + $var = substr_replace($var, $temp, 0, $remainder); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * Stores the created (or existing) callback function-name + * in $this->inline_crypt + * + * Internally for phpseclib developers: + * + * _setupInlineCrypt() would be called only if: + * + * - $engine == CRYPT_ENGINE_INTERNAL and + * + * - $use_inline_crypt === true + * + * - each time on _setup(), after(!) _setupKey() + * + * + * This ensures that _setupInlineCrypt() has always a + * full ready2go initializated internal cipher $engine state + * where, for example, the keys allready expanded, + * keys/block_size calculated and such. + * + * It is, each time if called, the responsibility of _setupInlineCrypt(): + * + * - to set $this->inline_crypt to a valid and fully working callback function + * as a (faster) replacement for encrypt() / decrypt() + * + * - NOT to create unlimited callback functions (for memory reasons!) + * no matter how often _setupInlineCrypt() would be called. At some + * point of amount they must be generic re-useable. + * + * - the code of _setupInlineCrypt() it self, + * and the generated callback code, + * must be, in following order: + * - 100% safe + * - 100% compatible to encrypt()/decrypt() + * - using only php5+ features/lang-constructs/php-extensions if + * compatibility (down to php4) or fallback is provided + * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) + * - >= 10% faster than encrypt()/decrypt() [which is, by the way, + * the reason for the existence of _setupInlineCrypt() :-)] + * - memory-nice + * - short (as good as possible) + * + * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. + * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class. + * - The following variable names are reserved: + * - $_* (all variable names prefixed with an underscore) + * - $self (object reference to it self. Do not use $this, but $self instead) + * - $in (the content of $in has to en/decrypt by the generated code) + * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only + * + * + * @see self::_setup() + * @see self::_createInlineCryptFunction() + * @see self::encrypt() + * @see self::decrypt() + * @access private + * @internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt() + */ + function _setupInlineCrypt() + { + // If, for any reason, an extending Crypt_Base() Crypt_* class + // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false + // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class, + // in the constructor at object instance-time + // or, if it's runtime-specific, at runtime + + $this->use_inline_crypt = false; + } + + /** + * Creates the performance-optimized function for en/decrypt() + * + * Internally for phpseclib developers: + * + * _createInlineCryptFunction(): + * + * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] + * with the current [$this->]mode of operation code + * + * - create the $inline function, which called by encrypt() / decrypt() + * as its replacement to speed up the en/decryption operations. + * + * - return the name of the created $inline callback function + * + * - used to speed up en/decryption + * + * + * + * The main reason why can speed up things [up to 50%] this way are: + * + * - using variables more effective then regular. + * (ie no use of expensive arrays but integers $k_0, $k_1 ... + * or even, for example, the pure $key[] values hardcoded) + * + * - avoiding 1000's of function calls of ie _encryptBlock() + * but inlining the crypt operations. + * in the mode of operation for() loop. + * + * - full loop unroll the (sometimes key-dependent) rounds + * avoiding this way ++$i counters and runtime-if's etc... + * + * The basic code architectur of the generated $inline en/decrypt() + * lambda function, in pseudo php, is: + * + * + * +----------------------------------------------------------------------------------------------+ + * | callback $inline = create_function: | + * | lambda_function_0001_crypt_ECB($action, $text) | + * | { | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_crypt']; // general init code. | + * | // ie: $sbox'es declarations used for | + * | // encrypt and decrypt'ing. | + * | | + * | switch ($action) { | + * | case 'encrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | + * | ie: specified $key or $box | + * | declarations for encrypt'ing. | + * | | + * | foreach ($ciphertext) { | + * | $in = $block_size of $ciphertext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for encryption. | + * | // $cipher_code['encrypt_block'] has to | + * | // encrypt the content of the $in variable | + * | | + * | $plaintext .= $in; | + * | } | + * | return $plaintext; | + * | | + * | case 'decrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_decrypt']; // decrypt sepcific init code | + * | ie: specified $key or $box | + * | declarations for decrypt'ing. | + * | foreach ($plaintext) { | + * | $in = $block_size of $plaintext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for decryption. | + * | // $cipher_code['decrypt_block'] has to | + * | // decrypt the content of the $in variable | + * | $ciphertext .= $in; | + * | } | + * | return $ciphertext; | + * | } | + * | } | + * +----------------------------------------------------------------------------------------------+ + * + * + * See also the Crypt_*::_setupInlineCrypt()'s for + * productive inline $cipher_code's how they works. + * + * Structure of: + * + * $cipher_code = array( + * 'init_crypt' => (string) '', // optional + * 'init_encrypt' => (string) '', // optional + * 'init_decrypt' => (string) '', // optional + * 'encrypt_block' => (string) '', // required + * 'decrypt_block' => (string) '' // required + * ); + * + * + * @see self::_setupInlineCrypt() + * @see self::encrypt() + * @see self::decrypt() + * @param array $cipher_code + * @access private + * @return string (the name of the created callback function) + */ + function _createInlineCryptFunction($cipher_code) + { + $block_size = $this->block_size; + + // optional + $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; + $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; + $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; + // required + $encrypt_block = $cipher_code['encrypt_block']; + $decrypt_block = $cipher_code['decrypt_block']; + + // Generating mode of operation inline code, + // merged with the $cipher_code algorithm + // for encrypt- and decryption. + switch ($this->mode) { + case CRYPT_MODE_ECB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$encrypt_block.' + $_ciphertext.= $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in; + } + + return $self->_unpad($_plaintext); + '; + break; + case CRYPT_MODE_CTR: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + if (strlen($_buffer["ciphertext"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["ciphertext"])) { + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_buffer["ciphertext"].= $in; + } + $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_key = $in; + $_ciphertext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; + } + } + + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["ciphertext"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["ciphertext"])) { + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_buffer["ciphertext"].= $in; + } + $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_key = $in; + $_plaintext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; + } + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_CFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_buffer = &$self->enbuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->encryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->encryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.'; + $_iv = $in ^ substr($_text, $_i, '.$block_size.'); + $_ciphertext.= $_iv; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_block = $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, $_block, 0, $_len); + $_ciphertext.= $_block; + $_pos = $_len; + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_buffer = &$self->debuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->decryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->decryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_plaintext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $cb = substr($_text, $_i, '.$block_size.'); + $_plaintext.= $_iv ^ $cb; + $_iv = $cb; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_plaintext.= $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); + $_pos = $_len; + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_OFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_string_shift($_buffer["xor"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_string_shift($_buffer["xor"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_plaintext; + '; + break; + case CRYPT_MODE_STREAM: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + '.$encrypt_block.' + return $_ciphertext; + '; + $decrypt = $init_decrypt . ' + $_plaintext = ""; + '.$decrypt_block.' + return $_plaintext; + '; + break; + // case CRYPT_MODE_CBC: + default: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + + $in = $self->encryptIV; + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.') ^ $in; + '.$encrypt_block.' + $_ciphertext.= $in; + } + + if ($self->continuousBuffer) { + $self->encryptIV = $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + $_iv = $self->decryptIV; + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_block = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in ^ $_iv; + $_iv = $_block; + } + + if ($self->continuousBuffer) { + $self->decryptIV = $_iv; + } + + return $self->_unpad($_plaintext); + '; + break; + } + + // Create the $inline function and return its name as string. Ready to run! + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + eval('$func = function ($_action, &$self, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' } };'); + return $func; + } + + return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }'); + } + + /** + * Holds the lambda_functions table (classwide) + * + * Each name of the lambda function, created from + * _setupInlineCrypt() && _createInlineCryptFunction() + * is stored, classwide (!), here for reusing. + * + * The string-based index of $function is a classwide + * unique value representing, at least, the $mode of + * operation (or more... depends of the optimizing level) + * for which $mode the lambda function was created. + * + * @access private + * @return array &$functions + */ + function &_getLambdaFunctions() + { + static $functions = array(); + return $functions; + } + + /** + * Generates a digest from $bytes + * + * @see self::_setupInlineCrypt() + * @access private + * @param string $bytes + * @return string + */ + function _hashInlineCryptFunction($bytes) + { + if (!defined('CRYPT_BASE_WHIRLPOOL_AVAILABLE')) { + define('CRYPT_BASE_WHIRLPOOL_AVAILABLE', (bool)(extension_loaded('hash') && in_array('whirlpool', hash_algos()))); + } + + $result = ''; + $hash = $bytes; + + switch (true) { + case CRYPT_BASE_WHIRLPOOL_AVAILABLE: + foreach (str_split($bytes, 64) as $t) { + $hash = hash('whirlpool', $hash, true); + $result .= $t ^ $hash; + } + return $result . hash('whirlpool', $hash, true); + default: + $len = strlen($bytes); + for ($i = 0; $i < $len; $i+=20) { + $t = substr($bytes, $i, 20); + $hash = pack('H*', sha1($hash)); + $result .= $t ^ $hash; + } + return $result . pack('H*', sha1($hash)); + } + } + + /** + * Convert float to int + * + * On 32-bit Linux installs running PHP < 5.3 converting floats to ints doesn't always work + * + * @access private + * @param string $x + * @return int + */ + function safe_intval($x) + { + switch (true) { + case is_int($x): + // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding" + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return $x; + } + return (fmod($x, 0x80000000) & 0x7FFFFFFF) | + ((fmod(floor($x / 0x80000000), 2) & 1) << 31); + } + + /** + * eval()'able string for in-line float to int + * + * @access private + * @return string + */ + function safe_intval_inline() + { + // on 32-bit linux systems with PHP < 5.3 float to integer conversion is bad + switch (true) { + case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8: + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return '%s'; + break; + default: + $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | '; + return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))'; + } + } + + /** + * Dummy error handler to suppress mcrypt errors + * + * @access private + */ + function do_nothing() + { + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php b/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php new file mode 100644 index 0000000..cc88511 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php @@ -0,0 +1,644 @@ + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Blowfish. + * + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Blowfish extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'BLOWFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'blowfish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each + * + * S-Box 0 + * + * @access private + * @var array + */ + var $sbox0 = array( + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ); + + /** + * S-Box 1 + * + * @access private + * @var array + */ + var $sbox1 = array( + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ); + + /** + * S-Box 2 + * + * @access private + * @var array + */ + var $sbox2 = array( + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ); + + /** + * S-Box 3 + * + * @access private + * @var array + */ + var $sbox3 = array( + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ); + + /** + * P-Array consists of 18 32-bit subkeys + * + * @var array + * @access private + */ + var $parray = array( + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b + ); + + /** + * The BCTX-working Array + * + * Holds the expanded key [p] and the key-depended s-boxes [sb] + * + * @var array + * @access private + */ + var $bctx; + + /** + * Holds the last used key + * + * @var array + * @access private + */ + var $kl; + + /** + * The Key Length (in bytes) + * + * @see Crypt_Base::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could + * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_length = 16; + + /** + * Sets the key length. + * + * Key lengths can be between 32 and 448 bits. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + if ($length < 32) { + $this->key_length = 4; + } elseif ($length > 448) { + $this->key_length = 56; + } else { + $this->key_length = $length >> 3; + } + + parent::setKeyLength($length); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::isValidEngine() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + if (version_compare(PHP_VERSION, '5.3.7') < 0 && $this->key_length != 16) { + return false; + } + if ($this->key_length < 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'bf-ecb'; + $this->cipher_name_openssl = 'bf-' . $this->_openssl_translate_mode(); + } + + return parent::isValidEngine($engine); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* key-expanding p[] and S-Box building sb[] */ + $this->bctx = array( + 'p' => array(), + 'sb' => array( + $this->sbox0, + $this->sbox1, + $this->sbox2, + $this->sbox3 + ) + ); + + // unpack binary string in unsigned chars + $key = array_values(unpack('C*', $this->key)); + $keyl = count($key); + for ($j = 0, $i = 0; $i < 18; ++$i) { + // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... + for ($data = 0, $k = 0; $k < 4; ++$k) { + $data = ($data << 8) | $key[$j]; + if (++$j >= $keyl) { + $j = 0; + } + } + $this->bctx['p'][] = $this->parray[$i] ^ $data; + } + + // encrypt the zero-string, replace P1 and P2 with the encrypted data, + // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys + $data = "\0\0\0\0\0\0\0\0"; + for ($i = 0; $i < 18; $i += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['p'][$i ] = $l; + $this->bctx['p'][$i + 1] = $r; + } + for ($i = 0; $i < 4; ++$i) { + for ($j = 0; $j < 256; $j += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['sb'][$i][$j ] = $l; + $this->bctx['sb'][$i][$j + 1] = $r; + } + } + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + $p = $this->bctx["p"]; + // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 0; $i < 16; $i+= 2) { + $l^= $p[$i]; + $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]); + + $r^= $p[$i + 1]; + $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]); + } + return pack("N*", $r ^ $p[17], $l ^ $p[16]); + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + $p = $this->bctx["p"]; + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 17; $i > 2; $i-= 2) { + $l^= $p[$i]; + $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]); + + $r^= $p[$i - 1]; + $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]); + } + return pack("N*", $r ^ $p[0], $l ^ $p[1]); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_Blowfish, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + $safeint = $this->safe_intval_inline(); + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $p = $this->bctx['p']; + $init_crypt = ' + static $sb_0, $sb_1, $sb_2, $sb_3; + if (!$sb_0) { + $sb_0 = $self->bctx["sb"][0]; + $sb_1 = $self->bctx["sb"][1]; + $sb_2 = $self->bctx["sb"][2]; + $sb_3 = $self->bctx["sb"][3]; + } + '; + break; + default: + $p = array(); + for ($i = 0; $i < 18; ++$i) { + $p[] = '$p_' . $i; + } + $init_crypt = ' + list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"]; + list(' . implode(',', $p) . ') = $self->bctx["p"]; + + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + for ($i = 0; $i < 16; $i+= 2) { + $encrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]') . '; + + $r^= ' . $p[$i + 1] . '; + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]') . '; + '; + } + $encrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[17] . ', + $l ^ ' . $p[16] . ' + ); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + + for ($i = 17; $i > 2; $i-= 2) { + $decrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]') . '; + + $r^= ' . $p[$i - 1] . '; + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]') . '; + '; + } + + $decrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[0] . ', + $l ^ ' . $p[1] . ' + ); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/DES.php b/app/Http/Controllers/dgaAdmin/Crypt/DES.php new file mode 100644 index 0000000..4c57401 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/DES.php @@ -0,0 +1,1516 @@ + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_DES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see self::_setupKey() + * @see self::_processBlock() + */ +/** + * Contains $keys[CRYPT_DES_ENCRYPT] + */ +define('CRYPT_DES_ENCRYPT', 0); +/** + * Contains $keys[CRYPT_DES_DECRYPT] + */ +define('CRYPT_DES_DECRYPT', 1); +/**#@-*/ + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of DES. + * + * @package Crypt_DES + * @author Jim Wigginton + * @access public + */ +class Crypt_DES extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * Key Length (in bytes) + * + * @see Crypt_Base::setKeyLength() + * @var int + * @access private + */ + var $key_length = 8; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'des'; + + /** + * The OpenSSL names of the cipher / modes + * + * @see Crypt_Base::openssl_mode_names + * @var array + * @access private + */ + var $openssl_mode_names = array( + CRYPT_MODE_ECB => 'des-ecb', + CRYPT_MODE_CBC => 'des-cbc', + CRYPT_MODE_CFB => 'des-cfb', + CRYPT_MODE_OFB => 'des-ofb' + // CRYPT_MODE_CTR is undefined for DES + ); + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * Switch for DES/3DES encryption + * + * Used only if $engine == CRYPT_DES_MODE_INTERNAL + * + * @see self::_setupKey() + * @see self::_processBlock() + * @var int + * @access private + */ + var $des_rounds = 1; + + /** + * max possible size of $key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key_length_max = 8; + + /** + * The Key Schedule + * + * @see self::_setupKey() + * @var array + * @access private + */ + var $keys; + + /** + * Shuffle table. + * + * For each byte value index, the entry holds an 8-byte string + * with each byte containing all bits in the same state as the + * corresponding bit in the index value. + * + * @see self::_processBlock() + * @see self::_setupKey() + * @var array + * @access private + */ + var $shuffle = array( + "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", + "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", + "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", + "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", + "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", + "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", + "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", + "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", + "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", + "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", + "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", + "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", + "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", + "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", + "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", + "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", + "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", + "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", + "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", + "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", + "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", + "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", + "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", + "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", + "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", + "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", + "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", + "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", + "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", + "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", + "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", + "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", + "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", + "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", + "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", + "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", + "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", + "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", + "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", + "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", + "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", + "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", + "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", + "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", + "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", + "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", + "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", + "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", + "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", + "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", + "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", + "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", + "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", + "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", + "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", + "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", + "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", + "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", + "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", + "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", + "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", + "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", + "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", + "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", + "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + ); + + /** + * IP mapping helper table. + * + * Indexing this table with each source byte performs the initial bit permutation. + * + * @var array + * @access private + */ + var $ipmap = array( + 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, + 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, + 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, + 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, + 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, + 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, + 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, + 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, + 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, + 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, + 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, + 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, + 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, + 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, + 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, + 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, + 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, + 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, + 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, + 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, + 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, + 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, + 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, + 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, + 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, + 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, + 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, + 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF + ); + + /** + * Inverse IP mapping helper table. + * Indexing this table with a byte value reverses the bit order. + * + * @var array + * @access private + */ + var $invipmap = array( + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF + ); + + /** + * Pre-permuted S-box1 + * + * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the + * P table: concatenation can then be replaced by exclusive ORs. + * + * @var array + * @access private + */ + var $sbox1 = array( + 0x00808200, 0x00000000, 0x00008000, 0x00808202, + 0x00808002, 0x00008202, 0x00000002, 0x00008000, + 0x00000200, 0x00808200, 0x00808202, 0x00000200, + 0x00800202, 0x00808002, 0x00800000, 0x00000002, + 0x00000202, 0x00800200, 0x00800200, 0x00008200, + 0x00008200, 0x00808000, 0x00808000, 0x00800202, + 0x00008002, 0x00800002, 0x00800002, 0x00008002, + 0x00000000, 0x00000202, 0x00008202, 0x00800000, + 0x00008000, 0x00808202, 0x00000002, 0x00808000, + 0x00808200, 0x00800000, 0x00800000, 0x00000200, + 0x00808002, 0x00008000, 0x00008200, 0x00800002, + 0x00000200, 0x00000002, 0x00800202, 0x00008202, + 0x00808202, 0x00008002, 0x00808000, 0x00800202, + 0x00800002, 0x00000202, 0x00008202, 0x00808200, + 0x00000202, 0x00800200, 0x00800200, 0x00000000, + 0x00008002, 0x00008200, 0x00000000, 0x00808002 + ); + + /** + * Pre-permuted S-box2 + * + * @var array + * @access private + */ + var $sbox2 = array( + 0x40084010, 0x40004000, 0x00004000, 0x00084010, + 0x00080000, 0x00000010, 0x40080010, 0x40004010, + 0x40000010, 0x40084010, 0x40084000, 0x40000000, + 0x40004000, 0x00080000, 0x00000010, 0x40080010, + 0x00084000, 0x00080010, 0x40004010, 0x00000000, + 0x40000000, 0x00004000, 0x00084010, 0x40080000, + 0x00080010, 0x40000010, 0x00000000, 0x00084000, + 0x00004010, 0x40084000, 0x40080000, 0x00004010, + 0x00000000, 0x00084010, 0x40080010, 0x00080000, + 0x40004010, 0x40080000, 0x40084000, 0x00004000, + 0x40080000, 0x40004000, 0x00000010, 0x40084010, + 0x00084010, 0x00000010, 0x00004000, 0x40000000, + 0x00004010, 0x40084000, 0x00080000, 0x40000010, + 0x00080010, 0x40004010, 0x40000010, 0x00080010, + 0x00084000, 0x00000000, 0x40004000, 0x00004010, + 0x40000000, 0x40080010, 0x40084010, 0x00084000 + ); + + /** + * Pre-permuted S-box3 + * + * @var array + * @access private + */ + var $sbox3 = array( + 0x00000104, 0x04010100, 0x00000000, 0x04010004, + 0x04000100, 0x00000000, 0x00010104, 0x04000100, + 0x00010004, 0x04000004, 0x04000004, 0x00010000, + 0x04010104, 0x00010004, 0x04010000, 0x00000104, + 0x04000000, 0x00000004, 0x04010100, 0x00000100, + 0x00010100, 0x04010000, 0x04010004, 0x00010104, + 0x04000104, 0x00010100, 0x00010000, 0x04000104, + 0x00000004, 0x04010104, 0x00000100, 0x04000000, + 0x04010100, 0x04000000, 0x00010004, 0x00000104, + 0x00010000, 0x04010100, 0x04000100, 0x00000000, + 0x00000100, 0x00010004, 0x04010104, 0x04000100, + 0x04000004, 0x00000100, 0x00000000, 0x04010004, + 0x04000104, 0x00010000, 0x04000000, 0x04010104, + 0x00000004, 0x00010104, 0x00010100, 0x04000004, + 0x04010000, 0x04000104, 0x00000104, 0x04010000, + 0x00010104, 0x00000004, 0x04010004, 0x00010100 + ); + + /** + * Pre-permuted S-box4 + * + * @var array + * @access private + */ + var $sbox4 = array( + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x00401040, 0x80400040, 0x80400000, 0x80001000, + 0x00000000, 0x00401000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00400040, 0x80400000, + 0x80000000, 0x00001000, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x80001000, 0x00001040, + 0x80400040, 0x80000000, 0x00001040, 0x00400040, + 0x00001000, 0x00401040, 0x80401040, 0x80000040, + 0x00400040, 0x80400000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00000000, 0x00401000, + 0x00001040, 0x00400040, 0x80400040, 0x80000000, + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x80401040, 0x80000040, 0x80000000, 0x00001000, + 0x80400000, 0x80001000, 0x00401040, 0x80400040, + 0x80001000, 0x00001040, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x00001000, 0x00401040 + ); + + /** + * Pre-permuted S-box5 + * + * @var array + * @access private + */ + var $sbox5 = array( + 0x00000080, 0x01040080, 0x01040000, 0x21000080, + 0x00040000, 0x00000080, 0x20000000, 0x01040000, + 0x20040080, 0x00040000, 0x01000080, 0x20040080, + 0x21000080, 0x21040000, 0x00040080, 0x20000000, + 0x01000000, 0x20040000, 0x20040000, 0x00000000, + 0x20000080, 0x21040080, 0x21040080, 0x01000080, + 0x21040000, 0x20000080, 0x00000000, 0x21000000, + 0x01040080, 0x01000000, 0x21000000, 0x00040080, + 0x00040000, 0x21000080, 0x00000080, 0x01000000, + 0x20000000, 0x01040000, 0x21000080, 0x20040080, + 0x01000080, 0x20000000, 0x21040000, 0x01040080, + 0x20040080, 0x00000080, 0x01000000, 0x21040000, + 0x21040080, 0x00040080, 0x21000000, 0x21040080, + 0x01040000, 0x00000000, 0x20040000, 0x21000000, + 0x00040080, 0x01000080, 0x20000080, 0x00040000, + 0x00000000, 0x20040000, 0x01040080, 0x20000080 + ); + + /** + * Pre-permuted S-box6 + * + * @var array + * @access private + */ + var $sbox6 = array( + 0x10000008, 0x10200000, 0x00002000, 0x10202008, + 0x10200000, 0x00000008, 0x10202008, 0x00200000, + 0x10002000, 0x00202008, 0x00200000, 0x10000008, + 0x00200008, 0x10002000, 0x10000000, 0x00002008, + 0x00000000, 0x00200008, 0x10002008, 0x00002000, + 0x00202000, 0x10002008, 0x00000008, 0x10200008, + 0x10200008, 0x00000000, 0x00202008, 0x10202000, + 0x00002008, 0x00202000, 0x10202000, 0x10000000, + 0x10002000, 0x00000008, 0x10200008, 0x00202000, + 0x10202008, 0x00200000, 0x00002008, 0x10000008, + 0x00200000, 0x10002000, 0x10000000, 0x00002008, + 0x10000008, 0x10202008, 0x00202000, 0x10200000, + 0x00202008, 0x10202000, 0x00000000, 0x10200008, + 0x00000008, 0x00002000, 0x10200000, 0x00202008, + 0x00002000, 0x00200008, 0x10002008, 0x00000000, + 0x10202000, 0x10000000, 0x00200008, 0x10002008 + ); + + /** + * Pre-permuted S-box7 + * + * @var array + * @access private + */ + var $sbox7 = array( + 0x00100000, 0x02100001, 0x02000401, 0x00000000, + 0x00000400, 0x02000401, 0x00100401, 0x02100400, + 0x02100401, 0x00100000, 0x00000000, 0x02000001, + 0x00000001, 0x02000000, 0x02100001, 0x00000401, + 0x02000400, 0x00100401, 0x00100001, 0x02000400, + 0x02000001, 0x02100000, 0x02100400, 0x00100001, + 0x02100000, 0x00000400, 0x00000401, 0x02100401, + 0x00100400, 0x00000001, 0x02000000, 0x00100400, + 0x02000000, 0x00100400, 0x00100000, 0x02000401, + 0x02000401, 0x02100001, 0x02100001, 0x00000001, + 0x00100001, 0x02000000, 0x02000400, 0x00100000, + 0x02100400, 0x00000401, 0x00100401, 0x02100400, + 0x00000401, 0x02000001, 0x02100401, 0x02100000, + 0x00100400, 0x00000000, 0x00000001, 0x02100401, + 0x00000000, 0x00100401, 0x02100000, 0x00000400, + 0x02000001, 0x02000400, 0x00000400, 0x00100001 + ); + + /** + * Pre-permuted S-box8 + * + * @var array + * @access private + */ + var $sbox8 = array( + 0x08000820, 0x00000800, 0x00020000, 0x08020820, + 0x08000000, 0x08000820, 0x00000020, 0x08000000, + 0x00020020, 0x08020000, 0x08020820, 0x00020800, + 0x08020800, 0x00020820, 0x00000800, 0x00000020, + 0x08020000, 0x08000020, 0x08000800, 0x00000820, + 0x00020800, 0x00020020, 0x08020020, 0x08020800, + 0x00000820, 0x00000000, 0x00000000, 0x08020020, + 0x08000020, 0x08000800, 0x00020820, 0x00020000, + 0x00020820, 0x00020000, 0x08020800, 0x00000800, + 0x00000020, 0x08020020, 0x00000800, 0x00020820, + 0x08000800, 0x00000020, 0x08000020, 0x08020000, + 0x08020020, 0x08000000, 0x00020000, 0x08000820, + 0x00000000, 0x08020820, 0x00020020, 0x08000020, + 0x08020000, 0x08000800, 0x08000820, 0x00000000, + 0x08020820, 0x00020800, 0x00020800, 0x00000820, + 0x00000820, 0x00020020, 0x08000000, 0x08020800 + ); + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::isValidEngine() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($this->key_length_max == 8) { + if ($engine == CRYPT_ENGINE_OPENSSL) { + $this->cipher_name_openssl_ecb = 'des-ecb'; + $this->cipher_name_openssl = 'des-' . $this->_openssl_translate_mode(); + } + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the key. + * + * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we + * only use the first eight, if $key has more then eight characters in it, and pad $key with the + * null byte if it is less then eight characters long. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all zero's. + * + * @see Crypt_Base::setKey() + * @access public + * @param string $key + */ + function setKey($key) + { + // We check/cut here only up to max length of the key. + // Key padding to the proper length will be done in _setupKey() + if (strlen($key) > $this->key_length_max) { + $key = substr($key, 0, $this->key_length_max); + } + + // Sets the key + parent::setKey($key); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @see self::encrypt() + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_ENCRYPT); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @see self::decrypt() + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_DECRYPT); + } + + /** + * Encrypts or decrypts a 64-bit block + * + * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See + * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general + * idea of what this function does. + * + * @see self::_encryptBlock() + * @see self::_decryptBlock() + * @access private + * @param string $block + * @param int $mode + * @return string + */ + function _processBlock($block, $mode) + { + static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $this->sbox1); + $sbox2 = array_map("intval", $this->sbox2); + $sbox3 = array_map("intval", $this->sbox3); + $sbox4 = array_map("intval", $this->sbox4); + $sbox5 = array_map("intval", $this->sbox5); + $sbox6 = array_map("intval", $this->sbox6); + $sbox7 = array_map("intval", $this->sbox7); + $sbox8 = array_map("intval", $this->sbox8); + /* Merge $shuffle with $[inv]ipmap */ + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $this->shuffle[$this->ipmap[$i]]; + $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; + } + } + + $keys = $this->keys[$mode]; + $ki = -1; + + // Do the initial IP permutation. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + + // Extract L0 and R0. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; $i++) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; + $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; + + // S-box indexing. + $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; + // end of "the Feistel (F) function" + + $l = $r; + $r = $t; + } + + // Last step should not permute L & R. + $t = $l; + $l = $r; + $r = $t; + } + + // Perform the inverse IP permutation. + return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds); + + static $shifts = array( // number of key bits shifted per round + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + ); + + static $pc1map = array( + 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, + 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, + 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, + 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, + 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, + 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, + 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, + 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, + 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, + 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, + 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, + 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, + 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, + 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, + 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, + 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, + 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, + 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, + 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, + 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, + 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, + 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, + 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, + 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, + 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, + 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, + 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, + 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, + 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, + 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, + 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, + 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE + ); + + // Mapping tables for the PC-2 transformation. + static $pc2mapc1 = array( + 0x00000000, 0x00000400, 0x00200000, 0x00200400, + 0x00000001, 0x00000401, 0x00200001, 0x00200401, + 0x02000000, 0x02000400, 0x02200000, 0x02200400, + 0x02000001, 0x02000401, 0x02200001, 0x02200401 + ); + static $pc2mapc2 = array( + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910 + ); + static $pc2mapc3 = array( + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026 + ); + static $pc2mapc4 = array( + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208 + ); + static $pc2mapd1 = array( + 0x00000000, 0x00000001, 0x08000000, 0x08000001, + 0x00200000, 0x00200001, 0x08200000, 0x08200001, + 0x00000002, 0x00000003, 0x08000002, 0x08000003, + 0x00200002, 0x00200003, 0x08200002, 0x08200003 + ); + static $pc2mapd2 = array( + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 + ); + static $pc2mapd3 = array( + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030 + ); + static $pc2mapd4 = array( + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081108, 0x10081508, 0x11081108, 0x11081508, + 0x10081108, 0x10081508, 0x11081108, 0x11081508 + ); + + $keys = array(); + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // pad the key and remove extra characters as appropriate. + $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); + + // Perform the PC/1 transformation and compute C and D. + $t = unpack('Nl/Nr', $key); + list($l, $r) = array($t['l'], $t['r']); + $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | + ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | + ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | + ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | + ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | + ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | + ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | + ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); + $key = unpack('Nc/Nd', $key); + $c = ( $key['c'] >> 4) & 0x0FFFFFFF; + $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); + + $keys[$des_round] = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array_fill(0, 32, 0) + ); + for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) { + $c <<= $shifts[$i]; + $c = ($c | ($c >> 28)) & 0x0FFFFFFF; + $d <<= $shifts[$i]; + $d = ($d | ($d >> 28)) & 0x0FFFFFFF; + + // Perform the PC-2 transformation. + $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | + $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; + $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | + $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; + + // Reorder: odd bytes/even bytes. Push the result in key schedule. + $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) | + (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); + $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) | + (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1; + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2; + } + } + + switch ($this->des_rounds) { + case 3: // 3DES keys + $this->keys = array( + CRYPT_DES_ENCRYPT => array_merge( + $keys[0][CRYPT_DES_ENCRYPT], + $keys[1][CRYPT_DES_DECRYPT], + $keys[2][CRYPT_DES_ENCRYPT] + ), + CRYPT_DES_DECRYPT => array_merge( + $keys[2][CRYPT_DES_DECRYPT], + $keys[1][CRYPT_DES_ENCRYPT], + $keys[0][CRYPT_DES_DECRYPT] + ) + ); + break; + // case 1: // DES keys + default: + $this->keys = array( + CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT] + ); + } + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_DES::_getLambdaFunctions(); + + // Engine configuration for: + // - DES ($des_rounds == 1) or + // - 3DES ($des_rounds == 3) + $des_rounds = $this->des_rounds; + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit) + // (Currently, for Crypt_TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one + $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_DES, $des_rounds, {$this->mode}"; + if ($gen_hi_opt_code) { + // For hi-optimized code, we create for each combination of + // $mode, $des_rounds and $this->key its own encrypt/decrypt function. + // After max 10 hi-optimized functions, we create generic + // (still very fast.. but not ultra) functions for each $mode/$des_rounds + // Currently 2 * 5 generic functions will be then max. possible. + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + // Is there a re-usable $lambda_functions in there? If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $self->sbox1); + $sbox2 = array_map("intval", $self->sbox2); + $sbox3 = array_map("intval", $self->sbox3); + $sbox4 = array_map("intval", $self->sbox4); + $sbox5 = array_map("intval", $self->sbox5); + $sbox6 = array_map("intval", $self->sbox6); + $sbox7 = array_map("intval", $self->sbox7); + $sbox8 = array_map("intval", $self->sbox8);' + /* Merge $shuffle with $[inv]ipmap */ . ' + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $self->shuffle[$self->ipmap[$i]]; + $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]]; + } + } + '; + + switch (true) { + case $gen_hi_opt_code: + // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers. + // No futher initialisation of the $keys schedule is necessary. + // That is the extra performance boost. + $k = array( + CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT] + ); + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + // In generic optimized code mode, we have to use, as the best compromise [currently], + // our key schedule as $ke/$kd arrays. (with hardcoded indexes...) + $k = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array() + ); + for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) { + $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']'; + $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']'; + } + $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];'; + $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];'; + break; + } + + // Creating code for en- and decryption. + $crypt_block = array(); + foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) { + /* Do the initial IP permutation. */ + $crypt_block[$c] = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + $in = unpack("N*", + ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") + ); + ' . /* Extract L0 and R0 */ ' + $l = $in[1]; + $r = $in[2]; + '; + + $l = '$l'; + $r = '$r'; + + // Perform DES or 3DES. + for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; ++$i) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $crypt_block[$c].= ' + $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; + $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . + /* S-box indexing. */ + $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; + '; + // end of "the Feistel (F) function" + + // swap L & R + list($l, $r) = array($r, $l); + } + list($l, $r) = array($r, $l); + } + + // Perform the inverse IP permutation. + $crypt_block[$c].= '$in = + ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + '; + } + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT], + 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT] + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Hash.php b/app/Http/Controllers/dgaAdmin/Crypt/Hash.php new file mode 100644 index 0000000..ff6037c --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Hash.php @@ -0,0 +1,928 @@ + + * setKey('abcdefg'); + * + * echo base64_encode($hash->hash('abcdefg')); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Hash + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access private + * @see self::Crypt_Hash() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_HASH_MODE_INTERNAL', 1); +/** + * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. + */ +define('CRYPT_HASH_MODE_MHASH', 2); +/** + * Toggles the hash() implementation, which works on PHP 5.1.2+. + */ +define('CRYPT_HASH_MODE_HASH', 3); +/**#@-*/ + +/** + * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. + * + * @package Crypt_Hash + * @author Jim Wigginton + * @access public + */ +class Crypt_Hash +{ + /** + * Hash Parameter + * + * @see self::setHash() + * @var int + * @access private + */ + var $hashParam; + + /** + * Byte-length of compression blocks / key (Internal HMAC) + * + * @see self::setAlgorithm() + * @var int + * @access private + */ + var $b; + + /** + * Byte-length of hash output (Internal HMAC) + * + * @see self::setHash() + * @var int + * @access private + */ + var $l = false; + + /** + * Hash Algorithm + * + * @see self::setHash() + * @var string + * @access private + */ + var $hash; + + /** + * Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key = false; + + /** + * Computed Key + * + * @see self::_computeKey() + * @var string + * @access private + */ + var $computedKey = false; + + /** + * Outer XOR (Internal HMAC) + * + * @see self::setKey() + * @var string + * @access private + */ + var $opad; + + /** + * Inner XOR (Internal HMAC) + * + * @see self::setKey() + * @var string + * @access private + */ + var $ipad; + + /** + * Engine + * + * @see self::setHash() + * @var string + * @access private + */ + var $engine; + + /** + * Default Constructor. + * + * @param string $hash + * @return Crypt_Hash + * @access public + */ + function __construct($hash = 'sha1') + { + if (!defined('CRYPT_HASH_MODE')) { + switch (true) { + case extension_loaded('hash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); + break; + case extension_loaded('mhash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); + break; + default: + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); + } + } + + $this->setHash($hash); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param string $hash + * @access public + */ + function Crypt_Hash($hash = 'sha1') + { + $this->__construct($hash); + } + + /** + * Sets the key for HMACs + * + * Keys can be of any length. + * + * @access public + * @param string $key + */ + function setKey($key = false) + { + $this->key = $key; + $this->_computeKey(); + } + + /** + * Pre-compute the key used by the HMAC + * + * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes + * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC." + * + * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/ + * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during + * every call + * + * @access private + */ + function _computeKey() + { + if ($this->key === false) { + $this->computedKey = false; + return; + } + + if (strlen($this->key) <= $this->b) { + $this->computedKey = $this->key; + return; + } + + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $this->computedKey = mhash($this->hash, $this->key); + break; + case CRYPT_HASH_MODE_HASH: + $this->computedKey = hash($this->hash, $this->key, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $this->computedKey = call_user_func($this->hash, $this->key); + } + } + + /** + * Gets the hash function. + * + * As set by the constructor or by the setHash() method. + * + * @access public + * @return string + */ + function getHash() + { + return $this->hashParam; + } + + /** + * Sets the hash function. + * + * @access public + * @param string $hash + */ + function setHash($hash) + { + $this->hashParam = $hash = strtolower($hash); + switch ($hash) { + case 'md5-96': + case 'sha1-96': + case 'sha256-96': + case 'sha512-96': + $hash = substr($hash, 0, -3); + $this->l = 12; // 96 / 8 = 12 + break; + case 'md2': + case 'md5': + $this->l = 16; + break; + case 'sha1': + $this->l = 20; + break; + case 'sha256': + $this->l = 32; + break; + case 'sha384': + $this->l = 48; + break; + case 'sha512': + $this->l = 64; + } + + switch ($hash) { + case 'md2-96': + case 'md2': + $this->b = 16; + case 'md5-96': + case 'sha1-96': + case 'sha224-96': + case 'sha256-96': + case 'md2': + case 'md5': + case 'sha1': + case 'sha224': + case 'sha256': + $this->b = 64; + break; + default: + $this->b = 128; + } + + switch ($hash) { + case 'md2': + $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? + CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; + break; + case 'sha384': + case 'sha512': + $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; + break; + default: + $this->engine = CRYPT_HASH_MODE; + } + + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + switch ($hash) { + case 'md5': + $this->hash = MHASH_MD5; + break; + case 'sha256': + $this->hash = MHASH_SHA256; + break; + case 'sha1': + default: + $this->hash = MHASH_SHA1; + } + $this->_computeKey(); + return; + case CRYPT_HASH_MODE_HASH: + switch ($hash) { + case 'md5': + $this->hash = 'md5'; + return; + case 'md2': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = $hash; + return; + case 'sha1': + default: + $this->hash = 'sha1'; + } + $this->_computeKey(); + return; + } + + switch ($hash) { + case 'md2': + $this->hash = array($this, '_md2'); + break; + case 'md5': + $this->hash = array($this, '_md5'); + break; + case 'sha256': + $this->hash = array($this, '_sha256'); + break; + case 'sha384': + case 'sha512': + $this->hash = array($this, '_sha512'); + break; + case 'sha1': + default: + $this->hash = array($this, '_sha1'); + } + + $this->ipad = str_repeat(chr(0x36), $this->b); + $this->opad = str_repeat(chr(0x5C), $this->b); + + $this->_computeKey(); + } + + /** + * Compute the HMAC. + * + * @access public + * @param string $text + * @return string + */ + function hash($text) + { + if (!empty($this->key) || is_string($this->key)) { + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text, $this->computedKey); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash_hmac($this->hash, $text, $this->computedKey, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1 + $temp = $this->ipad ^ $key; // step 2 + $temp .= $text; // step 3 + $temp = call_user_func($this->hash, $temp); // step 4 + $output = $this->opad ^ $key; // step 5 + $output.= $temp; // step 6 + $output = call_user_func($this->hash, $output); // step 7 + } + } else { + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash($this->hash, $text, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $output = call_user_func($this->hash, $text); + } + } + + return substr($output, 0, $this->l); + } + + /** + * Returns the hash length (in bytes) + * + * @access public + * @return int + */ + function getLength() + { + return $this->l; + } + + /** + * Wrapper for MD5 + * + * @access private + * @param string $m + */ + function _md5($m) + { + return pack('H*', md5($m)); + } + + /** + * Wrapper for SHA1 + * + * @access private + * @param string $m + */ + function _sha1($m) + { + return pack('H*', sha1($m)); + } + + /** + * Pure-PHP implementation of MD2 + * + * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. + * + * @access private + * @param string $m + */ + function _md2($m) + { + static $s = array( + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 + ); + + // Step 1. Append Padding Bytes + $pad = 16 - (strlen($m) & 0xF); + $m.= str_repeat(chr($pad), $pad); + + $length = strlen($m); + + // Step 2. Append Checksum + $c = str_repeat(chr(0), 16); + $l = chr(0); + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + // RFC1319 incorrectly states that C[j] should be set to S[c xor L] + //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); + // per , however, C[j] should be set to S[c xor L] xor C[j] + $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); + $l = $c[$j]; + } + } + $m.= $c; + + $length+= 16; + + // Step 3. Initialize MD Buffer + $x = str_repeat(chr(0), 48); + + // Step 4. Process Message in 16-Byte Blocks + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + $x[$j + 16] = $m[$i + $j]; + $x[$j + 32] = $x[$j + 16] ^ $x[$j]; + } + $t = chr(0); + for ($j = 0; $j < 18; $j++) { + for ($k = 0; $k < 48; $k++) { + $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); + //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); + } + $t = chr(ord($t) + $j); + } + } + + // Step 5. Output + return substr($x, 0, 16); + } + + /** + * Pure-PHP implementation of SHA256 + * + * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. + * + * @access private + * @param string $m + */ + function _sha256($m) + { + if (extension_loaded('suhosin')) { + return pack('H*', sha256($m)); + } + + // Initialize variables + $hash = array( + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ); + // Initialize table of round constants + // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) + static $k = array( + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + ); + + // Pre-processing + $length = strlen($m); + // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 + $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N2', 0, $length << 3); + + // Process the message in successive 512-bit chunks + $chunks = str_split($m, 64); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into sixty-four 32-bit words + for ($i = 16; $i < 64; $i++) { + // @codingStandardsIgnoreStart + $s0 = $this->_rightRotate($w[$i - 15], 7) ^ + $this->_rightRotate($w[$i - 15], 18) ^ + $this->_rightShift( $w[$i - 15], 3); + $s1 = $this->_rightRotate($w[$i - 2], 17) ^ + $this->_rightRotate($w[$i - 2], 19) ^ + $this->_rightShift( $w[$i - 2], 10); + // @codingStandardsIgnoreEnd + $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); + } + + // Initialize hash value for this chunk + list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; + + // Main loop + for ($i = 0; $i < 64; $i++) { + $s0 = $this->_rightRotate($a, 2) ^ + $this->_rightRotate($a, 13) ^ + $this->_rightRotate($a, 22); + $maj = ($a & $b) ^ + ($a & $c) ^ + ($b & $c); + $t2 = $this->_add($s0, $maj); + + $s1 = $this->_rightRotate($e, 6) ^ + $this->_rightRotate($e, 11) ^ + $this->_rightRotate($e, 25); + $ch = ($e & $f) ^ + ($this->_not($e) & $g); + $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); + + $h = $g; + $g = $f; + $f = $e; + $e = $this->_add($d, $t1); + $d = $c; + $c = $b; + $b = $a; + $a = $this->_add($t1, $t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $this->_add($hash[0], $a), + $this->_add($hash[1], $b), + $this->_add($hash[2], $c), + $this->_add($hash[3], $d), + $this->_add($hash[4], $e), + $this->_add($hash[5], $f), + $this->_add($hash[6], $g), + $this->_add($hash[7], $h) + ); + } + + // Produce the final hash value (big-endian) + return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); + } + + /** + * Pure-PHP implementation of SHA384 and SHA512 + * + * @access private + * @param string $m + */ + function _sha512($m) + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + static $init384, $init512, $k; + + if (!isset($k)) { + // Initialize variables + $init384 = array( // initial values for SHA384 + 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', + '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' + ); + $init512 = array( // initial values for SHA512 + '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', + '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' + ); + + for ($i = 0; $i < 8; $i++) { + $init384[$i] = new Math_BigInteger($init384[$i], 16); + $init384[$i]->setPrecision(64); + $init512[$i] = new Math_BigInteger($init512[$i], 16); + $init512[$i]->setPrecision(64); + } + + // Initialize table of round constants + // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) + $k = array( + '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', + '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', + 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', + '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', + 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', + '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', + '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', + 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', + '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', + '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', + 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', + 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', + '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', + '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', + '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', + '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', + 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', + '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', + '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', + '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' + ); + + for ($i = 0; $i < 80; $i++) { + $k[$i] = new Math_BigInteger($k[$i], 16); + } + } + + $hash = $this->l == 48 ? $init384 : $init512; + + // Pre-processing + $length = strlen($m); + // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 + $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N4', 0, 0, 0, $length << 3); + + // Process the message in successive 1024-bit chunks + $chunks = str_split($m, 128); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); + $temp->setPrecision(64); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into eighty 32-bit words + for ($i = 16; $i < 80; $i++) { + $temp = array( + $w[$i - 15]->bitwise_rightRotate(1), + $w[$i - 15]->bitwise_rightRotate(8), + $w[$i - 15]->bitwise_rightShift(7) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $w[$i - 2]->bitwise_rightRotate(19), + $w[$i - 2]->bitwise_rightRotate(61), + $w[$i - 2]->bitwise_rightShift(6) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $w[$i] = $w[$i - 16]->copy(); + $w[$i] = $w[$i]->add($s0); + $w[$i] = $w[$i]->add($w[$i - 7]); + $w[$i] = $w[$i]->add($s1); + } + + // Initialize hash value for this chunk + $a = $hash[0]->copy(); + $b = $hash[1]->copy(); + $c = $hash[2]->copy(); + $d = $hash[3]->copy(); + $e = $hash[4]->copy(); + $f = $hash[5]->copy(); + $g = $hash[6]->copy(); + $h = $hash[7]->copy(); + + // Main loop + for ($i = 0; $i < 80; $i++) { + $temp = array( + $a->bitwise_rightRotate(28), + $a->bitwise_rightRotate(34), + $a->bitwise_rightRotate(39) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $a->bitwise_and($b), + $a->bitwise_and($c), + $b->bitwise_and($c) + ); + $maj = $temp[0]->bitwise_xor($temp[1]); + $maj = $maj->bitwise_xor($temp[2]); + $t2 = $s0->add($maj); + + $temp = array( + $e->bitwise_rightRotate(14), + $e->bitwise_rightRotate(18), + $e->bitwise_rightRotate(41) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $temp = array( + $e->bitwise_and($f), + $g->bitwise_and($e->bitwise_not()) + ); + $ch = $temp[0]->bitwise_xor($temp[1]); + $t1 = $h->add($s1); + $t1 = $t1->add($ch); + $t1 = $t1->add($k[$i]); + $t1 = $t1->add($w[$i]); + + $h = $g->copy(); + $g = $f->copy(); + $f = $e->copy(); + $e = $d->add($t1); + $d = $c->copy(); + $c = $b->copy(); + $b = $a->copy(); + $a = $t1->add($t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $hash[0]->add($a), + $hash[1]->add($b), + $hash[2]->add($c), + $hash[3]->add($d), + $hash[4]->add($e), + $hash[5]->add($f), + $hash[6]->add($g), + $hash[7]->add($h) + ); + } + + // Produce the final hash value (big-endian) + // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) + $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . + $hash[4]->toBytes() . $hash[5]->toBytes(); + if ($this->l != 48) { + $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); + } + + return $temp; + } + + /** + * Right Rotate + * + * @access private + * @param int $int + * @param int $amt + * @see self::_sha256() + * @return int + */ + function _rightRotate($int, $amt) + { + $invamt = 32 - $amt; + $mask = (1 << $invamt) - 1; + return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); + } + + /** + * Right Shift + * + * @access private + * @param int $int + * @param int $amt + * @see self::_sha256() + * @return int + */ + function _rightShift($int, $amt) + { + $mask = (1 << (32 - $amt)) - 1; + return ($int >> $amt) & $mask; + } + + /** + * Not + * + * @access private + * @param int $int + * @see self::_sha256() + * @return int + */ + function _not($int) + { + return ~$int & 0xFFFFFFFF; + } + + /** + * Add + * + * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the + * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. + * + * @return int + * @see self::_sha256() + * @access private + */ + function _add() + { + static $mod; + if (!isset($mod)) { + $mod = pow(2, 32); + } + + $result = 0; + $arguments = func_get_args(); + foreach ($arguments as $argument) { + $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; + } + + switch (true) { + case is_int($result): + // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding" + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return fmod($result, $mod); + } + + return (fmod($result, 0x80000000) & 0x7FFFFFFF) | + ((fmod(floor($result / 0x80000000), 2) & 1) << 31); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php b/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php new file mode 100644 index 0000000..d17a783 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php @@ -0,0 +1,3833 @@ +> and << cannot be used, nor can the modulo operator %, + * which only supports integers. Although this fact will slow this library down, the fact that such a high + * base is being used should more than compensate. + * + * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. + * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1) + * + * Useful resources are as follows: + * + * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} + * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} + * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip + * + * Here's an example of how to use this library: + * + * add($b); + * + * echo $c->toString(); // outputs 5 + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Math + * @package Math_BigInteger + * @author Jim Wigginton + * @copyright 2006 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +/**#@+ + * Reduction constants + * + * @access private + * @see self::_reduce() + */ +/** + * @see self::_montgomery() + * @see self::_prepMontgomery() + */ +define('MATH_BIGINTEGER_MONTGOMERY', 0); +/** + * @see self::_barrett() + */ +define('MATH_BIGINTEGER_BARRETT', 1); +/** + * @see self::_mod2() + */ +define('MATH_BIGINTEGER_POWEROF2', 2); +/** + * @see self::_remainder() + */ +define('MATH_BIGINTEGER_CLASSIC', 3); +/** + * @see self::__clone() + */ +define('MATH_BIGINTEGER_NONE', 4); +/**#@-*/ + +/**#@+ + * Array constants + * + * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and + * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. + * + * @access private + */ +/** + * $result[MATH_BIGINTEGER_VALUE] contains the value. + */ +define('MATH_BIGINTEGER_VALUE', 0); +/** + * $result[MATH_BIGINTEGER_SIGN] contains the sign. + */ +define('MATH_BIGINTEGER_SIGN', 1); +/**#@-*/ + +/**#@+ + * @access private + * @see self::_montgomery() + * @see self::_barrett() + */ +/** + * Cache constants + * + * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid. + */ +define('MATH_BIGINTEGER_VARIABLE', 0); +/** + * $cache[MATH_BIGINTEGER_DATA] contains the cached data. + */ +define('MATH_BIGINTEGER_DATA', 1); +/**#@-*/ + +/**#@+ + * Mode constants. + * + * @access private + * @see self::Math_BigInteger() + */ +/** + * To use the pure-PHP implementation + */ +define('MATH_BIGINTEGER_MODE_INTERNAL', 1); +/** + * To use the BCMath library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_BCMATH', 2); +/** + * To use the GMP library + * + * (if present; otherwise, either the BCMath or the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_GMP', 3); +/**#@-*/ + +/** + * Karatsuba Cutoff + * + * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? + * + * @access private + */ +define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25); + +/** + * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 + * numbers. + * + * @package Math_BigInteger + * @author Jim Wigginton + * @access public + */ +class Math_BigInteger +{ + /** + * Holds the BigInteger's value. + * + * @var array + * @access private + */ + var $value; + + /** + * Holds the BigInteger's magnitude. + * + * @var bool + * @access private + */ + var $is_negative = false; + + /** + * Precision + * + * @see self::setPrecision() + * @access private + */ + var $precision = -1; + + /** + * Precision Bitmask + * + * @see self::setPrecision() + * @access private + */ + var $bitmask = false; + + /** + * Mode independent value used for serialization. + * + * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for + * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, + * however, $this->hex is only calculated when $this->__sleep() is called. + * + * @see self::__sleep() + * @see self::__wakeup() + * @var string + * @access private + */ + var $hex; + + /** + * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. + * + * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using + * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @param int|string|resource $x base-10 number or base-$base number if $base set. + * @param int $base + * @return Math_BigInteger + * @access public + */ + function __construct($x = 0, $base = 10) + { + if (!defined('MATH_BIGINTEGER_MODE')) { + switch (true) { + case extension_loaded('gmp'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP); + break; + case extension_loaded('bcmath'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH); + break; + default: + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL); + } + } + + if (function_exists('phpinfo') && extension_loaded('openssl') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + break; + default: + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + } + + if (!defined('PHP_INT_SIZE')) { + define('PHP_INT_SIZE', 4); + } + + if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) { + switch (PHP_INT_SIZE) { + case 8: // use 64-bit integers if int size is 8 bytes + define('MATH_BIGINTEGER_BASE', 31); + define('MATH_BIGINTEGER_BASE_FULL', 0x80000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF); + define('MATH_BIGINTEGER_MSB', 0x40000000); + // 10**9 is the closest we can get to 2**31 without passing it + define('MATH_BIGINTEGER_MAX10', 1000000000); + define('MATH_BIGINTEGER_MAX10_LEN', 9); + // the largest digit that may be used in addition / subtraction + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62)); + break; + //case 4: // use 64-bit floats if int size is 4 bytes + default: + define('MATH_BIGINTEGER_BASE', 26); + define('MATH_BIGINTEGER_BASE_FULL', 0x4000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF); + define('MATH_BIGINTEGER_MSB', 0x2000000); + // 10**7 is the closest to 2**26 without passing it + define('MATH_BIGINTEGER_MAX10', 10000000); + define('MATH_BIGINTEGER_MAX10_LEN', 7); + // the largest digit that may be used in addition / subtraction + // we do pow(2, 52) instead of using 4503599627370496 directly because some + // PHP installations will truncate 4503599627370496. + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52)); + } + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + switch (true) { + case is_resource($x) && get_resource_type($x) == 'GMP integer': + // PHP 5.6 switched GMP from using resources to objects + case is_object($x) && get_class($x) == 'GMP': + $this->value = $x; + return; + } + $this->value = gmp_init(0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $this->value = '0'; + break; + default: + $this->value = array(); + } + + // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 + // '0' is the only value like this per http://php.net/empty + if (empty($x) && (abs($base) != 256 || $x !== '0')) { + return; + } + + switch ($base) { + case -256: + if (ord($x[0]) & 0x80) { + $x = ~$x; + $this->is_negative = true; + } + case 256: + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $this->value = function_exists('gmp_import') ? + gmp_import($x) : + gmp_init('0x' . bin2hex($x)); + if ($this->is_negative) { + $this->value = gmp_neg($this->value); + } + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // round $len to the nearest 4 (thanks, DavidMJ!) + $len = (strlen($x) + 3) & 0xFFFFFFFC; + + $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); + + for ($i = 0; $i < $len; $i+= 4) { + $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 + $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); + } + + if ($this->is_negative) { + $this->value = '-' . $this->value; + } + + break; + // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) + default: + while (strlen($x)) { + $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE)); + } + } + + if ($this->is_negative) { + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + $this->is_negative = false; + } + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 16: + case -16: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); + + $is_negative = false; + if ($base < 0 && hexdec($x[0]) >= 8) { + $this->is_negative = $is_negative = true; + $x = bin2hex(~pack('H*', $x)); + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; + $this->value = gmp_init($temp); + $this->is_negative = false; + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; + $this->is_negative = false; + break; + default: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $temp->value; + } + + if ($is_negative) { + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 10: + case -10: + // (?value = gmp_init($x); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different + // results then doing it on '-1' does (modInverse does $x[0]) + $this->value = $x === '-' ? '0' : (string) $x; + break; + default: + $temp = new Math_BigInteger(); + + $multiplier = new Math_BigInteger(); + $multiplier->value = array(MATH_BIGINTEGER_MAX10); + + if ($x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT); + while (strlen($x)) { + $temp = $temp->multiply($multiplier); + $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256)); + $x = substr($x, MATH_BIGINTEGER_MAX10_LEN); + } + + $this->value = $temp->value; + } + break; + case 2: // base-2 support originally implemented by Lluis Pamies - thanks! + case -2: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^([01]*).*#', '$1', $x); + $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); + + $str = '0x'; + while (strlen($x)) { + $part = substr($x, 0, 4); + $str.= dechex(bindec($part)); + $x = substr($x, 4); + } + + if ($this->is_negative) { + $str = '-' . $str; + } + + $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16 + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + + break; + default: + // base not supported, so we'll let $this == 0 + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param $x base-10 number or base-$base number if $base set. + * @param int $base + * @access public + */ + function Math_BigInteger($x = 0, $base = 10) + { + $this->__construct($x, $base); + } + + /** + * Converts a BigInteger to a byte string (eg. base-256). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBytes(); // outputs chr(65) + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toBytes($twos_compliment = false) + { + if ($twos_compliment) { + $comparison = $this->compare(new Math_BigInteger()); + if ($comparison == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy(); + $bytes = $temp->toBytes(); + + if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1 + $bytes = chr(0); + } + + if ($this->precision <= 0 && (ord($bytes[0]) & 0x80)) { + $bytes = chr(0) . $bytes; + } + + return $comparison < 0 ? ~$bytes : $bytes; + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + if (gmp_cmp($this->value, gmp_init(0)) == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + if (function_exists('gmp_export')) { + $temp = gmp_export($this->value); + } else { + $temp = gmp_strval(gmp_abs($this->value), 16); + $temp = (strlen($temp) & 1) ? '0' . $temp : $temp; + $temp = pack('H*', $temp); + } + + return $this->precision > 0 ? + substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($temp, chr(0)); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $value = ''; + $current = $this->value; + + if ($current[0] == '-') { + $current = substr($current, 1); + } + + while (bccomp($current, '0', 0) > 0) { + $temp = bcmod($current, '16777216'); + $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; + $current = bcdiv($current, '16777216', 0); + } + + return $this->precision > 0 ? + substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($value, chr(0)); + } + + if (!count($this->value)) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + $result = $this->_int2bytes($this->value[count($this->value) - 1]); + + $temp = $this->copy(); + + for ($i = count($temp->value) - 2; $i >= 0; --$i) { + $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE); + $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); + } + + return $this->precision > 0 ? + str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : + $result; + } + + /** + * Converts a BigInteger to a hex string (eg. base-16)). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toHex(); // outputs '41' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toHex($twos_compliment = false) + { + return bin2hex($this->toBytes($twos_compliment)); + } + + /** + * Converts a BigInteger to a bit string (eg. base-2). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBits(); // outputs '1000001' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**2 + */ + function toBits($twos_compliment = false) + { + $hex = $this->toHex($twos_compliment); + $bits = ''; + for ($i = strlen($hex) - 6, $start = strlen($hex) % 6; $i >= $start; $i-=6) { + $bits = str_pad(decbin(hexdec(substr($hex, $i, 6))), 24, '0', STR_PAD_LEFT) . $bits; + } + if ($start) { // hexdec('') == 0 + $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8 * $start, '0', STR_PAD_LEFT) . $bits; + } + $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); + + if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) { + return '0' . $result; + } + + return $result; + } + + /** + * Converts a BigInteger to a base-10 number. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @return string + * @access public + * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) + */ + function toString() + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_strval($this->value); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return '0'; + } + + return ltrim($this->value, '0'); + } + + if (!count($this->value)) { + return '0'; + } + + $temp = $this->copy(); + $temp->bitmask = false; + $temp->is_negative = false; + + $divisor = new Math_BigInteger(); + $divisor->value = array(MATH_BIGINTEGER_MAX10); + $result = ''; + while (count($temp->value)) { + list($temp, $mod) = $temp->divide($divisor); + $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result; + } + $result = ltrim($result, '0'); + if (empty($result)) { + $result = '0'; + } + + if ($this->is_negative) { + $result = '-' . $result; + } + + return $result; + } + + /** + * Copy an object + * + * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee + * that all objects are passed by value, when appropriate. More information can be found here: + * + * {@link http://php.net/language.oop5.basic#51624} + * + * @access public + * @see self::__clone() + * @return Math_BigInteger + */ + function copy() + { + $temp = new Math_BigInteger(); + $temp->value = $this->value; + $temp->is_negative = $this->is_negative; + $temp->precision = $this->precision; + $temp->bitmask = $this->bitmask; + return $temp; + } + + /** + * __toString() magic method + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * toString(). + * + * @access public + * @internal Implemented per a suggestion by Techie-Michael - thanks! + */ + function __toString() + { + return $this->toString(); + } + + /** + * __clone() magic method + * + * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone() + * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 + * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5, + * call Math_BigInteger::copy(), instead. + * + * @access public + * @see self::copy() + * @return Math_BigInteger + */ + function __clone() + { + return $this->copy(); + } + + /** + * __sleep() magic method + * + * Will be called, automatically, when serialize() is called on a Math_BigInteger object. + * + * @see self::__wakeup() + * @access public + */ + function __sleep() + { + $this->hex = $this->toHex(true); + $vars = array('hex'); + if ($this->precision > 0) { + $vars[] = 'precision'; + } + return $vars; + } + + /** + * __wakeup() magic method + * + * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. + * + * @see self::__sleep() + * @access public + */ + function __wakeup() + { + $temp = new Math_BigInteger($this->hex, -16); + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + if ($this->precision > 0) { + // recalculate $this->bitmask + $this->setPrecision($this->precision); + } + } + + /** + * __debugInfo() magic method + * + * Will be called, automatically, when print_r() or var_dump() are called + * + * @access public + */ + function __debugInfo() + { + $opts = array(); + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $engine = 'gmp'; + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $engine = 'bcmath'; + break; + case MATH_BIGINTEGER_MODE_INTERNAL: + $engine = 'internal'; + $opts[] = PHP_INT_SIZE == 8 ? '64-bit' : '32-bit'; + } + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_GMP && defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $opts[] = 'OpenSSL'; + } + if (!empty($opts)) { + $engine.= ' (' . implode('.', $opts) . ')'; + } + return array( + 'value' => '0x' . $this->toHex(true), + 'engine' => $engine + ); + } + + /** + * Adds two BigIntegers. + * + * Here's an example: + * + * add($b); + * + * echo $c->toString(); // outputs 30 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 addition + */ + function add($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_add($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcadd($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs addition. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _add($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => $y_negative + ); + } elseif ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // subtract, if appropriate + if ($x_negative != $y_negative) { + if ($x_value == $y_value) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + $temp = $this->_subtract($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? + $x_negative : $y_negative; + + return $temp; + } + + if ($x_size < $y_size) { + $size = $x_size; + $value = $y_value; + } else { + $size = $y_size; + $value = $x_value; + } + + $value[count($value)] = 0; // just in case the carry adds an extra digit + + $carry = 0; + for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) + $value[$j] = $temp; + } + + if ($j == $size) { // ie. if $y_size is odd + $sum = $x_value[$i] + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_BASE_FULL; + $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; // ie. let $i = $j since we've just done $value[$i] + } + + if ($carry) { + for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) { + $value[$i] = 0; + } + ++$value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Subtracts two BigIntegers. + * + * Here's an example: + * + * subtract($b); + * + * echo $c->toString(); // outputs -10 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 subtraction + */ + function subtract($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_sub($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcsub($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs subtraction. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _subtract($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => !$y_negative + ); + } elseif ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // add, if appropriate (ie. -$x - +$y or +$x - -$y) + if ($x_negative != $y_negative) { + $temp = $this->_add($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $x_negative; + + return $temp; + } + + $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); + + if (!$diff) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + // switch $x and $y around, if appropriate. + if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_negative = !$x_negative; + + $x_size = count($x_value); + $y_size = count($y_value); + } + + // at this point, $x_value should be at least as big as - if not bigger than - $y_value + + $carry = 0; + for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry; + $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); + $x_value[$j] = $temp; + } + + if ($j == $y_size) { // ie. if $y_size is odd + $sum = $x_value[$i] - $y_value[$i] - $carry; + $carry = $sum < 0; + $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; + } + + if ($carry) { + for (; !$x_value[$i]; ++$i) { + $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT; + } + --$x_value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($x_value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Multiplies two BigIntegers + * + * Here's an example: + * + * multiply($b); + * + * echo $c->toString(); // outputs 200 + * ?> + * + * + * @param Math_BigInteger $x + * @return Math_BigInteger + * @access public + */ + function multiply($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_mul($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcmul($this->value, $x->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); + + $product = new Math_BigInteger(); + $product->value = $temp[MATH_BIGINTEGER_VALUE]; + $product->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($product); + } + + /** + * Performs multiplication. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _multiply($x_value, $x_negative, $y_value, $y_negative) + { + //if ( $x_value == $y_value ) { + // return array( + // MATH_BIGINTEGER_VALUE => $this->_square($x_value), + // MATH_BIGINTEGER_SIGN => $x_sign != $y_value + // ); + //} + + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + return array( + MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_regularMultiply($x_value, $y_value)) : + $this->_trim($this->_karatsuba($x_value, $y_value)), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Performs long multiplication on two BigIntegers + * + * Modeled after 'multiply' in MutableBigInteger.java. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _regularMultiply($x_value, $y_value) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array(); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$j] = $carry; + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$k] = $carry; + } + + return $product_value; + } + + /** + * Performs Karatsuba multiplication on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _karatsuba($x_value, $y_value) + { + $m = min(count($x_value) >> 1, count($y_value) >> 1); + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_regularMultiply($x_value, $y_value); + } + + $x1 = array_slice($x_value, $m); + $x0 = array_slice($x_value, 0, $m); + $y1 = array_slice($y_value, $m); + $y0 = array_slice($y_value, 0, $m); + + $z2 = $this->_karatsuba($x1, $y1); + $z0 = $this->_karatsuba($x0, $y0); + + $z1 = $this->_add($x1, false, $x0, false); + $temp = $this->_add($y1, false, $y0, false); + $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xy[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs squaring + * + * @param array $x + * @return array + * @access private + */ + function _square($x = false) + { + return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_baseSquare($x)) : + $this->_trim($this->_karatsubaSquare($x)); + } + + /** + * Performs traditional squaring on two BigIntegers + * + * Squaring can be done faster than multiplying a number by itself can be. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. + * + * @param array $value + * @return array + * @access private + */ + function _baseSquare($value) + { + if (empty($value)) { + return array(); + } + $square_value = $this->_array_repeat(0, 2 * count($value)); + + for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { + $i2 = $i << 1; + + $temp = $square_value[$i2] + $value[$i] * $value[$i]; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + + // note how we start from $i+1 instead of 0 as we do in multiplication. + for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { + $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + // the following line can yield values larger 2**15. at this point, PHP should switch + // over to floats. + $square_value[$i + $max_index + 1] = $carry; + } + + return $square_value; + } + + /** + * Performs Karatsuba "squaring" on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. + * + * @param array $value + * @return array + * @access private + */ + function _karatsubaSquare($value) + { + $m = count($value) >> 1; + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_baseSquare($value); + } + + $x1 = array_slice($value, $m); + $x0 = array_slice($value, 0, $m); + + $z2 = $this->_karatsubaSquare($x1); + $z0 = $this->_karatsubaSquare($x0); + + $z1 = $this->_add($x1, false, $x0, false); + $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xx[MATH_BIGINTEGER_VALUE]; + } + + /** + * Divides two BigIntegers. + * + * Returns an array whose first element contains the quotient and whose second element contains the + * "common residue". If the remainder would be positive, the "common residue" and the remainder are the + * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder + * and the divisor (basically, the "common residue" is the first positive modulo). + * + * Here's an example: + * + * divide($b); + * + * echo $quotient->toString(); // outputs 0 + * echo "\r\n"; + * echo $remainder->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $y + * @return array + * @access public + * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. + */ + function divide($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); + + if (gmp_sign($remainder->value) < 0) { + $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + case MATH_BIGINTEGER_MODE_BCMATH: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + $quotient->value = bcdiv($this->value, $y->value, 0); + $remainder->value = bcmod($this->value, $y->value); + + if ($remainder->value[0] == '-') { + $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + if (count($y->value) == 1) { + list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + $quotient->value = $q; + $remainder->value = array($r); + $quotient->is_negative = $this->is_negative != $y->is_negative; + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + static $zero; + if (!isset($zero)) { + $zero = new Math_BigInteger(); + } + + $x = $this->copy(); + $y = $y->copy(); + + $x_sign = $x->is_negative; + $y_sign = $y->is_negative; + + $x->is_negative = $y->is_negative = false; + + $diff = $x->compare($y); + + if (!$diff) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + $temp->is_negative = $x_sign != $y_sign; + return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger())); + } + + if ($diff < 0) { + // if $x is negative, "add" $y. + if ($x_sign) { + $x = $y->subtract($x); + } + return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x)); + } + + // normalize $x and $y as described in HAC 14.23 / 14.24 + $msb = $y->value[count($y->value) - 1]; + for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) { + $msb <<= 1; + } + $x->_lshift($shift); + $y->_lshift($shift); + $y_value = &$y->value; + + $x_max = count($x->value) - 1; + $y_max = count($y->value) - 1; + + $quotient = new Math_BigInteger(); + $quotient_value = &$quotient->value; + $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); + + static $temp, $lhs, $rhs; + if (!isset($temp)) { + $temp = new Math_BigInteger(); + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + } + $temp_value = &$temp->value; + $rhs_value = &$rhs->value; + + // $temp = $y << ($x_max - $y_max-1) in base 2**26 + $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); + + while ($x->compare($temp) >= 0) { + // calculate the "common residue" + ++$quotient_value[$x_max - $y_max]; + $x = $x->subtract($temp); + $x_max = count($x->value) - 1; + } + + for ($i = $x_max; $i >= $y_max + 1; --$i) { + $x_value = &$x->value; + $x_window = array( + isset($x_value[$i]) ? $x_value[$i] : 0, + isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, + isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 + ); + $y_window = array( + $y_value[$y_max], + ($y_max > 0) ? $y_value[$y_max - 1] : 0 + ); + + $q_index = $i - $y_max - 1; + if ($x_window[0] == $y_window[0]) { + $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT; + } else { + $quotient_value[$q_index] = $this->_safe_divide( + $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1], + $y_window[0] + ); + } + + $temp_value = array($y_window[1], $y_window[0]); + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + + $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); + + while ($lhs->compare($rhs) > 0) { + --$quotient_value[$q_index]; + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + } + + $adjust = $this->_array_repeat(0, $q_index); + $temp_value = array($quotient_value[$q_index]); + $temp = $temp->multiply($y); + $temp_value = &$temp->value; + if (count($temp_value)) { + $temp_value = array_merge($adjust, $temp_value); + } + + $x = $x->subtract($temp); + + if ($x->compare($zero) < 0) { + $temp_value = array_merge($adjust, $y_value); + $x = $x->add($temp); + + --$quotient_value[$q_index]; + } + + $x_max = count($x_value) - 1; + } + + // unnormalize the remainder + $x->_rshift($shift); + + $quotient->is_negative = $x_sign != $y_sign; + + // calculate the "common residue", if appropriate + if ($x_sign) { + $y->_rshift($shift); + $x = $y->subtract($x); + } + + return array($this->_normalize($quotient), $this->_normalize($x)); + } + + /** + * Divides a BigInteger by a regular integer + * + * abc / x = a00 / x + b0 / x + c / x + * + * @param array $dividend + * @param array $divisor + * @return array + * @access private + */ + function _divide_digit($dividend, $divisor) + { + $carry = 0; + $result = array(); + + for ($i = count($dividend) - 1; $i >= 0; --$i) { + $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i]; + $result[$i] = $this->_safe_divide($temp, $divisor); + $carry = (int) ($temp - $divisor * $result[$i]); + } + + return array($result, $carry); + } + + /** + * Performs modular exponentiation. + * + * Here's an example: + * + * modPow($b, $c); + * + * echo $c->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and + * and although the approach involving repeated squaring does vastly better, it, too, is impractical + * for our purposes. The reason being that division - by far the most complicated and time-consuming + * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. + * + * Modular reductions resolve this issue. Although an individual modular reduction takes more time + * then an individual division, when performed in succession (with the same modulo), they're a lot faster. + * + * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, + * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the + * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because + * the product of two odd numbers is odd), but what about when RSA isn't used? + * + * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a + * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the + * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, + * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and + * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. + * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. + */ + function modPow($e, $n) + { + $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + + if ($e->compare(new Math_BigInteger()) < 0) { + $e = $e->abs(); + + $temp = $this->modInverse($n); + if ($temp === false) { + return false; + } + + return $this->_normalize($temp->modPow($e, $n)); + } + + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP) { + $temp = new Math_BigInteger(); + $temp->value = gmp_powm($this->value, $e->value, $n->value); + + return $this->_normalize($temp); + } + + if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) { + list(, $temp) = $this->divide($n); + return $temp->modPow($e, $n); + } + + if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $components = array( + 'modulus' => $n->toBytes(true), + 'publicExponent' => $e->toBytes(true) + ); + + $components = array( + 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), + 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + 48, + $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; + + $encapsulated = pack( + 'Ca*a*', + 48, + $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($encapsulated)) . + '-----END PUBLIC KEY-----'; + + $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); + + if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { + return new Math_BigInteger($result, 256); + } + } + + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $temp = new Math_BigInteger(); + $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); + + return $this->_normalize($temp); + } + + if (empty($e->value)) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->_normalize($temp); + } + + if ($e->value == array(1)) { + list(, $temp) = $this->divide($n); + return $this->_normalize($temp); + } + + if ($e->value == array(2)) { + $temp = new Math_BigInteger(); + $temp->value = $this->_square($this->value); + list(, $temp) = $temp->divide($n); + return $this->_normalize($temp); + } + + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT)); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + // is the modulo odd? + if ($n->value[0] & 1) { + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY)); + } + // if it's not, it's even + + // find the lowest set bit (eg. the max pow of 2 that divides $n) + for ($i = 0; $i < count($n->value); ++$i) { + if ($n->value[$i]) { + $temp = decbin($n->value[$i]); + $j = strlen($temp) - strrpos($temp, '1') - 1; + $j+= 26 * $i; + break; + } + } + // at this point, 2^$j * $n/(2^$j) == $n + + $mod1 = $n->copy(); + $mod1->_rshift($j); + $mod2 = new Math_BigInteger(); + $mod2->value = array(1); + $mod2->_lshift($j); + + $part1 = ($mod1->value != array(1)) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger(); + $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2); + + $y1 = $mod2->modInverse($mod1); + $y2 = $mod1->modInverse($mod2); + + $result = $part1->multiply($mod2); + $result = $result->multiply($y1); + + $temp = $part2->multiply($mod1); + $temp = $temp->multiply($y2); + + $result = $result->add($temp); + list(, $result) = $result->divide($n); + + return $this->_normalize($result); + } + + /** + * Performs modular exponentiation. + * + * Alias for Math_BigInteger::modPow() + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function powMod($e, $n) + { + return $this->modPow($e, $n); + } + + /** + * Sliding Window k-ary Modular Exponentiation + * + * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, + * however, this function performs a modular reduction after every multiplication and squaring operation. + * As such, this function has the same preconditions that the reductions being used do. + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @param int $mode + * @return Math_BigInteger + * @access private + */ + function _slidingWindow($e, $n, $mode) + { + static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function + //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 + + $e_value = $e->value; + $e_length = count($e_value) - 1; + $e_bits = decbin($e_value[$e_length]); + for ($i = $e_length - 1; $i >= 0; --$i) { + $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT); + } + + $e_length = strlen($e_bits); + + // calculate the appropriate window size. + // $window_size == 3 if $window_ranges is between 25 and 81, for example. + for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { + } + + $n_value = $n->value; + + // precompute $this^0 through $this^$window_size + $powers = array(); + $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); + $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); + + // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end + // in a 1. ie. it's supposed to be odd. + $temp = 1 << ($window_size - 1); + for ($i = 1; $i < $temp; ++$i) { + $i2 = $i << 1; + $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); + } + + $result = array(1); + $result = $this->_prepareReduce($result, $n_value, $mode); + + for ($i = 0; $i < $e_length;) { + if (!$e_bits[$i]) { + $result = $this->_squareReduce($result, $n_value, $mode); + ++$i; + } else { + for ($j = $window_size - 1; $j > 0; --$j) { + if (!empty($e_bits[$i + $j])) { + break; + } + } + + // eg. the length of substr($e_bits, $i, $j + 1) + for ($k = 0; $k <= $j; ++$k) { + $result = $this->_squareReduce($result, $n_value, $mode); + } + + $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); + + $i += $j + 1; + } + } + + $temp = new Math_BigInteger(); + $temp->value = $this->_reduce($result, $n_value, $mode); + + return $temp; + } + + /** + * Modular reduction + * + * For most $modes this will return the remainder. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _reduce($x, $n, $mode) + { + switch ($mode) { + case MATH_BIGINTEGER_MONTGOMERY: + return $this->_montgomery($x, $n); + case MATH_BIGINTEGER_BARRETT: + return $this->_barrett($x, $n); + case MATH_BIGINTEGER_POWEROF2: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + return $x->_mod2($n); + case MATH_BIGINTEGER_CLASSIC: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + case MATH_BIGINTEGER_NONE: + return $x; + default: + // an invalid $mode was provided + } + } + + /** + * Modular reduction preperation + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _prepareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_prepMontgomery($x, $n); + } + return $this->_reduce($x, $n, $mode); + } + + /** + * Modular multiply + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $y + * @param array $n + * @param int $mode + * @return array + */ + function _multiplyReduce($x, $y, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $y, $n); + } + $temp = $this->_multiply($x, false, $y, false); + return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode); + } + + /** + * Modular square + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _squareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $x, $n); + } + return $this->_reduce($this->_square($x), $n, $mode); + } + + /** + * Modulos for Powers of Two + * + * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), + * we'll just use this function as a wrapper for doing that. + * + * @see self::_slidingWindow() + * @access private + * @param Math_BigInteger $n + * @return Math_BigInteger + */ + function _mod2($n) + { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->bitwise_and($n->subtract($temp)); + } + + /** + * Barrett Modular Reduction + * + * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, + * so as not to require negative numbers (initially, this script didn't support negative numbers). + * + * Employs "folding", as described at + * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from + * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." + * + * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that + * usable on account of (1) its not using reasonable radix points as discussed in + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable + * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that + * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line + * comments for details. + * + * @see self::_slidingWindow() + * @access private + * @param array $n + * @param array $m + * @return array + */ + function _barrett($n, $m) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $m_length = count($m); + + // if ($this->_compare($n, $this->_square($m)) >= 0) { + if (count($n) > 2 * $m_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $n; + $rhs->value = $m; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced + if ($m_length < 5) { + return $this->_regularBarrett($n, $m); + } + + // n = 2 * m.length + + if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $m; + + list($u, $m1) = $lhs->divide($rhs); + $u = $u->value; + $m1 = $m1->value; + + $cache[MATH_BIGINTEGER_DATA][] = array( + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1'=> $m1 // m.length + ); + } else { + extract($cache[MATH_BIGINTEGER_DATA][$key]); + } + + $cutoff = $m_length + ($m_length >> 1); + $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) + $msd = array_slice($n, $cutoff); // m.length >> 1 + $lsd = $this->_trim($lsd); + $temp = $this->_multiply($msd, false, $m1, false); + $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1 + + if ($m_length & 1) { + return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m); + } + + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 + $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1); + // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 + // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 + $temp = $this->_multiply($temp, false, $u, false); + // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 + // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1); + // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 + // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) + $temp = $this->_multiply($temp, false, $m, false); + + // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit + // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop + // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). + + $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * (Regular) Barrett Modular Reduction + * + * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this + * is that this function does not fold the denominator into a smaller form. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _regularBarrett($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $n_length = count($n); + + if (count($x) > 2 * $n_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $n; + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, 2 * $n_length); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list($temp, ) = $lhs->divide($rhs); // m.length + $cache[MATH_BIGINTEGER_DATA][] = $temp->value; + } + + // 2 * m.length - (m.length - 1) = m.length + 1 + $temp = array_slice($x, $n_length - 1); + // (m.length + 1) + m.length = 2 * m.length + 1 + $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false); + // (2 * m.length + 1) - (m.length - 1) = m.length + 2 + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1); + + // m.length + 1 + $result = array_slice($x, 0, $n_length + 1); + // m.length + 1 + $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); + // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) + + if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) { + $corrector_value = $this->_array_repeat(0, $n_length + 1); + $corrector_value[count($corrector_value)] = 1; + $result = $this->_add($result, false, $corrector_value, false); + $result = $result[MATH_BIGINTEGER_VALUE]; + } + + // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits + $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]); + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs long multiplication up to $stop digits + * + * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. + * + * @see self::_regularBarrett() + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @param int $stop + * @return array + * @access private + */ + function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($j < $stop) { + $product_value[$j] = $carry; + } + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($k < $stop) { + $product_value[$k] = $carry; + } + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($product_value), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Montgomery Modular Reduction + * + * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be + * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function + * to work correctly. + * + * @see self::_prepMontgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _montgomery($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $x; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n); + } + + $k = count($n); + + $result = array(MATH_BIGINTEGER_VALUE => $x); + + for ($i = 0; $i < $k; ++$i) { + $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_regularMultiply(array($temp), $n); + $temp = array_merge($this->_array_repeat(0, $i), $temp); + $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false); + } + + $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k); + + if ($this->_compare($result, false, $n, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Montgomery Multiply + * + * Interleaves the montgomery reduction and long multiplication algorithms together as described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} + * + * @see self::_prepMontgomery() + * @see self::_montgomery() + * @access private + * @param array $x + * @param array $y + * @param array $m + * @return array + */ + function _montgomeryMultiply($x, $y, $m) + { + $temp = $this->_multiply($x, false, $y, false); + return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m); + } + + $n = max(count($x), count($y), count($m)); + $x = array_pad($x, $n, 0); + $y = array_pad($y, $n, 0); + $m = array_pad($m, $n, 0); + $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1)); + for ($i = 0; $i < $n; ++$i) { + $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); + $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1); + } + if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) { + $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false); + } + return $a[MATH_BIGINTEGER_VALUE]; + } + + /** + * Prepare a number for use in Montgomery Modular Reductions + * + * @see self::_montgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _prepMontgomery($x, $n) + { + $lhs = new Math_BigInteger(); + $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); + $rhs = new Math_BigInteger(); + $rhs->value = $n; + + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + /** + * Modular Inverse of a number mod 2**26 (eg. 67108864) + * + * Based off of the bnpInvDigit function implemented and justified in the following URL: + * + * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} + * + * The following URL provides more info: + * + * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} + * + * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For + * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields + * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't + * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that + * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the + * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to + * 40 bits, which only 64-bit floating points will support. + * + * Thanks to Pedro Gimeno Fortea for input! + * + * @see self::_montgomery() + * @access private + * @param array $x + * @return int + */ + function _modInverse67108864($x) // 2**26 == 67,108,864 + { + $x = -$x[0]; + $result = $x & 0x3; // x**-1 mod 2**2 + $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 + $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 + $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 + $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26 + return $result & MATH_BIGINTEGER_MAX_DIGIT; + } + + /** + * Calculates modular inverses. + * + * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. + * + * Here's an example: + * + * modInverse($b); + * echo $c->toString(); // outputs 4 + * + * echo "\r\n"; + * + * $d = $a->multiply($c); + * list(, $d) = $d->divide($b); + * echo $d; // outputs 1 (as per the definition of modular inverse) + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. + */ + function modInverse($n) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_invert($this->value, $n->value); + + return ($temp->value === false) ? false : $this->_normalize($temp); + } + + static $zero, $one; + if (!isset($zero)) { + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + } + + // $x mod -$n == $x mod $n. + $n = $n->abs(); + + if ($this->compare($zero) < 0) { + $temp = $this->abs(); + $temp = $temp->modInverse($n); + return $this->_normalize($n->subtract($temp)); + } + + extract($this->extendedGCD($n)); + + if (!$gcd->equals($one)) { + return false; + } + + $x = $x->compare($zero) < 0 ? $x->add($n) : $x; + + return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); + } + + /** + * Calculates the greatest common divisor and Bezout's identity. + * + * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that + * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which + * combination is returned is dependent upon which mode is in use. See + * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. + * + * Here's an example: + * + * extendedGCD($b)); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal Calculates the GCD using the binary xGCD algorithim described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, + * the more traditional algorithim requires "relatively costly multiple-precision divisions". + */ + function extendedGCD($n) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + extract(gmp_gcdext($this->value, $n->value)); + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($g)), + 'x' => $this->_normalize(new Math_BigInteger($s)), + 'y' => $this->_normalize(new Math_BigInteger($t)) + ); + case MATH_BIGINTEGER_MODE_BCMATH: + // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works + // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, + // the basic extended euclidean algorithim is what we're using. + + $u = $this->value; + $v = $n->value; + + $a = '1'; + $b = '0'; + $c = '0'; + $d = '1'; + + while (bccomp($v, '0', 0) != 0) { + $q = bcdiv($u, $v, 0); + + $temp = $u; + $u = $v; + $v = bcsub($temp, bcmul($v, $q, 0), 0); + + $temp = $a; + $a = $c; + $c = bcsub($temp, bcmul($a, $q, 0), 0); + + $temp = $b; + $b = $d; + $d = bcsub($temp, bcmul($b, $q, 0), 0); + } + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($u)), + 'x' => $this->_normalize(new Math_BigInteger($a)), + 'y' => $this->_normalize(new Math_BigInteger($b)) + ); + } + + $y = $n->copy(); + $x = $this->copy(); + $g = new Math_BigInteger(); + $g->value = array(1); + + while (!(($x->value[0] & 1)|| ($y->value[0] & 1))) { + $x->_rshift(1); + $y->_rshift(1); + $g->_lshift(1); + } + + $u = $x->copy(); + $v = $y->copy(); + + $a = new Math_BigInteger(); + $b = new Math_BigInteger(); + $c = new Math_BigInteger(); + $d = new Math_BigInteger(); + + $a->value = $d->value = $g->value = array(1); + $b->value = $c->value = array(); + + while (!empty($u->value)) { + while (!($u->value[0] & 1)) { + $u->_rshift(1); + if ((!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1))) { + $a = $a->add($y); + $b = $b->subtract($x); + } + $a->_rshift(1); + $b->_rshift(1); + } + + while (!($v->value[0] & 1)) { + $v->_rshift(1); + if ((!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1))) { + $c = $c->add($y); + $d = $d->subtract($x); + } + $c->_rshift(1); + $d->_rshift(1); + } + + if ($u->compare($v) >= 0) { + $u = $u->subtract($v); + $a = $a->subtract($c); + $b = $b->subtract($d); + } else { + $v = $v->subtract($u); + $c = $c->subtract($a); + $d = $d->subtract($b); + } + } + + return array( + 'gcd' => $this->_normalize($g->multiply($v)), + 'x' => $this->_normalize($c), + 'y' => $this->_normalize($d) + ); + } + + /** + * Calculates the greatest common divisor + * + * Say you have 693 and 609. The GCD is 21. + * + * Here's an example: + * + * extendedGCD($b); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function gcd($n) + { + extract($this->extendedGCD($n)); + return $gcd; + } + + /** + * Absolute value. + * + * @return Math_BigInteger + * @access public + */ + function abs() + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp->value = gmp_abs($this->value); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; + break; + default: + $temp->value = $this->value; + } + + return $temp; + } + + /** + * Compares two numbers. + * + * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is + * demonstrated thusly: + * + * $x > $y: $x->compare($y) > 0 + * $x < $y: $x->compare($y) < 0 + * $x == $y: $x->compare($y) == 0 + * + * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). + * + * @param Math_BigInteger $y + * @return int < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. + * @access public + * @see self::equals() + * @internal Could return $this->subtract($x), but that's not as fast as what we do do. + */ + function compare($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $r = gmp_cmp($this->value, $y->value); + if ($r < -1) { + $r = -1; + } + if ($r > 1) { + $r = 1; + } + return $r; + case MATH_BIGINTEGER_MODE_BCMATH: + return bccomp($this->value, $y->value, 0); + } + + return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); + } + + /** + * Compares two numbers. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return int + * @see self::compare() + * @access private + */ + function _compare($x_value, $x_negative, $y_value, $y_negative) + { + if ($x_negative != $y_negative) { + return (!$x_negative && $y_negative) ? 1 : -1; + } + + $result = $x_negative ? -1 : 1; + + if (count($x_value) != count($y_value)) { + return (count($x_value) > count($y_value)) ? $result : -$result; + } + $size = max(count($x_value), count($y_value)); + + $x_value = array_pad($x_value, $size, 0); + $y_value = array_pad($y_value, $size, 0); + + for ($i = count($x_value) - 1; $i >= 0; --$i) { + if ($x_value[$i] != $y_value[$i]) { + return ($x_value[$i] > $y_value[$i]) ? $result : -$result; + } + } + + return 0; + } + + /** + * Tests the equality of two numbers. + * + * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare() + * + * @param Math_BigInteger $x + * @return bool + * @access public + * @see self::compare() + */ + function equals($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_cmp($this->value, $x->value) == 0; + default: + return $this->value === $x->value && $this->is_negative == $x->is_negative; + } + } + + /** + * Set Precision + * + * Some bitwise operations give different results depending on the precision being used. Examples include left + * shift, not, and rotates. + * + * @param int $bits + * @access public + */ + function setPrecision($bits) + { + $this->precision = $bits; + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH) { + $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); + } else { + $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0)); + } + + $temp = $this->_normalize($this); + $this->value = $temp->value; + } + + /** + * Logical And + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_and($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_and($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left & $right, 256)); + } + + $result = $this->copy(); + + $length = min(count($x->value), count($this->value)); + + $result->value = array_slice($result->value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]&= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_or($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_or($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left | $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]|= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Exclusive-Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_xor($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_xor(gmp_abs($this->value), gmp_abs($x->value)); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left ^ $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->is_negative = false; + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]^= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Not + * + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_not() + { + // calculuate "not" without regard to $this->precision + // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) + $temp = $this->toBytes(); + if ($temp == '') { + return $this->_normalize(new Math_BigInteger()); + } + $pre_msb = decbin(ord($temp[0])); + $temp = ~$temp; + $msb = decbin(ord($temp[0])); + if (strlen($msb) == 8) { + $msb = substr($msb, strpos($msb, '0')); + } + $temp[0] = chr(bindec($msb)); + + // see if we need to add extra leading 1's + $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; + $new_bits = $this->precision - $current_bits; + if ($new_bits <= 0) { + return $this->_normalize(new Math_BigInteger($temp, 256)); + } + + // generate as many leading 1's as we need to. + $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); + $this->_base256_lshift($leading_ones, $current_bits); + + $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256)); + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. + * + * @param int $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_rightShift($shift) + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_rshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. + * + * @param int $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_leftShift($shift) + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_lshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Rotate + * + * Instead of the top x bits being dropped they're appended to the shifted bit string. + * + * @param int $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_leftRotate($shift) + { + $bits = $this->toBytes(); + + if ($this->precision > 0) { + $precision = $this->precision; + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $mask = $this->bitmask->subtract(new Math_BigInteger(1)); + $mask = $mask->toBytes(); + } else { + $mask = $this->bitmask->toBytes(); + } + } else { + $temp = ord($bits[0]); + for ($i = 0; $temp >> $i; ++$i) { + } + $precision = 8 * strlen($bits) - 8 + $i; + $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); + } + + if ($shift < 0) { + $shift+= $precision; + } + $shift%= $precision; + + if (!$shift) { + return $this->copy(); + } + + $left = $this->bitwise_leftShift($shift); + $left = $left->bitwise_and(new Math_BigInteger($mask, 256)); + $right = $this->bitwise_rightShift($precision - $shift); + $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); + return $this->_normalize($result); + } + + /** + * Logical Right Rotate + * + * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. + * + * @param int $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_rightRotate($shift) + { + return $this->bitwise_leftRotate(-$shift); + } + + /** + * Set random number generator function + * + * This function is deprecated. + * + * @param string $generator + * @access public + */ + function setRandomGenerator($generator) + { + } + + /** + * Generates a random BigInteger + * + * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not. + * + * @param int $size + * @return Math_BigInteger + * @access private + */ + function _random_number_helper($size) + { + if (function_exists('crypt_random_string')) { + $random = crypt_random_string($size); + } else { + $random = ''; + + if ($size & 1) { + $random.= chr(mt_rand(0, 255)); + } + + $blocks = $size >> 1; + for ($i = 0; $i < $blocks; ++$i) { + // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems + $random.= pack('n', mt_rand(0, 0xFFFF)); + } + } + + return new Math_BigInteger($random, 256); + } + + /** + * Generate a random number + * + * Returns a random number between $min and $max where $min and $max + * can be defined using one of the two methods: + * + * $min->random($max) + * $max->random($min) + * + * @param Math_BigInteger $arg1 + * @param Math_BigInteger $arg2 + * @return Math_BigInteger + * @access public + * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object. + * That method is still supported for BC purposes. + */ + function random($arg1, $arg2 = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $this->_normalize($min); + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one; + if (!isset($one)) { + $one = new Math_BigInteger(1); + } + + $max = $max->subtract($min->subtract($one)); + $size = strlen(ltrim($max->toBytes(), chr(0))); + + /* + doing $random % $max doesn't work because some numbers will be more likely to occur than others. + eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 + would produce 5 whereas the only value of random that could produce 139 would be 139. ie. + not all numbers would be equally likely. some would be more likely than others. + + creating a whole new random number until you find one that is within the range doesn't work + because, for sufficiently small ranges, the likelihood that you'd get a number within that range + would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability + would be pretty high that $random would be greater than $max. + + phpseclib works around this using the technique described here: + + http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string + */ + $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256); + $random = $this->_random_number_helper($size); + + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + + while ($random->compare($max_multiple) >= 0) { + $random = $random->subtract($max_multiple); + $random_max = $random_max->subtract($max_multiple); + $random = $random->bitwise_leftShift(8); + $random = $random->add($this->_random_number_helper(1)); + $random_max = $random_max->bitwise_leftShift(8); + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + } + list(, $random) = $random->divide($max); + + return $this->_normalize($random->add($min)); + } + + /** + * Generate a random prime number. + * + * If there's not a prime within the given range, false will be returned. + * If more than $timeout seconds have elapsed, give up and return false. + * + * @param Math_BigInteger $arg1 + * @param Math_BigInteger $arg2 + * @param int $timeout + * @return Math_BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. + */ + function randomPrime($arg1, $arg2 = false, $timeout = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $min->isPrime() ? $min : false; + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one, $two; + if (!isset($one)) { + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + $start = time(); + + $x = $this->random($min, $max); + + // gmp_nextprime() requires PHP 5 >= 5.2.0 per . + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && extension_loaded('gmp') && version_compare(PHP_VERSION, '5.2.0', '>=')) { + $p = new Math_BigInteger(); + $p->value = gmp_nextprime($x->value); + + if ($p->compare($max) <= 0) { + return $p; + } + + if (!$min->equals($x)) { + $x = $x->subtract($one); + } + + return $x->randomPrime($min, $x); + } + + if ($x->equals($two)) { + return $x; + } + + $x->_make_odd(); + if ($x->compare($max) > 0) { + // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range + if ($min->equals($max)) { + return false; + } + $x = $min->copy(); + $x->_make_odd(); + } + + $initial_x = $x->copy(); + + while (true) { + if ($timeout !== false && time() - $start > $timeout) { + return false; + } + + if ($x->isPrime()) { + return $x; + } + + $x = $x->add($two); + + if ($x->compare($max) > 0) { + $x = $min->copy(); + if ($x->equals($two)) { + return $x; + } + $x->_make_odd(); + } + + if ($x->equals($initial_x)) { + return false; + } + } + } + + /** + * Make the current number odd + * + * If the current number is odd it'll be unchanged. If it's even, one will be added to it. + * + * @see self::randomPrime() + * @access private + */ + function _make_odd() + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + gmp_setbit($this->value, 0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + $this->value = bcadd($this->value, '1'); + } + break; + default: + $this->value[0] |= 1; + } + } + + /** + * Checks a numer to see if it's prime + * + * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the + * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads + * on a website instead of just one. + * + * @param Math_BigInteger $t + * @return bool + * @access public + * @internal Uses the + * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. + */ + function isPrime($t = false) + { + $length = strlen($this->toBytes()); + + if (!$t) { + // see HAC 4.49 "Note (controlling the error probability)" + // @codingStandardsIgnoreStart + if ($length >= 163) { $t = 2; } // floor(1300 / 8) + else if ($length >= 106) { $t = 3; } // floor( 850 / 8) + else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) + else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) + else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) + else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) + else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) + else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) + else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) + else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) + else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) + else { $t = 27; } + // @codingStandardsIgnoreEnd + } + + // ie. gmp_testbit($this, 0) + // ie. isEven() or !isOdd() + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_prob_prime($this->value, $t) != 0; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '2') { + return true; + } + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + return false; + } + break; + default: + if ($this->value == array(2)) { + return true; + } + if (~$this->value[0] & 1) { + return false; + } + } + + static $primes, $zero, $one, $two; + + if (!isset($primes)) { + $primes = array( + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997 + ); + + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + for ($i = 0; $i < count($primes); ++$i) { + $primes[$i] = new Math_BigInteger($primes[$i]); + } + } + + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + if ($this->equals($one)) { + return false; + } + + // see HAC 4.4.1 "Random search for probable primes" + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + foreach ($primes as $prime) { + list(, $r) = $this->divide($prime); + if ($r->equals($zero)) { + return $this->equals($prime); + } + } + } else { + $value = $this->value; + foreach ($primes as $prime) { + list(, $r) = $this->_divide_digit($value, $prime); + if (!$r) { + return count($value) == 1 && $value[0] == $prime; + } + } + } + + $n = $this->copy(); + $n_1 = $n->subtract($one); + $n_2 = $n->subtract($two); + + $r = $n_1->copy(); + $r_value = $r->value; + // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $s = 0; + // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier + while ($r->value[strlen($r->value) - 1] % 2 == 0) { + $r->value = bcdiv($r->value, '2', 0); + ++$s; + } + } else { + for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { + $temp = ~$r_value[$i] & 0xFFFFFF; + for ($j = 1; ($temp >> $j) & 1; ++$j) { + } + if ($j != 25) { + break; + } + } + $s = 26 * $i + $j; + $r->_rshift($s); + } + + for ($i = 0; $i < $t; ++$i) { + $a = $this->random($two, $n_2); + $y = $a->modPow($r, $n); + + if (!$y->equals($one) && !$y->equals($n_1)) { + for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { + $y = $y->modPow($two, $n); + if ($y->equals($one)) { + return false; + } + } + + if (!$y->equals($n_1)) { + return false; + } + } + } + return true; + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _lshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $shift = 1 << $shift; + + $carry = 0; + + for ($i = 0; $i < count($this->value); ++$i) { + $temp = $this->value[$i] * $shift + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL); + } + + if ($carry) { + $this->value[count($this->value)] = $carry; + } + + while ($num_digits--) { + array_unshift($this->value, 0); + } + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _rshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $carry_shift = MATH_BIGINTEGER_BASE - $shift; + $carry_mask = (1 << $shift) - 1; + + if ($num_digits) { + $this->value = array_slice($this->value, $num_digits); + } + + $carry = 0; + + for ($i = count($this->value) - 1; $i >= 0; --$i) { + $temp = $this->value[$i] >> $shift | $carry; + $carry = ($this->value[$i] & $carry_mask) << $carry_shift; + $this->value[$i] = $temp; + } + + $this->value = $this->_trim($this->value); + } + + /** + * Normalize + * + * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision + * + * @param Math_BigInteger $result + * @return Math_BigInteger + * @see self::_trim() + * @access private + */ + function _normalize($result) + { + $result->precision = $this->precision; + $result->bitmask = $this->bitmask; + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + if ($this->bitmask !== false) { + $flip = gmp_cmp($result->value, gmp_init(0)) < 0; + if ($flip) { + $result->value = gmp_neg($result->value); + } + $result->value = gmp_and($result->value, $result->bitmask->value); + if ($flip) { + $result->value = gmp_neg($result->value); + } + } + + return $result; + case MATH_BIGINTEGER_MODE_BCMATH: + if (!empty($result->bitmask->value)) { + $result->value = bcmod($result->value, $result->bitmask->value); + } + + return $result; + } + + $value = &$result->value; + + if (!count($value)) { + $result->is_negative = false; + return $result; + } + + $value = $this->_trim($value); + + if (!empty($result->bitmask->value)) { + $length = min(count($value), count($this->bitmask->value)); + $value = array_slice($value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $value[$i] = $value[$i] & $this->bitmask->value[$i]; + } + } + + return $result; + } + + /** + * Trim + * + * Removes leading zeros + * + * @param array $value + * @return Math_BigInteger + * @access private + */ + function _trim($value) + { + for ($i = count($value) - 1; $i >= 0; --$i) { + if ($value[$i]) { + break; + } + unset($value[$i]); + } + + return $value; + } + + /** + * Array Repeat + * + * @param array $input + * @param mixed $multiplier + * @return array + * @access private + */ + function _array_repeat($input, $multiplier) + { + return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); + } + + /** + * Logical Left Shift + * + * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. + * + * @param string $x (by reference) + * @param int $shift + * @return string + * @access private + */ + function _base256_lshift(&$x, $shift) + { + if ($shift == 0) { + return; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $carry = 0; + for ($i = strlen($x) - 1; $i >= 0; --$i) { + $temp = ord($x[$i]) << $shift | $carry; + $x[$i] = chr($temp); + $carry = $temp >> 8; + } + $carry = ($carry != 0) ? chr($carry) : ''; + $x = $carry . $x . str_repeat(chr(0), $num_bytes); + } + + /** + * Logical Right Shift + * + * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. + * + * @param string $x (by referenc) + * @param int $shift + * @return string + * @access private + */ + function _base256_rshift(&$x, $shift) + { + if ($shift == 0) { + $x = ltrim($x, chr(0)); + return ''; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $remainder = ''; + if ($num_bytes) { + $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; + $remainder = substr($x, $start); + $x = substr($x, 0, -$num_bytes); + } + + $carry = 0; + $carry_shift = 8 - $shift; + for ($i = 0; $i < strlen($x); ++$i) { + $temp = (ord($x[$i]) >> $shift) | $carry; + $carry = (ord($x[$i]) << $carry_shift) & 0xFF; + $x[$i] = chr($temp); + } + $x = ltrim($x, chr(0)); + + $remainder = chr($carry >> $carry_shift) . $remainder; + + return ltrim($remainder, chr(0)); + } + + // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long + // at 32-bits, while java's longs are 64-bits. + + /** + * Converts 32-bit integers to bytes. + * + * @param int $x + * @return string + * @access private + */ + function _int2bytes($x) + { + return ltrim(pack('N', $x), chr(0)); + } + + /** + * Converts bytes to 32-bit integers + * + * @param string $x + * @return int + * @access private + */ + function _bytes2int($x) + { + $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); + return $temp['int']; + } + + /** + * DER-encode an integer + * + * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL + * + * @see self::modPow() + * @access private + * @param int $length + * @return string + */ + function _encodeASN1Length($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * Single digit division + * + * Even if int64 is being used the division operator will return a float64 value + * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't + * have the precision of int64 this is a problem so, when int64 is being used, + * we'll guarantee that the dividend is divisible by first subtracting the remainder. + * + * @access private + * @param int $x + * @param int $y + * @return int + */ + function _safe_divide($x, $y) + { + if (MATH_BIGINTEGER_BASE === 26) { + return (int) ($x / $y); + } + + // MATH_BIGINTEGER_BASE === 31 + return ($x - ($x % $y)) / $y; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RC2.php b/app/Http/Controllers/dgaAdmin/Crypt/RC2.php new file mode 100644 index 0000000..f88ef9b --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/RC2.php @@ -0,0 +1,761 @@ + + * setKey('abcdefgh'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $rc2->decrypt($rc2->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RC2 + * @author Patrick Monnerat + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of RC2. + * + * @package Crypt_RC2 + * @access public + */ +class Crypt_RC2 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * The Key + * + * @see Crypt_Base::key + * @see self::setKey() + * @var string + * @access private + */ + var $key; + + /** + * The Original (unpadded) Key + * + * @see Crypt_Base::key + * @see self::setKey() + * @see self::encrypt() + * @see self::decrypt() + * @var string + * @access private + */ + var $orig_key; + + /** + * Don't truncate / null pad key + * + * @see Crypt_Base::_clearBuffers() + * @var bool + * @access private + */ + var $skip_key_adjustment = true; + + /** + * Key Length (in bytes) + * + * @see Crypt_RC2::setKeyLength() + * @var int + * @access private + */ + var $key_length = 16; // = 128 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RC2'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'rc2'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * The key length in bits. + * + * @see self::setKeyLength() + * @see self::setKey() + * @var int + * @access private + * @internal Should be in range [1..1024]. + * @internal Changing this value after setting the key has no effect. + */ + var $default_key_length = 1024; + + /** + * The key length in bits. + * + * @see self::isValidEnine() + * @see self::setKey() + * @var int + * @access private + * @internal Should be in range [1..1024]. + */ + var $current_key_length; + + /** + * The Key Schedule + * + * @see self::_setupKey() + * @var array + * @access private + */ + var $keys; + + /** + * Key expansion randomization table. + * Twice the same 256-value sequence to save a modulus in key expansion. + * + * @see self::setKey() + * @var array + * @access private + */ + var $pitable = array( + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD + ); + + /** + * Inverse key expansion randomization table. + * + * @see self::setKey() + * @var array + * @access private + */ + var $invpitable = array( + 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, + 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, + 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, + 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, + 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, + 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, + 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, + 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, + 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, + 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, + 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, + 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, + 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, + 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, + 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, + 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, + 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, + 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, + 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, + 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, + 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, + 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, + 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, + 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, + 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, + 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, + 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, + 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, + 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, + 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, + 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, + 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 + ); + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'rc2-ecb'; + $this->cipher_name_openssl = 'rc2-' . $this->_openssl_translate_mode(); + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the key length. + * + * Valid key lengths are 8 to 1024. + * Calling this function after setting the key has no effect until the next + * Crypt_RC2::setKey() call. + * + * @access public + * @param int $length in bits + */ + function setKeyLength($length) + { + if ($length < 8) { + $this->default_key_length = 1; + } elseif ($length > 1024) { + $this->default_key_length = 128; + } else { + $this->default_key_length = $length; + } + $this->current_key_length = $this->default_key_length; + + parent::setKeyLength($length); + } + + /** + * Returns the current key length + * + * @access public + * @return int + */ + function getKeyLength() + { + return $this->current_key_length; + } + + /** + * Sets the key. + * + * Keys can be of any length. RC2, itself, uses 8 to 1024 bit keys (eg. + * strlen($key) <= 128), however, we only use the first 128 bytes if $key + * has more then 128 bytes in it, and set $key to a single null byte if + * it is empty. + * + * If the key is not explicitly set, it'll be assumed to be a single + * null byte. + * + * @see Crypt_Base::setKey() + * @access public + * @param string $key + * @param int $t1 optional Effective key length in bits. + */ + function setKey($key, $t1 = 0) + { + $this->orig_key = $key; + + if ($t1 <= 0) { + $t1 = $this->default_key_length; + } elseif ($t1 > 1024) { + $t1 = 1024; + } + $this->current_key_length = $t1; + // Key byte count should be 1..128. + $key = strlen($key) ? substr($key, 0, 128) : "\x00"; + $t = strlen($key); + + // The mcrypt RC2 implementation only supports effective key length + // of 1024 bits. It is however possible to handle effective key + // lengths in range 1..1024 by expanding the key and applying + // inverse pitable mapping to the first byte before submitting it + // to mcrypt. + + // Key expansion. + $l = array_values(unpack('C*', $key)); + $t8 = ($t1 + 7) >> 3; + $tm = 0xFF >> (8 * $t8 - $t1); + + // Expand key. + $pitable = $this->pitable; + for ($i = $t; $i < 128; $i++) { + $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; + } + $i = 128 - $t8; + $l[$i] = $pitable[$l[$i] & $tm]; + while ($i--) { + $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; + } + + // Prepare the key for mcrypt. + $l[0] = $this->invpitable[$l[0]]; + array_unshift($l, 'C*'); + + parent::setKey(call_user_func_array('pack', $l)); + } + + /** + * Encrypts a message. + * + * Mostly a wrapper for Crypt_Base::encrypt, with some additional OpenSSL handling code + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + */ + function encrypt($plaintext) + { + if ($this->engine == CRYPT_ENGINE_OPENSSL) { + $temp = $this->key; + $this->key = $this->orig_key; + $result = parent::encrypt($plaintext); + $this->key = $temp; + return $result; + } + + return parent::encrypt($plaintext); + } + + /** + * Decrypts a message. + * + * Mostly a wrapper for Crypt_Base::decrypt, with some additional OpenSSL handling code + * + * @see self::encrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine == CRYPT_ENGINE_OPENSSL) { + $temp = $this->key; + $this->key = $this->orig_key; + $result = parent::decrypt($ciphertext); + $this->key = $temp; + return $result; + } + + return parent::decrypt($ciphertext); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F]; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Setup the CRYPT_ENGINE_MCRYPT $engine + * + * @see Crypt_Base::_setupMcrypt() + * @access private + */ + function _setupMcrypt() + { + if (!isset($this->key)) { + $this->setKey(''); + } + + parent::_setupMcrypt(); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (!isset($this->key)) { + $this->setKey(''); + } + + // Key has already been expanded in Crypt_RC2::setKey(): + // Only the first value must be altered. + $l = unpack('Ca/Cb/v*', $this->key); + array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8)); + unset($l['a']); + unset($l['b']); + $this->keys = $l; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions = &Crypt_RC2::_getLambdaFunctions(); + + // The first 10 generated $lambda_functions will use the $keys hardcoded as integers + // for the mixing rounds, for better inline crypt performance [~20% faster]. + // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10. + // (Currently, for Crypt_RC2, one generated $lambda_function cost on php5.5@32bit ~60kb unfreeable mem and ~100kb on php5.5@64bit) + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_RC2, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + // Is there a re-usable $lambda_functions in there? + // If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = '$keys = $self->keys;'; + + switch (true) { + case $gen_hi_opt_code: + $keys = $this->keys; + default: + $keys = array(); + foreach ($this->keys as $k => $v) { + $keys[$k] = '$keys[' . $k . ']'; + } + } + + // $in is the current 8 bytes block which has to be en/decrypt + $encrypt_block = $decrypt_block = ' + $in = unpack("v4", $in); + $r0 = $in[1]; + $r1 = $in[2]; + $r2 = $in[3]; + $r3 = $in[4]; + '; + + // Create code for encryption. + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $encrypt_block .= ' + $r0 = (($r0 + ' . $keys[$j++] . ' + + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + ' . $keys[$j++] . ' + + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + ' . $keys[$j++] . ' + + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + ' . $keys[$j++] . ' + + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16;'; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $encrypt_block .= ' + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F];'; + $limit = $actions[$limit]; + } + } + + $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Create code for decryption. + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $decrypt_block .= ' + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - ' . $keys[--$j] . ' - + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - ' . $keys[--$j] . ' - + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - ' . $keys[--$j] . ' - + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - ' . $keys[--$j] . ' - + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $decrypt_block .= ' + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; + $limit = $actions[$limit]; + } + } + + $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RC4.php b/app/Http/Controllers/dgaAdmin/Crypt/RC4.php new file mode 100644 index 0000000..8a59518 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/RC4.php @@ -0,0 +1,366 @@ + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rc4->decrypt($rc4->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RC4 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see self::_crypt() + */ +define('CRYPT_RC4_ENCRYPT', 0); +define('CRYPT_RC4_DECRYPT', 1); +/**#@-*/ + +/** + * Pure-PHP implementation of RC4. + * + * @package Crypt_RC4 + * @author Jim Wigginton + * @access public + */ +class Crypt_RC4 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * RC4 is a stream cipher + * so we the block_size to 0 + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 0; + + /** + * Key Length (in bytes) + * + * @see Crypt_RC4::setKeyLength() + * @var int + * @access private + */ + var $key_length = 128; // = 1024 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RC4'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'arcfour'; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see Crypt_Base::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt = false; // currently not available + + /** + * The Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key; + + /** + * The Key Stream for decryption and encryption + * + * @see self::setKey() + * @var array + * @access private + */ + var $stream; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * @see Crypt_Base::Crypt_Base() + * @return Crypt_RC4 + * @access public + */ + function __construct() + { + parent::__construct(CRYPT_MODE_STREAM); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function Crypt_RC4() + { + $this->__construct(); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + if (version_compare(PHP_VERSION, '5.3.7') >= 0) { + $this->cipher_name_openssl = 'rc4-40'; + } else { + switch (strlen($this->key)) { + case 5: + $this->cipher_name_openssl = 'rc4-40'; + break; + case 8: + $this->cipher_name_openssl = 'rc4-64'; + break; + case 16: + $this->cipher_name_openssl = 'rc4'; + break; + default: + return false; + } + } + } + + return parent::isValidEngine($engine); + } + + /** + * Dummy function. + * + * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. + * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before + * calling setKey(). + * + * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, + * the IV's are relatively easy to predict, an attack described by + * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} + * can be used to quickly guess at the rest of the key. The following links elaborate: + * + * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} + * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} + * + * @param string $iv + * @see self::setKey() + * @access public + */ + function setIV($iv) + { + } + + /** + * Sets the key length + * + * Keys can be between 1 and 256 bytes long. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + if ($length < 8) { + $this->key_length = 1; + } elseif ($length > 2048) { + $this->key_length = 256; + } else { + $this->key_length = $length >> 3; + } + + parent::setKeyLength($length); + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::decrypt() + * @see self::_crypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + */ + function encrypt($plaintext) + { + if ($this->engine != CRYPT_ENGINE_INTERNAL) { + return parent::encrypt($plaintext); + } + return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); + } + + /** + * Decrypts a message. + * + * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). + * At least if the continuous buffer is disabled. + * + * @see Crypt_Base::encrypt() + * @see self::_crypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine != CRYPT_ENGINE_INTERNAL) { + return parent::decrypt($ciphertext); + } + return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); + } + + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + $key = $this->key; + $keyLength = strlen($key); + $keyStream = range(0, 255); + $j = 0; + for ($i = 0; $i < 256; $i++) { + $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; + $temp = $keyStream[$i]; + $keyStream[$i] = $keyStream[$j]; + $keyStream[$j] = $temp; + } + + $this->stream = array(); + $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array( + 0, // index $i + 0, // index $j + $keyStream + ); + } + + /** + * Encrypts or decrypts a message. + * + * @see self::encrypt() + * @see self::decrypt() + * @access private + * @param string $text + * @param int $mode + * @return string $text + */ + function _crypt($text, $mode) + { + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + + $stream = &$this->stream[$mode]; + if ($this->continuousBuffer) { + $i = &$stream[0]; + $j = &$stream[1]; + $keyStream = &$stream[2]; + } else { + $i = $stream[0]; + $j = $stream[1]; + $keyStream = $stream[2]; + } + + $len = strlen($text); + for ($k = 0; $k < $len; ++$k) { + $i = ($i + 1) & 255; + $ksi = $keyStream[$i]; + $j = ($j + $ksi) & 255; + $ksj = $keyStream[$j]; + + $keyStream[$i] = $ksj; + $keyStream[$j] = $ksi; + $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); + } + + return $text; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RSA.php b/app/Http/Controllers/dgaAdmin/Crypt/RSA.php new file mode 100644 index 0000000..817b1a3 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/RSA.php @@ -0,0 +1,3349 @@ + + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $ciphertext = $rsa->encrypt($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->decrypt($ciphertext); + * ?> + * + * + * Here's an example of how to create signatures and verify signatures with this library: + * + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $signature = $rsa->sign($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RSA + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Random + */ +// the class_exists() will only be called if the crypt_random_string function hasn't been defined and +// will trigger a call to __autoload() if you're wanting to auto-load classes +// call function_exists() a second time to stop the include_once from being called outside +// of the auto loader +if (!function_exists('crypt_random_string')) { + include_once 'Random.php'; +} + +/** + * Include Crypt_Hash + */ +if (!class_exists('Crypt_Hash')) { + include_once 'Hash.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} + * (OAEP) for encryption / decryption. + * + * Uses sha1 by default. + * + * @see self::setHash() + * @see self::setMGFHash() + */ +define('CRYPT_RSA_ENCRYPTION_OAEP', 1); +/** + * Use PKCS#1 padding. + * + * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards + * compatibility with protocols (like SSH-1) written before OAEP's introduction. + */ +define('CRYPT_RSA_ENCRYPTION_PKCS1', 2); +/** + * Do not use any padding + * + * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy + * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc. + */ +define('CRYPT_RSA_ENCRYPTION_NONE', 3); +/**#@-*/ + +/**#@+ + * @access public + * @see self::sign() + * @see self::verify() + * @see self::setHash() + */ +/** + * Use the Probabilistic Signature Scheme for signing + * + * Uses sha1 by default. + * + * @see self::setSaltLength() + * @see self::setMGFHash() + */ +define('CRYPT_RSA_SIGNATURE_PSS', 1); +/** + * Use the PKCS#1 scheme by default. + * + * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards + * compatibility with protocols (like SSH-2) written before PSS's introduction. + */ +define('CRYPT_RSA_SIGNATURE_PKCS1', 2); +/**#@-*/ + +/**#@+ + * @access private + * @see self::createKey() + */ +/** + * ASN1 Integer + */ +define('CRYPT_RSA_ASN1_INTEGER', 2); +/** + * ASN1 Bit String + */ +define('CRYPT_RSA_ASN1_BITSTRING', 3); +/** + * ASN1 Octet String + */ +define('CRYPT_RSA_ASN1_OCTETSTRING', 4); +/** + * ASN1 Object Identifier + */ +define('CRYPT_RSA_ASN1_OBJECT', 6); +/** + * ASN1 Sequence (with the constucted bit set) + */ +define('CRYPT_RSA_ASN1_SEQUENCE', 48); +/**#@-*/ + +/**#@+ + * @access private + * @see self::Crypt_RSA() + */ +/** + * To use the pure-PHP implementation + */ +define('CRYPT_RSA_MODE_INTERNAL', 1); +/** + * To use the OpenSSL library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('CRYPT_RSA_MODE_OPENSSL', 2); +/**#@-*/ + +/** + * Default openSSL configuration file. + */ +define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf'); + +/**#@+ + * @access public + * @see self::createKey() + * @see self::setPrivateKeyFormat() + */ +/** + * PKCS#1 formatted private key + * + * Used by OpenSSH + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0); +/** + * PuTTY formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1); +/** + * XML formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2); +/** + * PKCS#8 formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 8); +/** + * OpenSSH formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_OPENSSH', 9); +/**#@-*/ + +/**#@+ + * @access public + * @see self::createKey() + * @see self::setPublicKeyFormat() + */ +/** + * Raw public key + * + * An array containing two Math_BigInteger objects. + * + * The exponent can be indexed with any of the following: + * + * 0, e, exponent, publicExponent + * + * The modulus can be indexed with any of the following: + * + * 1, n, modulo, modulus + */ +define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3); +/** + * PKCS#1 formatted public key (raw) + * + * Used by File/X509.php + * + * Has the following header: + * + * -----BEGIN RSA PUBLIC KEY----- + * + * Analogous to ssh-keygen's pem format (as specified by -m) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4); +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4); +/** + * XML formatted public key + */ +define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5); +/** + * OpenSSH formatted public key + * + * Place in $HOME/.ssh/authorized_keys + */ +define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6); +/** + * PKCS#1 formatted public key (encapsulated) + * + * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) + * + * Has the following header: + * + * -----BEGIN PUBLIC KEY----- + * + * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 + * is specific to private keys it's basically creating a DER-encoded wrapper + * for keys. This just extends that same concept to public keys (much like ssh-keygen) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7); +/**#@-*/ + +/** + * Pure-PHP PKCS#1 compliant implementation of RSA. + * + * @package Crypt_RSA + * @author Jim Wigginton + * @access public + */ +class Crypt_RSA +{ + /** + * Precomputed Zero + * + * @var Math_BigInteger + * @access private + */ + var $zero; + + /** + * Precomputed One + * + * @var Math_BigInteger + * @access private + */ + var $one; + + /** + * Private Key Format + * + * @var int + * @access private + */ + var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1; + + /** + * Public Key Format + * + * @var int + * @access public + */ + var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8; + + /** + * Modulus (ie. n) + * + * @var Math_BigInteger + * @access private + */ + var $modulus; + + /** + * Modulus length + * + * @var Math_BigInteger + * @access private + */ + var $k; + + /** + * Exponent (ie. e or d) + * + * @var Math_BigInteger + * @access private + */ + var $exponent; + + /** + * Primes for Chinese Remainder Theorem (ie. p and q) + * + * @var array + * @access private + */ + var $primes; + + /** + * Exponents for Chinese Remainder Theorem (ie. dP and dQ) + * + * @var array + * @access private + */ + var $exponents; + + /** + * Coefficients for Chinese Remainder Theorem (ie. qInv) + * + * @var array + * @access private + */ + var $coefficients; + + /** + * Hash name + * + * @var string + * @access private + */ + var $hashName; + + /** + * Hash function + * + * @var Crypt_Hash + * @access private + */ + var $hash; + + /** + * Length of hash function output + * + * @var int + * @access private + */ + var $hLen; + + /** + * Length of salt + * + * @var int + * @access private + */ + var $sLen; + + /** + * Hash function for the Mask Generation Function + * + * @var Crypt_Hash + * @access private + */ + var $mgfHash; + + /** + * Length of MGF hash function output + * + * @var int + * @access private + */ + var $mgfHLen; + + /** + * Encryption mode + * + * @var int + * @access private + */ + var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP; + + /** + * Signature mode + * + * @var int + * @access private + */ + var $signatureMode = CRYPT_RSA_SIGNATURE_PSS; + + /** + * Public Exponent + * + * @var mixed + * @access private + */ + var $publicExponent = false; + + /** + * Password + * + * @var string + * @access private + */ + var $password = false; + + /** + * Components + * + * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - + * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. + * + * @see self::_start_element_handler() + * @var array + * @access private + */ + var $components = array(); + + /** + * Current String + * + * For use with parsing XML formatted keys. + * + * @see self::_character_handler() + * @see self::_stop_element_handler() + * @var mixed + * @access private + */ + var $current; + + /** + * OpenSSL configuration file name. + * + * Set to null to use system configuration file. + * @see self::createKey() + * @var mixed + * @Access public + */ + var $configFile; + + /** + * Public key comment field. + * + * @var string + * @access private + */ + var $comment = 'phpseclib-generated-key'; + + /** + * The constructor + * + * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason + * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires + * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. + * + * @return Crypt_RSA + * @access public + */ + function __construct() + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + $this->configFile = CRYPT_RSA_OPENSSL_CONFIG; + + if (!defined('CRYPT_RSA_MODE')) { + switch (true) { + // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, + // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger + // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. + case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0 + case !function_exists('openssl_pkey_get_details'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + case function_exists('phpinfo') && extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile): + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL); + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + } + } + + $this->zero = new Math_BigInteger(); + $this->one = new Math_BigInteger(1); + + $this->hash = new Crypt_Hash('sha1'); + $this->hLen = $this->hash->getLength(); + $this->hashName = 'sha1'; + $this->mgfHash = new Crypt_Hash('sha1'); + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function Crypt_RSA() + { + $this->__construct(); + } + + /** + * Create public / private key pair + * + * Returns an array with the following three elements: + * - 'privatekey': The private key. + * - 'publickey': The public key. + * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). + * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing. + * + * @access public + * @param int $bits + * @param int $timeout + * @param array $partial + */ + function createKey($bits = 1024, $timeout = false, $partial = array()) + { + if (!defined('CRYPT_RSA_EXPONENT')) { + // http://en.wikipedia.org/wiki/65537_%28number%29 + define('CRYPT_RSA_EXPONENT', '65537'); + } + // per , this number ought not result in primes smaller + // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME + // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if + // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then + // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key + // generation when there's a chance neither gmp nor OpenSSL are installed) + if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { + define('CRYPT_RSA_SMALLEST_PRIME', 4096); + } + + // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum + if (CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { + $config = array(); + if (isset($this->configFile)) { + $config['config'] = $this->configFile; + } + $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); + openssl_pkey_export($rsa, $privatekey, null, $config); + $publickey = openssl_pkey_get_details($rsa); + $publickey = $publickey['key']; + + $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))); + $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1))); + + // clear the buffer of error strings stemming from a minimalistic openssl.cnf + while (openssl_error_string() !== false) { + } + + return array( + 'privatekey' => $privatekey, + 'publickey' => $publickey, + 'partialkey' => false + ); + } + + static $e; + if (!isset($e)) { + $e = new Math_BigInteger(CRYPT_RSA_EXPONENT); + } + + extract($this->_generateMinMax($bits)); + $absoluteMin = $min; + $temp = $bits >> 1; // divide by two to see how many bits P and Q would be + if ($temp > CRYPT_RSA_SMALLEST_PRIME) { + $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); + $temp = CRYPT_RSA_SMALLEST_PRIME; + } else { + $num_primes = 2; + } + extract($this->_generateMinMax($temp + $bits % $temp)); + $finalMax = $max; + extract($this->_generateMinMax($temp)); + + $generator = new Math_BigInteger(); + + $n = $this->one->copy(); + if (!empty($partial)) { + extract(unserialize($partial)); + } else { + $exponents = $coefficients = $primes = array(); + $lcm = array( + 'top' => $this->one->copy(), + 'bottom' => false + ); + } + + $start = time(); + $i0 = count($primes) + 1; + + do { + for ($i = $i0; $i <= $num_primes; $i++) { + if ($timeout !== false) { + $timeout-= time() - $start; + $start = time(); + if ($timeout <= 0) { + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )) + ); + } + } + + if ($i == $num_primes) { + list($min, $temp) = $absoluteMin->divide($n); + if (!$temp->equals($this->zero)) { + $min = $min->add($this->one); // ie. ceil() + } + $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); + } else { + $primes[$i] = $generator->randomPrime($min, $max, $timeout); + } + + if ($primes[$i] === false) { // if we've reached the timeout + if (count($primes) > 1) { + $partialkey = ''; + } else { + array_pop($primes); + $partialkey = serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )); + } + + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => $partialkey + ); + } + + // the first coefficient is calculated differently from the rest + // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) + if ($i > 2) { + $coefficients[$i] = $n->modInverse($primes[$i]); + } + + $n = $n->multiply($primes[$i]); + + $temp = $primes[$i]->subtract($this->one); + + // textbook RSA implementations use Euler's totient function instead of the least common multiple. + // see http://en.wikipedia.org/wiki/Euler%27s_totient_function + $lcm['top'] = $lcm['top']->multiply($temp); + $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); + + $exponents[$i] = $e->modInverse($temp); + } + + list($temp) = $lcm['top']->divide($lcm['bottom']); + $gcd = $temp->gcd($e); + $i0 = 1; + } while (!$gcd->equals($this->one)); + + $d = $e->modInverse($temp); + + $coefficients[2] = $primes[2]->modInverse($primes[1]); + + // from : + // RSAPrivateKey ::= SEQUENCE { + // version Version, + // modulus INTEGER, -- n + // publicExponent INTEGER, -- e + // privateExponent INTEGER, -- d + // prime1 INTEGER, -- p + // prime2 INTEGER, -- q + // exponent1 INTEGER, -- d mod (p-1) + // exponent2 INTEGER, -- d mod (q-1) + // coefficient INTEGER, -- (inverse of q) mod p + // otherPrimeInfos OtherPrimeInfos OPTIONAL + // } + + return array( + 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), + 'publickey' => $this->_convertPublicKey($n, $e), + 'partialkey' => false + ); + } + + /** + * Convert a private key to the appropriate format. + * + * @access private + * @see self::setPrivateKeyFormat() + * @param Math_BigInteger $n + * @param Math_BigInteger $e + * @param Math_BigInteger $d + * @param array $primes + * @param array $exponents + * @param array $coefficients + * @return string + */ + function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) + { + $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML; + $num_primes = count($primes); + $raw = array( + 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi + 'modulus' => $n->toBytes($signed), + 'publicExponent' => $e->toBytes($signed), + 'privateExponent' => $d->toBytes($signed), + 'prime1' => $primes[1]->toBytes($signed), + 'prime2' => $primes[2]->toBytes($signed), + 'exponent1' => $exponents[1]->toBytes($signed), + 'exponent2' => $exponents[2]->toBytes($signed), + 'coefficient' => $coefficients[2]->toBytes($signed) + ); + + // if the format in question does not support multi-prime rsa and multi-prime rsa was used, + // call _convertPublicKey() instead. + switch ($this->privateKeyFormat) { + case CRYPT_RSA_PRIVATE_FORMAT_XML: + if ($num_primes != 2) { + return false; + } + return "\r\n" . + ' ' . base64_encode($raw['modulus']) . "\r\n" . + ' ' . base64_encode($raw['publicExponent']) . "\r\n" . + '

' . base64_encode($raw['prime1']) . "

\r\n" . + ' ' . base64_encode($raw['prime2']) . "\r\n" . + ' ' . base64_encode($raw['exponent1']) . "\r\n" . + ' ' . base64_encode($raw['exponent2']) . "\r\n" . + ' ' . base64_encode($raw['coefficient']) . "\r\n" . + ' ' . base64_encode($raw['privateExponent']) . "\r\n" . + '
'; + break; + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + if ($num_primes != 2) { + return false; + } + $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; + $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; + $key.= $encryption; + $key.= "\r\nComment: " . $this->comment . "\r\n"; + $public = pack( + 'Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($raw['publicExponent']), + $raw['publicExponent'], + strlen($raw['modulus']), + $raw['modulus'] + ); + $source = pack( + 'Na*Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($encryption), + $encryption, + strlen($this->comment), + $this->comment, + strlen($public), + $public + ); + $public = base64_encode($public); + $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; + $key.= chunk_split($public, 64); + $private = pack( + 'Na*Na*Na*Na*', + strlen($raw['privateExponent']), + $raw['privateExponent'], + strlen($raw['prime1']), + $raw['prime1'], + strlen($raw['prime2']), + $raw['prime2'], + strlen($raw['coefficient']), + $raw['coefficient'] + ); + if (empty($this->password) && !is_string($this->password)) { + $source.= pack('Na*', strlen($private), $private); + $hashkey = 'putty-private-key-file-mac-key'; + } else { + $private.= crypt_random_string(16 - (strlen($private) & 15)); + $source.= pack('Na*', strlen($private), $private); + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $sequence = 0; + $symkey = ''; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->encrypt($private); + $hashkey = 'putty-private-key-file-mac-key' . $this->password; + } + + $private = base64_encode($private); + $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; + $key.= chunk_split($private, 64); + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash->setKey(pack('H*', sha1($hashkey))); + $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; + + return $key; + case CRYPT_RSA_PRIVATE_FORMAT_OPENSSH: + if ($num_primes != 2) { + return false; + } + $publicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']); + $privateKey = pack( + 'Na*Na*Na*Na*Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($raw['modulus']), + $raw['modulus'], + strlen($raw['publicExponent']), + $raw['publicExponent'], + strlen($raw['privateExponent']), + $raw['privateExponent'], + strlen($raw['coefficient']), + $raw['coefficient'], + strlen($raw['prime1']), + $raw['prime1'], + strlen($raw['prime2']), + $raw['prime2'] + ); + $checkint = crypt_random_string(4); + $paddedKey = pack( + 'a*Na*', + $checkint . $checkint . $privateKey, + strlen($this->comment), + $this->comment + ); + $paddingLength = (7 * strlen($paddedKey)) % 8; + for ($i = 1; $i <= $paddingLength; $i++) { + $paddedKey.= chr($i); + } + $key = pack( + 'Na*Na*Na*NNa*Na*', + strlen('none'), + 'none', + strlen('none'), + 'none', + 0, + '', + 1, + strlen($publicKey), + $publicKey, + strlen($paddedKey), + $paddedKey + ); + $key = "openssh-key-v1\0$key"; + + return "-----BEGIN OPENSSH PRIVATE KEY-----\n" . + chunk_split(base64_encode($key), 70, "\n") . + "-----END OPENSSH PRIVATE KEY-----\n"; + default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1 + $components = array(); + foreach ($raw as $name => $value) { + $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); + } + + $RSAPrivateKey = implode('', $components); + + if ($num_primes > 2) { + $OtherPrimeInfos = ''; + for ($i = 3; $i <= $num_primes; $i++) { + // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo + // + // OtherPrimeInfo ::= SEQUENCE { + // prime INTEGER, -- ri + // exponent INTEGER, -- di + // coefficient INTEGER -- ti + // } + $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); + $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); + } + $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); + } + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) { + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_INTEGER, + "\01\00", + $rsaOID, + 4, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + if (!empty($this->password) || is_string($this->password)) { + $salt = crypt_random_string(8); + $iterationCount = 2048; + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); + + $parameters = pack( + 'Ca*a*Ca*N', + CRYPT_RSA_ASN1_OCTETSTRING, + $this->_encodeLength(strlen($salt)), + $salt, + CRYPT_RSA_ASN1_INTEGER, + $this->_encodeLength(4), + $iterationCount + ); + $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; + + $encryptionAlgorithm = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_OBJECT, + $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), + $pbeWithMD5AndDES_CBC, + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($parameters)), + $parameters + ); + + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($encryptionAlgorithm)), + $encryptionAlgorithm, + CRYPT_RSA_ASN1_OCTETSTRING, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END ENCRYPTED PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END PRIVATE KEY-----'; + } + return $RSAPrivateKey; + } + + if (!empty($this->password) || is_string($this->password)) { + $iv = crypt_random_string(8); + $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key + $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $des = new Crypt_TripleDES(); + $des->setKey($symkey); + $des->setIV($iv); + $iv = strtoupper(bin2hex($iv)); + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + "Proc-Type: 4,ENCRYPTED\r\n" . + "DEK-Info: DES-EDE3-CBC,$iv\r\n" . + "\r\n" . + chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . + '-----END RSA PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END RSA PRIVATE KEY-----'; + } + + return $RSAPrivateKey; + } + } + + /** + * Convert a public key to the appropriate format + * + * @access private + * @see self::setPublicKeyFormat() + * @param Math_BigInteger $n + * @param Math_BigInteger $e + * @return string|array + */ + function _convertPublicKey($n, $e) + { + $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML; + + $modulus = $n->toBytes($signed); + $publicExponent = $e->toBytes($signed); + + switch ($this->publicKeyFormat) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + return array('e' => $e->copy(), 'n' => $n->copy()); + case CRYPT_RSA_PUBLIC_FORMAT_XML: + return "\r\n" . + ' ' . base64_encode($modulus) . "\r\n" . + ' ' . base64_encode($publicExponent) . "\r\n" . + ''; + break; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + // from : + // string "ssh-rsa" + // mpint e + // mpint n + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; + + return $RSAPublicKey; + default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1 + // from : + // RSAPublicKey ::= SEQUENCE { + // modulus INTEGER, -- n + // publicExponent INTEGER -- e + // } + $components = array( + 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), + 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) { + $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END RSA PUBLIC KEY-----'; + } else { + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; + + $RSAPublicKey = pack( + 'Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END PUBLIC KEY-----'; + } + + return $RSAPublicKey; + } + } + + /** + * Break a public or private key down into its constituant components + * + * @access private + * @see self::_convertPublicKey() + * @see self::_convertPrivateKey() + * @param string $key + * @param int $type + * @return array + */ + function _parseKey($key, $type) + { + if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) { + return false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + if (!is_array($key)) { + return false; + } + $components = array(); + switch (true) { + case isset($key['e']): + $components['publicExponent'] = $key['e']->copy(); + break; + case isset($key['exponent']): + $components['publicExponent'] = $key['exponent']->copy(); + break; + case isset($key['publicExponent']): + $components['publicExponent'] = $key['publicExponent']->copy(); + break; + case isset($key[0]): + $components['publicExponent'] = $key[0]->copy(); + } + switch (true) { + case isset($key['n']): + $components['modulus'] = $key['n']->copy(); + break; + case isset($key['modulo']): + $components['modulus'] = $key['modulo']->copy(); + break; + case isset($key['modulus']): + $components['modulus'] = $key['modulus']->copy(); + break; + case isset($key[1]): + $components['modulus'] = $key[1]->copy(); + } + return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + case CRYPT_RSA_PRIVATE_FORMAT_PKCS8: + case CRYPT_RSA_PUBLIC_FORMAT_PKCS1: + /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is + "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to + protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding + two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: + + http://tools.ietf.org/html/rfc1421#section-4.6.1.1 + http://tools.ietf.org/html/rfc1421#section-4.6.1.3 + + DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. + DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation + function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's + own implementation. ie. the implementation *is* the standard and any bugs that may exist in that + implementation are part of the standard, as well. + + * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ + if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { + $iv = pack('H*', trim($matches[2])); + $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key + $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); + // remove the Proc-Type / DEK-Info sections as they're no longer needed + $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); + $ciphertext = $this->_extractBER($key); + if ($ciphertext === false) { + $ciphertext = $key; + } + switch ($matches[1]) { + case 'AES-256-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $crypto = new Crypt_AES(); + break; + case 'AES-128-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = substr($symkey, 0, 16); + $crypto = new Crypt_AES(); + break; + case 'DES-EDE3-CFB': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB); + break; + case 'DES-EDE3-CBC': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $symkey = substr($symkey, 0, 24); + $crypto = new Crypt_TripleDES(); + break; + case 'DES-CBC': + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + break; + default: + return false; + } + $crypto->setKey($symkey); + $crypto->setIV($iv); + $decoded = $crypto->decrypt($ciphertext); + } else { + $decoded = $this->_extractBER($key); + } + + if ($decoded !== false) { + $key = $decoded; + } + + $components = array(); + + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + + $tag = ord($this->_string_shift($key)); + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 631 cons: SEQUENCE + 4:d=1 hl=2 l= 1 prim: INTEGER :00 + 7:d=1 hl=2 l= 13 cons: SEQUENCE + 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 20:d=2 hl=2 l= 0 prim: NULL + 22:d=1 hl=4 l= 609 prim: OCTET STRING + + ie. PKCS8 keys*/ + + if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { + $this->_string_shift($key, 3); + $tag = CRYPT_RSA_ASN1_SEQUENCE; + } + + if ($tag == CRYPT_RSA_ASN1_SEQUENCE) { + $temp = $this->_string_shift($key, $this->_decodeLength($key)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) { + return false; + } + $length = $this->_decodeLength($temp); + switch ($this->_string_shift($temp, $length)) { + case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption + case "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0A": // rsaPSS + break; + case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC + /* + PBEParameter ::= SEQUENCE { + salt OCTET STRING (SIZE(8)), + iterationCount INTEGER } + */ + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($temp) != strlen($temp)) { + return false; + } + $this->_string_shift($temp); // assume it's an octet string + $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $this->_decodeLength($temp); + list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); + $this->_string_shift($key); // assume it's an octet string + $length = $this->_decodeLength($key); + if (strlen($key) != $length) { + return false; + } + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $key = $crypto->decrypt($key); + if ($key === false) { + return false; + } + return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); + default: + return false; + } + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 290 cons: SEQUENCE + 4:d=1 hl=2 l= 13 cons: SEQUENCE + 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 17:d=2 hl=2 l= 0 prim: NULL + 19:d=1 hl=4 l= 271 prim: BIT STRING */ + $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag + $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length + // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of + // unused bits in the final subsequent octet. The number shall be in the range zero to seven." + // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) + if ($tag == CRYPT_RSA_ASN1_BITSTRING) { + $this->_string_shift($key); + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + $tag = ord($this->_string_shift($key)); + } + if ($tag != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + + $length = $this->_decodeLength($key); + $temp = $this->_string_shift($key, $length); + if (strlen($temp) != 1 || ord($temp) > 2) { + $components['modulus'] = new Math_BigInteger($temp, 256); + $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER + $length = $this->_decodeLength($key); + $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + + return $components; + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $length = $this->_decodeLength($key); + $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + + if (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + while (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + $key = substr($key, 1); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + } + } + + return $components; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + $parts = explode(' ', $key, 3); + + $key = isset($parts[1]) ? base64_decode($parts[1]) : false; + if ($key === false) { + return false; + } + + $comment = isset($parts[2]) ? $parts[2] : false; + + $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; + + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256); + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + + if ($cleanup && strlen($key)) { + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + return strlen($key) ? false : array( + 'modulus' => $realModulus, + 'publicExponent' => $modulus, + 'comment' => $comment + ); + } else { + return strlen($key) ? false : array( + 'modulus' => $modulus, + 'publicExponent' => $publicExponent, + 'comment' => $comment + ); + } + // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue + // http://en.wikipedia.org/wiki/XML_Signature + case CRYPT_RSA_PRIVATE_FORMAT_XML: + case CRYPT_RSA_PUBLIC_FORMAT_XML: + $this->components = array(); + + $xml = xml_parser_create('UTF-8'); + xml_set_object($xml, $this); + xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); + xml_set_character_data_handler($xml, '_data_handler'); + // add to account for "dangling" tags like ... that are sometimes added + if (!xml_parse($xml, '' . $key . '')) { + xml_parser_free($xml); + unset($xml); + return false; + } + + xml_parser_free($xml); + unset($xml); + + return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; + // from PuTTY's SSHPUBK.C + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + $components = array(); + $key = preg_split('#\r\n|\r|\n#', $key); + $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); + if ($type != 'ssh-rsa') { + return false; + } + $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); + $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); + + $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); + $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); + $public = substr($public, 11); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + + $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); + $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); + + switch ($encryption) { + case 'aes256-cbc': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = ''; + $sequence = 0; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + } + + if ($encryption != 'none') { + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->decrypt($private); + if ($private === false) { + return false; + } + } + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + + return $components; + case CRYPT_RSA_PRIVATE_FORMAT_OPENSSH: + $components = array(); + $decoded = $this->_extractBER($key); + $magic = $this->_string_shift($decoded, 15); + if ($magic !== "openssh-key-v1\0") { + return false; + } + $options = $this->_string_shift($decoded, 24); + // \0\0\0\4none = ciphername + // \0\0\0\4none = kdfname + // \0\0\0\0 = kdfoptions + // \0\0\0\1 = numkeys + if ($options != "\0\0\0\4none\0\0\0\4none\0\0\0\0\0\0\0\1") { + return false; + } + extract(unpack('Nlength', $this->_string_shift($decoded, 4))); + if (strlen($decoded) < $length) { + return false; + } + $publicKey = $this->_string_shift($decoded, $length); + extract(unpack('Nlength', $this->_string_shift($decoded, 4))); + if (strlen($decoded) < $length) { + return false; + } + $paddedKey = $this->_string_shift($decoded, $length); + + if ($this->_string_shift($publicKey, 11) !== "\0\0\0\7ssh-rsa") { + return false; + } + + $checkint1 = $this->_string_shift($paddedKey, 4); + $checkint2 = $this->_string_shift($paddedKey, 4); + if (strlen($checkint1) != 4 || $checkint1 !== $checkint2) { + return false; + } + + if ($this->_string_shift($paddedKey, 11) !== "\0\0\0\7ssh-rsa") { + return false; + } + + $values = array( + &$components['modulus'], + &$components['publicExponent'], + &$components['privateExponent'], + &$components['coefficients'][2], + &$components['primes'][1], + &$components['primes'][2] + ); + + for ($i = 0; $i < count($values); $i++) { + extract(unpack('Nlength', $this->_string_shift($paddedKey, 4))); + if (strlen($paddedKey) < $length) { + return false; + } + $values[$i] = new Math_BigInteger($this->_string_shift($paddedKey, $length), -256); + } + + extract(unpack('Nlength', $this->_string_shift($paddedKey, 4))); + if (strlen($paddedKey) < $length) { + return false; + } + $components['comment'] = $this->_string_shift($decoded, $length); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + return $components; + } + + return false; + } + + /** + * Returns the key size + * + * More specifically, this returns the size of the modulo in bits. + * + * @access public + * @return int + */ + function getSize() + { + return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); + } + + /** + * Start Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + * @param array $attribs + */ + function _start_element_handler($parser, $name, $attribs) + { + //$name = strtoupper($name); + switch ($name) { + case 'MODULUS': + $this->current = &$this->components['modulus']; + break; + case 'EXPONENT': + $this->current = &$this->components['publicExponent']; + break; + case 'P': + $this->current = &$this->components['primes'][1]; + break; + case 'Q': + $this->current = &$this->components['primes'][2]; + break; + case 'DP': + $this->current = &$this->components['exponents'][1]; + break; + case 'DQ': + $this->current = &$this->components['exponents'][2]; + break; + case 'INVERSEQ': + $this->current = &$this->components['coefficients'][2]; + break; + case 'D': + $this->current = &$this->components['privateExponent']; + } + $this->current = ''; + } + + /** + * Stop Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + */ + function _stop_element_handler($parser, $name) + { + if (isset($this->current)) { + $this->current = new Math_BigInteger(base64_decode($this->current), 256); + unset($this->current); + } + } + + /** + * Data Handler + * + * Called by xml_set_character_data_handler() + * + * @access private + * @param resource $parser + * @param string $data + */ + function _data_handler($parser, $data) + { + if (!isset($this->current) || is_object($this->current)) { + return; + } + $this->current.= trim($data); + } + + /** + * Loads a public or private key + * + * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) + * + * @access public + * @param string $key + * @param int $type optional + */ + function loadKey($key, $type = false) + { + if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') { + $this->privateKeyFormat = $key->privateKeyFormat; + $this->publicKeyFormat = $key->publicKeyFormat; + $this->k = $key->k; + $this->hLen = $key->hLen; + $this->sLen = $key->sLen; + $this->mgfHLen = $key->mgfHLen; + $this->encryptionMode = $key->encryptionMode; + $this->signatureMode = $key->signatureMode; + $this->password = $key->password; + $this->configFile = $key->configFile; + $this->comment = $key->comment; + + if (is_object($key->hash)) { + $this->hash = new Crypt_Hash($key->hash->getHash()); + } + if (is_object($key->mgfHash)) { + $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash()); + } + + if (is_object($key->modulus)) { + $this->modulus = $key->modulus->copy(); + } + if (is_object($key->exponent)) { + $this->exponent = $key->exponent->copy(); + } + if (is_object($key->publicExponent)) { + $this->publicExponent = $key->publicExponent->copy(); + } + + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + + foreach ($this->primes as $prime) { + $this->primes[] = $prime->copy(); + } + foreach ($this->exponents as $exponent) { + $this->exponents[] = $exponent->copy(); + } + foreach ($this->coefficients as $coefficient) { + $this->coefficients[] = $coefficient->copy(); + } + + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PRIVATE_FORMAT_PKCS1, + CRYPT_RSA_PRIVATE_FORMAT_XML, + CRYPT_RSA_PRIVATE_FORMAT_PUTTY, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH, + CRYPT_RSA_PRIVATE_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + $this->comment = null; + $this->modulus = null; + $this->k = null; + $this->exponent = null; + $this->primes = null; + $this->exponents = null; + $this->coefficients = null; + $this->publicExponent = null; + + return false; + } + + if (isset($components['comment']) && $components['comment'] !== false) { + $this->comment = $components['comment']; + } + $this->modulus = $components['modulus']; + $this->k = strlen($this->modulus->toBytes()); + $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; + if (isset($components['primes'])) { + $this->primes = $components['primes']; + $this->exponents = $components['exponents']; + $this->coefficients = $components['coefficients']; + $this->publicExponent = $components['publicExponent']; + } else { + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + $this->publicExponent = false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + $this->setPublicKey(); + break; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + switch (true) { + case strpos($key, '-BEGIN PUBLIC KEY-') !== false: + case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: + $this->setPublicKey(); + } + } + + return true; + } + + /** + * Sets the password + * + * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. + * Or rather, pass in $password such that empty($password) && !is_string($password) is true. + * + * @see self::createKey() + * @see self::loadKey() + * @access public + * @param string $password + */ + function setPassword($password = false) + { + $this->password = $password; + } + + /** + * Defines the public key + * + * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when + * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a + * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys + * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public + * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used + * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being + * public. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPublicKey($key = false, $type = false) + { + // if a public key has already been loaded return false + if (!empty($this->publicExponent)) { + return false; + } + + if ($key === false && !empty($this->modulus)) { + $this->publicExponent = $this->exponent; + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PUBLIC_FORMAT_PKCS1, + CRYPT_RSA_PUBLIC_FORMAT_XML, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + return false; + } + + if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { + $this->modulus = $components['modulus']; + $this->exponent = $this->publicExponent = $components['publicExponent']; + return true; + } + + $this->publicExponent = $components['publicExponent']; + + return true; + } + + /** + * Defines the private key + * + * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force + * phpseclib to treat the key as a private key. This function will do that. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPrivateKey($key = false, $type = false) + { + if ($key === false && !empty($this->publicExponent)) { + $this->publicExponent = false; + return true; + } + + $rsa = new Crypt_RSA(); + if (!$rsa->loadKey($key, $type)) { + return false; + } + $rsa->publicExponent = false; + + // don't overwrite the old key if the new key is invalid + $this->loadKey($rsa); + return true; + } + + /** + * Returns the public key + * + * The public key is only returned under two circumstances - if the private key had the public key embedded within it + * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this + * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. + * + * @see self::getPublicKey() + * @access public + * @param int $type optional + */ + function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $type; + $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns the public key's fingerprint + * + * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is + * no public key currently loaded, false is returned. + * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716) + * + * @access public + * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned + * for invalid values. + * @return mixed + */ + function getPublicKeyFingerprint($algorithm = 'md5') + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $modulus = $this->modulus->toBytes(true); + $publicExponent = $this->publicExponent->toBytes(true); + + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + + switch ($algorithm) { + case 'sha256': + $hash = new Crypt_Hash('sha256'); + $base = base64_encode($hash->hash($RSAPublicKey)); + return substr($base, 0, strlen($base) - 1); + case 'md5': + return substr(chunk_split(md5($RSAPublicKey), 2, ':'), 0, -1); + default: + return false; + } + } + + /** + * Returns the private key + * + * The private key is only returned if the currently loaded key contains the constituent prime numbers. + * + * @see self::getPublicKey() + * @access public + * @param int $type optional + * @return mixed + */ + function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1) + { + if (empty($this->primes)) { + return false; + } + + $oldFormat = $this->privateKeyFormat; + $this->privateKeyFormat = $type; + $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); + $this->privateKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns a minimalistic private key + * + * Returns the private key without the prime number constituants. Structurally identical to a public key that + * hasn't been set as the public key + * + * @see self::getPrivateKey() + * @access private + * @param int $mode optional + */ + function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $mode; + $temp = $this->_convertPublicKey($this->modulus, $this->exponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * __toString() magic method + * + * @access public + * @return string + */ + function __toString() + { + $key = $this->getPrivateKey($this->privateKeyFormat); + if ($key !== false) { + return $key; + } + $key = $this->_getPrivatePublicKey($this->publicKeyFormat); + return $key !== false ? $key : ''; + } + + /** + * __clone() magic method + * + * @access public + * @return Crypt_RSA + */ + function __clone() + { + $key = new Crypt_RSA(); + $key->loadKey($this); + return $key; + } + + /** + * Generates the smallest and largest numbers requiring $bits bits + * + * @access private + * @param int $bits + * @return array + */ + function _generateMinMax($bits) + { + $bytes = $bits >> 3; + $min = str_repeat(chr(0), $bytes); + $max = str_repeat(chr(0xFF), $bytes); + $msb = $bits & 7; + if ($msb) { + $min = chr(1 << ($msb - 1)) . $min; + $max = chr((1 << $msb) - 1) . $max; + } else { + $min[0] = chr(0x80); + } + + return array( + 'min' => new Math_BigInteger($min, 256), + 'max' => new Math_BigInteger($max, 256) + ); + } + + /** + * DER-decode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param string $string + * @return int + */ + function _decodeLength(&$string) + { + $length = ord($this->_string_shift($string)); + if ($length & 0x80) { // definite length, long form + $length&= 0x7F; + $temp = $this->_string_shift($string, $length); + list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); + } + return $length; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param int $length + * @return string + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Determines the private key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPrivateKeyFormat($format) + { + $this->privateKeyFormat = $format; + } + + /** + * Determines the public key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPublicKeyFormat($format) + { + $this->publicKeyFormat = $format; + } + + /** + * Determines which hashing function should be used + * + * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and + * decryption. If $hash isn't supported, sha1 is used. + * + * @access public + * @param string $hash + */ + function setHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = new Crypt_Hash($hash); + $this->hashName = $hash; + break; + default: + $this->hash = new Crypt_Hash('sha1'); + $this->hashName = 'sha1'; + } + $this->hLen = $this->hash->getLength(); + } + + /** + * Determines which hashing function should be used for the mask generation function + * + * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's + * best if Hash and MGFHash are set to the same thing this is not a requirement. + * + * @access public + * @param string $hash + */ + function setMGFHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->mgfHash = new Crypt_Hash($hash); + break; + default: + $this->mgfHash = new Crypt_Hash('sha1'); + } + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Determines the salt length + * + * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: + * + * Typical salt lengths in octets are hLen (the length of the output + * of the hash function Hash) and 0. + * + * @access public + * @param int $sLen + */ + function setSaltLength($sLen) + { + $this->sLen = $sLen; + } + + /** + * Integer-to-Octet-String primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. + * + * @access private + * @param Math_BigInteger $x + * @param int $xLen + * @return string + */ + function _i2osp($x, $xLen) + { + $x = $x->toBytes(); + if (strlen($x) > $xLen) { + user_error('Integer too large'); + return false; + } + return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); + } + + /** + * Octet-String-to-Integer primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. + * + * @access private + * @param int|string|resource $x + * @return Math_BigInteger + */ + function _os2ip($x) + { + return new Math_BigInteger($x, 256); + } + + /** + * Exponentiate with or without Chinese Remainder Theorem + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $x + * @return Math_BigInteger + */ + function _exponentiate($x) + { + switch (true) { + case empty($this->primes): + case $this->primes[1]->equals($this->zero): + case empty($this->coefficients): + case $this->coefficients[2]->equals($this->zero): + case empty($this->exponents): + case $this->exponents[1]->equals($this->zero): + return $x->modPow($this->exponent, $this->modulus); + } + + $num_primes = count($this->primes); + + if (defined('CRYPT_RSA_DISABLE_BLINDING')) { + $m_i = array( + 1 => $x->modPow($this->exponents[1], $this->primes[1]), + 2 => $x->modPow($this->exponents[2], $this->primes[2]) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } else { + $smallest = $this->primes[1]; + for ($i = 2; $i <= $num_primes; $i++) { + if ($smallest->compare($this->primes[$i]) > 0) { + $smallest = $this->primes[$i]; + } + } + + $one = new Math_BigInteger(1); + + $r = $one->random($one, $smallest->subtract($one)); + + $m_i = array( + 1 => $this->_blind($x, $r, 1), + 2 => $this->_blind($x, $r, 2) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $this->_blind($x, $r, $i); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } + + return $m; + } + + /** + * Performs RSA Blinding + * + * Protects against timing attacks by employing RSA Blinding. + * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) + * + * @access private + * @param Math_BigInteger $x + * @param Math_BigInteger $r + * @param int $i + * @return Math_BigInteger + */ + function _blind($x, $r, $i) + { + $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); + $x = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->modInverse($this->primes[$i]); + $x = $x->multiply($r); + list(, $x) = $x->divide($this->primes[$i]); + + return $x; + } + + /** + * Performs blinded RSA equality testing + * + * Protects against a particular type of timing attack described. + * + * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} + * + * Thanks for the heads up singpolyma! + * + * @access private + * @param string $x + * @param string $y + * @return bool + */ + function _equals($x, $y) + { + if (function_exists('hash_equals')) { + return hash_equals($x, $y); + } + + if (strlen($x) != strlen($y)) { + return false; + } + + $result = "\0"; + $x^= $y; + for ($i = 0; $i < strlen($x); $i++) { + $result|= $x[$i]; + } + + return $result === "\0"; + } + + /** + * RSAEP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsaep($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSADP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $c + * @return Math_BigInteger + */ + function _rsadp($c) + { + if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { + user_error('Ciphertext representative out of range'); + return false; + } + return $this->_exponentiate($c); + } + + /** + * RSASP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsasp1($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSAVP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. + * + * @access private + * @param Math_BigInteger $s + * @return Math_BigInteger + */ + function _rsavp1($s) + { + if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { + user_error('Signature representative out of range'); + return false; + } + return $this->_exponentiate($s); + } + + /** + * MGF1 + * + * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. + * + * @access private + * @param string $mgfSeed + * @param int $maskLen + * @return string + */ + function _mgf1($mgfSeed, $maskLen) + { + // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. + + $t = ''; + $count = ceil($maskLen / $this->mgfHLen); + for ($i = 0; $i < $count; $i++) { + $c = pack('N', $i); + $t.= $this->mgfHash->hash($mgfSeed . $c); + } + + return substr($t, 0, $maskLen); + } + + /** + * RSAES-OAEP-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and + * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. + * + * @access private + * @param string $m + * @param string $l + * @return string + */ + function _rsaes_oaep_encrypt($m, $l = '') + { + $mLen = strlen($m); + + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if ($mLen > $this->k - 2 * $this->hLen - 2) { + user_error('Message too long'); + return false; + } + + // EME-OAEP encoding + + $lHash = $this->hash->hash($l); + $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); + $db = $lHash . $ps . chr(1) . $m; + $seed = crypt_random_string($this->hLen); + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $maskedSeed = $seed ^ $seedMask; + $em = chr(0) . $maskedSeed . $maskedDB; + + // RSA encryption + + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-OAEP-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error + * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: + * + * Note. Care must be taken to ensure that an opponent cannot + * distinguish the different error conditions in Step 3.g, whether by + * error message or timing, or, more generally, learn partial + * information about the encoded message EM. Otherwise an opponent may + * be able to obtain useful information about the decryption of the + * ciphertext C, leading to a chosen-ciphertext attack such as the one + * observed by Manger [36]. + * + * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: + * + * Both the encryption and the decryption operations of RSAES-OAEP take + * the value of a label L as input. In this version of PKCS #1, L is + * the empty string; other uses of the label are outside the scope of + * this document. + * + * @access private + * @param string $c + * @param string $l + * @return string + */ + function _rsaes_oaep_decrypt($c, $l = '') + { + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-OAEP decoding + + $lHash = $this->hash->hash($l); + $y = ord($em[0]); + $maskedSeed = substr($em, 1, $this->hLen); + $maskedDB = substr($em, $this->hLen + 1); + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $seed = $maskedSeed ^ $seedMask; + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $lHash2 = substr($db, 0, $this->hLen); + $m = substr($db, $this->hLen); + $hashesMatch = $this->_equals($lHash, $lHash2); + $leadingZeros = 1; + $patternMatch = 0; + $offset = 0; + for ($i = 0; $i < strlen($m); $i++) { + $patternMatch|= $leadingZeros & ($m[$i] === "\1"); + $leadingZeros&= $m[$i] === "\0"; + $offset+= $patternMatch ? 0 : 1; + } + + // we do | instead of || to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation + // to protect against timing attacks + if (!$hashesMatch | !$patternMatch) { + user_error('Decryption error'); + return false; + } + + // Output the message M + + return substr($m, $offset + 1); + } + + /** + * Raw Encryption / Decryption + * + * Doesn't use padding and is not recommended. + * + * @access private + * @param string $m + * @return string + */ + function _raw_encrypt($m) + { + $temp = $this->_os2ip($m); + $temp = $this->_rsaep($temp); + return $this->_i2osp($temp, $this->k); + } + + /** + * RSAES-PKCS1-V1_5-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsaes_pkcs1_v1_5_encrypt($m) + { + $mLen = strlen($m); + + // Length checking + + if ($mLen > $this->k - 11) { + user_error('Message too long'); + return false; + } + + // EME-PKCS1-v1_5 encoding + + $psLen = $this->k - $mLen - 3; + $ps = ''; + while (strlen($ps) != $psLen) { + $temp = crypt_random_string($psLen - strlen($ps)); + $temp = str_replace("\x00", '', $temp); + $ps.= $temp; + } + $type = 2; + // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done + if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { + $type = 1; + // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" + $ps = str_repeat("\xFF", $psLen); + } + $em = chr(0) . chr($type) . $ps . chr(0) . $m; + + // RSA encryption + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-PKCS1-V1_5-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. + * + * For compatibility purposes, this function departs slightly from the description given in RFC3447. + * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the + * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the + * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed + * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the + * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. + * + * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt + * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but + * not private key encrypted ciphertext's. + * + * @access private + * @param string $c + * @return string + */ + function _rsaes_pkcs1_v1_5_decrypt($c) + { + // Length checking + + if (strlen($c) != $this->k) { // or if k < 11 + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-PKCS1-v1_5 decoding + + if (ord($em[0]) != 0 || ord($em[1]) > 2) { + user_error('Decryption error'); + return false; + } + + $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); + $m = substr($em, strlen($ps) + 3); + + if (strlen($ps) < 8) { + user_error('Decryption error'); + return false; + } + + // Output M + + return $m; + } + + /** + * EMSA-PSS-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. + * + * @access private + * @param string $m + * @param int $emBits + */ + function _emsa_pss_encode($m, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + user_error('Encoding error'); + return false; + } + + $salt = crypt_random_string($sLen); + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h = $this->hash->hash($m2); + $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); + $db = $ps . chr(1) . $salt; + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; + $em = $maskedDB . $h . chr(0xBC); + + return $em; + } + + /** + * EMSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. + * + * @access private + * @param string $m + * @param string $em + * @param int $emBits + * @return string + */ + function _emsa_pss_verify($m, $em, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 7) >> 3; // ie. ceil($emBits / 8); + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + return false; + } + + if ($em[strlen($em) - 1] != chr(0xBC)) { + return false; + } + + $maskedDB = substr($em, 0, -$this->hLen - 1); + $h = substr($em, -$this->hLen - 1, $this->hLen); + $temp = chr(0xFF << ($emBits & 7)); + if ((~$maskedDB[0] & $temp) != $temp) { + return false; + } + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; + $temp = $emLen - $this->hLen - $sLen - 2; + if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { + return false; + } + $salt = substr($db, $temp + 1); // should be $sLen long + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h2 = $this->hash->hash($m2); + return $this->_equals($h, $h2); + } + + /** + * RSASSA-PSS-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pss_sign($m) + { + // EMSA-PSS encoding + + $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. + * + * @access private + * @param string $m + * @param string $s + * @return string + */ + function _rsassa_pss_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $modBits = strlen($this->modulus->toBits()); + + $s2 = $this->_os2ip($s); + $m2 = $this->_rsavp1($s2); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $this->k); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PSS verification + + return $this->_emsa_pss_verify($m, $em, $modBits - 1); + } + + /** + * EMSA-PKCS1-V1_5-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. + * + * @access private + * @param string $m + * @param int $emLen + * @return string + */ + function _emsa_pkcs1_v1_5_encode($m, $emLen) + { + $h = $this->hash->hash($m); + if ($h === false) { + return false; + } + + // see http://tools.ietf.org/html/rfc3447#page-43 + switch ($this->hashName) { + case 'md2': + $t = pack('H*', '3020300c06082a864886f70d020205000410'); + break; + case 'md5': + $t = pack('H*', '3020300c06082a864886f70d020505000410'); + break; + case 'sha1': + $t = pack('H*', '3021300906052b0e03021a05000414'); + break; + case 'sha256': + $t = pack('H*', '3031300d060960864801650304020105000420'); + break; + case 'sha384': + $t = pack('H*', '3041300d060960864801650304020205000430'); + break; + case 'sha512': + $t = pack('H*', '3051300d060960864801650304020305000440'); + } + $t.= $h; + $tLen = strlen($t); + + if ($emLen < $tLen + 11) { + user_error('Intended encoded message length too short'); + return false; + } + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + + return $em; + } + + /** + * EMSA-PKCS1-V1_5-ENCODE (without NULL) + * + * Quoting https://tools.ietf.org/html/rfc8017#page-65, + * + * "The parameters field associated with id-sha1, id-sha224, id-sha256, + * id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should + * generally be omitted, but if present, it shall have a value of type + * NULL" + * + * @access private + * @param string $m + * @param int $emLen + * @return string + */ + function _emsa_pkcs1_v1_5_encode_without_null($m, $emLen) + { + $h = $this->hash->hash($m); + if ($h === false) { + return false; + } + + switch ($this->hashName) { + case 'sha1': + $t = pack('H*', '301f300706052b0e03021a0414'); + break; + case 'sha256': + $t = pack('H*', '302f300b06096086480165030402010420'); + break; + case 'sha384': + $t = pack('H*', '303f300b06096086480165030402020430'); + break; + case 'sha512': + $t = pack('H*', '304f300b06096086480165030402030440'); + break; + default: + return false; + } + $t.= $h; + $tLen = strlen($t); + + if ($emLen < $tLen + 11) { + user_error('Intended encoded message length too short'); + return false; + } + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + + return $em; + } + + /** + * RSASSA-PKCS1-V1_5-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pkcs1_v1_5_sign($m) + { + // EMSA-PKCS1-v1_5 encoding + + $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em === false) { + user_error('RSA modulus too short'); + return false; + } + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PKCS1-V1_5-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. + * + * @access private + * @param string $m + * @param string $s + * @return string + */ + function _rsassa_pkcs1_v1_5_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $s = $this->_os2ip($s); + $m2 = $this->_rsavp1($s); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $this->k); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PKCS1-v1_5 encoding + + $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + $em3 = $this->_emsa_pkcs1_v1_5_encode_without_null($m, $this->k); + + if ($em2 === false && $em3 === false) { + user_error('RSA modulus too short'); + return false; + } + + // Compare + + return ($em2 !== false && $this->_equals($em, $em2)) || + ($em3 !== false && $this->_equals($em, $em3)); + } + + /** + * Set Encryption Mode + * + * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1. + * + * @access public + * @param int $mode + */ + function setEncryptionMode($mode) + { + $this->encryptionMode = $mode; + } + + /** + * Set Signature Mode + * + * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1 + * + * @access public + * @param int $mode + */ + function setSignatureMode($mode) + { + $this->signatureMode = $mode; + } + + /** + * Set public key comment. + * + * @access public + * @param string $comment + */ + function setComment($comment) + { + $this->comment = $comment; + } + + /** + * Get public key comment. + * + * @access public + * @return string + */ + function getComment() + { + return $this->comment; + } + + /** + * Encryption + * + * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. + * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will + * be concatenated together. + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string + */ + function encrypt($plaintext) + { + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_NONE: + $plaintext = str_split($plaintext, $this->k); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_raw_encrypt($m); + } + return $ciphertext; + case CRYPT_RSA_ENCRYPTION_PKCS1: + $length = $this->k - 11; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); + } + return $ciphertext; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $length = $this->k - 2 * $this->hLen - 2; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_oaep_encrypt($m); + } + return $ciphertext; + } + } + + /** + * Decryption + * + * @see self::encrypt() + * @access public + * @param string $ciphertext + * @return string + */ + function decrypt($ciphertext) + { + if ($this->k <= 0) { + return false; + } + + $ciphertext = str_split($ciphertext, $this->k); + $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); + + $plaintext = ''; + + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_NONE: + $decrypt = '_raw_encrypt'; + break; + case CRYPT_RSA_ENCRYPTION_PKCS1: + $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; + break; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $decrypt = '_rsaes_oaep_decrypt'; + } + + foreach ($ciphertext as $c) { + $temp = $this->$decrypt($c); + if ($temp === false) { + return false; + } + $plaintext.= $temp; + } + + return $plaintext; + } + + /** + * Create a signature + * + * @see self::verify() + * @access public + * @param string $message + * @return string + */ + function sign($message) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_sign($message); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_sign($message); + } + } + + /** + * Verifies a signature + * + * @see self::sign() + * @access public + * @param string $message + * @param string $signature + * @return bool + */ + function verify($message, $signature) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_verify($message, $signature); + } + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param string $str + * @return string + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Random.php b/app/Http/Controllers/dgaAdmin/Crypt/Random.php new file mode 100644 index 0000000..6230a55 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Random.php @@ -0,0 +1,341 @@ + + * + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Random + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, +// have phpseclib as a requirement as well. if you're developing such a program you may encounter +// a "Cannot redeclare crypt_random_string()" error. +if (!function_exists('crypt_random_string')) { + /** + * "Is Windows" test + * + * @access private + */ + define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); + + /** + * Generate a random string. + * + * Although microoptimizations are generally discouraged as they impair readability this function is ripe with + * microoptimizations because this function has the potential of being called a huge number of times. + * eg. for RSA key generation. + * + * @param int $length + * @return string + * @access public + */ + function crypt_random_string($length) + { + if (!$length) { + return ''; + } + + if (CRYPT_RANDOM_IS_WINDOWS) { + // method 1. prior to PHP 5.3, mcrypt_create_iv() would call rand() on windows + if (extension_loaded('mcrypt') && version_compare(PHP_VERSION, '5.3.0', '>=')) { + return @mcrypt_create_iv($length); + } + // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, + // to quote , "possible blocking behavior". as of 5.3.4 + // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both + // call php_win32_get_random_bytes(): + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 + // + // php_win32_get_random_bytes() is defined thusly: + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 + // + // we're calling it, all the same, in the off chance that the mcrypt extension is not available + if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.4', '>=')) { + return openssl_random_pseudo_bytes($length); + } + } else { + // method 1. the fastest + if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.0', '>=')) { + return openssl_random_pseudo_bytes($length); + } + // method 2 + static $fp = true; + if ($fp === true) { + // warning's will be output unles the error suppression operator is used. errors such as + // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. + $fp = @fopen('/dev/urandom', 'rb'); + } + if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() + $temp = fread($fp, $length); + if (strlen($temp) == $length) { + return $temp; + } + } + // method 3. pretty much does the same thing as method 2 per the following url: + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 + // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're + // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir + // restrictions or some such + if (extension_loaded('mcrypt')) { + return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + } + } + // at this point we have no choice but to use a pure-PHP CSPRNG + + // cascade entropy across multiple PHP instances by fixing the session and collecting all + // environmental variables, including the previous session data and the current session + // data. + // + // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) + // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but + // PHP isn't low level to be able to use those as sources and on a web server there's not likely + // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use + // however, a ton of people visiting the website. obviously you don't want to base your seeding + // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled + // by the user and (2) this isn't just looking at the data sent by the current user - it's based + // on the data sent by all users. one user requests the page and a hash of their info is saved. + // another user visits the page and the serialization of their data is utilized along with the + // server envirnment stuff and a hash of the previous http request data (which itself utilizes + // a hash of the session data before that). certainly an attacker should be assumed to have + // full control over his own http requests. he, however, is not going to have control over + // everyone's http requests. + static $crypto = false, $v; + if ($crypto === false) { + // save old session data + $old_session_id = session_id(); + $old_use_cookies = ini_get('session.use_cookies'); + $old_session_cache_limiter = session_cache_limiter(); + $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; + if ($old_session_id != '') { + session_write_close(); + } + + session_id(1); + ini_set('session.use_cookies', 0); + session_cache_limiter(''); + session_start(); + + $v = $seed = $_SESSION['seed'] = pack('H*', sha1( + (isset($_SERVER) ? phpseclib_safe_serialize($_SERVER) : '') . + (isset($_POST) ? phpseclib_safe_serialize($_POST) : '') . + (isset($_GET) ? phpseclib_safe_serialize($_GET) : '') . + (isset($_COOKIE) ? phpseclib_safe_serialize($_COOKIE) : '') . + phpseclib_safe_serialize($GLOBALS) . + phpseclib_safe_serialize($_SESSION) . + phpseclib_safe_serialize($_OLD_SESSION) + )); + if (!isset($_SESSION['count'])) { + $_SESSION['count'] = 0; + } + $_SESSION['count']++; + + session_write_close(); + + // restore old session data + if ($old_session_id != '') { + session_id($old_session_id); + session_start(); + ini_set('session.use_cookies', $old_use_cookies); + session_cache_limiter($old_session_cache_limiter); + } else { + if ($_OLD_SESSION !== false) { + $_SESSION = $_OLD_SESSION; + unset($_OLD_SESSION); + } else { + unset($_SESSION); + } + } + + // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. + // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. + // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the + // original hash and the current hash. we'll be emulating that. for more info see the following URL: + // + // http://tools.ietf.org/html/rfc4253#section-7.2 + // + // see the is_string($crypto) part for an example of how to expand the keys + $key = pack('H*', sha1($seed . 'A')); + $iv = pack('H*', sha1($seed . 'C')); + + // ciphers are used as per the nist.gov link below. also, see this link: + // + // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives + switch (true) { + case phpseclib_resolve_include_path('Crypt/AES.php'): + if (!class_exists('Crypt_AES')) { + include_once 'AES.php'; + } + $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Twofish.php'): + if (!class_exists('Crypt_Twofish')) { + include_once 'Twofish.php'; + } + $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Blowfish.php'): + if (!class_exists('Crypt_Blowfish')) { + include_once 'Blowfish.php'; + } + $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/TripleDES.php'): + if (!class_exists('Crypt_TripleDES')) { + include_once 'TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/DES.php'): + if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; + } + $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/RC4.php'): + if (!class_exists('Crypt_RC4')) { + include_once 'RC4.php'; + } + $crypto = new Crypt_RC4(); + break; + default: + user_error('crypt_random_string requires at least one symmetric cipher be loaded'); + return false; + } + + $crypto->setKey($key); + $crypto->setIV($iv); + $crypto->enableContinuousBuffer(); + } + + //return $crypto->encrypt(str_repeat("\0", $length)); + + // the following is based off of ANSI X9.31: + // + // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf + // + // OpenSSL uses that same standard for it's random numbers: + // + // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c + // (do a search for "ANS X9.31 A.2.4") + $result = ''; + while (strlen($result) < $length) { + $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 + $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 + $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 + $result.= $r; + } + return substr($result, 0, $length); + } +} + +if (!function_exists('phpseclib_safe_serialize')) { + /** + * Safely serialize variables + * + * If a class has a private __sleep() method it'll give a fatal error on PHP 5.2 and earlier. + * PHP 5.3 will emit a warning. + * + * @param mixed $arr + * @access public + */ + function phpseclib_safe_serialize(&$arr) + { + if (is_object($arr)) { + return ''; + } + if (!is_array($arr)) { + return serialize($arr); + } + // prevent circular array recursion + if (isset($arr['__phpseclib_marker'])) { + return ''; + } + $safearr = array(); + $arr['__phpseclib_marker'] = true; + foreach (array_keys($arr) as $key) { + // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage + if ($key !== '__phpseclib_marker') { + $safearr[$key] = phpseclib_safe_serialize($arr[$key]); + } + } + unset($arr['__phpseclib_marker']); + return serialize($safearr); + } +} + +if (!function_exists('phpseclib_resolve_include_path')) { + /** + * Resolve filename against the include path. + * + * Wrapper around stream_resolve_include_path() (which was introduced in + * PHP 5.3.2) with fallback implementation for earlier PHP versions. + * + * @param string $filename + * @return string|false + * @access public + */ + function phpseclib_resolve_include_path($filename) + { + if (function_exists('stream_resolve_include_path')) { + return stream_resolve_include_path($filename); + } + + // handle non-relative paths + if (file_exists($filename)) { + return realpath($filename); + } + + $paths = PATH_SEPARATOR == ':' ? + preg_split('#(? + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Rijndael + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Rijndael. + * + * @package Crypt_Rijndael + * @author Jim Wigginton + * @access public + */ +class Crypt_Rijndael extends Crypt_Base +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RIJNDAEL'; + + /** + * The mcrypt specific name of the cipher + * + * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not. + * Crypt_Rijndael determines automatically whether mcrypt is useable + * or not for the current $block_size/$key_length. + * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. + * + * @see Crypt_Base::cipher_name_mcrypt + * @see Crypt_Base::engine + * @see self::isValidEngine() + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'rijndael-128'; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $w; + + /** + * The Inverse Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $dw; + + /** + * The Block Length divided by 32 + * + * @see self::setBlockLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size + * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could + * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $Nb = 4; + + /** + * The Key Length (in bytes) + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could + * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_length = 16; + + /** + * The Key Length divided by 32 + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 + */ + var $Nk = 4; + + /** + * The Number of Rounds + * + * @var int + * @access private + * @internal The max value is 14, the min value is 10. + */ + var $Nr; + + /** + * Shift offsets + * + * @var array + * @access private + */ + var $c; + + /** + * Holds the last used key- and block_size information + * + * @var array + * @access private + */ + var $kl; + + /** + * Sets the key. + * + * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and + * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length + * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the + * excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits. + * + * @see Crypt_Base:setKey() + * @see self::setKeyLength() + * @access public + * @param string $key + */ + function setKey($key) + { + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_size = 16; + break; + case $length <= 20: + $this->key_size = 20; + break; + case $length <= 24: + $this->key_size = 24; + break; + case $length <= 28: + $this->key_size = 28; + break; + default: + $this->key_size = 32; + } + } + parent::setKey($key); + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined + * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to + * 192/256 bits as, for example, mcrypt will do. + * + * That said, if you want be compatible with other Rijndael and AES implementations, + * you should not setKeyLength(160) or setKeyLength(224). + * + * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use + * the mcrypt php extension, even if available. + * This results then in slower encryption. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch (true) { + case $length <= 128: + $this->key_length = 16; + break; + case $length <= 160: + $this->key_length = 20; + break; + case $length <= 192: + $this->key_length = 24; + break; + case $length <= 224: + $this->key_length = 28; + break; + default: + $this->key_length = 32; + } + + parent::setKeyLength($length); + } + + /** + * Sets the block length + * + * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @access public + * @param int $length + */ + function setBlockLength($length) + { + $length >>= 5; + if ($length > 8) { + $length = 8; + } elseif ($length < 4) { + $length = 4; + } + $this->Nb = $length; + $this->block_size = $length << 2; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->block_size != 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; + $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode(); + break; + case CRYPT_ENGINE_MCRYPT: + $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); + if ($this->key_length % 8) { // is it a 160/224-bit key? + // mcrypt is not usable for them, only for 128/192/256-bit keys + return false; + } + } + + return parent::isValidEngine($engine); + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + static $tables; + if (empty($tables)) { + $tables = &$this->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $w = $this->w; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $w[++$wc]; + } + + // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - + // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding + // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. + // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. + // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], + // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. + + // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf + $temp = array(); + for ($round = 1; $round < $Nr; ++$round) { + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + + while ($i < $Nb) { + $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ + $t1[$state[$j] >> 16 & 0x000000FF] ^ + $t2[$state[$k] >> 8 & 0x000000FF] ^ + $t3[$state[$l] & 0x000000FF] ^ + $w[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // subWord + for ($i = 0; $i < $Nb; ++$i) { + $state[$i] = $sbox[$state[$i] & 0x000000FF] | + ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | + ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | + ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); + } + + // shiftRows + addRoundKey + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + while ($i < $Nb) { + $temp[$i] = ($state[$i] & 0xFF000000) ^ + ($state[$j] & 0x00FF0000) ^ + ($state[$k] & 0x0000FF00) ^ + ($state[$l] & 0x000000FF) ^ + $w[$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + static $invtables; + if (empty($invtables)) { + $invtables = &$this->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $dw = $this->dw; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $dw[++$wc]; + } + + $temp = array(); + for ($round = $Nr - 1; $round > 0; --$round) { + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ + $dt1[$state[$j] >> 16 & 0x000000FF] ^ + $dt2[$state[$k] >> 8 & 0x000000FF] ^ + $dt3[$state[$l] & 0x000000FF] ^ + $dw[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // invShiftRows + invSubWord + addRoundKey + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $word = ($state[$i] & 0xFF000000) | + ($state[$j] & 0x00FF0000) | + ($state[$k] & 0x0000FF00) | + ($state[$l] & 0x000000FF); + + $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] | + ($isbox[$word >> 8 & 0x000000FF] << 8) | + ($isbox[$word >> 16 & 0x000000FF] << 16) | + ($isbox[$word >> 24 & 0x000000FF] << 24)); + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. + // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse + static $rcon = array(0, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, + 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, + 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, + 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 + ); + + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size); + + $this->Nk = $this->key_length >> 2; + // see Rijndael-ammended.pdf#page=44 + $this->Nr = max($this->Nk, $this->Nb) + 6; + + // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, + // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" + // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, + // "Table 2: Shift offsets for different block lengths" + switch ($this->Nb) { + case 4: + case 5: + case 6: + $this->c = array(0, 1, 2, 3); + break; + case 7: + $this->c = array(0, 1, 2, 4); + break; + case 8: + $this->c = array(0, 1, 3, 4); + } + + $w = array_values(unpack('N*words', $this->key)); + + $length = $this->Nb * ($this->Nr + 1); + for ($i = $this->Nk; $i < $length; $i++) { + $temp = $w[$i - 1]; + if ($i % $this->Nk == 0) { + // according to , "the size of an integer is platform-dependent". + // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, + // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' + // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. + $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord + $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; + } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { + $temp = $this->_subWord($temp); + } + $w[$i] = $w[$i - $this->Nk] ^ $temp; + } + + // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns + // and generate the inverse key schedule. more specifically, + // according to (section 5.3.3), + // "The key expansion for the Inverse Cipher is defined as follows: + // 1. Apply the Key Expansion. + // 2. Apply InvMixColumn to all Round Keys except the first and the last one." + // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" + list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables(); + $temp = $this->w = $this->dw = array(); + for ($i = $row = $col = 0; $i < $length; $i++, $col++) { + if ($col == $this->Nb) { + if ($row == 0) { + $this->dw[0] = $this->w[0]; + } else { + // subWord + invMixColumn + invSubWord = invMixColumn + $j = 0; + while ($j < $this->Nb) { + $dw = $this->_subWord($this->w[$row][$j]); + $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^ + $dt1[$dw >> 16 & 0x000000FF] ^ + $dt2[$dw >> 8 & 0x000000FF] ^ + $dt3[$dw & 0x000000FF]; + $j++; + } + $this->dw[$row] = $temp; + } + + $col = 0; + $row++; + } + $this->w[$row][$col] = $w[$i]; + } + + $this->dw[$row] = $this->w[$row]; + + // Converting to 1-dim key arrays (both ascending) + $this->dw = array_reverse($this->dw); + $w = array_pop($this->w); + $dw = array_pop($this->dw); + foreach ($this->w as $r => $wr) { + foreach ($wr as $c => $wc) { + $w[] = $wc; + $dw[] = $this->dw[$r][$c]; + } + } + $this->w = $w; + $this->dw = $dw; + } + + /** + * Performs S-Box substitutions + * + * @access private + * @param int $word + */ + function _subWord($word) + { + static $sbox; + if (empty($sbox)) { + list(, , , , $sbox) = $this->_getTables(); + } + + return $sbox[$word & 0x000000FF] | + ($sbox[$word >> 8 & 0x000000FF] << 8) | + ($sbox[$word >> 16 & 0x000000FF] << 16) | + ($sbox[$word >> 24 & 0x000000FF] << 24); + } + + /** + * Provides the mixColumns and sboxes tables + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_setupInlineCrypt() + * @see Crypt_Rijndael:_subWord() + * @access private + * @return array &$tables + */ + function &_getTables() + { + static $tables; + if (empty($tables)) { + // according to (section 5.2.1), + // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so + // those are the names we'll use. + $t3 = array_map('intval', array( + // with array_map('intval', ...) we ensure we have only int's and not + // some slower floats converted by php automatically on high values + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, + 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, + 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, + 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, + 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, + 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, + 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, + 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, + 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, + 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, + 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, + 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, + 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, + 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, + 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, + 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, + 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, + 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C + )); + + foreach ($t3 as $t3i) { + $t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >> 8) & 0x00FFFFFF); + $t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF); + $t2[] = (($t3i << 8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF); + } + + $tables = array( + // The Precomputed mixColumns tables t0 - t3 + $t0, + $t1, + $t2, + $t3, + // The SubByte S-Box + array( + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 + ) + ); + } + return $tables; + } + + /** + * Provides the inverse mixColumns and inverse sboxes tables + * + * @see Crypt_Rijndael:_decryptBlock() + * @see Crypt_Rijndael:_setupInlineCrypt() + * @see Crypt_Rijndael:_setupKey() + * @access private + * @return array &$tables + */ + function &_getInvTables() + { + static $tables; + if (empty($tables)) { + $dt3 = array_map('intval', array( + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, + 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, + 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, + 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, + 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, + 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, + 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, + 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, + 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, + 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, + 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, + 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, + 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, + 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, + 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, + 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, + 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, + 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 + )); + + foreach ($dt3 as $dt3i) { + $dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >> 8) & 0x00FFFFFF); + $dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF); + $dt2[] = (($dt3i << 8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF); + }; + + $tables = array( + // The Precomputed inverse mixColumns tables dt0 - dt3 + $dt0, + $dt1, + $dt2, + $dt3, + // The inverse SubByte S-Box + array( + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D + ) + ); + } + return $tables; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + // Note: _setupInlineCrypt() will be called only if $this->changed === true + // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). + // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. + + $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a uniqe hash for our generated code + $code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + // The hi-optimized $lambda_functions will use the key-words hardcoded for better performance. + $w = $this->w; + $dw = $this->dw; + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { + $w[] = '$w[' . $i . ']'; + $dw[] = '$dw[' . $i . ']'; + } + $init_encrypt = '$w = $self->w;'; + $init_decrypt = '$dw = $self->dw;'; + } + + $Nr = $this->Nr; + $Nb = $this->Nb; + $c = $this->c; + + // Generating encrypt code: + $init_encrypt.= ' + static $tables; + if (empty($tables)) { + $tables = &$self->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $encrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $t0[($'.$s.$i .' >> 24) & 0xff] ^ + $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ + $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ + $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ + '.$w[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $sbox[ $'.$e.$i.' & 0xff] | + ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $encrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= ', + ($'.$e.$i .' & '.((int)0xFF000000).') ^ + ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$w[$i]."\n"; + } + $encrypt_block .= ');'; + + // Generating decrypt code: + $init_decrypt.= ' + static $invtables; + if (empty($invtables)) { + $invtables = &$self->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $decrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $dt0[($'.$s.$i .' >> 24) & 0xff] ^ + $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ + $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ + $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ + '.$dw[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $isbox[ $'.$e.$i.' & 0xff] | + ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $decrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= ', + ($'.$e.$i. ' & '.((int)0xFF000000).') ^ + ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$dw[$i]."\n"; + } + $decrypt_block .= ');'; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => '', + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php b/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php new file mode 100644 index 0000000..4c0b677 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php @@ -0,0 +1,517 @@ + + * setKey('abcdefghijklmnopqrstuvwx'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_TripleDES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_DES + */ +if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; +} + +/**#@+ + * @access public + * @see self::Crypt_TripleDES() + */ +/** + * Encrypt / decrypt using inner chaining + * + * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3). + */ +define('CRYPT_MODE_3CBC', -2); +/** + * BC version of the above. + */ +define('CRYPT_DES_MODE_3CBC', -2); +/** + * Encrypt / decrypt using outer chaining + * + * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC. + */ +define('CRYPT_MODE_CBC3', CRYPT_MODE_CBC); +/** + * BC version of the above. + */ +define('CRYPT_DES_MODE_CBC3', CRYPT_MODE_CBC3); +/**#@-*/ + +/** + * Pure-PHP implementation of Triple DES. + * + * @package Crypt_TripleDES + * @author Jim Wigginton + * @access public + */ +class Crypt_TripleDES extends Crypt_DES +{ + /** + * Key Length (in bytes) + * + * @see Crypt_TripleDES::setKeyLength() + * @var int + * @access private + */ + var $key_length = 24; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_DES::const_namespace + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_DES::cipher_name_mcrypt + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'tripledes'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 750; + + /** + * max possible size of $key + * + * @see self::setKey() + * @see Crypt_DES::setKey() + * @var string + * @access private + */ + var $key_length_max = 24; + + /** + * Internal flag whether using CRYPT_DES_MODE_3CBC or not + * + * @var bool + * @access private + */ + var $mode_3cbc; + + /** + * The Crypt_DES objects + * + * Used only if $mode_3cbc === true + * + * @var array + * @access private + */ + var $des; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_DES_MODE_ECB + * + * - CRYPT_DES_MODE_CBC + * + * - CRYPT_DES_MODE_CTR + * + * - CRYPT_DES_MODE_CFB + * + * - CRYPT_DES_MODE_OFB + * + * - CRYPT_DES_MODE_3CBC + * + * If not explicitly set, CRYPT_DES_MODE_CBC will be used. + * + * @see Crypt_DES::Crypt_DES() + * @see Crypt_Base::Crypt_Base() + * @param int $mode + * @access public + */ + function __construct($mode = CRYPT_MODE_CBC) + { + switch ($mode) { + // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC + // and additional flag us internally as 3CBC + case CRYPT_DES_MODE_3CBC: + parent::Crypt_Base(CRYPT_MODE_CBC); + $this->mode_3cbc = true; + + // This three $des'es will do the 3CBC work (if $key > 64bits) + $this->des = array( + new Crypt_DES(CRYPT_MODE_CBC), + new Crypt_DES(CRYPT_MODE_CBC), + new Crypt_DES(CRYPT_MODE_CBC), + ); + + // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects + $this->des[0]->disablePadding(); + $this->des[1]->disablePadding(); + $this->des[2]->disablePadding(); + break; + // If not 3CBC, we init as usual + default: + parent::__construct($mode); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function Crypt_TripleDES($mode = CRYPT_MODE_CBC) + { + $this->__construct($mode); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + $this->cipher_name_openssl_ecb = 'des-ede3'; + $mode = $this->_openssl_translate_mode(); + $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode; + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * @see Crypt_Base::setIV() + * @access public + * @param string $iv + */ + function setIV($iv) + { + parent::setIV($iv); + if ($this->mode_3cbc) { + $this->des[0]->setIV($iv); + $this->des[1]->setIV($iv); + $this->des[2]->setIV($iv); + } + } + + /** + * Sets the key length. + * + * Valid key lengths are 64, 128 and 192 + * + * @see Crypt_Base:setKeyLength() + * @access public + * @param int $length + */ + function setKeyLength($length) + { + $length >>= 3; + switch (true) { + case $length <= 8: + $this->key_length = 8; + break; + case $length <= 16: + $this->key_length = 16; + break; + default: + $this->key_length = 24; + } + + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or + * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * @access public + * @see Crypt_DES::setKey() + * @see Crypt_Base::setKey() + * @param string $key + */ + function setKey($key) + { + $length = $this->explicit_key_length ? $this->key_length : strlen($key); + if ($length > 8) { + $key = str_pad(substr($key, 0, 24), 24, chr(0)); + // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this: + // http://php.net/function.mcrypt-encrypt#47973 + $key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24); + } else { + $key = str_pad($key, 8, chr(0)); + } + parent::setKey($key); + + // And in case of CRYPT_DES_MODE_3CBC: + // if key <= 64bits we not need the 3 $des to work, + // because we will then act as regular DES-CBC with just a <= 64bit key. + // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des. + if ($this->mode_3cbc && $length > 8) { + $this->des[0]->setKey(substr($key, 0, 8)); + $this->des[1]->setKey(substr($key, 8, 8)); + $this->des[2]->setKey(substr($key, 16, 8)); + } + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::encrypt() + * @access public + * @param string $plaintext + * @return string $cipertext + */ + function encrypt($plaintext) + { + // parent::en/decrypt() is able to do all the work for all modes and keylengths, + // except for: CRYPT_MODE_3CBC (inner chaining CBC) with a key > 64bits + + // if the key is smaller then 8, do what we'd normally do + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->des[2]->encrypt( + $this->des[1]->decrypt( + $this->des[0]->encrypt( + $this->_pad($plaintext) + ) + ) + ); + } + + return parent::encrypt($plaintext); + } + + /** + * Decrypts a message. + * + * @see Crypt_Base::decrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->_unpad( + $this->des[0]->decrypt( + $this->des[1]->encrypt( + $this->des[2]->decrypt( + str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") + ) + ) + ) + ); + } + + return parent::decrypt($ciphertext); + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->encrypt(substr($plaintext, 8, 8)); + * + * + * echo $des->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * @see Crypt_Base::enableContinuousBuffer() + * @see self::disableContinuousBuffer() + * @access public + */ + function enableContinuousBuffer() + { + parent::enableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->enableContinuousBuffer(); + $this->des[1]->enableContinuousBuffer(); + $this->des[2]->enableContinuousBuffer(); + } + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * @see Crypt_Base::disableContinuousBuffer() + * @see self::enableContinuousBuffer() + * @access public + */ + function disableContinuousBuffer() + { + parent::disableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->disableContinuousBuffer(); + $this->des[1]->disableContinuousBuffer(); + $this->des[2]->disableContinuousBuffer(); + } + } + + /** + * Creates the key schedule + * + * @see Crypt_DES::_setupKey() + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + switch (true) { + // if $key <= 64bits we configure our internal pure-php cipher engine + // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. + case strlen($this->key) <= 8: + $this->des_rounds = 1; + break; + + // otherwise, if $key > 64bits, we configure our engine to work as 3DES. + default: + $this->des_rounds = 3; + + // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. + if ($this->mode_3cbc) { + $this->des[0]->_setupKey(); + $this->des[1]->_setupKey(); + $this->des[2]->_setupKey(); + + // because $des[0-2] will, now, do all the work we can return here + // not need unnecessary stress parent::_setupKey() with our, now unused, $key. + return; + } + } + // setup our key + parent::_setupKey(); + } + + /** + * Sets the internal crypt engine + * + * @see Crypt_Base::Crypt_Base() + * @see Crypt_Base::setPreferredEngine() + * @param int $engine + * @access public + * @return int + */ + function setPreferredEngine($engine) + { + if ($this->mode_3cbc) { + $this->des[0]->setPreferredEngine($engine); + $this->des[1]->setPreferredEngine($engine); + $this->des[2]->setPreferredEngine($engine); + } + + return parent::setPreferredEngine($engine); + } +} diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php b/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php new file mode 100644 index 0000000..f33cbdf --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php @@ -0,0 +1,889 @@ + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $twofish->decrypt($twofish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Twofish. + * + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Twofish extends Crypt_Base +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'TWOFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'twofish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 800; + + /** + * Q-Table + * + * @var array + * @access private + */ + var $q0 = array( + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, + 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, + 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, + 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, + 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, + 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, + 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, + 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, + 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, + 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, + 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, + 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, + 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, + 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, + 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, + 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, + 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, + 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, + 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, + 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 + ); + + /** + * Q-Table + * + * @var array + * @access private + */ + var $q1 = array( + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, + 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, + 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, + 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, + 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, + 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, + 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, + 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, + 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, + 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, + 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, + 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, + 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, + 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, + 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, + 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, + 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, + 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, + 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, + 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m0 = array( + 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, + 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, + 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, + 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, + 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, + 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, + 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, + 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, + 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, + 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, + 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, + 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, + 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, + 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, + 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, + 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, + 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, + 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, + 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, + 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, + 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, + 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m1 = array( + 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, + 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, + 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, + 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, + 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, + 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, + 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, + 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, + 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, + 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, + 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, + 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, + 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, + 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, + 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, + 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, + 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, + 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, + 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, + 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, + 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, + 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m2 = array( + 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, + 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, + 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, + 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, + 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, + 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, + 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, + 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, + 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, + 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, + 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, + 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, + 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, + 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, + 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, + 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, + 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, + 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, + 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, + 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, + 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, + 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m3 = array( + 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, + 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, + 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, + 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, + 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, + 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, + 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, + 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, + 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, + 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, + 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, + 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, + 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, + 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, + 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, + 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, + 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, + 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, + 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, + 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, + 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, + 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 + ); + + /** + * The Key Schedule Array + * + * @var array + * @access private + */ + var $K = array(); + + /** + * The Key depended S-Table 0 + * + * @var array + * @access private + */ + var $S0 = array(); + + /** + * The Key depended S-Table 1 + * + * @var array + * @access private + */ + var $S1 = array(); + + /** + * The Key depended S-Table 2 + * + * @var array + * @access private + */ + var $S2 = array(); + + /** + * The Key depended S-Table 3 + * + * @var array + * @access private + */ + var $S3 = array(); + + /** + * Holds the last used key + * + * @var array + * @access private + */ + var $kl; + + /** + * The Key Length (in bytes) + * + * @see Crypt_Twofish::setKeyLength() + * @var int + * @access private + */ + var $key_length = 16; + + /** + * Sets the key length. + * + * Valid key lengths are 128, 192 or 256 bits + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch (true) { + case $length <= 128: + $this->key_length = 16; + break; + case $length <= 192: + $this->key_length = 24; + break; + default: + $this->key_length = 32; + } + + parent::setKeyLength($length); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* Key expanding and generating the key-depended s-boxes */ + $le_longs = unpack('V*', $this->key); + $key = unpack('C*', $this->key); + $m0 = $this->m0; + $m1 = $this->m1; + $m2 = $this->m2; + $m3 = $this->m3; + $q0 = $this->q0; + $q1 = $this->q1; + + $K = $S0 = $S1 = $S2 = $S3 = array(); + + switch (strlen($this->key)) { + case 16: + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; + } + break; + case 24: + list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; + } + break; + default: // 32 + list($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; + } + } + + $this->K = $K; + $this->S0 = $S0; + $this->S1 = $S1; + $this->S2 = $S2; + $this->S3 = $S3; + } + + /** + * _mdsrem function using by the twofish cipher algorithm + * + * @access private + * @param string $A + * @param string $B + * @return array + */ + function _mdsrem($A, $B) + { + // No gain by unrolling this loop. + for ($i = 0; $i < 8; ++$i) { + // Get most significant coefficient. + $t = 0xff & ($B >> 24); + + // Shift the others up. + $B = ($B << 8) | (0xff & ($A >> 24)); + $A<<= 8; + + $u = $t << 1; + + // Subtract the modular polynomial on overflow. + if ($t & 0x80) { + $u^= 0x14d; + } + + // Remove t * (a * x^2 + 1). + $B ^= $t ^ ($u << 16); + + // Form u = a*t + t/a = t*(a + 1/a). + $u^= 0x7fffffff & ($t >> 1); + + // Add the modular polynomial on underflow. + if ($t & 0x01) { + $u^= 0xa6 ; + } + + // Remove t * (a + 1/a) * (x^3 + x). + $B^= ($u << 24) | ($u << 8); + } + + return array( + 0xff & $B >> 24, + 0xff & $B >> 16, + 0xff & $B >> 8, + 0xff & $B); + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[0] ^ $in[1]; + $R1 = $K[1] ^ $in[2]; + $R2 = $K[2] ^ $in[3]; + $R3 = $K[3] ^ $in[4]; + + $ki = 7; + while ($ki < 39) { + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= $this->safe_intval($t0 + $t1 + $K[++$ki]); + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= $this->safe_intval($t0 + $t1 + $K[++$ki]); + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[4] ^ $R2, + $K[5] ^ $R3, + $K[6] ^ $R0, + $K[7] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[4] ^ $in[1]; + $R1 = $K[5] ^ $in[2]; + $R2 = $K[6] ^ $in[3]; + $R3 = $K[7] ^ $in[4]; + + $ki = 40; + while ($ki > 8) { + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]); + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]); + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]); + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[0] ^ $R2, + $K[1] ^ $R3, + $K[2] ^ $R0, + $K[3] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Twofish::_getLambdaFunctions(); + + // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one. + // (Currently, for Crypt_Twofish, one generated $lambda_function cost on php5.5@32bit ~140kb unfreeable mem and ~240kb on php5.5@64bit) + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_Twofish, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + $safeint = $this->safe_intval_inline(); + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $K = $this->K; + $init_crypt = ' + static $S0, $S1, $S2, $S3; + if (!$S0) { + for ($i = 0; $i < 256; ++$i) { + $S0[] = (int)$self->S0[$i]; + $S1[] = (int)$self->S1[$i]; + $S2[] = (int)$self->S2[$i]; + $S3[] = (int)$self->S3[$i]; + } + } + '; + break; + default: + $K = array(); + for ($i = 0; $i < 40; ++$i) { + $K[] = '$K_' . $i; + } + $init_crypt = ' + $S0 = $self->S0; + $S1 = $self->S1; + $S2 = $self->S2; + $S3 = $self->S3; + list(' . implode(',', $K) . ') = $self->K; + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[0].' ^ $in[1]; + $R1 = '.$K[1].' ^ $in[2]; + $R2 = '.$K[2].' ^ $in[3]; + $R3 = '.$K[3].' ^ $in[4]; + '; + for ($ki = 7, $i = 0; $i < 8; ++$i) { + $encrypt_block.= ' + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + '; + } + $encrypt_block.= ' + $in = pack("V4", ' . $K[4] . ' ^ $R2, + ' . $K[5] . ' ^ $R3, + ' . $K[6] . ' ^ $R0, + ' . $K[7] . ' ^ $R1); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[4].' ^ $in[1]; + $R1 = '.$K[5].' ^ $in[2]; + $R2 = '.$K[6].' ^ $in[3]; + $R3 = '.$K[7].' ^ $in[4]; + '; + for ($ki = 40, $i = 0; $i < 8; ++$i) { + $decrypt_block.= ' + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . '; + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . '; + '; + } + $decrypt_block.= ' + $in = pack("V4", ' . $K[0] . ' ^ $R2, + ' . $K[1] . ' ^ $R3, + ' . $K[2] . ' ^ $R0, + ' . $K[3] . ' ^ $R1); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/app/Http/Controllers/dgaAdmin/HistoryController.php b/app/Http/Controllers/dgaAdmin/HistoryController.php new file mode 100644 index 0000000..02895f6 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/HistoryController.php @@ -0,0 +1,17 @@ +limit(500)->get(); + return view('dgaAdmin.history', compact('setting', 'history')); + } +} diff --git a/app/Http/Controllers/dgaAdmin/HomeController.php b/app/Http/Controllers/dgaAdmin/HomeController.php new file mode 100644 index 0000000..92d3026 --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/HomeController.php @@ -0,0 +1,167 @@ + HistoryPlay::sum('amount'), + 'amountWin' => HistoryPlay::where('status', 1)->sum('amount'), + 'amountLose'=> HistoryPlay::where('status', 0)->sum('amount'), + 'amountSend' => HistoryPlay::sum('receive'), + 'turnWin' => HistoryPlay::where('status', 1)->count(), + 'turnLose' => HistoryPlay::where('status', 0)->count(), + //CHANLE + 'amountSendCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL')->sum('receive'), + 'amountCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL')->sum('amount'), + 'turnLoseCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL', 'status' => 0])->count(), + 'turnWinCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL', 'status' => 1])->count(), + 'amountSendCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'CL')->sum('receive'), + 'amountCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 0])->sum('amount'), + 'turnLoseCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 0])->count(), + 'turnWinCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 1])->count(), + 'amountSendCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'CL')->sum('receive'), + 'amountCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 0])->sum('amount'), + 'turnLoseCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 0])->count(), + 'turnWinCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 1])->count(), + // CHANLE2 + 'amountSendCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL2')->sum('receive'), + 'amountCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL2')->sum('amount'), + 'turnLoseCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL2', 'status' => 0])->count(), + 'turnWinCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL2', 'status' => 1])->count(), + 'amountSendCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'CL2')->sum('receive'), + 'amountCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 0])->sum('amount'), + 'turnLoseCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 0])->count(), + 'turnWinCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 1])->count(), + 'amountSendCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'CL2')->sum('receive'), + 'amountCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 0])->sum('amount'), + 'turnLoseCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 0])->count(), + 'turnWinCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 1])->count(), + // TÀI XỈU + 'amountSendTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX')->sum('receive'), + 'amountTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX')->sum('amount'), + 'turnLoseTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX', 'status' => 0])->count(), + 'turnWinTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX', 'status' => 1])->count(), + 'amountSendTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'TX')->sum('receive'), + 'amountTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 0])->sum('amount'), + 'turnLoseTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 0])->count(), + 'turnWinTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 1])->count(), + 'amountSendTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'TX')->sum('receive'), + 'amountTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 0])->sum('amount'), + 'turnLoseTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 0])->count(), + 'turnWinTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 1])->count(), + // TÀI XỈU 2 + 'amountSendTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX2')->sum('receive'), + 'amountTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX2')->sum('amount'), + 'turnLoseTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX2', 'status' => 0])->count(), + 'turnWinTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX2', 'status' => 1])->count(), + 'amountSendTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'TX2')->sum('receive'), + 'amountTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 0])->sum('amount'), + 'turnLoseTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 0])->count(), + 'turnWinTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 1])->count(), + 'amountSendTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'TX2')->sum('receive'), + 'amountTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 0])->sum('amount'), + 'turnLoseTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 0])->count(), + 'turnWinTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 1])->count(), + // 1 Phần 3 + 'amountSend1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', '1P3')->sum('receive'), + 'amount1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', '1P3')->sum('amount'), + 'turnLose1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => '1P3', 'status' => 0])->count(), + 'turnWin1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => '1P3', 'status' => 1])->count(), + 'amountSend1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', '1P3')->sum('receive'), + 'amount1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 0])->sum('amount'), + 'turnLose1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 0])->count(), + 'turnWin1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 1])->count(), + 'amountSend1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', '1P3')->sum('receive'), + 'amount1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 0])->sum('amount'), + 'turnLose1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 0])->count(), + 'turnWin1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 1])->count(), + // GẤP 3 + 'amountSendG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'G3')->sum('receive'), + 'amountG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'G3')->sum('amount'), + 'turnLoseG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'G3', 'status' => 0])->count(), + 'turnWinG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'G3', 'status' => 1])->count(), + 'amountSendG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'G3')->sum('receive'), + 'amountG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 0])->sum('amount'), + 'turnLoseG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 0])->count(), + 'turnWinG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 1])->count(), + 'amountSendG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'G3')->sum('receive'), + 'amountG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 0])->sum('amount'), + 'turnLoseG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 0])->count(), + 'turnWinG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 1])->count(), + // H3 + 'amountSendH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'H3')->sum('receive'), + 'amountH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'H3')->sum('amount'), + 'turnLoseH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'H3', 'status' => 0])->count(), + 'turnWinH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'H3', 'status' => 1])->count(), + 'amountSendH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'H3')->sum('receive'), + 'amountH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 0])->sum('amount'), + 'turnLoseH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 0])->count(), + 'turnWinH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 1])->count(), + 'amountSendH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'H3')->sum('receive'), + 'amountH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 0])->sum('amount'), + 'turnLoseH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 0])->count(), + 'turnWinH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 1])->count(), + // LO + 'amountSendLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'LO')->sum('receive'), + 'amountLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'LO')->sum('amount'), + 'turnLoseLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'LO', 'status' => 0])->count(), + 'turnWinLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'LO', 'status' => 1])->count(), + 'amountSendLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'LO')->sum('receive'), + 'amountLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 0])->sum('amount'), + 'turnLoseLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 0])->count(), + 'turnWinLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 1])->count(), + 'amountSendLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'LO')->sum('receive'), + 'amountLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 0])->sum('amount'), + 'turnLoseLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 0])->count(), + 'turnWinLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 1])->count(), + ); + $day = array( + '1' => Carbon::now()->toDateString(), + '2' => Carbon::now()->subDay(1)->toDateString(), + '3' => Carbon::now()->subDay(2)->toDateString(), + '4' => Carbon::now()->subDay(3)->toDateString(), + '5' => Carbon::now()->subDay(4)->toDateString(), + '6' => Carbon::now()->subDay(5)->toDateString(), + '7' => Carbon::now()->subDay(6)->toDateString(), + ); + $moneyDay = array( + '1' => HistoryPlay::whereDate('created_at', Carbon::now()->toDateString())->sum('amount') / 1000, + '2' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(1)->toDateString())->sum('amount') / 1000, + '3' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(2)->toDateString())->sum('amount') / 1000, + '4' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(3)->toDateString())->sum('amount') / 1000, + '5' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(4)->toDateString())->sum('amount') / 1000, + '6' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(5)->toDateString())->sum('amount') / 1000, + '7' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(6)->toDateString())->sum('amount') / 1000, + ); + $receiveDay = array( + '1' => HistoryPlay::whereDate('created_at', Carbon::now()->toDateString())->sum('receive') / 1000, + '2' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(1)->toDateString())->sum('receive') / 1000, + '3' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(2)->toDateString())->sum('receive') / 1000, + '4' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(3)->toDateString())->sum('receive') / 1000, + '5' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(4)->toDateString())->sum('receive') / 1000, + '6' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(5)->toDateString())->sum('receive') / 1000, + '7' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(6)->toDateString())->sum('receive') / 1000, + ); + return view('dgaAdmin.home', compact('setting', 'total', 'day', 'moneyDay', 'receiveDay')); + } + + public function setting() { + $setting = Setting::first(); + return view('dgaAdmin.setting', compact('setting')); + } + + public function settingEdit(Request $request) { + $setting = Setting::first(); + $setting->update($request->all()); + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/dgaAdmin/MiniGame.php b/app/Http/Controllers/dgaAdmin/MiniGame.php new file mode 100644 index 0000000..efc26ca --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/MiniGame.php @@ -0,0 +1,408 @@ + array( + 'chan' => 'C', + 'le' => 'L' + ), + 'MINIGAMECL2' => array( + 'chan' => '2', + 'le' => '1' + ), + 'MINIGAMETX' => array( + 'tai' => 'T', + 'xiu' => 'X' + ), + 'MINIGAMETX2' => array( + 'tai' => '4', + 'xiu' => '3' + ), + 'MINIGAME1P3' => array( + 'n0' => 'N0', + 'n1' => 'N1', + 'n2' => 'N2', + 'n3' => 'N3', + ), + 'MINIGAMELO' => array( + 'lo' => 'LO' + ), + 'MINIGAMEH3' => array( + 'h3' => 'H3' + ), + 'MINIGAMEG3' => array( + 'g3' => 'G3' + ) + ); + + public function logicMinigame($tranId, $comment, $game) + { + if ($game == 'CL') { + $number = substr((string) $tranId, -1); + if ($number == 0 || $number == 9) { + $rs = 3; // THUA + } else { + if ($number == 2 || $number == 4 || $number == 6 || $number == 8) { + $rs = $this->comment['MINIGAMECL']['chan']; // CHẴN + } else { + $rs = $this->comment['MINIGAMECL']['le']; // LẺ + } + } + + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'CL2') { + $number = substr((string) $tranId, -1); + if ($number == 0 || $number == 2 || $number == 4 || $number == 6 || $number == 8) { + $rs = $this->comment['MINIGAMECL2']['chan']; // CHẴN 2 + } else { + $rs = $this->comment['MINIGAMECL2']['le']; // LẺ 2 + } + + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'TX') { + $number = substr((string) $tranId, -1); + if ($number == 0 || $number == 9) { + $rs = 3; // THUA + } else { + if ($number >= 5) { + $rs = $this->comment['MINIGAMETX']['tai']; // TÀI + } else { + $rs = $this->comment['MINIGAMETX']['xiu']; // XỈU + } + } + + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'TX2') { + $number = substr((string) $tranId, -1); + + if ($number >= 5) { + $rs = $this->comment['MINIGAMETX2']['tai']; // TÀI + } else { + $rs = $this->comment['MINIGAMETX2']['xiu']; // XỈU + } + + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == '1P3') { + $number = substr((string) $tranId, -1); + if ($number == '0') { + $rs = $this->comment['MINIGAME1P3']['n0']; // N0 + } else if ($number == '1' || $number == '2' || $number == '3') { + $rs = $this->comment['MINIGAME1P3']['n1']; // N1 + } else if ($number == '4' || $number == '5' || $number == '6') { + $rs = $this->comment['MINIGAME1P3']['n2']; // N2 + } else if ($number == '7' || $number == '8' || $number == '9') { + $rs = $this->comment['MINIGAME1P3']['n3']; // N3 + } + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'LO') { + $number = substr((string) $tranId, -2); + if ($number == 01 || $number == 03 || $number == 12 || $number == 19 || $number == 23 || $number == 24 || $number == 30 || $number == 33 || $number == 39 || $number == 48 || $number == 54 || $number == 55 || $number == 60 || $number == 61 || $number == 71 || $number == 77 || $number == 81 || $number == 82 || $number == 83 || $number == 67 || $number == 88 || $number == 76 || $number == 64 || $number == 79 || $number == 29 || $number == 99) { + $rs = $this->comment['MINIGAMELO']['lo']; // LO + } + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'H3') { + $number1 = substr((string) $tranId, -1); + $number2 = substr((string) $tranId, -2, 1); + $number = $number2 - $number1; + if ($number == 9 || $number == 7 || $number == 5 || $number == 3) { + $rs = $this->comment['MINIGAMEH3']['h3']; // H3 + } + if ($rs == $comment) { + return true; + } else { + return false; + } + } else if ($game == 'G3') { + $number1 = substr((string) $tranId, -2); + $number2 = substr((string) $tranId, -3); + if ($number1 == 02 || $number1 == 13 || $number1 == 17 || $number1 == 19 || $number1 == 21 || $number1 == 29 || $number1 == 35 || $number1 == 37 || $number1 == 47 || $number1 == 49 || $number1 == 51 || $number1 == 54 || $number1 == 57 || $number1 == 63 || $number1 == 64 || $number1 == 74 || $number1 == 83 || $number1 == 91 || $number1 == 95 || $number1 == 96) { + $rs = $this->comment['MINIGAMEG3']['g3']; // G3 + } else if ($number1 == 66 || $number1 == 99) { + $rs = $this->comment['MINIGAMEG3']['g3']; // G3 + } else if ($number2 == 123 || $number2 == 234 || $number2 == 456 || $number2 == 678 || $number2 == 789) { + $rs = $this->comment['MINIGAMEG3']['g3']; // G3 + } + if ($rs == $comment) { + return true; + } else { + return false; + } + } + } + + public function XuLiMiniGame() + { + $momo = Momo::where('status', 1)->get(); + $setting = Setting::first(); + foreach ($momo as $row) { + $url = route('admin.historyMomo', ['phone' => $row->phone]); + $response = Http::get($url)->json(); + + if (!empty($response['data'])) { + foreach ($response['data'] as $data) { + $comment = $data['comment']; + $amount = $data['amount']; + $partnerId = $data['patnerID']; + $partnerName = $data['partnerName']; + $tranId = $data['tranId']; + $history = HistoryPlay::where('tranId', $tranId)->first(); + if (!$history) { + if (Str::upper($comment) == $this->comment['MINIGAMECL']['chan'] || Str::upper($comment) == $this->comment['MINIGAMECL']['le']) { // MINIGAME CHẴN LẺ + $game = 'CL'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $receive = $amount * $setting->ratioCL; // TIỀN NHẬN KHI THẮN + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMECL2']['chan'] || Str::upper($comment) == $this->comment['MINIGAMECL2']['le']) { // MINIGAME CHẴN LẺ 2 + $game = 'CL2'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $receive = $amount * $setting->ratioCL2; // TIỀN NHẬN KHI THẮN + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMETX']['tai'] || Str::upper($comment) == $this->comment['MINIGAMETX']['xiu']) { // MINIGAME TÀI XỈU + $game = 'TX'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $receive = $amount * $setting->ratioTX; // TIỀN NHẬN KHI THẮN + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMETX2']['tai'] || Str::upper($comment) == $this->comment['MINIGAMETX2']['xiu']) { // MINIGAME TÀI XỈU 2 + $game = 'TX2'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $receive = $amount * $setting->ratioTX2; // TIỀN NHẬN KHI THẮN + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAME1P3']['n0'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n1'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n2'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n3']) { // MINIGAME 1 PHẦN 3 + $game = '1P3'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + if ($comment != 'N0') { + $receive = $amount * explode('|', $setting->ratio1P3)[0]; // TIỀN NHẬN KHI THẮN + } else { + $receive = $amount * explode('|', $setting->ratio1P3)[1]; // TIỀN NHẬN KHI THẮN + } + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMELO']['lo']) { // MINIGAME LO + $game = 'LO'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $receive = $amount * $setting->ratioLO; // TIỀN NHẬN KHI THẮN + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMEH3']['h3']) { // MINIGAME H3 + $game = 'H3'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $number1 = substr((string) $tranId, -1); + $number2 = substr((string) $tranId, -2, 1); + $number = $number2 - $number1; + if ($number == 3) { + $receive = $amount * explode('|', $setting->ratioH3)[0];; // TIỀN NHẬN KHI THẮNG + } else if ($number == 5) { + $receive = $amount * explode('|', $setting->ratioH3)[1];; // TIỀN NHẬN KHI THẮNG + } else if ($number == 7) { + $receive = $amount * explode('|', $setting->ratioH3)[2];; // TIỀN NHẬN KHI THẮNG + } else if ($number == 9) { + $receive = $amount * explode('|', $setting->ratioH3)[3];; // TIỀN NHẬN KHI THẮNG + } + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else if (Str::upper($comment) == $this->comment['MINIGAMEH3']['h3']) { // MINIGAME H3 + $game = 'G3'; + if ($amount >= $row->min && $amount <= $row->max) { + if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG + $number1 = substr((string) $tranId, -1); + $number2 = substr((string) $tranId, -3); + if ($number1 == 02 || $number1 == 13 || $number1 == 17 || $number1 == 19 || $number1 == 21 || $number1 == 29 || $number1 == 35 || $number1 == 37 || $number1 == 47 || $number1 == 49 || $number1 == 51 || $number1 == 54 || $number1 == 57 || $number1 == 63 || $number1 == 64 || $number1 == 74 || $number1 == 83 || $number1 == 91 || $number1 == 95 || $number1 == 96) { + $receive = $amount * explode('|', $setting->ratioG3)[0];; // TIỀN NHẬN KHI THẮNG + } else if ($number1 == 66 || $number1 == 99) { + $receive = $amount * explode('|', $setting->ratioG3)[1];; // TIỀN NHẬN KHI THẮNG + } else if ($number2 == 123 || $number2 == 234 || $number2 == 456 || $number2 == 678 || $number2 == 789) { + $receive = $amount * explode('|', $setting->ratioG3)[2];; // TIỀN NHẬN KHI THẮNG + } + $status = 1; // THẮNG + $pay = 0; // CHƯA CHUYỂN + } else { + $receive = 0; + $status = 0; // THUA + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } else { + $receive = 0; // THUA + $status = 3; // GIỚI HẠN + $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN + } + } + HistoryPlay::create([ + 'tranId' => $tranId, + 'partnerName' => $partnerName, + 'partnerId' => $partnerId, + 'comment' => $comment, + 'amount' => $amount, + 'receive' => $receive, + 'status' => $status, + 'pay' => $pay, + 'game' => $game, + 'phoneSend' => $row->phone + ]); + } + } + } + } + } + + public function payMoneyMiniGame() { + $setting = Setting::first(); + $history = HistoryPlay::where(['status' => 1, 'pay' => 0])->orWhere('pay', 100)->get(); + foreach ($history as $row) { + $info = HistoryPlay::where(['tranId' => $row->tranId])->first(); + $url = route('admin.sendMoneyMomo', ['phone' => $info->phoneSend, 'amount' => $info->receive, 'comment' => $setting->content.$row->tranId, 'receiver' => $info->partnerId]); + $response = Http::get($url)->json(); + if ($response['status'] != 'success') { // CHUYỂN TIỀN LỖI + $info->pay = 100; + $info->save(); + } else { + $momo = Momo::where('phone', $info->phoneSend)->first(); + $momo->times = $momo->times + 1; + $momo->amount = $momo->amount + $info->receive; + $momo->save(); + $info->pay = 1; + $info->save(); + } + } + } + + public function payDayMission() { + $setting = Setting::first(); + $history = HistoryDayMission::where(['status' => 1, 'pay' => 0])->get(); + $phone = Momo::where('status', 1)->inRandomOrder()->first()->phone; + foreach ($history as $row) { + $info = HistoryDayMission::where(['status' => 1, 'pay' => 0, 'id' => $row->id])->first(); + $url = route('admin.sendMoneyMomo', ['phone' => $phone, 'amount' => $info->receive, 'comment' => $setting->content_day.' '.Str::upper(Str::random(6)), 'receiver' => $info->phone]); + $response = Http::get($url)->json(); + if ($response['status'] != 'success') { // CHUYỂN TIỀN LỖI + $info->pay = 100; + $info->save(); + } else { + $momo = Momo::where('phone', $phone)->first(); + $momo->times = $momo->times + 1; + $momo->amount = $momo->amount + $info->receive; + $momo->save(); + $info->pay = 1; + $info->save(); + } + } + } + +} diff --git a/app/Http/Controllers/dgaAdmin/MomoApi.php b/app/Http/Controllers/dgaAdmin/MomoApi.php new file mode 100644 index 0000000..4bd86fd --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/MomoApi.php @@ -0,0 +1,788 @@ + array( + 'partnerCode' => '110', + ), + 'VTB' => array( + 'partnerCode' => '102', + ), + 'MB' => array( + 'partnerCode' => '301', + ), + 'ACB' => array( + 'partnerCode' => '115', + ), + 'VCB' => array( + 'partnerCode' => '12345', + ), + + 'VPB' => array( + 'partnerCode' => '103', + ), + 'VIB' => array( + 'partnerCode' => '113', + ), + 'EXB' => array( + 'partnerCode' => '107', + ), + 'OCB' => array( + 'partnerCode' => '104', + ), + 'SCB' => array( + 'partnerCode' => '111', + ), + + ); + + private $ohash; + + private $TimeSetUp = 600; // seconds + + private $amount = 100000; + + private $hours = 200; + + private $keys; + + private $send = array(); + + private $rsa; + + private $URLAction = array( + "CHECK_USER_BE_MSG" => "https://api.momo.vn/backend/auth-app/public/CHECK_USER_BE_MSG", //Check người dùng + "SEND_OTP_MSG" => "https://api.momo.vn/backend/otp-app/public/SEND_OTP_MSG", //Gửi OTP + "REG_DEVICE_MSG" => "https://api.momo.vn/backend/otp-app/public/REG_DEVICE_MSG", // Xác minh OTP + "QUERY_TRAN_HIS_MSG" => "https://owa.momo.vn/api/QUERY_TRAN_HIS_MSG", // Check ls giao dịch + "USER_LOGIN_MSG" => "https://owa.momo.vn/public/login", // Đăng Nhập + "QUERY_TRAN_HIS_MSG_NEW" => "https://m.mservice.io/hydra/v2/user/noti", // check ls giao dịch + "M2MU_INIT" => "https://owa.momo.vn/api/M2MU_INIT", // Chuyển tiền + "M2MU_CONFIRM" => "https://owa.momo.vn/api/M2MU_CONFIRM", // Chuyển tiền + "LOAN_MSG" => "https://owa.momo.vn/api/LOAN_MSG", // yêu cầu chuyển tiền + 'M2M_VALIDATE_MSG' => 'https://owa.momo.vn/api/M2M_VALIDATE_MSG', // Ko rõ chức năng + 'CHECK_USER_PRIVATE' => 'https://owa.momo.vn/api/CHECK_USER_PRIVATE', // Check người dùng ẩn + 'TRAN_HIS_INIT_MSG' => 'https://owa.momo.vn/api/TRAN_HIS_INIT_MSG', // Rút tiền, chuyển tiền + 'TRAN_HIS_CONFIRM_MSG' => 'https://owa.momo.vn/api/TRAN_HIS_CONFIRM_MSG', // rút tiền chuyển tiền + 'GET_CORE_PREPAID_CARD' => 'https://owa.momo.vn/api/sync/GET_CORE_PREPAID_CARD', + 'ins_qoala_phone' => 'https://owa.momo.vn/proxy/ins_qoala_phone', + 'GET_DETAIL_LOAN' => 'https://owa.momo.vn/api/GET_DETAIL_LOAN', // Get danh sách yêu cầu chuyển + 'LOAN_UPDATE_STATUS' => 'https://owa.momo.vn/api/LOAN_UPDATE_STATUS', // Từ chỗi chuyển tiền + 'CANCEL_LOAN_REQUEST' => 'https://owa.momo.vn/api/CANCEL_LOAN_REQUEST', // Huỷe chuyển tiền + 'LOAN_SUGGEST' => 'https://owa.momo.vn/api/LOAN_SUGGEST', + 'STANDARD_LOAN_REQUEST' => 'https://owa.momo.vn/api/STANDARD_LOAN_REQUEST', + 'SAY_THANKS' => 'https://owa.momo.vn/api/SAY_THANKS', // Gửi lời nhắn khi nhận tiền + 'HEARTED_TRANSACTIONS' => 'https://owa.momo.vn/api/HEARTED_TRANSACTIONS', + 'VERIFY_MAP' => 'https://owa.momo.vn/api/VERIFY_MAP', // Liên kết ngân hàng + 'service' => "https://owa.momo.vn/service", // Check ngân hàng qua stk + 'NEXT_PAGE_MSG' => 'https://owa.momo.vn/api/NEXT_PAGE_MSG', // mua thẻ điện thoại + 'dev_backend_gift-recommend' => 'https://owa.momo.vn/proxy/dev_backend_gift-recommend', // check gift + 'ekyc_init' => 'https://owa.momo.vn/proxy/ekyc_init', // Xác minh cmnd + 'ekyc_ocr' => 'https://owa.momo.vn/proxy/ekyc_ocr', // xác minh cmnd + 'GetDataStoreMsg' => 'https://owa.momo.vn/api/GetDataStoreMsg', // Get danh sách ngân hàng đã chuyển + 'VOUCHER_GET' => 'https://owa.momo.vn/api/sync/VOUVHER_GET', // get voucher + 'END_USER_QUICK_REGISTER' => 'https://api.momo.vn/backend/auth-app/public/END_USER_QUICK_REGISTER', // đăng kí + 'AGENT_MODIFY' => 'https://api.momo.vn/backend/auth-app/api/AGENT_MODIFY', // Cập nhật tên email + 'ekyc_ocr_result' => 'https://owa.momo.vn/proxy/ekyc_ocr_result', // xác minh cmnd + 'CHECK_INFO' => 'https://owa.momo.vn/api/CHECK_INFO', // Check hóa đơn + 'BANK_OTP' => 'https://owa.momo.vn/api/BANK_OTP', // Rút tiền + 'SERVICE_UNAVAILABLE' => 'https://owa.momo.vn/api/SERVICE_UNAVAILABLE', // Bên bảo mật + 'ekyc_ocr_confirm' => 'https://owa.momo.vn/proxy/ekyc_ocr_confirm', //Xác minh cmnd + 'sync' => 'https://owa.momo.vn/api/sync', // Lấy biến động số dư + 'MANAGE_CREDIT_CARD' => 'https://owa.momo.vn/api/MANAGE_CREDIT_CARD', //Thêm visa marter card + 'UN_MAP' => 'https://owa.momo.vn/api/UN_MAP', // Hủy liên kết thẻ + 'WALLET_MAPPING' => 'https://owa.momo.vn/api/WALLET_MAPPING', // Liên kết thẻ + 'NAPAS_CASHIN_INIT_MSG' => 'https://owa.momo.vn/api/NAPAS_CASHIN_INIT_MSG', + "CARD_GET" => "https://owa.momo.vn/api/sync/CARD_GET", + 'NAPAS_CASHIN_DELETE_TOKEN_MSG' => 'https://owa.momo.vn/api/NAPAS_CASHIN_DELETE_TOKEN_MSG', + 'API_DEFAULT_SOURCE' => 'https://owa.momo.vn/api/API_DEFAULT_SOURCE' + + ); + + private $momo_data_config = array( + "appVer" => 31110, + "appCode" => "3.1.11" + + ); + + public function SendOTP($data) + { + $result = $this->SEND_OTP_MSG($data); + if ($result["errorCode"] != 0) { + return array( + "status" => "error", + "code" => $result["errorCode"], + "message" => $result["errorDesc"] + ); + } else { + return array( + "status" => "success", + "message" => "Thành công" + ); + } + return $result; + } + + private function SEND_OTP_MSG($data) + { + $header = array( + "agent_id: undefined", + "sessionkey:", + "user_phone: undefined", + "authorization: Bearer undefined", + "msgtype: SEND_OTP_MSG", + "Host: api.momo.vn", + "User-Agent: okhttp/3.14.17", + "app_version: " . $this->momo_data_config["appVer"], + "app_code: " . $this->momo_data_config["appCode"], + "device_os: ANDROID" + ); + $microtime = $this->get_microtime(); + $Data = array( + 'user' => $data['phone'], + 'msgType' => 'SEND_OTP_MSG', + 'cmdId' => (string) $microtime . '000000', + 'lang' => 'vi', + 'time' => $microtime, + 'channel' => 'APP', + 'appVer' => $this->momo_data_config["appVer"], + 'appCode' => $this->momo_data_config["appCode"], + 'deviceOS' => 'ANDROID', + 'buildNumber' => 0, + 'appId' => 'vn.momo.platform', + 'result' => true, + 'errorCode' => 0, + 'errorDesc' => '', + 'momoMsg' => + array( + '_class' => 'mservice.backend.entity.msg.RegDeviceMsg', + 'number' => $data['phone'], + 'imei' => $data["imei"], + 'cname' => 'Vietnam', + 'ccode' => '084', + 'device' => $data["device"], + 'firmware' => '23', + 'hardware' => $data["hardware"], + 'manufacture' => $data["facture"], + 'csp' => '', + 'icc' => '', + 'mcc' => '452', + 'device_os' => 'Ios', + 'secure_id' => $data['SECUREID'], + ), + 'extra' => + array( + 'action' => 'SEND', + 'rkey' => $data["rkey"], + 'AAID' => $data["AAID"], + 'IDFA' => '', + 'TOKEN' => $data["TOKEN"], + 'SIMULATOR' => '', + 'SECUREID' => $data['SECUREID'], + 'MODELID' => $data["MODELID"], + 'isVoice' => false, + 'REQUIRE_HASH_STRING_OTP' => true, + 'checkSum' => '', + ), + ); + return $this->CURL("SEND_OTP_MSG", $header, $Data); + } + + public function REG_DEVICE_MSG($data) + { + $microtime = $this->get_microtime(); + $header = array( + "agent_id: undefined", + "sessionkey:", + "user_phone: undefined", + "authorization: Bearer undefined", + "msgtype: REG_DEVICE_MSG", + "Host: api.momo.vn", + "User-Agent: okhttp/3.14.17", + "app_version: " . $this->momo_data_config["appVer"], + "app_code: " . $this->momo_data_config["appCode"], + "device_os: ANDROID" + ); + $Data = '{ + "user": "' . $data["phone"] . '", + "msgType": "REG_DEVICE_MSG", + "cmdId": "' . $microtime . '000000", + "lang": "vi", + "time": ' . $microtime . ', + "channel": "APP", + "appVer": ' . $this->momo_data_config["appVer"] . ', + "appCode": "' . $this->momo_data_config["appCode"] . '", + "deviceOS": "ANDROID", + "buildNumber": 0, + "appId": "vn.momo.platform", + "result": true, + "errorCode": 0, + "errorDesc": "", + "momoMsg": { + "_class": "mservice.backend.entity.msg.RegDeviceMsg", + "number": "' . $data["phone"] . '", + "imei": "' . $data["imei"] . '", + "cname": "Vietnam", + "ccode": "084", + "device": "' . $data["device"] . '", + "firmware": "23", + "hardware": "' . $data["hardware"] . '", + "manufacture": "' . $data["facture"] . '", + "csp": "", + "icc": "", + "mcc": "", + "device_os": "Android", + "secure_id": "' . $data["SECUREID"] . '" + }, + "extra": { + "ohash": "' . $data['ohash'] . '", + "AAID": "' . $data["AAID"] . '", + "IDFA": "", + "TOKEN": "' . $data["TOKEN"] . '", + "SIMULATOR": "", + "SECUREID": "' . $data["SECUREID"] . '", + "MODELID": "' . $data["MODELID"] . '", + "checkSum": "" + } + }'; + return $this->CURL("REG_DEVICE_MSG", $header, $Data); + } + + public function USER_LOGIN_MSG($data) + { + $microtime = $this->get_microtime(); + $header = array( + "agent_id: " . $data["agent_id"], + "user_phone: " . $data["phone"], + "sessionkey: " . (!empty($data["sessionkey"])) ? $data["sessionkey"] : "", + "authorization: Bearer " . $data["authorization"], + "msgtype: USER_LOGIN_MSG", + "Host: owa.momo.vn", + "user_id: " . $data["phone"], + "User-Agent: okhttp/3.14.17", + "app_version: " . $this->momo_data_config["appVer"], + "app_code: " . $this->momo_data_config["appCode"], + "device_os: ANDROID" + ); + $Data = array( + 'user' => $data['phone'], + 'msgType' => 'USER_LOGIN_MSG', + 'pass' => $data['password'], + 'cmdId' => (string) $microtime . '000000', + 'lang' => 'vi', + 'time' => $microtime, + 'channel' => 'APP', + 'appVer' => $this->momo_data_config["appVer"], + 'appCode' => $this->momo_data_config["appCode"], + 'deviceOS' => 'ANDROID', + 'buildNumber' => 0, + 'appId' => 'vn.momo.platform', + 'result' => true, + 'errorCode' => 0, + 'errorDesc' => '', + 'momoMsg' => + array( + '_class' => 'mservice.backend.entity.msg.LoginMsg', + 'isSetup' => false, + ), + 'extra' => + array( + 'pHash' => $this->get_pHash($data), + 'AAID' => $data['AAID'], + 'IDFA' => '', + 'TOKEN' => $data['TOKEN'], + 'SIMULATOR' => '', + 'SECUREID' => $data['SECUREID'], + 'MODELID' => $data['MODELID'], + 'checkSum' => $this->generateCheckSum('USER_LOGIN_MSG', $microtime, $data), + ), + ); + return $this->CURL("USER_LOGIN_MSG", $header, $Data); + } + + public function CheckHisNew($hours = 5, $data) + { + $begin = (time() - (3600 * $hours)) * 1000; + $header = array( + "authorization: Bearer " . $data["authorization"], + "user_phone: " . $data["phone"], + "sessionkey: " . $data["sessionkey"], + "agent_id: " . $data["agent_id"], + 'app_version: ' . $this->momo_data_config["appVer"], + 'app_code: ' . $this->momo_data_config["appCode"], + "Host: m.mservice.io" + ); + $Data = '{ + "userId": "' . $data['phone'] . '", + "fromTime": ' . $begin . ', + "toTime": ' . $this->get_microtime() . ', + "limit": 5000, + "cursor": "", + "cusPhoneNumber": "" + }'; + + $result = $this->CURL("QUERY_TRAN_HIS_MSG_NEW", $header, $Data); + if (!is_array($result)) { + return array( + "status" => "error", + "code" => -5, + "message" => "Hết thời gian truy cập vui lòng đăng nhập lại" + ); + } + $tranHisMsg = $result["message"]["data"]["notifications"]; + $return = array(); + foreach ($tranHisMsg as $value) { + if($value["type"] != 77) continue; + $extra = json_decode($value["extra"],true); + $amount = $value['caption']; + $name = explode("từ", $amount)[1] ?: ""; + if (strpos($amount, "Nhận") !== false && $name) { + preg_match('#Nhận (.+?)đ#is', $amount, $amount); + $amount = str_replace(".", "", $amount[1]) > 0 ? str_replace(".", "", $amount[1]) : '0'; + //Cover body to comment + $comment = $value['body']; + $comment = ltrim($comment, '"'); + $comment = explode('"', $comment); + $comment = $comment[0]; + if ($comment == "Nhấn để xem chi tiết.") { + $comment = ""; + } + $return[] = array( + "tranId" => $value["tranId"], + "ID" => $value["ID"], + "patnerID" => $value["sender"], + "partnerName" => $name, + "comment" => $comment, + "amount" => (int)$amount, + "millisecond" => $value["time"] + ); + } + } + return array('status' => 'success', 'author' => 'DUNGA', 'data' => $return); + } + + public function CHECK_USER_PRIVATE($receiver, $data) + { + $microtime = $this->get_microtime(); + $requestkeyRaw = $this->generateRandom(32); + $requestkey = $this->RSA_Encrypt($data["RSA_PUBLIC_KEY"], $requestkeyRaw); + $header = array( + "agent_id: " . $data["agent_id"], + "user_phone: " . $data["phone"], + "sessionkey: " . $data["sessionkey"], + "authorization: Bearer " . $data["authorization"], + "msgtype: CHECK_USER_PRIVATE", + "userid: " . $data["phone"], + "requestkey: " . $requestkey, + "Host: owa.momo.vn" + ); + $Data = '{ + "user":"' . $data['phone'] . '", + "msgType":"CHECK_USER_PRIVATE", + "cmdId":"' . $microtime . '000000", + "lang":"vi", + "time":' . (int) $microtime . ', + "channel":"APP", + "appVer": ' . $this->momo_data_config["appVer"] . ', + "appCode": "' . $this->momo_data_config["appCode"] . '", + "deviceOS":"ANDROID", + "buildNumber":1916, + "appId":"vn.momo.transfer", + "result":true, + "errorCode":0, + "errorDesc":"", + "momoMsg": + { + "_class":"mservice.backend.entity.msg.LoginMsg", + "getMutualFriend":false + }, + "extra": + { + "CHECK_INFO_NUMBER":"' . $receiver . '", + "checkSum":"' . $this->generateCheckSum('CHECK_USER_PRIVATE', $microtime, $data) . '" + } + }'; + return $this->CURL("CHECK_USER_PRIVATE", $header, $this->Encrypt_data($Data, $requestkeyRaw)); + } + + public function CHECK_USER_BE_MSG($data) + { + $microtime = $this->get_microtime(); + $header = array( + "agent_id: undefined", + "sessionkey:", + "user_phone: undefined", + "authorization: Bearer undefined", + "msgtype: CHECK_USER_BE_MSG", + "Host: api.momo.vn", + "User-Agent: okhttp/3.14.17", + "app_version: ".$this->momo_data_config["appVer"], + "app_code: ", + "device_os: ANDROID" + ); + + $Data = array ( + 'user' => $data['phone'], + 'msgType' => 'CHECK_USER_BE_MSG', + 'cmdId' => (string) $microtime. '000000', + 'lang' => 'vi', + 'time' => $microtime, + 'channel' => 'APP', + 'appVer' => $this->momo_data_config["appVer"], + 'appCode' => $this->momo_data_config["appCode"], + 'deviceOS' => 'ANDROID', + 'buildNumber' => 0, + 'appId' => 'vn.momo.platform', + 'result' => true, + 'errorCode' => 0, + 'errorDesc' => '', + 'momoMsg' => + array ( + '_class' => 'mservice.backend.entity.msg.RegDeviceMsg', + 'number' => $data['phone'], + 'imei' => $data["imei"], + 'cname' => 'Vietnam', + 'ccode' => '084', + 'device' => $data["device"], + 'firmware' => '23', + 'hardware' => $data["hardware"], + 'manufacture' => $data["facture"], + 'csp' => 'Viettel', + 'icc' => '', + 'mcc' => '452', + 'device_os' => 'Android', + 'secure_id' => $data["SECUREID"], + ), + 'extra' => + array ( + 'checkSum' => '', + ), + ); + return $this->CURL("CHECK_USER_BE_MSG",$header,$Data); + + } + + public function M2MU_INIT($dataPhone, $dataSend) + { + $microtime = $this->get_microtime(); + $requestkeyRaw = $this->generateRandom(32); + $requestkey = $this->RSA_Encrypt($dataPhone["RSA_PUBLIC_KEY"],$requestkeyRaw); + $header = array( + "agent_id: ".$dataPhone["agent_id"], + "user_phone: ".$dataPhone["phone"], + "sessionkey: ".$dataPhone["sessionkey"], + "authorization: Bearer ".$dataPhone["authorization"], + "msgtype: M2MU_INIT", + "userid: ".$dataPhone["phone"], + "requestkey: ".$requestkey, + "Host: owa.momo.vn" + ); + $ipaddress = $this->get_ip_address(); + $Data = array ( + 'user' => $dataPhone['phone'], + 'msgType' => 'M2MU_INIT', + 'cmdId' => (string) $microtime.'000000', + 'lang' => 'vi', + 'time' => (int) $microtime, + 'channel' => 'APP', + 'appVer' => $this->momo_data_config["appVer"], + 'appCode' => $this->momo_data_config["appCode"], + 'deviceOS' => 'ANDROID', + 'buildNumber' => 0, + 'appId' => 'vn.momo.platform', + 'result' => true, + 'errorCode' => 0, + 'errorDesc' => '', + 'momoMsg' => + array ( + 'clientTime' => (int) $microtime - 221, + 'tranType' => 2018, + 'comment' => $dataSend['comment'], + 'amount' => $dataSend['amount'], + 'partnerId' => $dataSend['receiver'], + 'partnerName' => $dataSend['partnerName'], + 'ref' => '', + 'serviceCode' => 'transfer_p2p', + 'serviceId' => 'transfer_p2p', + '_class' => 'mservice.backend.entity.msg.M2MUInitMsg', + 'tranList' => + array ( + 0 => + array ( + 'partnerName' => $dataSend['partnerName'], + 'partnerId' => $dataSend['receiver'], + 'originalAmount' => $dataSend['amount'], + 'serviceCode' => 'transfer_p2p', + 'stickers' => '', + 'themeBackground' => '#f5fff6', + 'themeUrl' => 'https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png', + 'transferSource' => '', + 'socialUserId' => '', + '_class' => 'mservice.backend.entity.msg.M2MUInitMsg', + 'tranType' => 2018, + 'comment' => $dataSend['comment'], + 'moneySource' => 1, + 'partnerCode' => 'momo', + 'serviceMode' => 'transfer_p2p', + 'serviceId' => 'transfer_p2p', + 'extras' => '{"loanId":0,"appSendChat":false,"loanIds":[],"stickers":"","themeUrl":"https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png","hidePhone":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'","vpc_PaymentGateway":""}', + ), + ), + 'extras' => '{"loanId":0,"appSendChat":false,"loanIds":[],"stickers":"","themeUrl":"https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png","hidePhone":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'","vpc_PaymentGateway":""}', + 'moneySource' => 1, + 'partnerCode' => 'momo', + 'rowCardId' => '', + 'giftId' => '', + 'useVoucher' => 0, + 'prepaidIds' => '', + 'usePrepaid' => 0, + ), + 'extra' => + array ( + 'checkSum' => $this->generateCheckSum('M2MU_INIT', $microtime, $dataPhone), + ), + ); + return $this->CURL("M2MU_INIT",$header,$this->Encrypt_data($Data,$requestkeyRaw)); + + } + + public function M2MU_CONFIRM($ID, $data, $dataSend) + { + $microtime = $this->get_microtime(); + $requestkeyRaw = $this->generateRandom(32); + $requestkey = $this->RSA_Encrypt($data["RSA_PUBLIC_KEY"],$requestkeyRaw); + $header = array( + "agent_id: ".$data["agent_id"], + "user_phone: ".$data["phone"], + "sessionkey: ".$data["sessionkey"], + "authorization: Bearer ".$data["authorization"], + "msgtype: M2MU_INIT", + "userid: ".$data["phone"], + "requestkey: ".$requestkey, + "Host: owa.momo.vn" + ); + $ipaddress = $this->get_ip_address(); + $Data = array( + 'user' => $data['phone'], + 'pass' => $data['password'], + 'msgType' => 'M2MU_CONFIRM', + 'cmdId' => (string) $microtime.'000000', + 'lang' => 'vi', + 'time' =>(int) $microtime, + 'channel' => 'APP', + 'appVer' => $this->momo_data_config["appVer"], + 'appCode' => $this->momo_data_config["appCode"], + 'deviceOS' => 'ANDROID', + 'buildNumber' => 0, + 'appId' => 'vn.momo.platform', + 'result' => true, + 'errorCode' => 0, + 'errorDesc' => '', + 'momoMsg' => + array( + 'ids' => + array ( + 0 => $ID, + ), + 'totalAmount' => $dataSend['amount'], + 'originalAmount' => $dataSend['amount'], + 'originalClass' => 'mservice.backend.entity.msg.M2MUConfirmMsg', + 'originalPhone' => $data['phone'], + 'totalFee' => '0.0', + 'id' => $ID, + 'GetUserInfoTaskRequest' => $dataSend['receiver'], + 'tranList' => + array ( + 0 => + array( + '_class' => 'mservice.backend.entity.msg.TranHisMsg', + 'user' => $data['phone'], + 'clientTime' => (int) ($microtime - 211), + 'tranType' => 36, + 'amount' => (int) $dataSend['amount'], + 'receiverType' => 1, + ), + 1 => + array( + '_class' => 'mservice.backend.entity.msg.TranHisMsg', + 'user' => $data['phone'], + 'clientTime' => (int) ($microtime - 211), + 'tranType' => 36, + 'partnerId' => $dataSend['receiver'], + 'amount' => 100, + 'comment' => '', + 'ownerName' => $data['Name'], + 'receiverType' => 0, + 'partnerExtra1' => '{"totalAmount":'.$dataSend['amount'].'}', + 'partnerInvNo' => 'borrow', + ), + ), + 'serviceId' => 'transfer_p2p', + 'serviceCode' => 'transfer_p2p', + 'clientTime' => (int) ($microtime - 211), + 'tranType' => 2018, + 'comment' => '', + 'ref' => '', + 'amount' => $dataSend['amount'], + 'partnerId' => $dataSend['receiver'], + 'bankInId' => '', + 'otp' => '', + 'otpBanknet' => '', + '_class' => 'mservice.backend.entity.msg.M2MUConfirmMsg', + 'extras' => '{"appSendChat":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'"","vpc_PaymentGateway":""}', + ), + 'extra' => + array( + 'checkSum' => $this-> generateCheckSum('M2MU_CONFIRM',$microtime, $data), + ), + ); + return $this->CURL("M2MU_CONFIRM",$header,$this->Encrypt_data($Data,$requestkeyRaw)); + + } + + private function CURL($Action, $header, $data) + { + $Data = is_array($data) ? json_encode($data) : $data; + $curl = curl_init(); + // echo strlen($Data); die; + $header[] = 'Content-Type: application/json'; + $header[] = 'accept: application/json'; + $header[] = 'Content-Length: ' . strlen($Data); + $opt = array( + CURLOPT_URL => $this->URLAction[$Action], + CURLOPT_RETURNTRANSFER => TRUE, + CURLOPT_POST => empty($data) ? FALSE : TRUE, + CURLOPT_POSTFIELDS => $Data, + CURLOPT_CUSTOMREQUEST => empty($data) ? 'GET' : 'POST', + CURLOPT_HTTPHEADER => $header, + CURLOPT_ENCODING => "", + CURLOPT_HEADER => FALSE, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_TIMEOUT => 20, + ); + curl_setopt_array($curl, $opt); + $body = curl_exec($curl); + // echo strlen($body); die; + if (is_object(json_decode($body))) { + return json_decode($body, true); + } + return json_decode($this->Decrypt_data($body), true); + } + + public function Decrypt_data($data) + { + + $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return openssl_decrypt(base64_decode($data), 'AES-256-CBC', $this->keys, OPENSSL_RAW_DATA, $iv); + } + + public function generateCheckSum($type, $microtime, $data) + { + $Encrypt = $data["phone"] . $microtime . '000000' . $type . ($microtime / 1000000000000.0) . 'E12'; + $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return base64_encode(openssl_encrypt($Encrypt, 'AES-256-CBC', $data["setupKeyDecrypt"], OPENSSL_RAW_DATA, $iv)); + } + + private function get_pHash($data) + { + $key = $data["imei"] . "|" . $data["password"]; + $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return base64_encode(openssl_encrypt($key, 'AES-256-CBC', $data['setupKeyDecrypt'], OPENSSL_RAW_DATA, $iv)); + } + + public function get_setupKey($setUpKey, $data) + { + $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + return openssl_decrypt(base64_decode($setUpKey), 'AES-256-CBC', $data["ohash"], OPENSSL_RAW_DATA, $iv); + } + + public function generateRandom($length = 20) + { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + private function get_SECUREID($length = 17) + { + $characters = '0123456789abcdef'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + public function get_microtime() + { + return round(microtime(true) * 1000); + } + public function generateImei() + { + return $this->generateRandomString(8) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(12); + } + private function generateRandomString($length = 20) + { + $characters = '0123456789abcdef'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + public function get_TOKEN() + { + return $this->generateRandom(22) . ':' . $this->generateRandom(9) . '-' . $this->generateRandom(20) . '-' . $this->generateRandom(12) . '-' . $this->generateRandom(7) . '-' . $this->generateRandom(7) . '-' . $this->generateRandom(53) . '-' . $this->generateRandom(9) . '_' . $this->generateRandom(11) . '-' . $this->generateRandom(4); + } + + public function Encrypt_data($data,$key) + { + + $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + $this->keys = $key; + return base64_encode(openssl_encrypt(is_array($data) ? json_encode($data) : $data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv)); + + } + + public function RSA_Encrypt($key,$content) + { + if(empty($this->rsa)){ + $this->INCLUDE_RSA($key); + } + return base64_encode($this->rsa->encrypt($content)); + } + + private function INCLUDE_RSA($key) + { + require_once ('Crypt/RSA.php'); + $this->rsa = new Crypt_RSA(); + $this->rsa->loadKey($key); + $this->rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); + return $this; + } + + private function get_ip_address() + { + $isValid = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP,FILTER_FLAG_IPV4); + if(!empty($isValid)){ + return $_SERVER['REMOTE_ADDR']; + } + try { + $isIpv4 = json_decode(file_get_contents('https://api.ipify.org?format=json'), true); + return $isIpv4['ip']; + } catch (\Throwable $e){ + return '116.107.187.109'; + } + } +} diff --git a/app/Http/Controllers/dgaAdmin/MomoController.php b/app/Http/Controllers/dgaAdmin/MomoController.php new file mode 100644 index 0000000..c8a439e --- /dev/null +++ b/app/Http/Controllers/dgaAdmin/MomoController.php @@ -0,0 +1,323 @@ +info)->name; + $GetAccountMomo[$i]['balance'] = json_decode($row->info)->balance; + if ($row->status == 1) { + $GetAccountMomo[$i]['status_text'] = 'Hoạt động'; + } else if ($row->status == 2) { + $GetAccountMomo[$i]['status_text'] = 'Ẩn'; + } else if ($row->status == 0) { + $GetAccountMomo[$i]['status_text'] = 'Bảo trì'; + } else if ($row->status == 3) { + $GetAccountMomo[$i]['status_text'] = 'Đang xác thực'; + } + + $i ++; + + } + return view('dgaAdmin.addMomo', compact('setting', 'GetAccountMomo')); + } + + public function getOTP(Request $request) + { + $validator = Validator::make($request->all(), [ + 'phone' => 'required|string|max:11', + 'min' => 'numeric|required', + 'max' => 'numeric|required', + 'password' => 'required|string|min:6', + ]); + if ($validator->fails()) { + return response()->json(array('status' => 'error', 'message' => $validator->errors()->first())); + } + $momo = new MomoApi(); + $data = array( + 'phone' => $request->phone, + 'device' => 'iPhone', + 'hardware' => 'iPhone', + 'facture' => 'Apple', + 'SECUREID' => '', + 'MODELID' => '', + 'imei' => $momo->generateImei(), + 'rkey' => $momo->generateRandom(20), + 'AAID' => '', + 'TOKEN' => $momo->get_TOKEN(), + ); + $result = $momo->SendOTP($data); + if ($result['status'] == "success") { + $momo = Momo::where('phone', $request->phone)->first(); + if (!$momo) { + Momo::create([ + 'phone' => $request->phone, + 'password' => $request->password, + 'info' => json_encode($data), + 'min' => $request->min, + 'max' => $request->max, + 'times' => 0, + 'amount' => 0, + 'status' => 3, + ]); + return response()->json(array('status' => 'success', 'message' => 'Gửi mã OTP về ' . $request->phone . ' thành công')); + } else { + $momo->info = json_encode($data); + $momo->save(); + return response()->json(array('status' => 'success', 'message' => 'Gửi mã OTP về ' . $request->phone . ' thành công')); + } + } + } + + public function verifyMomo(Request $request) + { + $validator = Validator::make($request->all(), [ + 'phone' => 'required|string|max:11', + 'min' => 'numeric|required', + 'max' => 'numeric|required', + 'password' => 'required|string|min:6', + 'otp' => 'required|numeric' + ]); + if ($validator->fails()) { + return response()->json(array('status' => 'error', 'message' => $validator->errors()->first())); + } + $code = $request->otp; + $dataMomo = Momo::where('phone', $request->phone)->first(); + $data_old = json_decode($dataMomo->info, true); + $data = Arr::add($data_old, 'ohash', hash('sha256', $data_old["phone"] . $data_old["rkey"] . $code)); + $momo = new MomoApi(); + $result = $momo->REG_DEVICE_MSG($data); + $data_new = Arr::add($data, 'setupKey', $result["extra"]["setupKey"]); + $data_new = Arr::add($data_new, 'setupKeyDecrypt', $momo->get_setupKey($result["extra"]["setupKey"], $data)); + $dataMomo->info = $data_new; + $dataMomo->save(); + $result = $this->loginMomo($dataMomo->phone); + return back()->withErrors(['status' => 'success', 'message' => 'Thêm tài khoản thành công']); + } + + public function loginMomo($phone) + { + $dataMomo = Momo::where('phone', $phone)->first(); + $data_old = json_decode($dataMomo->info, true); + $data_new = Arr::add($data_old, 'agent_id', ''); + $data_new = Arr::add($data_new, 'sessionkey', ''); + $data_new = Arr::add($data_new, 'authorization', ''); + $data_new = Arr::add($data_new, 'password', $dataMomo->password); + $momo = new MomoApi(); + $result = $momo->USER_LOGIN_MSG($data_new); + if ($result['errorCode']) { + return array( + 'author' => 'DUNGA', + 'status' => 'error', + 'message' => 'Thất bại', + 'data' => array( + 'code' => $result['errorCode'], + 'desc' => $result['errorDesc'] + ) + ); + } else { + $data_new = Arr::set($data_old, 'authorization', $result['extra']['AUTH_TOKEN']); + $data_new = Arr::set($data_new, 'RSA_PUBLIC_KEY', $result['extra']['REQUEST_ENCRYPT_KEY']); + $data_new = Arr::set($data_new, 'sessionkey', $result['extra']['SESSION_KEY']); + $data_new = Arr::set($data_new, 'balance', $result['extra']['BALANCE']); + $data_new = Arr::set($data_new, 'agent_id', $result['momoMsg']['agentId']); + $data_new = Arr::set($data_new, 'BankVerify', $result['momoMsg']['bankVerifyPersonalid']); + $data_new = Arr::set($data_new, 'Name', $result['momoMsg']['name']); + $data_new = Arr::set($data_new, 'password', $dataMomo->password); + $dataMomo->info = $data_new; + $dataMomo->save(); + return array( + 'status' => 'success', + 'message' => 'Đăng nhập thành công' + ); + } + // dd($result); + } + + public function historyMomo($phone) + { + $dataMomo = Momo::where('phone', $phone)->first(); + $data = json_decode($dataMomo->info, true); + $momo = new MomoApi(); + $result = $momo->CheckHisNew(1, $data); + if ($result['status'] != 'error') { + return $result; + } else { + $this->loginMomo($dataMomo->phone); + return $momo->CheckHisNew(1, $data); + } + } + + public function checkMomo($phone, $receiver) + { + $dataMomo = Momo::where('phone', $phone)->first(); + $data = json_decode($dataMomo->info, true); + $momo = new MomoApi(); + $result = $momo->CHECK_USER_PRIVATE($receiver, $data); + if ($result == null) { + return array('status' => 'error', 'message' => 'Tài khoản không tồn tại hoặc chưa đăng ký momo', 'author' => 'DUNGA'); + } else { + return array('status' => 'success', 'message' => 'Thành công', 'author' => 'DUNGA', 'name' => $result['extra']['NAME']); + } + } + + public function sendMoneyMomo($phone, $amount, $comment, $receiver) + { + $dataMomo = Momo::where('phone', $phone)->first(); + $data = json_decode($dataMomo->info, true); + $momo = new MomoApi(); + $dataSend = array( + 'comment' => $comment, + 'amount' => $amount, + 'partnerName' => $this->checkMomo($phone, $receiver)['name'], + 'receiver' => $receiver, + ); + // $data_new = Arr::set($data, 'Name', $this->checkMomo($phone, $phone)['name']); + $result = $momo->M2MU_INIT($data, $dataSend); + if (!empty($result["errorCode"]) && $result["errorDesc"] != "Lỗi cơ sở dữ liệu. Quý khách vui lòng thử lại sau") { + return array( + "status" => "error", + "code" => $result["errorCode"], + "message" => $result["errorDesc"] + ); + } else if (is_null($result)) { + return array( + "status" => "error", + "code" => -5, + "message" => "Đã xảy ra lỗi ở momo hoặc bạn đã hết hạn truy cập vui lòng đăng nhập lại" + ); + } else { + $id = $result["momoMsg"]["replyMsgs"]["0"]["ID"]; + $result = $momo->M2MU_CONFIRM($id, $data, $dataSend); + if (empty($result['errorCode'])) { + $balance = $result["extra"]["BALANCE"]; + $tranHisMsg = $result["momoMsg"]["replyMsgs"]["0"]["tranHisMsg"]; + $data_new = Arr::set($data, 'balance', $balance); + $dataMomo->info = $data_new; + $dataMomo->save(); + return array( + 'status' => 'success', + 'message' => 'Thành công', + 'author' => 'DUNGA', + 'data' => array( + "balance" => $balance, + "ID" => $tranHisMsg["ID"], + "tranId" => $tranHisMsg["tranId"], + "partnerId" => $tranHisMsg["partnerId"], + "partnerName" => $tranHisMsg["partnerName"], + "amount" => $tranHisMsg["amount"], + "comment" => (empty($tranHisMsg["comment"])) ? "" : $tranHisMsg["comment"], + "status" => $tranHisMsg["status"], + "desc" => $tranHisMsg["desc"], + "ownerNumber" => $tranHisMsg["ownerNumber"], + "ownerName" => $tranHisMsg["ownerName"], + "millisecond" => $tranHisMsg["finishTime"] + ) + ); + } else { + return array( + 'status' => 'error', + 'author' => 'DUNGA', + 'data' => array( + "code" => $result["errorCode"], + "message" => $result["errorDesc"], + ) + ); + } + } + } + + public function deleteMomo(Request $request) { + $phone = "0".$request->phone; + $dataMomo = Momo::where('phone', $phone)->first(); + if ($dataMomo) { + $dataMomo->delete(); + return response()->json(array('status' => 'success', 'message' => 'Xóa số momo '.$dataMomo->phone.' thành công')); + } else { + return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống')); + } + } + + public function activeMomo(Request $request) { + $phone = "0".$request->phone; + $dataMomo = Momo::where('phone', $phone)->first(); + if ($dataMomo) { + $dataMomo->status = 1; + $dataMomo->save(); + return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái hoạt động số momo '.$dataMomo->phone.' thành công')); + } else { + return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống')); + } + } + + public function hideMomo(Request $request) { + $phone = "0".$request->phone; + $dataMomo = Momo::where('phone', $phone)->first(); + if ($dataMomo) { + $dataMomo->status = 2; + $dataMomo->save(); + return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái ẩn số momo '.$dataMomo->phone.' thành công')); + } else { + return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống')); + } + } + + public function maintenanceMomo(Request $request) { + $phone = "0".$request->phone; + $dataMomo = Momo::where('phone', $phone)->first(); + if ($dataMomo) { + $dataMomo->status = 0; + $dataMomo->save(); + return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái bảo trì số momo '.$dataMomo->phone.' thành công')); + } else { + return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống')); + } + } + + public function infoMomo(Request $request) { + $phone = "0".$request->phone; + $dataMomo = Momo::where('phone', $phone)->first(); + if ($dataMomo) { + return response()->json(array('status' => 'success', 'message' =>'Thành công', 'html' => '
')); + } else { + return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống')); + } + } + + public function editMomo(Request $request) { + $dataMomo = Momo::where('id', $request->id)->first(); + if ($dataMomo) { + if ($request->password == null) { + $dataMomo->min = $request->min; + $dataMomo->max = $request->max; + $dataMomo->save(); + return back()->withErrors(['status' => 'success', 'message' => 'Sửa thông tin số momo thành công']); + } else { + $dataMomo->password = $request->password; + $dataMomo->min = $request->min; + $dataMomo->max = $request->max; + $dataMomo->save(); + return back()->withErrors(['status' => 'success', 'message' => 'Sửa thông tin số momo thành công']); + } + } else { + return back()->withErrors(['status' => 'danger', 'message' => 'Số momo không có trong hệ thống']); + + } + } +} diff --git a/app/Http/Resources/HistoryResource.php b/app/Http/Resources/HistoryResource.php new file mode 100644 index 0000000..2fc9aa3 --- /dev/null +++ b/app/Http/Resources/HistoryResource.php @@ -0,0 +1,26 @@ + $this->id, + 'partnerId' => Str::substr($this->partnerId, 0, 4).'****', + 'victory' => $this->status, + 'amount' => $this->amount, + 'comment' => $this->comment, + ]; + } +} diff --git a/app/Http/Resources/MomoResource.php b/app/Http/Resources/MomoResource.php index 63df025..cfe9784 100644 --- a/app/Http/Resources/MomoResource.php +++ b/app/Http/Resources/MomoResource.php @@ -3,6 +3,8 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; +use App\Models\HistoryPlay; +use Carbon\Carbon; class MomoResource extends JsonResource { @@ -20,7 +22,7 @@ class MomoResource extends JsonResource 'settings' => array( 'transfers_today' => array( 'times' => $this->times, - 'amount' => $this->amount + 'amount' => $this->amount, ) ) ]; diff --git a/app/Models/HistoryDayMission.php b/app/Models/HistoryDayMission.php new file mode 100644 index 0000000..f7e5bc9 --- /dev/null +++ b/app/Models/HistoryDayMission.php @@ -0,0 +1,19 @@ +namespace($this->namespace) ->group(base_path('routes/web.php')); }); + + Route::domain(env('APP_SUBDOMAIN').'.' . env('APP_URL')) + ->middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/admin.php')); } /** diff --git a/config/app.php b/config/app.php index a8d1a82..e52ead4 100644 --- a/config/app.php +++ b/config/app.php @@ -67,7 +67,7 @@ return [ | */ - 'timezone' => 'UTC', + 'timezone' => 'Asia/Ho_Chi_Minh', /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2022_05_01_134738_create_momos_table.php b/database/migrations/2022_05_01_134738_create_momos_table.php index 065bad9..4c6022b 100644 --- a/database/migrations/2022_05_01_134738_create_momos_table.php +++ b/database/migrations/2022_05_01_134738_create_momos_table.php @@ -16,7 +16,7 @@ class CreateMomosTable extends Migration Schema::create('momos', function (Blueprint $table) { $table->id(); $table->string('phone'); - $table->string('token'); + $table->longText('info'); $table->string('password'); $table->string('min'); $table->string('max'); diff --git a/database/migrations/2022_05_02_012840_create_settings_table.php b/database/migrations/2022_05_02_012840_create_settings_table.php new file mode 100644 index 0000000..865e78b --- /dev/null +++ b/database/migrations/2022_05_02_012840_create_settings_table.php @@ -0,0 +1,58 @@ +id(); + $table->string('name'); + $table->string('keywords'); + $table->string('logo'); + $table->string('description'); + $table->string('favicon'); + $table->string('background'); + $table->integer('active'); + $table->integer('history'); + $table->integer('only_win'); + $table->integer('limit'); + $table->integer('day_mission'); + $table->integer('week_top'); + $table->string('ratioCL'); + $table->string('ratioCL2'); + $table->string('ratioTX'); + $table->string('ratioTX2'); + $table->string('ratio1P3'); + $table->string('ratioG3'); + $table->string('ratioH3'); + $table->string('ratioLO'); + $table->string('gift_week')->nullable(); + $table->string('gift_day')->nullable(); + $table->longText('note'); + $table->string('content'); + $table->string('content_day'); + $table->string('content_week'); + $table->longText('ads')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('settings'); + } +} diff --git a/database/migrations/2022_05_02_031023_create_history_plays_table.php b/database/migrations/2022_05_02_031023_create_history_plays_table.php new file mode 100644 index 0000000..69ac7f1 --- /dev/null +++ b/database/migrations/2022_05_02_031023_create_history_plays_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('tranId')->unique(); + $table->string('partnerName'); + $table->string('partnerId'); + $table->string('comment'); + $table->integer('amount'); + $table->integer('receive'); + $table->integer('status'); + $table->integer('pay'); + $table->string('game'); + $table->string('phoneSend'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('history_plays'); + } +} diff --git a/database/migrations/2022_05_10_061858_create_history_day_missions_table.php b/database/migrations/2022_05_10_061858_create_history_day_missions_table.php new file mode 100644 index 0000000..36e7f76 --- /dev/null +++ b/database/migrations/2022_05_10_061858_create_history_day_missions_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('phone'); + $table->integer('amount'); + $table->integer('level'); + $table->integer('receive'); + $table->integer('status'); + $table->integer('pay'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('history_day_missions'); + } +} diff --git a/public/dgaAdmin/assets/css/dashlite.css b/public/dgaAdmin/assets/css/dashlite.css new file mode 100644 index 0000000..ecb0c7c --- /dev/null +++ b/public/dgaAdmin/assets/css/dashlite.css @@ -0,0 +1,10 @@ +@charset "UTF-8"; +/*! +* Template Name: DashLite +* Author: Softnio +* Author URI: http://themeforest.net/user/softnio +* Version: 3.0.2 +* Updated: 04.27.2022 +**/ + +@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Light.eot");src:local("Roboto Light"),local("Roboto-Light"),url("../fonts/Roboto-Light.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Light.woff2") format("woff2"),url("../fonts/Roboto-Light.woff") format("woff"),url("../fonts/Roboto-Light.ttf") format("truetype");font-weight:300;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Regular.eot");src:local("Roboto"),local("Roboto-Regular"),url("../fonts/Roboto-Regular.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Regular.woff2") format("woff2"),url("../fonts/Roboto-Regular.woff") format("woff"),url("../fonts/Roboto-Regular.ttf") format("truetype");font-weight:normal;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Medium.eot");src:local("Roboto Medium"),local("Roboto-Medium"),url("../fonts/Roboto-Medium.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Medium.woff2") format("woff2"),url("../fonts/Roboto-Medium.woff") format("woff"),url("../fonts/Roboto-Medium.ttf") format("truetype");font-weight:500;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Bold.eot");src:local("Roboto Bold"),local("Roboto-Medium"),url("../fonts/Roboto-Bold.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Bold.woff2") format("woff2"),url("../fonts/Roboto-Bold.woff") format("woff"),url("../fonts/Roboto-Bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Nunito";src:url("../fonts/Nunito-Regular.eot");src:local("Nunito Regular"),local("Nunito-Regular"),url("../fonts/Nunito-Regular.eot#iefix") format("embedded-opentype"),url("../fonts/Nunito-Regular.woff2") format("woff2"),url("../fonts/Nunito-Regular.woff") format("woff"),url("../fonts/Nunito-Regular.ttf") format("truetype");font-weight:normal;font-style:normal}@font-face{font-family:"Nunito";src:url("../fonts/Nunito-Bold.eot");src:local("Nunito Bold"),local("Nunito-Bold"),url("../fonts/Nunito-Bold.eot#iefix") format("embedded-opentype"),url("../fonts/Nunito-Bold.woff2") format("woff2"),url("../fonts/Nunito-Bold.woff") format("woff"),url("../fonts/Nunito-Bold.ttf") format("truetype");font-weight:bold;font-style:normal}:root{--bs-blue: #559bfb;--bs-indigo: #2c3782;--bs-purple: #816bff;--bs-pink: #ff63a5;--bs-red: #e85347;--bs-orange: #ffa353;--bs-yellow: #f4bd0e;--bs-green: #1ee0ac;--bs-teal: #20c997;--bs-cyan: #09c2de;--bs-white: #fff;--bs-gray: #8091a7;--bs-gray-dark: #2b3748;--bs-gray-100: #ebeef2;--bs-gray-200: #e5e9f2;--bs-gray-300: #dbdfea;--bs-gray-400: #b7c2d0;--bs-gray-500: #8091a7;--bs-gray-600: #3c4d62;--bs-gray-700: #344357;--bs-gray-800: #2b3748;--bs-gray-900: #1f2b3a;--bs-primary: #0fac81;--bs-secondary: #364a63;--bs-success: #1ee0ac;--bs-info: #09c2de;--bs-warning: #f4bd0e;--bs-danger: #e85347;--bs-light: #e5e9f2;--bs-dark: #1f2b3a;--bs-gray: #8091a7;--bs-lighter: #f5f6fa;--bs-primary-rgb: 15, 172, 129;--bs-secondary-rgb: 54, 74, 99;--bs-success-rgb: 30, 224, 172;--bs-info-rgb: 9, 194, 222;--bs-warning-rgb: 244, 189, 14;--bs-danger-rgb: 232, 83, 71;--bs-light-rgb: 229, 233, 242;--bs-dark-rgb: 31, 43, 58;--bs-gray-rgb: 128, 145, 167;--bs-lighter-rgb: 245, 246, 250;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-body-color-rgb: 82, 100, 132;--bs-body-bg-rgb: 255, 255, 255;--bs-font-sans-serif: Roboto, sans-serif;--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family: Roboto, sans-serif;--bs-body-font-size: 0.875rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.65;--bs-body-color: #526484;--bs-body-bg: #fff}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:#b7c2d0;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-family:Nunito,sans-serif;font-weight:700;line-height:1.1;color:#364a63}h1,.h1{font-size:2rem}h2,.h2{font-size:1.75rem}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}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,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#3fbd9a;text-decoration:none}a:hover{color:#32977b;text-decoration:none}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:#ff63a5;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:3px}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#8094ae;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.00625rem;font-weight:400}.display-1{font-size:5rem;font-weight:300;line-height:1.1}.display-2{font-size:4.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}.display-5{font-size:3rem;font-weight:300;line-height:1.1}.display-6{font-size:2.5rem;font-weight:300;line-height:1.1}.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:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.09375rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:85%;color:#b6c6e3}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:4px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:var(--bs-gutter-x, 14px);padding-left:var(--bs-gutter-x, 14px);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1540px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1440px}}.row{--bs-gutter-x: 28px;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-0.5*var(--bs-gutter-x));margin-left:calc(-0.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: 0.375rem}.g-1,.gy-1{--bs-gutter-y: 0.375rem}.g-2,.gx-2{--bs-gutter-x: 0.75rem}.g-2,.gy-2{--bs-gutter-y: 0.75rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 2.75rem}.g-5,.gy-5{--bs-gutter-y: 2.75rem}.g-gs,.gx-gs{--bs-gutter-x: 28px}.g-gs,.gy-gs{--bs-gutter-y: 28px}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: 0.375rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: 0.375rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: 0.75rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: 0.75rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 2.75rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 2.75rem}.g-sm-gs,.gx-sm-gs{--bs-gutter-x: 28px}.g-sm-gs,.gy-sm-gs{--bs-gutter-y: 28px}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: 0.375rem}.g-md-1,.gy-md-1{--bs-gutter-y: 0.375rem}.g-md-2,.gx-md-2{--bs-gutter-x: 0.75rem}.g-md-2,.gy-md-2{--bs-gutter-y: 0.75rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 2.75rem}.g-md-5,.gy-md-5{--bs-gutter-y: 2.75rem}.g-md-gs,.gx-md-gs{--bs-gutter-x: 28px}.g-md-gs,.gy-md-gs{--bs-gutter-y: 28px}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: 0.375rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: 0.375rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: 0.75rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: 0.75rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 2.75rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 2.75rem}.g-lg-gs,.gx-lg-gs{--bs-gutter-x: 28px}.g-lg-gs,.gy-lg-gs{--bs-gutter-y: 28px}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: 0.375rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: 0.375rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: 0.75rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: 0.75rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 2.75rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 2.75rem}.g-xl-gs,.gx-xl-gs{--bs-gutter-x: 28px}.g-xl-gs,.gy-xl-gs{--bs-gutter-y: 28px}}@media(min-width: 1540px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: 0.375rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: 0.375rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: 0.75rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: 0.75rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 2.75rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 2.75rem}.g-xxl-gs,.gx-xxl-gs{--bs-gutter-x: 28px}.g-xxl-gs,.gy-xxl-gs{--bs-gutter-y: 28px}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: #fff;--bs-table-striped-color: #526484;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #526484;--bs-table-active-bg: #f5f6fa;--bs-table-hover-color: #526484;--bs-table-hover-bg: #f5f6fa;width:100%;margin-bottom:1rem;color:#526484;vertical-align:top;border-color:#dbdfea}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem 1.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #ddebfe;--bs-table-striped-bg: #d2dff1;--bs-table-striped-color: #000;--bs-table-active-bg: #c7d4e5;--bs-table-active-color: #000;--bs-table-hover-bg: #ccd9eb;--bs-table-hover-color: #000;color:#000;border-color:#c7d4e5}.table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg: #d2f9ee;--bs-table-striped-bg: #c8ede2;--bs-table-striped-color: #000;--bs-table-active-bg: #bde0d6;--bs-table-active-color: #000;--bs-table-hover-bg: #c2e6dc;--bs-table-hover-color: #000;color:#000;border-color:#bde0d6}.table-info{--bs-table-bg: #cef3f8;--bs-table-striped-bg: #c4e7ec;--bs-table-striped-color: #000;--bs-table-active-bg: #b9dbdf;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe1e5;--bs-table-hover-color: #000;color:#000;border-color:#b9dbdf}.table-warning{--bs-table-bg: #fdf2cf;--bs-table-striped-bg: #f0e6c5;--bs-table-striped-color: #000;--bs-table-active-bg: #e4daba;--bs-table-active-color: #000;--bs-table-hover-bg: #eae0bf;--bs-table-hover-color: #000;color:#000;border-color:#e4daba}.table-danger{--bs-table-bg: #faddda;--bs-table-striped-bg: #eed2cf;--bs-table-striped-color: #000;--bs-table-active-bg: #e1c7c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e7ccca;--bs-table-hover-color: #000;color:#000;border-color:#e1c7c4}.table-light{--bs-table-bg: #ebeef2;--bs-table-striped-bg: #dfe2e6;--bs-table-striped-color: #000;--bs-table-active-bg: #d4d6da;--bs-table-active-color: #000;--bs-table-hover-bg: #d9dce0;--bs-table-hover-color: #000;color:#000;border-color:#d4d6da}.table-dark{--bs-table-bg: #1f2b3a;--bs-table-striped-bg: #2a3644;--bs-table-striped-color: #fff;--bs-table-active-bg: #35404e;--bs-table-active-color: #fff;--bs-table-hover-bg: #303b49;--bs-table-hover-color: #fff;color:#fff;border-color:#35404e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1539.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.4375rem + 1px);padding-bottom:calc(0.4375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.25rem}.col-form-label-lg{padding-top:calc(0.6875rem + 1px);padding-bottom:calc(0.6875rem + 1px);font-size:0.9375rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.75rem}.form-text{margin-top:.25rem;font-size:0.875em;color:#6c757d}.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{display:block;width:100%;padding:.4375rem 1rem;font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;background-clip:padding-box;border:1px solid #dbdfea;appearance:none;border-radius:4px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{transition:none}}.form-control[type=file],.dual-listbox [type=file].dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]),.dual-listbox [type=file].dual-listbox__search:not(:disabled):not([readonly]),div.dataTables_wrapper div.dataTables_filter input[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus,.dual-listbox .dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input:focus{color:#3c4d62;background-color:#fff;border-color:#0fac81;outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-control::-webkit-date-and-time-value,.dual-listbox .dual-listbox__search::-webkit-date-and-time-value,div.dataTables_wrapper div.dataTables_filter input::-webkit-date-and-time-value{height:1.25rem}.form-control::placeholder,.dual-listbox .dual-listbox__search::placeholder,div.dataTables_wrapper div.dataTables_filter input::placeholder{color:#b6c6e3;opacity:1}.form-control:disabled,.dual-listbox .dual-listbox__search:disabled,div.dataTables_wrapper div.dataTables_filter input:disabled,.form-control[readonly],.dual-listbox [readonly].dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input[readonly]{background-color:#f5f6fa;opacity:1}.form-control::file-selector-button,.dual-listbox .dual-listbox__search::file-selector-button,div.dataTables_wrapper div.dataTables_filter input::file-selector-button{padding:.4375rem 1rem;margin:-0.4375rem -1rem;margin-inline-end:1rem;color:#3c4d62;background-color:#ebeef2;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button,.dual-listbox .dual-listbox__search::file-selector-button,div.dataTables_wrapper div.dataTables_filter input::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button,.dual-listbox .dual-listbox__search:hover:not(:disabled):not([readonly])::file-selector-button,div.dataTables_wrapper div.dataTables_filter input:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button,.dual-listbox .dual-listbox__search::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input::-webkit-file-upload-button{padding:.4375rem 1rem;margin:-0.4375rem -1rem;margin-inline-end:1rem;color:#3c4d62;background-color:#ebeef2;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button,.dual-listbox .dual-listbox__search::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,.dual-listbox .dual-listbox__search:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.4375rem 0;margin-bottom:0;line-height:1.25rem;color:#364a63;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);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{min-height:calc(1.75rem + 2px);padding:.25rem 1rem;font-size:0.75rem;border-radius:3px}.form-control-sm::file-selector-button{padding:.25rem 1rem;margin:-0.25rem -1rem;margin-inline-end:1rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem 1rem;margin:-0.25rem -1rem;margin-inline-end:1rem}.form-control-lg{min-height:calc(2.625rem + 2px);padding:.6875rem 1rem;font-size:0.9375rem;border-radius:5px}.form-control-lg::file-selector-button{padding:.6875rem 1rem;margin:-0.6875rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.6875rem 1rem;margin:-0.6875rem -1rem;margin-inline-end:1rem}textarea.form-control,.dual-listbox textarea.dual-listbox__search{min-height:calc(2.125rem + 2px)}textarea.form-control-sm{min-height:calc(1.75rem + 2px)}textarea.form-control-lg{min-height:calc(2.625rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.4375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.25rem;border-radius:4px}.form-control-color::-webkit-color-swatch{height:1.25rem;border-radius:4px}.form-select{display:block;width:100%;padding:.4375rem 3rem .4375rem 1rem;-moz-padding-start:calc(1rem - 3px);font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px;border:1px solid #dbdfea;border-radius:4px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#0fac81;outline:0;box-shadow:0 0 0 .2rem rgba(85,155,251,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #3c4d62}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:1rem;font-size:0.75rem;border-radius:3px}.form-select-lg{padding-top:.6875rem;padding-bottom:.6875rem;padding-left:1rem;font-size:0.9375rem;border-radius:5px}.form-check{display:block;min-height:1.44375rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.325em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#0fac81;outline:0;box-shadow:0 0 0 .25rem rgba(85,155,251,.25)}.form-check-input:checked{background-color:#0fac81;border-color:#559bfb}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#559bfb;border-color:#559bfb;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;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='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{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='%230fac81'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;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")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.dual-listbox .btn-check[disabled]+.dual-listbox__button,.btn-check:disabled+.btn,.dual-listbox .btn-check:disabled+.dual-listbox__button{pointer-events:none;filter:none;opacity:.5}.form-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.1)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.1)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#559bfb;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#cce1fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dbdfea;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#559bfb;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#cce1fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dbdfea;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.dual-listbox .form-floating>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-floating>input,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem 1rem;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.dual-listbox .form-floating>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-floating>input{padding:1rem 1rem}.form-floating>.form-control::placeholder,.dual-listbox .form-floating>.dual-listbox__search::placeholder,div.dataTables_wrapper div.dataTables_filter .form-floating>input::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.dual-listbox .form-floating>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .form-floating>input:focus,.form-floating>.form-control:not(:placeholder-shown),.dual-listbox .form-floating>.dual-listbox__search:not(:placeholder-shown),div.dataTables_wrapper div.dataTables_filter .form-floating>input:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.dual-listbox .form-floating>.dual-listbox__search:-webkit-autofill,div.dataTables_wrapper div.dataTables_filter .form-floating>input:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.dual-listbox .form-floating>.dual-listbox__search:focus~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.dual-listbox .form-floating>.dual-listbox__search:not(:placeholder-shown)~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill~label,.dual-listbox .form-floating>.dual-listbox__search:-webkit-autofill~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:-webkit-autofill~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.dual-listbox .input-group>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.dual-listbox .input-group>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .input-group>input:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn,.input-group .dual-listbox .dual-listbox__button,.dual-listbox .input-group .dual-listbox__button{position:relative;z-index:2}.input-group .btn:focus,.input-group .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group .dual-listbox__button:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.4375rem 1rem;font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;text-align:center;white-space:nowrap;background-color:#ebeef2;border:1px solid #dbdfea;border-radius:4px}.input-group-lg>.form-control,.dual-listbox .input-group-lg>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-lg>input,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn,.dual-listbox .input-group-lg>.dual-listbox__button{padding:.6875rem 1rem;font-size:0.9375rem;border-radius:5px}.input-group-sm>.form-control,.dual-listbox .input-group-sm>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-sm>input,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn,.dual-listbox .input-group-sm>.dual-listbox__button{padding:.25rem 1rem;font-size:0.75rem;border-radius:3px}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#1ee0ac}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .75rem;margin-top:.1rem;font-size:0.8125rem;color:#fff;background-color:rgba(30,224,172,.9);border-radius:3px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.was-validated .dual-listbox .dual-listbox__search:valid,.dual-listbox .was-validated .dual-listbox__search:valid,.was-validated div.dataTables_wrapper div.dataTables_filter input:valid,div.dataTables_wrapper div.dataTables_filter .was-validated input:valid,.form-control.is-valid,.dual-listbox .is-valid.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.is-valid{border-color:#1ee0ac;padding-right:2.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231ee0ac' 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");background-repeat:no-repeat;background-position:right .53125rem center;background-size:1.0625rem 1.0625rem}.was-validated .form-control:valid:focus,.was-validated .dual-listbox .dual-listbox__search:valid:focus,.dual-listbox .was-validated .dual-listbox__search:valid:focus,.was-validated div.dataTables_wrapper div.dataTables_filter input:valid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated input:valid:focus,.form-control.is-valid:focus,.dual-listbox .is-valid.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.is-valid:focus{border-color:#1ee0ac;box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated textarea.form-control:valid,.was-validated .dual-listbox textarea.dual-listbox__search:valid,.dual-listbox .was-validated textarea.dual-listbox__search:valid,textarea.form-control.is-valid,.dual-listbox textarea.is-valid.dual-listbox__search{padding-right:2.125rem;background-position:top .53125rem right .53125rem}.was-validated .form-select:valid,.form-select.is-valid{border-color:#1ee0ac}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:5.5rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231ee0ac' 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");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.0625rem 1.0625rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#1ee0ac;box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#1ee0ac}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#1ee0ac}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#1ee0ac}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.was-validated .input-group .dual-listbox .dual-listbox__search:valid,.dual-listbox .was-validated .input-group .dual-listbox__search:valid,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:valid,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:valid,.input-group .form-control.is-valid,.input-group .dual-listbox .is-valid.dual-listbox__search,.dual-listbox .input-group .is-valid.dual-listbox__search,.input-group div.dataTables_wrapper div.dataTables_filter input.is-valid,div.dataTables_wrapper div.dataTables_filter .input-group input.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .dual-listbox .dual-listbox__search:valid:focus,.dual-listbox .was-validated .input-group .dual-listbox__search:valid:focus,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:valid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:valid:focus,.input-group .form-control.is-valid:focus,.input-group .dual-listbox .is-valid.dual-listbox__search:focus,.dual-listbox .input-group .is-valid.dual-listbox__search:focus,.input-group div.dataTables_wrapper div.dataTables_filter input.is-valid:focus,div.dataTables_wrapper div.dataTables_filter .input-group input.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e85347}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .75rem;margin-top:.1rem;font-size:0.8125rem;color:#fff;background-color:rgba(232,83,71,.9);border-radius:3px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.was-validated .dual-listbox .dual-listbox__search:invalid,.dual-listbox .was-validated .dual-listbox__search:invalid,.was-validated div.dataTables_wrapper div.dataTables_filter input:invalid,div.dataTables_wrapper div.dataTables_filter .was-validated input:invalid,.form-control.is-invalid,.dual-listbox .is-invalid.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.is-invalid{border-color:#e85347;padding-right:2.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e85347'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e85347' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .53125rem center;background-size:1.0625rem 1.0625rem}.was-validated .form-control:invalid:focus,.was-validated .dual-listbox .dual-listbox__search:invalid:focus,.dual-listbox .was-validated .dual-listbox__search:invalid:focus,.was-validated div.dataTables_wrapper div.dataTables_filter input:invalid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated input:invalid:focus,.form-control.is-invalid:focus,.dual-listbox .is-invalid.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.is-invalid:focus{border-color:#e85347;box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated textarea.form-control:invalid,.was-validated .dual-listbox textarea.dual-listbox__search:invalid,.dual-listbox .was-validated textarea.dual-listbox__search:invalid,textarea.form-control.is-invalid,.dual-listbox textarea.is-invalid.dual-listbox__search{padding-right:2.125rem;background-position:top .53125rem right .53125rem}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e85347}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:5.5rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e85347'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e85347' stroke='none'/%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.0625rem 1.0625rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e85347;box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e85347}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e85347}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e85347}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.was-validated .input-group .dual-listbox .dual-listbox__search:invalid,.dual-listbox .was-validated .input-group .dual-listbox__search:invalid,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:invalid,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:invalid,.input-group .form-control.is-invalid,.input-group .dual-listbox .is-invalid.dual-listbox__search,.dual-listbox .input-group .is-invalid.dual-listbox__search,.input-group div.dataTables_wrapper div.dataTables_filter input.is-invalid,div.dataTables_wrapper div.dataTables_filter .input-group input.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .dual-listbox .dual-listbox__search:invalid:focus,.dual-listbox .was-validated .input-group .dual-listbox__search:invalid:focus,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:invalid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:invalid:focus,.input-group .form-control.is-invalid:focus,.input-group .dual-listbox .is-invalid.dual-listbox__search:focus,.dual-listbox .input-group .is-invalid.dual-listbox__search:focus,.input-group div.dataTables_wrapper div.dataTables_filter input.is-invalid:focus,div.dataTables_wrapper div.dataTables_filter .input-group input.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn,.dual-listbox .dual-listbox__button{display:inline-block;font-family:Nunito,sans-serif;font-weight:700;line-height:1.25rem;color:#526484;text-align:center;vertical-align:middle;cursor:pointer;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.4375rem 1.125rem;font-size:0.8125rem;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn,.dual-listbox .dual-listbox__button{transition:none}}.btn:hover,.dual-listbox .dual-listbox__button:hover{color:#526484}.btn-check:focus+.btn,.dual-listbox .btn-check:focus+.dual-listbox__button,.btn:focus,.dual-listbox .dual-listbox__button:focus{outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.btn:disabled,.dual-listbox .dual-listbox__button:disabled,.btn.disabled,.dual-listbox .disabled.dual-listbox__button,fieldset:disabled .btn,fieldset:disabled .dual-listbox .dual-listbox__button,.dual-listbox fieldset:disabled .dual-listbox__button{pointer-events:none;opacity:.5}.btn-primary{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-primary:hover{color:#fff;background-color:#0d926e;border-color:#0c8a67}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0d926e;border-color:#0c8a67;box-shadow:0 0 0 .2rem rgba(51,184,148,.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0c8a67;border-color:#0b8161}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(51,184,148,.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-secondary{color:#fff;background-color:#364a63;border-color:#364a63}.btn-secondary:hover{color:#fff;background-color:#2e3f54;border-color:#2b3b4f}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#2e3f54;border-color:#2b3b4f;box-shadow:0 0 0 .2rem rgba(84,101,122,.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#2b3b4f;border-color:#29384a}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(84,101,122,.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#364a63;border-color:#364a63}.btn-success{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-success:hover{color:#fff;background-color:#1abe92;border-color:#18b38a}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#1abe92;border-color:#18b38a;box-shadow:0 0 0 .2rem rgba(64,229,184,.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#18b38a;border-color:#17a881}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(64,229,184,.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-info{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-info:hover{color:#fff;background-color:#08a5bd;border-color:#079bb2}.btn-check:focus+.btn-info,.btn-info:focus{color:#fff;background-color:#08a5bd;border-color:#079bb2;box-shadow:0 0 0 .2rem rgba(46,203,227,.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#079bb2;border-color:#0792a7}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(46,203,227,.5)}.btn-info:disabled,.btn-info.disabled{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-warning{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-warning:hover{color:#fff;background-color:#cfa10c;border-color:#c3970b}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#fff;background-color:#cfa10c;border-color:#c3970b;box-shadow:0 0 0 .2rem rgba(246,199,50,.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#c3970b;border-color:#b78e0b}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(246,199,50,.5)}.btn-warning:disabled,.btn-warning.disabled{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-danger{color:#fff;background-color:#e85347;border-color:#e85347}.btn-danger:hover{color:#fff;background-color:#c5473c;border-color:#ba4239}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#c5473c;border-color:#ba4239;box-shadow:0 0 0 .2rem rgba(235,109,99,.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#ba4239;border-color:#ae3e35}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(235,109,99,.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#e85347;border-color:#e85347}.btn-light,.dual-listbox .dual-listbox__button{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-light:hover,.dual-listbox .dual-listbox__button:hover{color:#000;background-color:#e9ecf4;border-color:#e8ebf3}.btn-check:focus+.btn-light,.dual-listbox .btn-check:focus+.dual-listbox__button,.btn-light:focus,.dual-listbox .dual-listbox__button:focus{color:#000;background-color:#e9ecf4;border-color:#e8ebf3;box-shadow:0 0 0 .2rem rgba(195,198,206,.5)}.btn-check:checked+.btn-light,.dual-listbox .btn-check:checked+.dual-listbox__button,.btn-check:active+.btn-light,.dual-listbox .btn-check:active+.dual-listbox__button,.btn-light:active,.dual-listbox .dual-listbox__button:active,.btn-light.active,.dual-listbox .active.dual-listbox__button,.show>.btn-light.dropdown-toggle,.dual-listbox .show>.dropdown-toggle.dual-listbox__button{color:#000;background-color:#eaedf5;border-color:#e8ebf3}.btn-check:checked+.btn-light:focus,.dual-listbox .btn-check:checked+.dual-listbox__button:focus,.btn-check:active+.btn-light:focus,.dual-listbox .btn-check:active+.dual-listbox__button:focus,.btn-light:active:focus,.dual-listbox .dual-listbox__button:active:focus,.btn-light.active:focus,.dual-listbox .active.dual-listbox__button:focus,.show>.btn-light.dropdown-toggle:focus,.dual-listbox .show>.dropdown-toggle.dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(195,198,206,.5)}.btn-light:disabled,.dual-listbox .dual-listbox__button:disabled,.btn-light.disabled,.dual-listbox .disabled.dual-listbox__button{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-dark{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-dark:hover{color:#fff;background-color:#1a2531;border-color:#19222e}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1a2531;border-color:#19222e;box-shadow:0 0 0 .2rem rgba(65,75,88,.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#19222e;border-color:#17202c}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,75,88,.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-gray{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-gray:hover{color:#fff;background-color:#6d7b8e;border-color:#667486}.btn-check:focus+.btn-gray,.btn-gray:focus{color:#fff;background-color:#6d7b8e;border-color:#667486;box-shadow:0 0 0 .2rem rgba(147,162,180,.5)}.btn-check:checked+.btn-gray,.btn-check:active+.btn-gray,.btn-gray:active,.btn-gray.active,.show>.btn-gray.dropdown-toggle{color:#fff;background-color:#667486;border-color:#606d7d}.btn-check:checked+.btn-gray:focus,.btn-check:active+.btn-gray:focus,.btn-gray:active:focus,.btn-gray.active:focus,.show>.btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(147,162,180,.5)}.btn-gray:disabled,.btn-gray.disabled{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-lighter{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-lighter:hover{color:#000;background-color:#f7f7fb;border-color:#f6f7fb}.btn-check:focus+.btn-lighter,.btn-lighter:focus{color:#000;background-color:#f7f7fb;border-color:#f6f7fb;box-shadow:0 0 0 .2rem rgba(208,209,213,.5)}.btn-check:checked+.btn-lighter,.btn-check:active+.btn-lighter,.btn-lighter:active,.btn-lighter.active,.show>.btn-lighter.dropdown-toggle{color:#000;background-color:#f7f8fb;border-color:#f6f7fb}.btn-check:checked+.btn-lighter:focus,.btn-check:active+.btn-lighter:focus,.btn-lighter:active:focus,.btn-lighter.active:focus,.show>.btn-lighter.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(208,209,213,.5)}.btn-lighter:disabled,.btn-lighter.disabled{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-outline-primary{color:#0fac81;border-color:#0fac81}.btn-outline-primary:hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(15,172,129,.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(15,172,129,.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#0fac81;background-color:rgba(0,0,0,0)}.btn-outline-secondary{color:#364a63;border-color:#364a63}.btn-outline-secondary:hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(54,74,99,.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#364a63;border-color:#364a63}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(54,74,99,.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#364a63;background-color:rgba(0,0,0,0)}.btn-outline-success{color:#1ee0ac;border-color:#1ee0ac}.btn-outline-success:hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#1ee0ac;background-color:rgba(0,0,0,0)}.btn-outline-info{color:#09c2de;border-color:#09c2de}.btn-outline-info:hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(9,194,222,.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(9,194,222,.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#09c2de;background-color:rgba(0,0,0,0)}.btn-outline-warning{color:#f4bd0e;border-color:#f4bd0e}.btn-outline-warning:hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(244,189,14,.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(244,189,14,.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#f4bd0e;background-color:rgba(0,0,0,0)}.btn-outline-danger{color:#e85347;border-color:#e85347}.btn-outline-danger:hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#e85347;border-color:#e85347}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#e85347;background-color:rgba(0,0,0,0)}.btn-outline-light,.dt-buttons .btn-secondary{color:#e5e9f2;border-color:#e5e9f2}.btn-outline-light:hover,.dt-buttons .btn-secondary:hover{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-check:focus+.btn-outline-light,.dt-buttons .btn-check:focus+.btn-secondary,.btn-outline-light:focus,.dt-buttons .btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(229,233,242,.5)}.btn-check:checked+.btn-outline-light,.dt-buttons .btn-check:checked+.btn-secondary,.btn-check:active+.btn-outline-light,.dt-buttons .btn-check:active+.btn-secondary,.btn-outline-light:active,.dt-buttons .btn-secondary:active,.btn-outline-light.active,.dt-buttons .active.btn-secondary,.btn-outline-light.dropdown-toggle.show,.dt-buttons .dropdown-toggle.show.btn-secondary{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-check:checked+.btn-outline-light:focus,.dt-buttons .btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-outline-light:focus,.dt-buttons .btn-check:active+.btn-secondary:focus,.btn-outline-light:active:focus,.dt-buttons .btn-secondary:active:focus,.btn-outline-light.active:focus,.dt-buttons .active.btn-secondary:focus,.btn-outline-light.dropdown-toggle.show:focus,.dt-buttons .dropdown-toggle.show.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(229,233,242,.5)}.btn-outline-light:disabled,.dt-buttons .btn-secondary:disabled,.btn-outline-light.disabled,.dt-buttons .disabled.btn-secondary{color:#e5e9f2;background-color:rgba(0,0,0,0)}.btn-outline-dark{color:#1f2b3a;border-color:#1f2b3a}.btn-outline-dark:hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(31,43,58,.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(31,43,58,.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#1f2b3a;background-color:rgba(0,0,0,0)}.btn-outline-gray{color:#8091a7;border-color:#8091a7}.btn-outline-gray:hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-check:focus+.btn-outline-gray,.btn-outline-gray:focus{box-shadow:0 0 0 .2rem rgba(128,145,167,.5)}.btn-check:checked+.btn-outline-gray,.btn-check:active+.btn-outline-gray,.btn-outline-gray:active,.btn-outline-gray.active,.btn-outline-gray.dropdown-toggle.show{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-check:checked+.btn-outline-gray:focus,.btn-check:active+.btn-outline-gray:focus,.btn-outline-gray:active:focus,.btn-outline-gray.active:focus,.btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(128,145,167,.5)}.btn-outline-gray:disabled,.btn-outline-gray.disabled{color:#8091a7;background-color:rgba(0,0,0,0)}.btn-outline-lighter{color:#f5f6fa;border-color:#f5f6fa}.btn-outline-lighter:hover{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-check:focus+.btn-outline-lighter,.btn-outline-lighter:focus{box-shadow:0 0 0 .2rem rgba(245,246,250,.5)}.btn-check:checked+.btn-outline-lighter,.btn-check:active+.btn-outline-lighter,.btn-outline-lighter:active,.btn-outline-lighter.active,.btn-outline-lighter.dropdown-toggle.show{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-check:checked+.btn-outline-lighter:focus,.btn-check:active+.btn-outline-lighter:focus,.btn-outline-lighter:active:focus,.btn-outline-lighter.active:focus,.btn-outline-lighter.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(245,246,250,.5)}.btn-outline-lighter:disabled,.btn-outline-lighter.disabled{color:#f5f6fa;background-color:rgba(0,0,0,0)}.btn-link{font-weight:400;color:#3fbd9a;text-decoration:none}.btn-link:hover{color:#32977b;text-decoration:none}.btn-link:focus{text-decoration:none}.btn-link:disabled,.btn-link.disabled{color:#f5f6fa}.btn-lg,.btn-group-lg>.btn,.dual-listbox .btn-group-lg>.dual-listbox__button{padding:.6875rem 1.5rem;font-size:0.9375rem;border-radius:5px}.btn-sm,.btn-group-sm>.btn,.dual-listbox .btn-group-sm>.dual-listbox__button{padding:.25rem .75rem;font-size:0.75rem;border-radius:3px}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:180px;padding:0 0;margin:0;font-size:0.8125rem;color:#526484;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #e5e9f2;border-radius:4px}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1540px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{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 rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:12px 0;overflow:hidden;border-top:1px solid #e5e9f2}.dropdown-item{display:block;width:100%;padding:8px 14px;clear:both;font-weight:400;color:#364a63;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:first-child{border-top-left-radius:calc(4px - 1px);border-top-right-radius:calc(4px - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(4px - 1px);border-bottom-left-radius:calc(4px - 1px)}.dropdown-item:hover,.dropdown-item:focus{color:#0fac81;background-color:#ebeef2}.dropdown-item.active,.dropdown-item:active{color:#0fac81;text-decoration:none;background-color:#dbdfea}.dropdown-item.disabled,.dropdown-item:disabled{color:#ebeef2;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0 14px;margin-bottom:0;font-size:0.75rem;color:#8091a7;white-space:nowrap}.dropdown-item-text{display:block;padding:8px 14px;color:#364a63}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#e5e9f2}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#0fac81;background-color:#dbdfea}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:#e5e9f2}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.dual-listbox .btn-group>.dual-listbox__button,.btn-group-vertical>.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.dual-listbox .btn-group>.btn-check:checked+.dual-listbox__button,.btn-group>.btn-check:focus+.btn,.dual-listbox .btn-group>.btn-check:focus+.dual-listbox__button,.btn-group>.btn:hover,.dual-listbox .btn-group>.dual-listbox__button:hover,.btn-group>.btn:focus,.dual-listbox .btn-group>.dual-listbox__button:focus,.btn-group>.btn:active,.dual-listbox .btn-group>.dual-listbox__button:active,.btn-group>.btn.active,.dual-listbox .btn-group>.active.dual-listbox__button,.btn-group-vertical>.btn-check:checked+.btn,.dual-listbox .btn-group-vertical>.btn-check:checked+.dual-listbox__button,.btn-group-vertical>.btn-check:focus+.btn,.dual-listbox .btn-group-vertical>.btn-check:focus+.dual-listbox__button,.btn-group-vertical>.btn:hover,.dual-listbox .btn-group-vertical>.dual-listbox__button:hover,.btn-group-vertical>.btn:focus,.dual-listbox .btn-group-vertical>.dual-listbox__button:focus,.btn-group-vertical>.btn:active,.dual-listbox .btn-group-vertical>.dual-listbox__button:active,.btn-group-vertical>.btn.active,.dual-listbox .btn-group-vertical>.active.dual-listbox__button{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),.dual-listbox .btn-group>.dual-listbox__button:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.dual-listbox .btn-group>.dual-listbox__button:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn,.dual-listbox .btn-group>.btn-group:not(:last-child)>.dual-listbox__button{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.dual-listbox .btn-group>.dual-listbox__button:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.dual-listbox .btn-group>:not(.btn-check)+.dual-listbox__button,.btn-group>.btn-group:not(:first-child)>.btn,.dual-listbox .btn-group>.btn-group:not(:first-child)>.dual-listbox__button{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.84375rem;padding-left:.84375rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split,.dual-listbox .btn-group-sm>.dual-listbox__button+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split,.dual-listbox .btn-group-lg>.dual-listbox__button+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.dual-listbox .btn-group-vertical>.dual-listbox__button:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.dual-listbox .btn-group-vertical>.dual-listbox__button:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn,.dual-listbox .btn-group-vertical>.btn-group:not(:last-child)>.dual-listbox__button{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button~.btn,.dual-listbox .btn-group-vertical>.btn~.dual-listbox__button,.dual-listbox .btn-group-vertical>.dual-listbox__button~.dual-listbox__button,.btn-group-vertical>.btn-group:not(:first-child)>.btn,.dual-listbox .btn-group-vertical>.btn-group:not(:first-child)>.dual-listbox__button{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#3fbd9a;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#32977b}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid rgba(0,0,0,0);border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.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{background:none;border:0;border-radius:4px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#559bfb}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.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-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;white-space:nowrap}.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}.navbar-text{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:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:4px;transition:box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .2rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap: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 .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-top,.navbar-expand-sm .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap: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 .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-top,.navbar-expand-md .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap: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 .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-top,.navbar-expand-lg .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap: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 .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-top,.navbar-expand-xl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1540px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-top,.navbar-expand-xxl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.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 .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-top,.navbar-expand .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(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,.55)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.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:0 solid rgba(0,0,0,.125);border-radius:4px}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:3px;border-top-right-radius:3px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:.75rem 1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.07);border-bottom:0 solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:3px 3px 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.07);border-top:0 solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 3px 3px}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:3px}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:3px;border-top-right-radius:3px}.card-img,.card-img-bottom{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.card-group>.card{margin-bottom:14px}@media(min-width: 576px){.card-group{display:flex;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:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:0.875rem;color:#526484;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#4d8ce2;background-color:#eef5ff;box-shadow:inset 0 -1px 0 #dbdfea}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234d8ce2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23526484'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#0fac81;outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid #dbdfea}.accordion-item:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.accordion-item:first-of-type .accordion-button{border-top-left-radius:3px;border-top-right-radius:3px}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.25rem 0;margin-bottom:0;font-size:0.6875rem;list-style:none;background-color:rgba(0,0,0,0);border-radius:4px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#8091a7;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#b7c2d0}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#526484;background-color:#fff;border:1px solid #e5e9f2;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#32977b;background-color:#ebeef2;border-color:#e5e9f2}.page-link:focus{z-index:3;color:#32977b;background-color:#e9ecef;outline:0;box-shadow:none}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0fac81;border-color:#0fac81}.page-item.disabled .page-link{color:#dbdfea;pointer-events:none;background-color:#fff;border-color:#e5e9f2}.page-link{padding:.5625rem .625rem}.page-item:first-child .page-link{border-top-left-radius:4px;border-bottom-left-radius:4px}.page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination-lg .page-link{padding:.5625rem .75rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:5px;border-bottom-left-radius:5px}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:5px;border-bottom-right-radius:5px}.pagination-sm .page-link{padding:.4375rem .5rem;font-size:0.75rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:3px;border-bottom-right-radius:3px}.badge{display:inline-block;padding:0 .375rem;font-size:0.675rem;font-weight:500;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.badge:empty{display:none}.btn .badge,.dual-listbox .dual-listbox__button .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:4px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.75rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1.25rem}.alert-primary{color:#0b785a;background-color:#e2f5f0;border-color:#b7e6d9}.alert-primary .alert-link{color:#096048}.alert-secondary{color:#263445;background-color:#e7e9ec;border-color:#c3c9d0}.alert-secondary .alert-link{color:#1e2a37}.alert-success{color:#159d78;background-color:#e4fbf5;border-color:#bcf6e6}.alert-success .alert-link{color:#117e60}.alert-info{color:#06889b;background-color:#e1f8fb;border-color:#b5edf5}.alert-info .alert-link{color:#056d7c}.alert-warning{color:#ab840a;background-color:#fef7e2;border-color:#fcebb7}.alert-warning .alert-link{color:#896a08}.alert-danger{color:#a23a32;background-color:#fceae9;border-color:#f8cbc8}.alert-danger .alert-link{color:#822e28}.alert-light{color:#a0a3a9;background-color:#fcfcfd;border-color:#f7f8fb}.alert-light .alert-link{color:#808287}.alert-dark{color:#161e29;background-color:#e4e6e7;border-color:#bcbfc4}.alert-dark .alert-link{color:#121821}.alert-gray{color:#5a6675;background-color:#f0f2f4;border-color:#d9dee5}.alert-gray .alert-link{color:#48525e}.alert-lighter{color:#acacaf;background-color:#fefefe;border-color:#fcfcfe}.alert-lighter .alert-link{color:#8a8a8c}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress{display:flex;height:.5rem;overflow:hidden;font-size:0.75rem;background-color:#f5f6fa;border-radius:2px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0fac81;transition:width .6s ease}@media(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:.5rem .5rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:4px}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#526484;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;color:#212529;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.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:#559bfb;border-color:#559bfb}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1540px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#09674d;background-color:#cfeee6}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#09674d;background-color:#bad6cf}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#09674d;border-color:#09674d}.list-group-item-secondary{color:#202c3b;background-color:#d7dbe0}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#202c3b;background-color:#c2c5ca}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#202c3b;border-color:#202c3b}.list-group-item-success{color:#128667;background-color:#d2f9ee}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#128667;background-color:#bde0d6}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#128667;border-color:#128667}.list-group-item-info{color:#057485;background-color:#cef3f8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#057485;background-color:#b9dbdf}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#057485;border-color:#057485}.list-group-item-warning{color:#927108;background-color:#fdf2cf}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#927108;background-color:#e4daba}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#927108;border-color:#927108}.list-group-item-danger{color:#8b322b;background-color:#faddda}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#8b322b;background-color:#e1c7c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8b322b;border-color:#8b322b}.list-group-item-light{color:#898c91;background-color:#fafbfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#898c91;background-color:#e1e2e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#898c91;border-color:#898c91}.list-group-item-dark{color:#131a23;background-color:#d2d5d8}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#131a23;background-color:#bdc0c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#131a23;border-color:#131a23}.list-group-item-gray{color:#4d5764;background-color:#e6e9ed}.list-group-item-gray.list-group-item-action:hover,.list-group-item-gray.list-group-item-action:focus{color:#4d5764;background-color:#cfd2d5}.list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#4d5764;border-color:#4d5764}.list-group-item-lighter{color:#939496;background-color:#fdfdfe}.list-group-item-lighter.list-group-item-action:hover,.list-group-item-lighter.list-group-item-action:focus{color:#939496;background-color:#e4e4e5}.list-group-item-lighter.list-group-item-action.active{color:#fff;background-color:#939496;border-color:#939496}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:rgba(0,0,0,0) url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:4px;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(85,155,251,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:0.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 3px 12px 1px rgba(43,55,72,.15);border-radius:4px}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:3px;border-top-right-radius:3px}.toast-header .btn-close{margin-right:-0.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1051;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -30px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none !important}.modal.modal-static .modal-dialog{transform:scale(0.95)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,0);border-radius:5px;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#364a63}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #dbdfea;border-top-left-radius:4px;border-top-right-radius:4px}.modal-header .btn-close{padding:.5rem .625rem;margin:-0.5rem -0.625rem -0.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1.25rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #dbdfea;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.modal-footer>*{margin:.25rem}@media(min-width: 576px){.modal-dialog{max-width:520px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:360px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:720px}}@media(min-width: 1200px){.modal-xl{max-width:980px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media(max-width: 1539.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:Roboto,sans-serif;font-style:normal;font-weight:400;line-height:1.65;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:0.8125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#1f2b3a}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#1f2b3a}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#1f2b3a}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#1f2b3a}.tooltip-inner{max-width:200px;padding:.25rem .75rem;color:#fff;text-align:center;background-color:#1f2b3a;border-radius:3px}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:Roboto,sans-serif;font-style:normal;font-weight:400;line-height:1.65;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:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:5px}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:0.875rem;background-color:#f7f7f7;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:4px;border-top-right-radius:4px}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#526484}.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(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-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{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-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{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%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(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:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.25rem}.offcanvas-header .btn-close{padding:.625rem .625rem;margin-top:-0.625rem;margin-right:-0.625rem;margin-bottom:-0.625rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1.25rem 1.25rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0fac81}.link-primary:hover,.link-primary:focus{color:#0c8a67}.link-secondary{color:#364a63}.link-secondary:hover,.link-secondary:focus{color:#2b3b4f}.link-success{color:#1ee0ac}.link-success:hover,.link-success:focus{color:#18b38a}.link-info{color:#09c2de}.link-info:hover,.link-info:focus{color:#079bb2}.link-warning{color:#f4bd0e}.link-warning:hover,.link-warning:focus{color:#c3970b}.link-danger{color:#e85347}.link-danger:hover,.link-danger:focus{color:#ba4239}.link-light{color:#e5e9f2}.link-light:hover,.link-light:focus{color:#eaedf5}.link-dark{color:#1f2b3a}.link-dark:hover,.link-dark:focus{color:#19222e}.link-gray{color:#8091a7}.link-gray:hover,.link-gray:focus{color:#667486}.link-lighter{color:#f5f6fa}.link-lighter:hover,.link-lighter:focus{color:#f7f8fb}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.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}.sticky-top{position:sticky;top:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1540px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.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}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex,.stretch,.center,.between-center,.between-start,.justify-around,.justify-between,.justify-center,.justify-end,.justify-start,.align-center,.align-end,.align-start{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 3px 12px 1px rgba(43,55,72,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(43,55,72,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(43,55,72,.25) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative,.pos-rel{position:relative !important}.position-absolute,.pos-abs{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dbdfea !important}.border-0,.no-bdr{border:0 !important}.border-top{border-top:1px solid #dbdfea !important}.border-top-0,.no-bdr-y,.no-bdr-t{border-top:0 !important}.border-end{border-right:1px solid #dbdfea !important}.border-end-0,.no-bdr-x,.no-bdr-r{border-right:0 !important}.border-bottom{border-bottom:1px solid #dbdfea !important}.border-bottom-0,.no-bdr-y,.no-bdr-b{border-bottom:0 !important}.border-start{border-left:1px solid #dbdfea !important}.border-start-0,.no-bdr-x,.no-bdr-l{border-left:0 !important}.border-primary{border-color:#0fac81 !important}.border-secondary{border-color:#364a63 !important}.border-success{border-color:#1ee0ac !important}.border-info{border-color:#09c2de !important}.border-warning{border-color:#f4bd0e !important}.border-danger{border-color:#e85347 !important}.border-light{border-color:#e5e9f2 !important}.border-dark{border-color:#1f2b3a !important}.border-gray{border-color:#8091a7 !important}.border-lighter{border-color:#f5f6fa !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !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}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !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}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.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-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}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.375rem !important}.gap-2{gap:.75rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:2.75rem !important}.gap-gs{gap:28px !important}.justify-content-start,.justify-start{justify-content:flex-start !important}.justify-content-end,.justify-end{justify-content:flex-end !important}.justify-content-center,.center,.justify-center{justify-content:center !important}.justify-content-between,.between-center,.between-start,.justify-between{justify-content:space-between !important}.justify-content-around,.justify-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start,.between-start,.align-start{align-items:flex-start !important}.align-items-end,.align-end{align-items:flex-end !important}.align-items-center,.center,.between-center,.align-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch,.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}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.375rem !important}.m-2{margin:.75rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:2.75rem !important}.m-gs{margin:28px !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-gs{margin-right:28px !important;margin-left:28px !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-gs{margin-top:28px !important;margin-bottom:28px !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.375rem !important}.mt-2{margin-top:.75rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:2.75rem !important}.mt-gs{margin-top:28px !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.375rem !important}.me-2{margin-right:.75rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:2.75rem !important}.me-gs{margin-right:28px !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.375rem !important}.mb-2{margin-bottom:.75rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:2.75rem !important}.mb-gs{margin-bottom:28px !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.375rem !important}.ms-2{margin-left:.75rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:2.75rem !important}.ms-gs{margin-left:28px !important}.ms-auto{margin-left:auto !important}.m-n1{margin:-0.375rem !important}.m-n2{margin:-0.75rem !important}.m-n3{margin:-1rem !important}.m-n4{margin:-1.5rem !important}.m-n5{margin:-2.75rem !important}.m-ngs{margin:-28px !important}.mx-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-n1{margin-top:-0.375rem !important}.mt-n2{margin-top:-0.75rem !important}.mt-n3{margin-top:-1rem !important}.mt-n4{margin-top:-1.5rem !important}.mt-n5{margin-top:-2.75rem !important}.mt-ngs{margin-top:-28px !important}.me-n1{margin-right:-0.375rem !important}.me-n2{margin-right:-0.75rem !important}.me-n3{margin-right:-1rem !important}.me-n4{margin-right:-1.5rem !important}.me-n5{margin-right:-2.75rem !important}.me-ngs{margin-right:-28px !important}.mb-n1{margin-bottom:-0.375rem !important}.mb-n2{margin-bottom:-0.75rem !important}.mb-n3{margin-bottom:-1rem !important}.mb-n4{margin-bottom:-1.5rem !important}.mb-n5{margin-bottom:-2.75rem !important}.mb-ngs{margin-bottom:-28px !important}.ms-n1{margin-left:-0.375rem !important}.ms-n2{margin-left:-0.75rem !important}.ms-n3{margin-left:-1rem !important}.ms-n4{margin-left:-1.5rem !important}.ms-n5{margin-left:-2.75rem !important}.ms-ngs{margin-left:-28px !important}.p-0{padding:0 !important}.p-1{padding:.375rem !important}.p-2{padding:.75rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:2.75rem !important}.p-gs{padding:28px !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-gs{padding-right:28px !important;padding-left:28px !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.375rem !important}.pt-2{padding-top:.75rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:2.75rem !important}.pt-gs{padding-top:28px !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.375rem !important}.pe-2{padding-right:.75rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:2.75rem !important}.pe-gs{padding-right:28px !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.375rem !important}.pb-2{padding-bottom:.75rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:2.75rem !important}.pb-gs{padding-bottom:28px !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.375rem !important}.ps-2{padding-left:.75rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:2.75rem !important}.ps-gs{padding-left:28px !important}.font-monospace,.ff-mono{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:2rem !important}.fs-2{font-size:1.75rem !important}.fs-3{font-size:1.5rem !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.15rem !important}.fs-6{font-size:1rem !important}.fst-italic,.ff-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.5 !important}.lh-base{line-height:1.65 !important}.lh-lg{line-height:1.5 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase,.lcap{text-transform:lowercase !important}.text-uppercase,.ucap{text-transform:uppercase !important}.text-capitalize,.ccap{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-gray{--bs-text-opacity: 1;color:rgba(var(--bs-gray-rgb), var(--bs-text-opacity)) !important}.text-lighter{--bs-text-opacity: 1;color:rgba(var(--bs-lighter-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:#8094ae !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-gray{--bs-bg-opacity: 1;background-color:rgba(var(--bs-gray-rgb), var(--bs-bg-opacity)) !important}.bg-lighter,.dual-listbox .dual-listbox__item:hover{--bs-bg-opacity: 1;background-color:rgba(var(--bs-lighter-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:4px !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:3px !important}.rounded-2{border-radius:4px !important}.rounded-3{border-radius:5px !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:4px !important;border-top-right-radius:4px !important}.rounded-end{border-top-right-radius:4px !important;border-bottom-right-radius:4px !important}.rounded-bottom{border-bottom-right-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-start{border-bottom-left-radius:4px !important;border-top-left-radius:4px !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !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}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.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-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}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.375rem !important}.gap-sm-2{gap:.75rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:2.75rem !important}.gap-sm-gs{gap:28px !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}.justify-content-sm-evenly{justify-content:space-evenly !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}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.375rem !important}.m-sm-2{margin:.75rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:2.75rem !important}.m-sm-gs{margin:28px !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-sm-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-sm-gs{margin-right:28px !important;margin-left:28px !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-sm-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-sm-gs{margin-top:28px !important;margin-bottom:28px !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.375rem !important}.mt-sm-2{margin-top:.75rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:2.75rem !important}.mt-sm-gs{margin-top:28px !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.375rem !important}.me-sm-2{margin-right:.75rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:2.75rem !important}.me-sm-gs{margin-right:28px !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.375rem !important}.mb-sm-2{margin-bottom:.75rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:2.75rem !important}.mb-sm-gs{margin-bottom:28px !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.375rem !important}.ms-sm-2{margin-left:.75rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:2.75rem !important}.ms-sm-gs{margin-left:28px !important}.ms-sm-auto{margin-left:auto !important}.m-sm-n1{margin:-0.375rem !important}.m-sm-n2{margin:-0.75rem !important}.m-sm-n3{margin:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.m-sm-n5{margin:-2.75rem !important}.m-sm-ngs{margin:-28px !important}.mx-sm-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-sm-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-sm-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-sm-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-sm-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-sm-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-sm-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-sm-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-sm-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-sm-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-sm-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-sm-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-sm-n1{margin-top:-0.375rem !important}.mt-sm-n2{margin-top:-0.75rem !important}.mt-sm-n3{margin-top:-1rem !important}.mt-sm-n4{margin-top:-1.5rem !important}.mt-sm-n5{margin-top:-2.75rem !important}.mt-sm-ngs{margin-top:-28px !important}.me-sm-n1{margin-right:-0.375rem !important}.me-sm-n2{margin-right:-0.75rem !important}.me-sm-n3{margin-right:-1rem !important}.me-sm-n4{margin-right:-1.5rem !important}.me-sm-n5{margin-right:-2.75rem !important}.me-sm-ngs{margin-right:-28px !important}.mb-sm-n1{margin-bottom:-0.375rem !important}.mb-sm-n2{margin-bottom:-0.75rem !important}.mb-sm-n3{margin-bottom:-1rem !important}.mb-sm-n4{margin-bottom:-1.5rem !important}.mb-sm-n5{margin-bottom:-2.75rem !important}.mb-sm-ngs{margin-bottom:-28px !important}.ms-sm-n1{margin-left:-0.375rem !important}.ms-sm-n2{margin-left:-0.75rem !important}.ms-sm-n3{margin-left:-1rem !important}.ms-sm-n4{margin-left:-1.5rem !important}.ms-sm-n5{margin-left:-2.75rem !important}.ms-sm-ngs{margin-left:-28px !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.375rem !important}.p-sm-2{padding:.75rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:2.75rem !important}.p-sm-gs{padding:28px !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-sm-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-sm-gs{padding-right:28px !important;padding-left:28px !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-sm-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-sm-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.375rem !important}.pt-sm-2{padding-top:.75rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:2.75rem !important}.pt-sm-gs{padding-top:28px !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.375rem !important}.pe-sm-2{padding-right:.75rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:2.75rem !important}.pe-sm-gs{padding-right:28px !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.375rem !important}.pb-sm-2{padding-bottom:.75rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:2.75rem !important}.pb-sm-gs{padding-bottom:28px !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.375rem !important}.ps-sm-2{padding-left:.75rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:2.75rem !important}.ps-sm-gs{padding-left:28px !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !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}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.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-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}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.375rem !important}.gap-md-2{gap:.75rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:2.75rem !important}.gap-md-gs{gap:28px !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}.justify-content-md-evenly{justify-content:space-evenly !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}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.375rem !important}.m-md-2{margin:.75rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:2.75rem !important}.m-md-gs{margin:28px !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-md-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-md-gs{margin-right:28px !important;margin-left:28px !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-md-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-md-gs{margin-top:28px !important;margin-bottom:28px !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.375rem !important}.mt-md-2{margin-top:.75rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:2.75rem !important}.mt-md-gs{margin-top:28px !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.375rem !important}.me-md-2{margin-right:.75rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:2.75rem !important}.me-md-gs{margin-right:28px !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.375rem !important}.mb-md-2{margin-bottom:.75rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:2.75rem !important}.mb-md-gs{margin-bottom:28px !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.375rem !important}.ms-md-2{margin-left:.75rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:2.75rem !important}.ms-md-gs{margin-left:28px !important}.ms-md-auto{margin-left:auto !important}.m-md-n1{margin:-0.375rem !important}.m-md-n2{margin:-0.75rem !important}.m-md-n3{margin:-1rem !important}.m-md-n4{margin:-1.5rem !important}.m-md-n5{margin:-2.75rem !important}.m-md-ngs{margin:-28px !important}.mx-md-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-md-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-md-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-md-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-md-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-md-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-md-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-md-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-md-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-md-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-md-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-md-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-md-n1{margin-top:-0.375rem !important}.mt-md-n2{margin-top:-0.75rem !important}.mt-md-n3{margin-top:-1rem !important}.mt-md-n4{margin-top:-1.5rem !important}.mt-md-n5{margin-top:-2.75rem !important}.mt-md-ngs{margin-top:-28px !important}.me-md-n1{margin-right:-0.375rem !important}.me-md-n2{margin-right:-0.75rem !important}.me-md-n3{margin-right:-1rem !important}.me-md-n4{margin-right:-1.5rem !important}.me-md-n5{margin-right:-2.75rem !important}.me-md-ngs{margin-right:-28px !important}.mb-md-n1{margin-bottom:-0.375rem !important}.mb-md-n2{margin-bottom:-0.75rem !important}.mb-md-n3{margin-bottom:-1rem !important}.mb-md-n4{margin-bottom:-1.5rem !important}.mb-md-n5{margin-bottom:-2.75rem !important}.mb-md-ngs{margin-bottom:-28px !important}.ms-md-n1{margin-left:-0.375rem !important}.ms-md-n2{margin-left:-0.75rem !important}.ms-md-n3{margin-left:-1rem !important}.ms-md-n4{margin-left:-1.5rem !important}.ms-md-n5{margin-left:-2.75rem !important}.ms-md-ngs{margin-left:-28px !important}.p-md-0{padding:0 !important}.p-md-1{padding:.375rem !important}.p-md-2{padding:.75rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:2.75rem !important}.p-md-gs{padding:28px !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-md-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-md-gs{padding-right:28px !important;padding-left:28px !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-md-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-md-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.375rem !important}.pt-md-2{padding-top:.75rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:2.75rem !important}.pt-md-gs{padding-top:28px !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.375rem !important}.pe-md-2{padding-right:.75rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:2.75rem !important}.pe-md-gs{padding-right:28px !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.375rem !important}.pb-md-2{padding-bottom:.75rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:2.75rem !important}.pb-md-gs{padding-bottom:28px !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.375rem !important}.ps-md-2{padding-left:.75rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:2.75rem !important}.ps-md-gs{padding-left:28px !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !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}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.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-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}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.375rem !important}.gap-lg-2{gap:.75rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:2.75rem !important}.gap-lg-gs{gap:28px !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}.justify-content-lg-evenly{justify-content:space-evenly !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}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.375rem !important}.m-lg-2{margin:.75rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:2.75rem !important}.m-lg-gs{margin:28px !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-lg-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-lg-gs{margin-right:28px !important;margin-left:28px !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-lg-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-lg-gs{margin-top:28px !important;margin-bottom:28px !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.375rem !important}.mt-lg-2{margin-top:.75rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:2.75rem !important}.mt-lg-gs{margin-top:28px !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.375rem !important}.me-lg-2{margin-right:.75rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:2.75rem !important}.me-lg-gs{margin-right:28px !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.375rem !important}.mb-lg-2{margin-bottom:.75rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:2.75rem !important}.mb-lg-gs{margin-bottom:28px !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.375rem !important}.ms-lg-2{margin-left:.75rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:2.75rem !important}.ms-lg-gs{margin-left:28px !important}.ms-lg-auto{margin-left:auto !important}.m-lg-n1{margin:-0.375rem !important}.m-lg-n2{margin:-0.75rem !important}.m-lg-n3{margin:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.m-lg-n5{margin:-2.75rem !important}.m-lg-ngs{margin:-28px !important}.mx-lg-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-lg-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-lg-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-lg-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-lg-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-lg-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-lg-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-lg-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-lg-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-lg-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-lg-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-lg-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-lg-n1{margin-top:-0.375rem !important}.mt-lg-n2{margin-top:-0.75rem !important}.mt-lg-n3{margin-top:-1rem !important}.mt-lg-n4{margin-top:-1.5rem !important}.mt-lg-n5{margin-top:-2.75rem !important}.mt-lg-ngs{margin-top:-28px !important}.me-lg-n1{margin-right:-0.375rem !important}.me-lg-n2{margin-right:-0.75rem !important}.me-lg-n3{margin-right:-1rem !important}.me-lg-n4{margin-right:-1.5rem !important}.me-lg-n5{margin-right:-2.75rem !important}.me-lg-ngs{margin-right:-28px !important}.mb-lg-n1{margin-bottom:-0.375rem !important}.mb-lg-n2{margin-bottom:-0.75rem !important}.mb-lg-n3{margin-bottom:-1rem !important}.mb-lg-n4{margin-bottom:-1.5rem !important}.mb-lg-n5{margin-bottom:-2.75rem !important}.mb-lg-ngs{margin-bottom:-28px !important}.ms-lg-n1{margin-left:-0.375rem !important}.ms-lg-n2{margin-left:-0.75rem !important}.ms-lg-n3{margin-left:-1rem !important}.ms-lg-n4{margin-left:-1.5rem !important}.ms-lg-n5{margin-left:-2.75rem !important}.ms-lg-ngs{margin-left:-28px !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.375rem !important}.p-lg-2{padding:.75rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:2.75rem !important}.p-lg-gs{padding:28px !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-lg-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-lg-gs{padding-right:28px !important;padding-left:28px !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-lg-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-lg-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.375rem !important}.pt-lg-2{padding-top:.75rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:2.75rem !important}.pt-lg-gs{padding-top:28px !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.375rem !important}.pe-lg-2{padding-right:.75rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:2.75rem !important}.pe-lg-gs{padding-right:28px !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.375rem !important}.pb-lg-2{padding-bottom:.75rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:2.75rem !important}.pb-lg-gs{padding-bottom:28px !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.375rem !important}.ps-lg-2{padding-left:.75rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:2.75rem !important}.ps-lg-gs{padding-left:28px !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !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}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.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-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}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.375rem !important}.gap-xl-2{gap:.75rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:2.75rem !important}.gap-xl-gs{gap:28px !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}.justify-content-xl-evenly{justify-content:space-evenly !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}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.375rem !important}.m-xl-2{margin:.75rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:2.75rem !important}.m-xl-gs{margin:28px !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-xl-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-xl-gs{margin-right:28px !important;margin-left:28px !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-xl-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-xl-gs{margin-top:28px !important;margin-bottom:28px !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.375rem !important}.mt-xl-2{margin-top:.75rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:2.75rem !important}.mt-xl-gs{margin-top:28px !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.375rem !important}.me-xl-2{margin-right:.75rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:2.75rem !important}.me-xl-gs{margin-right:28px !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.375rem !important}.mb-xl-2{margin-bottom:.75rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:2.75rem !important}.mb-xl-gs{margin-bottom:28px !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.375rem !important}.ms-xl-2{margin-left:.75rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:2.75rem !important}.ms-xl-gs{margin-left:28px !important}.ms-xl-auto{margin-left:auto !important}.m-xl-n1{margin:-0.375rem !important}.m-xl-n2{margin:-0.75rem !important}.m-xl-n3{margin:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.m-xl-n5{margin:-2.75rem !important}.m-xl-ngs{margin:-28px !important}.mx-xl-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-xl-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-xl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xl-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-xl-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-xl-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-xl-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-xl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xl-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-xl-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-xl-n1{margin-top:-0.375rem !important}.mt-xl-n2{margin-top:-0.75rem !important}.mt-xl-n3{margin-top:-1rem !important}.mt-xl-n4{margin-top:-1.5rem !important}.mt-xl-n5{margin-top:-2.75rem !important}.mt-xl-ngs{margin-top:-28px !important}.me-xl-n1{margin-right:-0.375rem !important}.me-xl-n2{margin-right:-0.75rem !important}.me-xl-n3{margin-right:-1rem !important}.me-xl-n4{margin-right:-1.5rem !important}.me-xl-n5{margin-right:-2.75rem !important}.me-xl-ngs{margin-right:-28px !important}.mb-xl-n1{margin-bottom:-0.375rem !important}.mb-xl-n2{margin-bottom:-0.75rem !important}.mb-xl-n3{margin-bottom:-1rem !important}.mb-xl-n4{margin-bottom:-1.5rem !important}.mb-xl-n5{margin-bottom:-2.75rem !important}.mb-xl-ngs{margin-bottom:-28px !important}.ms-xl-n1{margin-left:-0.375rem !important}.ms-xl-n2{margin-left:-0.75rem !important}.ms-xl-n3{margin-left:-1rem !important}.ms-xl-n4{margin-left:-1.5rem !important}.ms-xl-n5{margin-left:-2.75rem !important}.ms-xl-ngs{margin-left:-28px !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.375rem !important}.p-xl-2{padding:.75rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:2.75rem !important}.p-xl-gs{padding:28px !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-xl-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-xl-gs{padding-right:28px !important;padding-left:28px !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-xl-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-xl-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.375rem !important}.pt-xl-2{padding-top:.75rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:2.75rem !important}.pt-xl-gs{padding-top:28px !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.375rem !important}.pe-xl-2{padding-right:.75rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:2.75rem !important}.pe-xl-gs{padding-right:28px !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.375rem !important}.pb-xl-2{padding-bottom:.75rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:2.75rem !important}.pb-xl-gs{padding-bottom:28px !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.375rem !important}.ps-xl-2{padding-left:.75rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:2.75rem !important}.ps-xl-gs{padding-left:28px !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1540px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.375rem !important}.gap-xxl-2{gap:.75rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:2.75rem !important}.gap-xxl-gs{gap:28px !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.375rem !important}.m-xxl-2{margin:.75rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:2.75rem !important}.m-xxl-gs{margin:28px !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-xxl-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-xxl-gs{margin-right:28px !important;margin-left:28px !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-xxl-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-xxl-gs{margin-top:28px !important;margin-bottom:28px !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.375rem !important}.mt-xxl-2{margin-top:.75rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:2.75rem !important}.mt-xxl-gs{margin-top:28px !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.375rem !important}.me-xxl-2{margin-right:.75rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:2.75rem !important}.me-xxl-gs{margin-right:28px !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.375rem !important}.mb-xxl-2{margin-bottom:.75rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:2.75rem !important}.mb-xxl-gs{margin-bottom:28px !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.375rem !important}.ms-xxl-2{margin-left:.75rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:2.75rem !important}.ms-xxl-gs{margin-left:28px !important}.ms-xxl-auto{margin-left:auto !important}.m-xxl-n1{margin:-0.375rem !important}.m-xxl-n2{margin:-0.75rem !important}.m-xxl-n3{margin:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.m-xxl-n5{margin:-2.75rem !important}.m-xxl-ngs{margin:-28px !important}.mx-xxl-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-xxl-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-xxl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xxl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xxl-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-xxl-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-xxl-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-xxl-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-xxl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xxl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xxl-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-xxl-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-xxl-n1{margin-top:-0.375rem !important}.mt-xxl-n2{margin-top:-0.75rem !important}.mt-xxl-n3{margin-top:-1rem !important}.mt-xxl-n4{margin-top:-1.5rem !important}.mt-xxl-n5{margin-top:-2.75rem !important}.mt-xxl-ngs{margin-top:-28px !important}.me-xxl-n1{margin-right:-0.375rem !important}.me-xxl-n2{margin-right:-0.75rem !important}.me-xxl-n3{margin-right:-1rem !important}.me-xxl-n4{margin-right:-1.5rem !important}.me-xxl-n5{margin-right:-2.75rem !important}.me-xxl-ngs{margin-right:-28px !important}.mb-xxl-n1{margin-bottom:-0.375rem !important}.mb-xxl-n2{margin-bottom:-0.75rem !important}.mb-xxl-n3{margin-bottom:-1rem !important}.mb-xxl-n4{margin-bottom:-1.5rem !important}.mb-xxl-n5{margin-bottom:-2.75rem !important}.mb-xxl-ngs{margin-bottom:-28px !important}.ms-xxl-n1{margin-left:-0.375rem !important}.ms-xxl-n2{margin-left:-0.75rem !important}.ms-xxl-n3{margin-left:-1rem !important}.ms-xxl-n4{margin-left:-1.5rem !important}.ms-xxl-n5{margin-left:-2.75rem !important}.ms-xxl-ngs{margin-left:-28px !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.375rem !important}.p-xxl-2{padding:.75rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:2.75rem !important}.p-xxl-gs{padding:28px !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-xxl-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-xxl-gs{padding-right:28px !important;padding-left:28px !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-xxl-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-xxl-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.375rem !important}.pt-xxl-2{padding-top:.75rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:2.75rem !important}.pt-xxl-gs{padding-top:28px !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.375rem !important}.pe-xxl-2{padding-right:.75rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:2.75rem !important}.pe-xxl-gs{padding-right:28px !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.375rem !important}.pb-xxl-2{padding-bottom:.75rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:2.75rem !important}.pb-xxl-gs{padding-bottom:28px !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.375rem !important}.ps-xxl-2{padding-left:.75rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:2.75rem !important}.ps-xxl-gs{padding-left:28px !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !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}.d-print-none{display:none !important}}html{font-size:16px}ol,ul{list-style:none;margin:0;padding:0}a{transition:color .4s,background-color .4s,border .4s,box-shadow .4s}a:focus{outline:none}img{max-width:100%}strong{font-weight:500}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,.h1:last-child,.h2:last-child,.h3:last-child,.h4:last-child,.h5:last-child,.h6:last-child,p:last-child{margin-bottom:0}h1,.h1,h2,.h2{letter-spacing:-0.03em}h3,.h3,h4,.h4{letter-spacing:-0.02em}h5,.h5,h6,.h6{letter-spacing:-0.01em}@media(min-width: 992px){h1,.h1{font-size:3.75rem;font-weight:400;letter-spacing:-0.04em}h2,.h2{font-size:2.5rem;letter-spacing:-0.03em}h3,.h3{font-size:2rem;letter-spacing:-0.03em}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1.05rem}}.list-inline li{display:inline-block}.list-inline li:not(:last-child){margin-right:1rem}.ellipsis,.nk-msg-text .title,.attach-item span,.tb-odr-item .tb-odr-info,.tb-tnx-item .tb-tnx-desc,.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ff-base{font-family:Roboto,sans-serif !important}.ff-alt{font-family:Nunito,sans-serif !important}.fw-medium{font-weight:500 !important}.text-white h1,.text-white h2,.text-white h3,.text-white h4,.text-white h5,.text-white h6,.text-white .h1,.text-white .h2,.text-white .h3,.text-white .h4,.text-white .h5,.text-white .h6{color:#fff}@media(min-width: 992px){.lead{font-size:1.09375rem}}small,.small{font-weight:400 !important}.text-soft{color:#8094ae !important}.text-base{color:#526484 !important}.text-head{color:#364a63 !important}.circle{border-radius:50%}.round{border-radius:4px}.round-sm{border-radius:3px}.round-lg{border-radius:5px}.round-xl{border-radius:10px}svg{height:100%;max-width:100%}.sq{height:40px;width:40px}.sq-xs{height:18px;width:18px}.sq-sm{height:24px;width:24px}.sq-md{height:32px;width:32px}.sq-lg{height:60px;width:60px}.sq-xl{height:80px;width:80px}.divider{border-top:1px solid #e5e9f2 !important;margin:28px 0;display:block}.divider.xs{margin:.5rem 0}.divider.sm{margin:1rem 0}.divider.md{margin:1.5rem 0}.divider.lg{margin:2.25rem 0}.divider.xl{margin:2.75rem 0}.bg-blue{background-color:#559bfb !important}.text-blue{color:#559bfb !important}.bg-azure{background-color:#1676fb !important}.text-azure{color:#1676fb !important}.bg-indigo{background-color:#2c3782 !important}.text-indigo{color:#2c3782 !important}.bg-purple{background-color:#816bff !important}.text-purple{color:#816bff !important}.bg-pink{background-color:#ff63a5 !important}.text-pink{color:#ff63a5 !important}.bg-orange{background-color:#ffa353 !important}.text-orange{color:#ffa353 !important}.bg-teal{background-color:#20c997 !important}.text-teal{color:#20c997 !important}.bg-blue-dim{background-color:#e9f2fe !important}.text-blue-dim{color:#e9f2fe !important}.bg-azure-dim{background-color:#e1edfe !important}.text-azure-dim{color:#e1edfe !important}.bg-indigo-dim{background-color:#e4e5ef !important}.text-indigo-dim{color:#e4e5ef !important}.bg-purple-dim{background-color:#efecff !important}.text-purple-dim{color:#efecff !important}.bg-pink-dim{background-color:#ffebf3 !important}.text-pink-dim{color:#ffebf3 !important}.bg-orange-dim{background-color:#fff3e9 !important}.text-orange-dim{color:#fff3e9 !important}.bg-teal-dim{background-color:#e2f8f1 !important}.text-teal-dim{color:#e2f8f1 !important}.bg-primary-dim,.dual-listbox .dual-listbox__item:active,.dual-listbox .dual-listbox__item.dual-listbox__item--selected{background-color:#e0f4ef !important}.text-primary-dim{color:#e0f4ef !important}.bg-success-dim{background-color:#e2fbf4 !important}.text-success-dim{color:#e2fbf4 !important}.bg-info-dim{background-color:#dff7fb !important}.text-info-dim{color:#dff7fb !important}.bg-warning-dim{background-color:#fef6e0 !important}.text-warning-dim{color:#fef6e0 !important}.bg-danger-dim{background-color:#fce9e7 !important}.text-danger-dim{color:#fce9e7 !important}.bg-secondary-dim{background-color:#e5ecf5 !important}.text-secondary-dim{color:#e5ecf5 !important}.bg-dark-dim{background-color:#d9e1ef !important}.text-dark-dim{color:#d9e1ef !important}.bg-gray-dim{background-color:#edf2f9 !important}.text-gray-dim{color:#edf2f9 !important}.bg-gray-100{background-color:#ebeef2 !important}.bg-gray-200{background-color:#e5e9f2 !important}.bg-gray-300{background-color:#dbdfea !important}.bg-gray-400{background-color:#b7c2d0 !important}.bg-gray-500{background-color:#8091a7 !important}.bg-gray-600{background-color:#3c4d62 !important}.bg-gray-700{background-color:#344357 !important}.bg-gray-800{background-color:#2b3748 !important}.bg-gray-900{background-color:#1f2b3a !important}.bg-abstract{background-image:linear-gradient(to right, #2c3782 calc(60% - 150px), #39469f calc(60% - 150px), #39469f 60%, #4856b5 60%, #4856b5 calc(60% + 150px), #5b6ac6 calc(60% + 150px), #5b6ac6 100%)}.bg-white-1{background:rgba(255,255,255,.1) !important}.bg-white-2{background:rgba(255,255,255,.2) !important}.bg-white-3{background:rgba(255,255,255,.3) !important}.bg-white-4{background:rgba(255,255,255,.4) !important}.bg-white-5{background:rgba(255,255,255,.5) !important}.bg-white-6{background:rgba(255,255,255,.6) !important}.bg-white-7{background:rgba(255,255,255,.7) !important}.bg-white-8{background:rgba(255,255,255,.8) !important}.bg-white-9{background:rgba(255,255,255,.9) !important}.border-transparent{border-color:rgba(0,0,0,0)}.w-40px{width:40px !important}.w-min-40px{min-width:40px !important}.w-max-40px{max-width:40px !important}.w-80px{width:80px !important}.w-min-80px{min-width:80px !important}.w-max-80px{max-width:80px !important}.w-90px{width:90px !important}.w-min-90px{min-width:90px !important}.w-max-90px{max-width:90px !important}.w-100px{width:100px !important}.w-min-100px{min-width:100px !important}.w-max-100px{max-width:100px !important}.w-110px{width:110px !important}.w-min-110px{min-width:110px !important}.w-max-110px{max-width:110px !important}.w-120px{width:120px !important}.w-min-120px{min-width:120px !important}.w-max-120px{max-width:120px !important}.w-125px{width:125px !important}.w-min-125px{min-width:125px !important}.w-max-125px{max-width:125px !important}.w-130px{width:130px !important}.w-min-130px{min-width:130px !important}.w-max-130px{max-width:130px !important}.w-140px{width:140px !important}.w-min-140px{min-width:140px !important}.w-max-140px{max-width:140px !important}.w-150px{width:150px !important}.w-min-150px{min-width:150px !important}.w-max-150px{max-width:150px !important}.w-175px{width:175px !important}.w-min-175px{min-width:175px !important}.w-max-175px{max-width:175px !important}.w-200px{width:200px !important}.w-min-200px{min-width:200px !important}.w-max-200px{max-width:200px !important}.w-220px{width:220px !important}.w-min-220px{min-width:220px !important}.w-max-220px{max-width:220px !important}.w-225px{width:225px !important}.w-min-225px{min-width:225px !important}.w-max-225px{max-width:225px !important}.w-250px{width:250px !important}.w-min-250px{min-width:250px !important}.w-max-250px{max-width:250px !important}.w-300px{width:300px !important}.w-min-300px{min-width:300px !important}.w-max-300px{max-width:300px !important}.w-350px{width:350px !important}.w-min-350px{min-width:350px !important}.w-max-350px{max-width:350px !important}.w-400px{width:400px !important}.w-min-400px{min-width:400px !important}.w-max-400px{max-width:400px !important}.w-550px{width:550px !important}.w-min-550px{min-width:550px !important}.w-max-550px{max-width:550px !important}.w-max-100,.wide-xs-fix,.wide-sm-fix,.wide-md-fix,.wide-lg-fix{max-width:100% !important}.w-min-100{min-width:100% !important}.w-max-auto{max-width:inherit !important}.w-min-auto{min-width:auto !important}.w-15{width:15% !important}.w-20{width:20% !important}.w-30{width:30% !important}.w-35{width:35% !important}.w-40{width:40% !important}.w-45{width:45% !important}.w-55{width:55% !important}.w-60{width:60% !important}.w-65{width:65% !important}.w-70{width:70% !important}.w-80{width:80% !important}.w-85{width:85% !important}.w-90{width:90% !important}.w-95{width:95% !important}@media(min-width: 576px){.wide-xs{max-width:520px !important}.wide-xs-fix{width:520px !important}}@media(min-width: 768px){.wide-sm{max-width:720px !important}.wide-sm-fix{width:720px !important}}@media(min-width: 992px){.wide-md{max-width:960px !important}.wide-md-fix{width:960px !important}}@media(min-width: 1200px){.wide-lg{max-width:1140px !important}.wide-lg-fix{width:1140px !important}}@media(min-width: 1280px){.wide-xl{max-width:1240px !important}.wide-xl-fix{width:1240px !important}}.wide-xs-fix{width:520px !important}.wide-sm-fix{width:720px !important}.wide-md-fix{width:960px !important}.wide-lg-fix{width:1140px !important}.wide-xl-fix{width:1240px !important}@media(min-width: 1200px)and (max-width: 1660px){.wide-fit{max-width:1140px}}.h-100px{height:100px !important}.h-min-100px{min-height:100px !important}.h-max-100px{max-height:100px !important}.h-150px{height:150px !important}.h-min-150px{min-height:150px !important}.h-max-150px{max-height:150px !important}.h-175px{height:175px !important}.h-min-175px{min-height:175px !important}.h-max-175px{max-height:175px !important}.h-200px{height:200px !important}.h-min-200px{min-height:200px !important}.h-max-200px{max-height:200px !important}.h-225px{height:225px !important}.h-min-225px{min-height:225px !important}.h-max-225px{max-height:225px !important}.h-250px{height:250px !important}.h-min-250px{min-height:250px !important}.h-max-250px{max-height:250px !important}.h-275px{height:275px !important}.h-min-275px{min-height:275px !important}.h-max-275px{max-height:275px !important}.h-300px{height:300px !important}.h-min-300px{min-height:300px !important}.h-max-300px{max-height:300px !important}.h-325px{height:325px !important}.h-min-325px{min-height:325px !important}.h-max-325px{max-height:325px !important}.h-350px{height:350px !important}.h-min-350px{min-height:350px !important}.h-max-350px{max-height:350px !important}.h-375px{height:375px !important}.h-min-375px{min-height:375px !important}.h-max-375px{max-height:375px !important}.h-400px{height:400px !important}.h-min-400px{min-height:400px !important}.h-max-400px{max-height:400px !important}.h-425px{height:425px !important}.h-min-425px{min-height:425px !important}.h-max-425px{max-height:425px !important}.h-450px{height:450px !important}.h-min-450px{min-height:450px !important}.h-max-450px{max-height:450px !important}.h-475px{height:475px !important}.h-min-475px{min-height:475px !important}.h-max-475px{max-height:475px !important}.h-500px{height:500px !important}.h-min-500px{min-height:500px !important}.h-max-500px{max-height:500px !important}.absolute-top-left{position:absolute;top:0;left:0}.absolute-top-right{position:absolute;top:0;right:0}.absolute-bottom-left{position:absolute;bottom:0;left:0}.absolute-bottom-right{position:absolute;bottom:0;right:0}.shrink-0{flex-shrink:0}.badge{position:relative;border:1px solid currentColor;line-height:1.125rem;font-family:Roboto,sans-serif;letter-spacing:.01em;vertical-align:middle;display:inline-flex}.badge .icon+span,.badge span+.icon{padding-left:4px}.badge.rounded-pill{border-radius:10rem;padding-right:.5rem;padding-left:.5rem}.badge-sm{padding:.3125rem .75rem;font-size:.75rem}.badge-sm.rounded-pill{padding:.3125rem .875rem}.badge-md{padding:.47rem 1rem;font-size:.8125rem !important}.badge-md.rounded-pill{padding:.47rem 1rem}.badge-lg{padding:.75rem 1.25rem;font-size:.93rem !important}.badge-lg.rounded-pill{padding:.75rem 1.25rem}.badge-xl{padding:.875rem 1.5rem;font-size:1.125rem !important}.badge-xl.rounded-pill{padding:.875rem 1.5rem}.badge.bg-light{color:#364a63}.badge-lighter{color:#526484}.badge .icon{font-size:1rem}.bg-primary{border-color:#0fac81;background:#0fac81}.bg-secondary{border-color:#364a63;background:#364a63}.bg-success{border-color:#1ee0ac;background:#1ee0ac}.bg-info{border-color:#09c2de;background:#09c2de}.bg-warning{border-color:#f4bd0e;background:#f4bd0e}.bg-danger{border-color:#e85347;background:#e85347}.bg-light{border-color:#e5e9f2;background:#e5e9f2}.bg-dark{border-color:#1f2b3a;background:#1f2b3a}.bg-gray{border-color:#8091a7;background:#8091a7}.bg-lighter,.dual-listbox .dual-listbox__item:hover{border-color:#f5f6fa;background:#f5f6fa}.bg-outline-primary{color:#0fac81;border-color:#6fcdb3}.bg-outline-secondary{color:#364a63;border-color:#8692a1}.bg-outline-success{color:#1ee0ac;border-color:#78eccd}.bg-outline-info{color:#09c2de;border-color:#6bdaeb}.bg-outline-warning{color:#f4bd0e;border-color:#f8d76e}.bg-outline-danger{color:#e85347;border-color:#f19891}.bg-outline-light{color:#b7c2d0;border-color:#d4dae3}.bg-outline-dark{color:#1f2b3a;border-color:#798089}.bg-outline-gray{color:#8091a7;border-color:#b3bdca}.bg-outline-lighter{color:#e5e9f2;border-color:#eff2f7}.badge-dim.bg-primary{color:#0fac81;background-color:#e5f6f1 !important;border-color:#e5f6f1}.badge-dim.bg-outline-primary{color:#0fac81;background-color:#e5f6f1;border-color:#9fdecd}.badge-dim.bg-secondary{color:#364a63;background-color:#e9ebee !important;border-color:#e9ebee}.badge-dim.bg-outline-secondary{color:#364a63;background-color:#e9ebee;border-color:#afb7c1}.badge-dim.bg-success{color:#1ee0ac;background-color:#e6fcf6 !important;border-color:#e6fcf6}.badge-dim.bg-outline-success{color:#1ee0ac;background-color:#e6fcf6;border-color:#a5f3de}.badge-dim.bg-info{color:#09c2de;background-color:#e4f8fb !important;border-color:#e4f8fb}.badge-dim.bg-outline-info{color:#09c2de;background-color:#e4f8fb;border-color:#9de7f2}.badge-dim.bg-warning{color:#f4bd0e;background-color:#fef8e4 !important;border-color:#fef8e4}.badge-dim.bg-outline-warning{color:#f4bd0e;background-color:#fef8e4;border-color:#fbe59f}.badge-dim.bg-danger{color:#e85347;background-color:#fceceb !important;border-color:#fceceb}.badge-dim.bg-outline-danger{color:#e85347;background-color:#fceceb;border-color:#f6bab5}.badge-dim.bg-light{color:#b7c2d0;background-color:#f7f8fa !important;border-color:#f7f8fa}.badge-dim.bg-outline-light{color:#b7c2d0;background-color:#f7f8fa;border-color:#e2e7ec}.badge-dim.bg-dark{color:#1f2b3a;background-color:#e6e8e9 !important;border-color:#e6e8e9}.badge-dim.bg-outline-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:#a5aab0}.badge-dim.bg-gray{color:#8091a7;background-color:#f1f3f5 !important;border-color:#f1f3f5}.badge-dim.bg-outline-gray{color:#8091a7;background-color:#f1f3f5;border-color:#ccd3dc}.badge-dim.bg-lighter,.dual-listbox .badge-dim.dual-listbox__item:hover{color:#e5e9f2;background-color:#fcfdfe !important;border-color:#fcfdfe}.badge-dim.bg-outline-lighter{color:#e5e9f2;background-color:#fcfdfe;border-color:#f5f6fa}.badge-dot{display:inline-flex;align-items:center;background-color:rgba(0,0,0,0) !important;border:none;padding-left:12px;padding-right:0;font-size:12px}.badge-dot:before{position:absolute;content:"";left:0;top:50%;transform:translateY(-50%);display:inline-block;height:6px;width:6px;margin-top:-1px;border-radius:50%;background:currentColor}.badge-dot.badge-sm,.badge-dot.badge-md{padding-left:16px}.badge-dot.badge-sm:before,.badge-dot.badge-md:before{height:8px;width:8px;margin-top:0}.badge-dot.badge-lg,.badge-dot.badge-xl{padding-left:24px}.badge-dot.badge-lg:before,.badge-dot.badge-xl:before{height:12px;width:12px;margin-top:0}.badge-dot.bg-primary{color:#0fac81}.badge-dot.bg-secondary{color:#364a63}.badge-dot.bg-success{color:#1ee0ac}.badge-dot.bg-info{color:#09c2de}.badge-dot.bg-warning{color:#f4bd0e}.badge-dot.bg-danger{color:#e85347}.badge-dot.bg-light{color:#b7c2d0}.badge-dot.bg-dark{color:#1f2b3a}.badge-dot.bg-gray{color:#8091a7}.badge-dot.bg-lighter,.dual-listbox .badge-dot.dual-listbox__item:hover{color:#e5e9f2}@media(max-width: 767.98px){.badge-dot-sm{width:0;overflow:hidden}}@media(max-width: 413px){.badge-dot-mb{width:0;overflow:hidden}}@media(max-width: 369px){.badge-dot-xs{width:0;overflow:hidden}}.alert:last-child{margin-bottom:0}.alert-link{box-shadow:0 1px 0 currentColor}.alert-link:hover{box-shadow:none}.alert h5,.alert .h5,.alert h6,.alert .h6,.alert .title{font-size:1.05rem}.alert.alert-icon{padding-left:3.25rem}.alert.alert-icon>.icon{position:absolute;font-size:1.25rem;line-height:1;width:2rem;top:1rem;left:1.25rem;margin-left:-1px}.alert-dismissible .close{top:50%;transform:translateY(-50%);transition:.3s ease;margin-top:-1px;position:absolute;right:0;padding:1rem 1.25rem;color:currentColor}.alert-dismissible .close:focus{outline:none}.alert-dismissible .close:hover{color:currentColor;opacity:.75}.alert-dismissible .close:after{font-family:"Nioicon";content:"";font-size:1.1rem}.alert-light,.alert-lighter,.alert-gray{border-color:#e5e9f2;color:#526484}.alert-light .alert-link,.alert-lighter .alert-link,.alert-gray .alert-link{color:#526484}.alert-alt{position:relative;padding:.875rem;border-radius:12px}.alert-alt.alert-icon{padding-left:4rem}.alert-alt.alert-icon>.icon{position:absolute;font-size:2rem;line-height:1;width:4rem;top:50%;left:0;transform:translateY(-50%);text-align:center;opacity:.5}a.alert:hover{color:currentColor}.alert-fill.alert-primary{color:#fff;background:#0fac81}.alert-fill.alert-secondary{color:#fff;background:#364a63}.alert-fill.alert-success{color:#fff;background:#1ee0ac}.alert-fill.alert-info{color:#fff;background:#09c2de}.alert-fill.alert-warning{color:#fff;background:#f4bd0e}.alert-fill.alert-danger{color:#fff;background:#e85347}.alert-fill.alert-light{color:#000;background:#e5e9f2}.alert-fill.alert-dark{color:#fff;background:#1f2b3a}.alert-fill.alert-gray{color:#fff;background:#8091a7}.alert-fill.alert-lighter{color:#000;background:#ebeef2}.alert-fill{border-width:0}.alert-fill .alert-link,.alert-fill .icon,.alert-fill h4,.alert-fill .h4,.alert-fill h5,.alert-fill .h5,.alert-fill h6,.alert-fill .h6{color:currentColor}.alert-fill.alert-light{color:#364a63}.alert-fill.alert-lighter{color:#526484}.alert-pro{box-shadow:0 4px 15px 0 rgba(31,43,58,.1);border:none;border-left:4px solid rgba(0,0,0,0);color:#526484;line-height:1.5;background:#fff}.alert-pro.no-shadow{box-shadow:none}.alert-pro.no-border{border-left:0}.alert-pro.alert-icon{padding-left:4rem}.alert-pro.alert-icon>.icon{font-size:1.75rem;top:50%;transform:translateY(-50%)}.alert-pro.alert-primary{border-color:#0fac81}.alert-pro.alert-primary>.icon{color:#0fac81}.alert-pro.alert-secondary{border-color:#364a63}.alert-pro.alert-secondary>.icon{color:#364a63}.alert-pro.alert-success{border-color:#1ee0ac}.alert-pro.alert-success>.icon{color:#1ee0ac}.alert-pro.alert-info{border-color:#09c2de}.alert-pro.alert-info>.icon{color:#09c2de}.alert-pro.alert-warning{border-color:#f4bd0e}.alert-pro.alert-warning>.icon{color:#f4bd0e}.alert-pro.alert-danger{border-color:#e85347}.alert-pro.alert-danger>.icon{color:#e85347}.alert-pro.alert-light{border-color:#b7c2d0}.alert-pro.alert-light>.icon{color:#b7c2d0}.alert-pro.alert-dark{border-color:#1f2b3a}.alert-pro.alert-dark>.icon{color:#1f2b3a}.alert-pro.alert-gray{border-color:#8091a7}.alert-pro.alert-gray>.icon{color:#8091a7}.alert-pro.alert-lighter{border-color:#b7c2d0}.alert-pro.alert-lighter>.icon{color:#b7c2d0}.breadcrumb-item{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.05rem}.breadcrumb-item a:not(:hover){color:#8094ae}.breadcrumb-pipe .breadcrumb-item+.breadcrumb-item::before{content:"|"}.breadcrumb-arrow .breadcrumb-item+.breadcrumb-item::before{font-family:"Nioicon";content:""}.breadcrumb-item.active:not(:only-child){font-weight:400}.breadcrumb-alt .breadcrumb-item{text-transform:unset;letter-spacing:0;color:#8094ae}.breadcrumb-xs .breadcrumb-item+.breadcrumb-item{padding-left:.25rem}.breadcrumb-xs .breadcrumb-item+.breadcrumb-item:before{padding-right:.25rem;font-size:.8em}.breadcrumb-sm .breadcrumb-item{font-size:13px}.link{display:inline-flex;align-items:center;font-size:.85rem;font-weight:500;font-family:Roboto,sans-serif;line-height:1;border:none;background:rgba(0,0,0,0);transition:all .3s ease;white-space:nowrap}.link:focus{box-shadow:none;outline:none}.link .icon{font-size:1.3em}.link span,.link .icon{display:inline-block}.link .icon-circle{display:inline-flex}.link .icon+span,.link span+.icon{padding-left:10px}.link-md{font-size:1.25rem}.link-sm{font-size:.75rem}.link-dim{opacity:.7}.link-dim:hover{opacity:1}.link-block{display:flex}.link-between{justify-content:space-between}.link-primary{color:#0fac81 !important}.link-on-primary:hover{color:#0fac81 !important}.link-secondary{color:#364a63 !important}.link-on-secondary:hover{color:#364a63 !important}.link-success{color:#1ee0ac !important}.link-on-success:hover{color:#1ee0ac !important}.link-info{color:#09c2de !important}.link-on-info:hover{color:#09c2de !important}.link-warning{color:#f4bd0e !important}.link-on-warning:hover{color:#f4bd0e !important}.link-danger{color:#e85347 !important}.link-on-danger:hover{color:#e85347 !important}.link-light{color:#8094ae !important}.link-on-light:hover{color:#8094ae !important}.link-dark{color:#1f2b3a !important}.link-on-dark:hover{color:#1f2b3a !important}.link-gray{color:#8091a7 !important}.link-on-gray:hover{color:#8091a7 !important}.link-lighter{color:#b7c2d0 !important}.link-on-lighter:hover{color:#b7c2d0 !important}.link-text{color:#526484 !important}.link-on-text:hover{color:#526484 !important}.link-danger:hover,.link-warning:hover,.link-success:hover,.link-info:hover{color:#526484 !important}.btn,.dual-listbox .dual-listbox__button{position:relative;letter-spacing:.02em;display:inline-flex;align-items:center}.btn-xl{padding:.6875rem 1.5rem;font-size:0.9375rem;border-radius:5px;line-height:1.25rem}.btn-xs{padding:.125rem .5rem;font-size:0.6875rem;border-radius:3px;line-height:1rem}.btn .icon,.dual-listbox .dual-listbox__button .icon{font-size:1.4em;line-height:inherit}.btn>span,.dual-listbox .dual-listbox__button>span{display:inline-block;white-space:nowrap}.btn>span:only-child,.dual-listbox .dual-listbox__button>span:only-child{width:100%}.btn .icon+span,.dual-listbox .dual-listbox__button .icon+span,.btn span+.icon,.dual-listbox .dual-listbox__button span+.icon{padding-left:8px}.btn .dd-indc,.dual-listbox .dual-listbox__button .dd-indc{transform:translateX(-8px)}.btn span+.dd-indc,.dual-listbox .dual-listbox__button span+.dd-indc{transform:translateX(8px)}.btn-lg .icon+span,.btn-group-lg>.btn .icon+span,.dual-listbox .btn-group-lg>.dual-listbox__button .icon+span,.btn-lg span+.icon,.btn-group-lg>.btn span+.icon,.dual-listbox .btn-group-lg>.dual-listbox__button span+.icon{padding-left:12px}.btn-round{border-radius:2.125rem}.btn-block{justify-content:center;width:100%}.btn-ucap,.btn.ucap,.dual-listbox .ucap.dual-listbox__button{text-transform:uppercase;font-size:12px;letter-spacing:.05em}.btn-icon:not([class*=btn-icon-break]),.dt-buttons .btn-secondary:not([class*=btn-icon-break]){padding-left:0;padding-right:0}.btn-icon .icon,.dt-buttons .btn-secondary .icon{width:2.125rem}.btn-icon.btn-xl .icon,.dt-buttons .btn-xl.btn-secondary .icon{width:2.625rem}.btn-icon.btn-lg .icon,.dt-buttons .btn-lg.btn-secondary .icon,.btn-group-lg>.btn-icon.btn .icon,.dual-listbox .btn-group-lg>.btn-icon.dual-listbox__button .icon,.dt-buttons .btn-group-lg>.btn.btn-secondary .icon,.dt-buttons .dual-listbox .btn-group-lg>.btn-secondary.dual-listbox__button .icon,.dual-listbox .dt-buttons .btn-group-lg>.btn-secondary.dual-listbox__button .icon{width:2.625rem}.btn-icon.btn-sm .icon,.dt-buttons .btn-sm.btn-secondary .icon,.btn-group-sm>.btn-icon.btn .icon,.dual-listbox .btn-group-sm>.btn-icon.dual-listbox__button .icon,.dt-buttons .btn-group-sm>.btn.btn-secondary .icon,.dt-buttons .dual-listbox .btn-group-sm>.btn-secondary.dual-listbox__button .icon,.dual-listbox .dt-buttons .btn-group-sm>.btn-secondary.dual-listbox__button .icon{width:1.75rem}.btn-icon.btn-xs .icon,.dt-buttons .btn-xs.btn-secondary .icon{width:1.25rem;font-size:1.1em}.btn-icon .dot,.dt-buttons .btn-secondary .dot{position:absolute;top:.35rem;right:.35rem;transform:translate(50%, -50%)}.btn-icon .badge,.dt-buttons .btn-secondary .badge{position:absolute;top:.25rem;right:.25rem;transform:translate(50%, -50%)}.btn-icon .badge-circle,.dt-buttons .btn-secondary .badge-circle{border-radius:50%;height:1.125rem;width:1.125rem;padding:0;font-weight:700;font-size:11px;text-align:center;justify-content:center}.btn-mw{min-width:120px;justify-content:center}.btn-wrap{flex-direction:column;align-items:center;flex-grow:0}.btn-extext{font-size:12px;font-weight:500;text-align:center;margin-top:.25rem;color:#8094ae}.btn-wider{display:flex}.btn-wider .icon+span,.btn-wider span+.icon{margin-left:auto}.btn-auto{min-width:auto}.btn-pd-auto{padding-left:.25rem;padding-right:.25rem}.btn .spinner-border,.dual-listbox .dual-listbox__button .spinner-border,.btn .spinner-grow,.dual-listbox .dual-listbox__button .spinner-grow{margin:.125rem}.btn .spinner-border+span,.dual-listbox .dual-listbox__button .spinner-border+span,.btn .spinner-grow+span,.dual-listbox .dual-listbox__button .spinner-grow+span{margin-left:.25rem}.btn-indc{width:100%}.btn-indc .icon{font-size:1.43em}.btn-indc .indc{opacity:.6;margin-left:-8px;margin-right:auto}.btn-indc span+.indc{margin-left:auto;margin-right:-8px}@media(min-width: 768px){.btn-xl{padding:.625rem 2rem;font-size:1.125rem;border-radius:5px;line-height:2rem}.btn-xl.btn-round{border-radius:3.25rem}.btn-icon.btn-xl .icon,.dt-buttons .btn-xl.btn-secondary .icon{width:3.25rem}}.btn-trigger{position:relative;z-index:1;color:#526484}.btn-trigger:focus{box-shadow:none}.btn-trigger:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.is-dark .btn-trigger:before{background-color:#03231a}.show>.btn-trigger:before{opacity:1;height:120%;width:120%}.btn-trigger:hover:before,.btn-trigger:focus:before,.btn-trigger.active:not(.revarse):before{opacity:1;height:120%;width:120%}.btn-trigger.active:hover:before{background-color:#dbdfea}a:hover .btn-trigger:before{opacity:1;height:120%;width:120%}.btn-dim.btn-outline-primary{color:#0fac81;background-color:#e5f6f1;border-color:#9fdecd}.btn-dim.btn-outline-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-white.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#0fac81;background:#e5f6f1}.btn-dim.btn-outline-success{color:#1ee0ac;background-color:#e6fcf6;border-color:#a5f3de}.btn-dim.btn-outline-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-white.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1ee0ac;background:#e6fcf6}.btn-dim.btn-outline-warning{color:#f4bd0e;background-color:#fef8e4;border-color:#fbe59f}.btn-dim.btn-outline-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-white.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#f4bd0e;background:#fef8e4}.btn-dim.btn-outline-info{color:#09c2de;background-color:#e4f8fb;border-color:#9de7f2}.btn-dim.btn-outline-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-white.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#09c2de;background:#e4f8fb}.btn-dim.btn-outline-danger{color:#e85347;background-color:#fceceb;border-color:#f6bab5}.btn-dim.btn-outline-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-white.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e85347;background:#fceceb}.btn-dim.btn-outline-secondary{color:#364a63;background-color:#e9ebee;border-color:#b9c0c8}.btn-dim.btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-white.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#364a63;background:#e9ebee}.btn-dim.btn-outline-gray{color:#3c4d62;background-color:#f1f3f5;border-color:#d3d9e0}.btn-dim.btn-outline-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#3c4d62;border-color:#3c4d62}.btn-white.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#3c4d62;background:#f1f3f5}.btn-dim.btn-outline-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:#b1b5ba}.btn-dim.btn-outline-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-white.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1f2b3a;background:#e6e8e9}.btn-dim.btn-outline-light,.dt-buttons .btn-dim.btn-secondary{color:#526484;background-color:#f5f6fa;border-color:#dbdfea}.btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dt-buttons .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#526484;border-color:#526484}.btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#526484;background:#f5f6fa}.btn-dim.btn-primary{color:#0fac81;background-color:#e5f6f1;border-color:rgba(0,0,0,0)}.btn-dim.btn-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-dim.btn-secondary{color:#364a63;background-color:#e9ebee;border-color:rgba(0,0,0,0)}.btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-dim.btn-success{color:#1ee0ac;background-color:#e6fcf6;border-color:rgba(0,0,0,0)}.btn-dim.btn-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-dim.btn-warning{color:#f4bd0e;background-color:#fef8e4;border-color:rgba(0,0,0,0)}.btn-dim.btn-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-dim.btn-info{color:#09c2de;background-color:#e4f8fb;border-color:rgba(0,0,0,0)}.btn-dim.btn-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-dim.btn-danger{color:#e85347;background-color:#fceceb;border-color:rgba(0,0,0,0)}.btn-dim.btn-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-dim.btn-gray{color:#3c4d62;background-color:#eaebee;border-color:rgba(0,0,0,0)}.btn-dim.btn-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#3c4d62;border-color:#3c4d62}.btn-dim.btn-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:rgba(0,0,0,0)}.btn-dim.btn-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-dim.btn-light,.dual-listbox .btn-dim.dual-listbox__button{color:#8091a7;background-color:#f1f3f5;border-color:rgba(0,0,0,0)}.btn-dim.btn-light:not(:disabled):not(.disabled):hover,.dual-listbox .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-dim.btn-lighter{color:#b7c2d0;background-color:#f7f8fa;border-color:rgba(0,0,0,0)}.btn-dim.btn-lighter:not(:disabled):not(.disabled):hover{color:#fff;background-color:#b7c2d0;border-color:#b7c2d0}.btn-trans.btn,.dual-listbox .btn-trans.dual-listbox__button{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.btn-outline-light,.dt-buttons .btn-secondary{border-color:#dbdfea}.btn-outline-lighter{border-color:#e5e9f2}.btn-outline-light,.dt-buttons .btn-secondary,.btn-outline-lighter{color:#526484}.btn-white,.dt-buttons .btn-secondary,.btn-white.btn-dim{background:#fff}.btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#fff;background:#526484;border-color:#526484}.btn-light:focus,.dual-listbox .dual-listbox__button:focus{color:#101924;background:#b7c2d0}.btn-toolbar-sep{border-right:1px solid #e5e9f2;margin-left:.75rem;margin-right:.75rem}.card-tools .btn-toolbar-sep{padding:0 !important;margin-left:.5rem;margin-right:.5rem}.btn-group.is-tags .btn-xs:first-child{padding-left:.25rem;padding-right:.25rem}.btn-group.is-tags .btn-xs:last-child{margin-left:0}.btn-group.is-tags .btn-xs .icon{width:1rem}.btn-group.is-tags .btn-dim:not(:disabled):not(.disabled):hover{border-color:rgba(0,0,0,0)}.dropup,.dropright,.dropdown,.dropleft{display:inline-flex}.dropdown-toggle{cursor:pointer;display:inline-flex;align-items:center;margin-bottom:0}.dropdown-toggle:not([class*=indicator]):after{display:none}.clickable *{pointer-events:none}.dropdown-menu{overflow:hidden;border:1px solid #e5e9f2;box-shadow:0 3px 12px 1px rgba(7,82,61,.15)}.dropdown-inner{padding:0 1.75rem}.dropdown-inner+.dropdown-inner{border-top:1px solid #e5e9f2}.dropdown-head,.dropdown-foot{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;border-bottom:1px solid #e5e9f2}.dropdown-head.center,.dropdown-foot.center{justify-content:center}.dropdown-head{border-bottom:1px solid #e5e9f2}.dropdown-foot{border-top:1px solid #e5e9f2}.dropdown-body-sm{padding:.75rem}.dropdown-body-rg{padding:1.25rem}.dropdown-body-md{padding:1.5rem}.dropdown-body-lg{padding:2.25rem}.dropdown-title{font-weight:500;color:#364a63}[class*=dropdown-indicator]:after{border:none !important;font-family:"Nioicon";vertical-align:middle;content:"";margin-left:.25rem;line-height:1;display:inline-flex;align-items:center;font-size:14px}.dropup [class*=dropdown-indicator]:after{content:""}.dropdown-indicator-caret:after{content:""}.dropup .dropdown-indicator-caret:after{content:""}.dropdown-indicator-caret-up:after{content:""}.dropup .dropdown-indicator-caret-up:after{content:""}.dropdown-indicator-up:after{content:""}.dropup .dropdown-indicator-up:after{content:""}.dropdown-indicator-down:after{content:""}.dropup .dropdown-indicator-down:after{content:""}.dropdown-indicator-dubble:after{content:""}.dropup .dropdown-indicator-dubble:after{content:""}.dropdown-indicator-unfold:after{content:""}.dropup .dropdown-indicator-unfold:after{content:""}.dropdown-menu-center{left:50% !important}.dropdown-menu-bottom{bottom:0 !important}.dropdown-menu-xxs{min-width:70px;max-width:70px}.dropdown-menu-xxs.dropdown-menu-center{margin-left:35px}.dropdown-menu-xs{min-width:120px;max-width:120px}.dropdown-menu-xs.dropdown-menu-center{margin-left:60px}.dropdown-menu-md{min-width:280px;max-width:280px}.dropdown-menu-md.dropdown-menu-center{margin-left:140px}.dropdown-menu-sm{min-width:140px;max-width:140px}.dropdown-menu-sm.dropdown-menu-center{margin-left:-70px}.dropdown-menu-lg{min-width:320px;max-width:320px}.dropdown-menu-lg.dropdown-menu-center{margin-left:-160px}.dropdown-menu-xl{min-width:360px;max-width:360px}.dropdown-menu-xl.dropdown-menu-center{margin-left:-180px}.dropdown-menu-auto{min-width:100%;max-width:100%}.dropdown-menu-mxh{max-height:400px;overflow:auto}.nk-quick-nav .dropdown-menu{margin-top:11px !important;margin-right:-6px !important}@media(max-width: 420px){.dropdown-menu-xl,.dropdown-menu-lg,.dropdown-menu-md{min-width:calc(100vw - 40px);max-width:calc(100vw - 40px)}.nk-quick-nav .dropdown-menu-xl,.nk-quick-nav .dropdown-menu-lg,.nk-quick-nav .dropdown-menu-md{margin-right:-21px !important}.nk-quick-nav li:last-child .dropdown-menu-xl,.nk-quick-nav li:last-child .dropdown-menu-lg,.nk-quick-nav li:last-child .dropdown-menu-md{margin-right:0 !important}}.dropdown-menu-s1{border-top:3px solid #0fac81}.dropdown-toggle-split>.icon{margin-left:-0.25rem;margin-right:-0.25rem}.card+.card:not(.card .card+.card){margin-top:28px}.card+.nk-block-head{padding-top:2.5rem}.card-full{height:100%}.card.is-dark{background:#07523d}.card-bordered{border:1px solid #dbdfea}.card-bordered.is-dark{border-color:#07523d}.card-bordered.dashed{border-style:dashed}.card-inner{padding:1.25rem}.card-inner-sm{padding-top:.75rem;padding-bottom:.75rem}.card-inner-group .card-inner:not(:last-child){border-bottom:1px solid #dbdfea}.card-head{display:flex;align-items:center;flex-wrap:wrap;justify-content:space-between;margin:-0.25rem -0.5rem 1rem}.card-head>*{padding:.25rem .5rem}.card-head>.title:only-child{width:100%}.card-title-group{display:flex;align-items:center;justify-content:space-between;position:relative}.card-title-group .card-title{margin-bottom:0}.card-title-group:only-child,.card-title-group .card-search{margin-top:-0.25rem;margin-bottom:-0.25rem}.card-title h6.title:not(:last-child),.card-title .title.h6:not(:last-child){margin-bottom:.25rem}.card-title p{font-size:12px;color:#8094ae}.card-title p .icon{line-height:inherit;vertical-align:middle}.card-title-sm .title{font-size:14px}.card-title small,.card-title .small{font-weight:500;color:#8094ae}.card-subtitle{color:#8094ae;font-family:Roboto,sans-serif;font-weight:normal}.card-tools-nav{display:flex;margin:-6px -10px -5px}.card-tools-nav li{padding:0 10px}.card-tools-nav li a{position:relative;color:#8094ae;padding:10px 0;display:block;line-height:1}.card-tools-nav li a:before{position:absolute;bottom:0;left:0;right:0;height:2px;content:"";background:#0fac81;opacity:0}.card-tools-nav li a:hover,.card-tools-nav li a.active{color:#526484}.card-tools-nav li a.active::before{opacity:1}.card-tools-nav li.active a{color:#526484}.card-tools-nav li.active a::before{opacity:1}.card-tools.me-n1{margin-right:-0.5rem !important}.card-hint{font-size:1rem;color:#dbdfea}@media(max-width: 575.98px){.card-head.ui-v2 .card-tools{width:calc(100% + 20px);margin:0 -10px;padding-top:.5rem}.card-head.ui-v2 .card-tools-nav{padding:0 .75rem;border-bottom:1px solid #e5e9f2}.card-head.ui-v2 .card-tools-nav li a{padding-bottom:1rem}.card-stretch{margin-left:-18px;margin-right:-18px;border-left:0 !important;border-right:0 !important;border-radius:0 !important}}@media(min-width: 576px){.card-inner{padding:1.5rem}.card-inner-sm{padding-top:.75rem;padding-bottom:.75rem}.card-inner-md{padding-top:1rem;padding-bottom:1rem}.card-header{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width: 768px){.card-inner-lg{padding:2.5rem}.card-inner-xl{padding:3.75rem}}.form-icon{position:absolute;display:inline-flex;justify-content:center;align-items:center;top:0;width:calc(1rem + 24px);height:calc(2.125rem + 2px)}.form-icon.sm{height:calc(1.75rem + 2px)}.form-icon.lg{height:calc(2.625rem + 2px)}.form-icon.xl{height:calc(3.25rem + 2px)}.form-icon .icon{font-size:16px;color:#8094ae}.form-icon+.form-control,.dual-listbox .form-icon+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-icon+input{padding-left:calc(1rem + 24px)}.form-icon-right{left:auto;right:-1px}.form-icon-right+.form-control,.dual-listbox .form-icon-right+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-icon-right+input{padding-left:1rem;padding-right:calc(1rem + 24px)}.form-info{position:absolute;display:inline-flex;justify-content:center;align-items:center;border-left:1px solid #dbdfea;right:0;top:50%;padding:.125rem 1.25rem;transform:translateY(-50%);color:#8094ae}.form-info+.form-control,.dual-listbox .form-info+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-info+input{padding-right:calc(1rem + 24px)}.form-label{font-size:.875rem;font-weight:500;color:#344357;margin-bottom:.5rem}.form-label-group{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.form-label-group .form-label{margin-bottom:0}.form-label+.form-note{margin-top:-0.35rem}.form-label-outlined{position:absolute;top:.4375rem;left:.6666666667rem;transform-origin:left;padding:0 .4rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;z-index:1;transition:all .3s ease;margin-bottom:0;font-size:0.8125rem}.form-control-lg~.form-label-outlined{top:.6875rem;padding:0 .3773584906rem;font-size:0.9375rem}.form-control-sm~.form-label-outlined{font-size:0.75rem;top:.25rem;left:.4rem}.focused .form-control-sm~.form-label-outlined,.js-select2.form-control-sm~.form-label-outlined{font-size:11px}.focused .form-label-outlined,.js-select2~.form-label-outlined{top:calc(-0.4375rem + -2px);font-size:11px}.form-control-xl~.form-label-outlined{font-size:0.9375rem;line-height:2rem;top:.625rem;padding:0 .5rem;left:.8333333333rem}.focused .form-control-xl~.form-label-outlined,.js-select2.form-control-xl~.form-label-outlined{top:calc(-0.625rem + -5px)}.focused .form-control-lg~.form-label-outlined,.focused .form-control-xl~.form-label-outlined,.js-select2.form-control-lg~.form-label-outlined,.js-select2.form-control-xl~.form-label-outlined{font-size:12px}.form-note{font-size:12px;color:#8094ae;font-style:italic;display:block}.form-note-alt{font-size:12px;color:#8094ae}.form-note-group{display:flex;justify-content:space-between;margin-top:.5rem;margin-bottom:-0.25rem}.form-control-xl{height:calc(3.25rem + 2px) !important;padding:.625rem 1.25rem;font-size:0.9375rem;line-height:2rem;border-radius:5px}.form-control-outlined{cursor:pointer}.focused .form-control-outlined{cursor:auto}.form-control-wrap,.form-control-group{position:relative}.form-control-wrap+.form-note,.form-control-group+.form-note{margin-top:.5rem}.form-control-noborder{border-color:rgba(0,0,0,0)}.form-control-noborder:focus{border-color:#dbdfea;box-shadow:none}.form-control-solid{border-color:#fff}.form-control-solid:focus{box-shadow:none;border-color:#dbdfea}.form-control-number{font-size:20px;padding:20px;height:74px}.form-control-password-big{font-size:44px;height:calc(1rem*2 + 1.25rem + 1px);padding:1rem 1rem}.form-control.error,.dual-listbox .error.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.error{border-color:#e85347}.form-control.error:focus,.dual-listbox .error.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.error:focus{box-shadow:0 0 0 3px rgba(232,83,71,.1)}.form-control.focus,.dual-listbox .focus.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.focus{border-color:#0fac81;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-control-simple{border:none;padding:0}.form-control-simple:focus{box-shadow:none}.form-group{position:relative;margin-bottom:1.25rem}.form-group:last-child{margin-bottom:0}.form-focus-none:focus{border-color:rgba(0,0,0,0);box-shadow:none}.form-action .btn+.btn,.form-action .dual-listbox .dual-listbox__button+.btn,.dual-listbox .form-action .dual-listbox__button+.btn,.form-action .dual-listbox .btn+.dual-listbox__button,.dual-listbox .form-action .btn+.dual-listbox__button,.form-action .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .form-action .dual-listbox__button+.dual-listbox__button{margin-left:1.25rem}.form-round{border-radius:100px}.form-select{appearance:none;-webkit-appearance:none}.form-select option{border-radius:3px;padding:5px .5rem;margin:2px -0.5rem;cursor:pointer;color:#526484}.form-select option:last-child{margin-bottom:-0.5rem}.form-control-select{position:relative}.form-control-select .form-control,.form-control-select .dual-listbox .dual-listbox__search,.dual-listbox .form-control-select .dual-listbox__search,.form-control-select div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .form-control-select input{appearance:none;-webkit-appearance:none}.form-control-select-multiple .js-select2{padding-top:.375rem;padding-bottom:.875rem}.form-control-select-multiple .js-select2 option{border-radius:3px;padding:5px .5rem;margin:2px -0.5rem;cursor:pointer;color:#526484}.form-control-select-multiple .js-select2 option:last-child{margin-bottom:-0.5rem}.form-control-select:after{font-family:"Nioicon";content:"";pointer-events:none;position:absolute;display:inline-flex;justify-content:center;align-items:center;right:0;top:50%;transform:translateY(-50%);width:calc(1rem + 12px);height:calc(1rem + 12px)}textarea.no-resize{resize:none}textarea.form-control,.dual-listbox textarea.dual-listbox__search{min-height:122px;padding-top:.65625rem}textarea.textarea-sm{min-height:92px}textarea.textarea-lg{min-height:208px}textarea.textarea-auto{min-height:0}.form-file-input~.error,.form-file-input~.invalid,.form-control~.error,.dual-listbox .dual-listbox__search~.error,div.dataTables_wrapper div.dataTables_filter input~.error,.form-control~.invalid,.dual-listbox .dual-listbox__search~.invalid,div.dataTables_wrapper div.dataTables_filter input~.invalid,.input-gruop~.error,.input-gruop~.invalid{color:#e85347;font-size:11px;font-style:italic}.custom-btn-check{position:relative}.custom-btn-check input{position:absolute;opacity:0;height:1px;width:1px}.custom-btn-check input:checked~label{color:#fff;border-color:#0fac81;background-color:#0fac81}.custom-btn-check label{display:inline-block;border:2px solid #e5e9f2;background-color:#e5e9f2;font-weight:500;color:#526484;text-align:center;padding:.4375rem 1.125rem;font-size:.8125rem;line-height:1.25rem;border-radius:4px;transition:all .3s;margin-bottom:0 !important}.custom-btn-sm label{padding:.25rem 1rem;font-size:.75rem;line-height:1.25rem}.custom-btn-round label{border-radius:60px}.custom-btn-outline label{background-color:rgba(0,0,0,0)}.form-select[multiple],.form-select[size]:not([size="1"]){height:122px}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{height:calc(2.125rem + 2px)}.custom-control{position:relative;z-index:1;display:inline-flex;min-height:1.5rem;padding-left:2.25rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1.5rem;height:1.471875rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#0fac81;background-color:#0fac81;box-shadow:none}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 3px rgba(15,172,129,.1)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#0fac81}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#0fac81;border-color:#0fac81;box-shadow:none}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#3c4d62}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before,.custom-control-label:after{z-index:1}.custom-control-label::before{position:absolute;top:-.028125rem;left:-2.25rem;display:block;width:1.5rem;height:1.5rem;pointer-events:none;content:"";background-color:#fff;border:#dbdfea solid 2px;box-shadow:inset 0 1px 1px rgba(16,25,36,.075);border-radius:4px}.custom-control-label::after{position:absolute;top:-.028125rem;left:-2.25rem;display:block;width:1.5rem;height:1.5rem;content:"";background:no-repeat 50%/50% 50%}.custom-control{display:inline-flex;min-height:1.5rem}.custom-control.color-control{padding:4px !important}.custom-control.color-control .custom-control-label::before{opacity:0;display:block;left:-4px;right:-4px;top:-4px;bottom:-4px;border-radius:50%;border:2px solid #0fac81 !important;background:rgba(0,0,0,0) !important;transition:.3s ease}.custom-control.color-control .custom-control-label::after{display:none}.custom-control.color-control .custom-control-input:checked~.custom-control-label::before{opacity:1}.custom-control.notext{margin-left:-0.75rem}.custom-control.notext .custom-control-label{position:relative;left:.75rem}.custom-control-label{font-size:14px;line-height:1.25rem;padding-top:.125rem}.custom-control-label::before,.custom-control-label::after{top:0}.custom-control-label:after{display:inline-flex;align-items:center;justify-content:center;background-image:none !important;font-family:"Nioicon";color:#fff;opacity:0}.custom-checkbox .custom-control-label:after{content:""}.custom-radio .custom-control-label:after{content:""}.custom-control .custom-control-input:checked~.custom-control-label::after{opacity:1}.custom-control .custom-control-input[disabled]~.custom-control-label,.custom-control .custom-control-input:disabled~.custom-control-label{opacity:.7;color:#364a63}.custom-control-sm{min-height:1.125rem;padding-left:1.625rem}.custom-control-sm.notext{margin-left:-0.5rem}.custom-control-sm.notext .custom-control-label{left:.5rem}.custom-control-sm .custom-control-label{font-size:12px;line-height:1.125rem;padding-top:0}.custom-control-sm .custom-control-label::before,.custom-control-sm .custom-control-label::after{left:-1.625rem;width:1.125rem;height:1.125rem}.custom-control-sm .custom-control-label:after{font-size:.9em}.custom-control-lg{min-height:2rem;padding-left:3rem}.custom-control-lg.notext{margin-left:-1rem}.custom-control-lg.notext .custom-control-label{left:1rem}.custom-control-lg .custom-control-label{font-size:15px;line-height:1.375rem;padding-top:.3125rem}.custom-control-lg .custom-control-label::before,.custom-control-lg .custom-control-label::after{left:-3rem;width:2rem;height:2rem}.custom-control-lg .custom-control-label:after{font-size:1.2em}.custom-control-input{position:absolute;height:1px;width:1px;opacity:0}.custom-control.is-right{padding-left:0;padding-right:2.25rem}.custom-control.is-right .custom-control-label:before,.custom-control.is-right .custom-control-label:after{left:auto;right:-2.25rem}.custom-control.is-right.custom-control-sm{padding-right:1.625rem}.custom-control.is-right.custom-control-sm .custom-control-label:before,.custom-control.is-right.custom-control-sm .custom-control-label:after{right:-1.625rem}.custom-control.is-right.custom-control-lg{padding-right:3rem}.custom-control.is-right.custom-control-lg .custom-control-label:before,.custom-control.is-right.custom-control-lg .custom-control-label:after{right:-3rem}.custom-file-label{white-space:nowrap;overflow:hidden}.custom-select,div.dataTables_wrapper div.dataTables_length select{background:#fff}.custom-control-group{display:inline-flex;align-items:center;flex-wrap:wrap;margin:-0.375rem}.custom-control-group>*{padding:.375rem}.custom-control-stacked{margin:0}.custom-control-stacked>*{padding:0;margin:-1px}.custom-control-stacked:not(.custom-control-vertical)>*:not(:first-child) .custom-control-label{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control-stacked:not(.custom-control-vertical)>*:not(:last-child) .custom-control-label{border-top-right-radius:0;border-bottom-right-radius:0}.custom-control-vertical{flex-direction:column;align-items:start}.custom-control-vertical>*{width:100%}.custom-control-vertical .custom-control{display:flex}.custom-control-vertical .custom-control .custom-control-label{width:100%}.custom-control-vertical.custom-control-stacked>*:not(:first-child) .custom-control-label{border-top-left-radius:0;border-top-right-radius:0}.custom-control-vertical.custom-control-stacked>*:not(:last-child) .custom-control-label{border-bottom-left-radius:0;border-bottom-right-radius:0}.custom-control-pro{padding-left:0;position:relative}.custom-control-pro.no-control.checked{z-index:3}.custom-control-pro.no-control.focused{z-index:2}.custom-control-pro.no-control .custom-control-label{padding:.375rem 1.125rem;border-width:2px}.custom-control-pro.no-control .custom-control-input:checked~.custom-control-label{border-color:#0fac81;box-shadow:none;z-index:2}.custom-control-pro.no-control .custom-control-input:not(:disabled):active~.custom-control-label{border-color:#0fac81;box-shadow:none}.custom-control-pro.no-control .custom-control-input[disabled]~.custom-control-label,.custom-control-pro.no-control .custom-control-input:disabled~.custom-control-label{color:#3c4d62}.custom-control-pro-block.custom-control{display:flex}.custom-control-pro-block .custom-control-label{width:100%}.custom-control-pro .custom-control-label{border:1px solid #e5e9f2;padding:1.125rem 1.125rem 1.125rem 3.375rem;font-size:13px;line-height:1.25rem;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-flex;align-items:center;background-color:#fff}.custom-control-pro .custom-control-label::before,.custom-control-pro .custom-control-label::after{top:50%;transform:translateY(-50%);left:1.125rem}.custom-control-pro .custom-control-label .icon{font-size:1.4em;line-height:inherit}.custom-control-pro .custom-control-label .icon-lg{font-size:2.2em}.custom-control-pro .custom-control-label>span{white-space:nowrap}.custom-control-pro .custom-control-label>span:only-child{width:100%}.custom-control-pro .custom-control-label .icon+span,.custom-control-pro .custom-control-label span+.icon{padding-left:8px}.custom-control-pro.custom-control-sm{padding-left:0}.custom-control-pro.custom-control-sm .custom-control-label{padding:.6875rem 1.125rem .6875rem 3rem;font-size:13px;line-height:1.25rem;border-radius:4px}.custom-control-pro.custom-control-sm .custom-control-label::before,.custom-control-pro.custom-control-sm .custom-control-label::after{top:50%;transform:translateY(-50%);left:1.125rem}.custom-control-pro-icon.custom-control-pro .custom-control-label{padding-left:0;padding-right:0}.custom-control-pro-icon.custom-control-pro .custom-control-label .icon{text-align:center;width:2.125rem}.no-control{padding-left:0}.no-control .custom-control-label::before,.no-control .custom-control-label::after{display:none}+.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}+.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:#0fac81}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}.image-control.custom-control{padding-left:0}.image-control .custom-control-input:checked~.custom-control-label:before{border-color:#fff}.image-control .custom-control-input:checked~.custom-control-label img{opacity:.8}.image-control .custom-control-label{padding-top:0;border-radius:4px;overflow:hidden;background-color:#1f2b3a}.image-control .custom-control-label img{transition:opacity .3s ease}.image-control .custom-control-label:before,.image-control .custom-control-label:after{z-index:9}.image-control .custom-control-label::before{border-width:1px;top:1rem;left:1rem}.image-control .custom-control-label::after{top:1rem;left:1rem}.image-control:hover .custom-control-label img{opacity:.8}.custom-switch{padding-left:3.75rem}.custom-switch .custom-control-label::before{left:-3.75rem;width:3rem;border-radius:1.5rem;pointer-events:all}.custom-switch .custom-control-label::after{opacity:1;top:.25rem;left:-3.5rem;width:1rem;height:1rem;border-radius:1.5rem;background-color:#dbdfea;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(1.5rem)}.custom-switch.custom-control-sm{padding-left:2.46875rem}.custom-switch.custom-control-sm .custom-control-label::before{left:-2.46875rem;width:1.96875rem;border-radius:.984375rem}.custom-switch.custom-control-sm .custom-control-label::after{top:.2375rem;left:calc(-2.46875rem + 4px);width:.65rem;height:.65rem;border-radius:.984375rem}.custom-switch.custom-control-sm .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(1.31875rem - 8px))}.custom-switch.custom-control-lg{padding-left:5rem}.custom-switch.custom-control-lg .custom-control-label::before{left:-5rem;width:4rem;border-radius:2rem}.custom-switch.custom-control-lg .custom-control-label::after{top:.375rem;left:calc(-5rem + 6px);width:1.25rem;height:1.25rem;border-radius:2rem}.custom-switch.custom-control-lg .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(2.75rem - 12px))}.custom-switch.is-right{padding-left:0;padding-right:3.75rem}.custom-switch.is-right .custom-control-label:before,.custom-switch.is-right .custom-control-label:after{left:auto;right:-2.25rem}.custom-switch.is-right .custom-control-label::before{right:-3.75rem}.custom-switch.is-right .custom-control-label::after{right:calc(-3.75rem + 4px)}.custom-switch.is-right .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-2rem + 8px))}.custom-switch.is-right.custom-control-sm{padding-right:2.46875rem}.custom-switch.is-right.custom-control-sm .custom-control-label::before{right:-2.46875rem}.custom-switch.is-right.custom-control-sm .custom-control-label::after{right:calc(-2.46875rem + 4px)}.custom-switch.is-right.custom-control-sm .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-1.31875rem + 8px))}.custom-switch.is-right.custom-control-lg{padding-right:5rem}.custom-switch.is-right.custom-control-lg .custom-control-label::before{right:-5rem}.custom-switch.is-right.custom-control-lg .custom-control-label::after{right:calc(-5rem + 6px)}.custom-switch.is-right.custom-control-lg .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-2.75rem + 12px))}label{cursor:pointer}input[type=radio]:checked~label{cursor:default}.is-alter .form-control~,.is-alter .dual-listbox .dual-listbox__search~,.dual-listbox .is-alter .dual-listbox__search~,.is-alter div.dataTables_wrapper div.dataTables_filter input~,div.dataTables_wrapper div.dataTables_filter .is-alter input~,.is-alter .input-group~,.custom-control{position:relative}.is-alter .form-control~.invalid,.is-alter .dual-listbox .dual-listbox__search~.invalid,.dual-listbox .is-alter .dual-listbox__search~.invalid,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid,.is-alter .input-group~.invalid,.custom-control .invalid{position:absolute;left:0;color:#fff;font-size:11px;line-height:1;bottom:calc(100% + 4px);background:#ed756b;padding:.3rem .5rem;z-index:1;border-radius:3px;white-space:nowrap}.is-alter .form-control~.invalid:before,.is-alter .dual-listbox .dual-listbox__search~.invalid:before,.dual-listbox .is-alter .dual-listbox__search~.invalid:before,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid:before,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid:before,.is-alter .input-group~.invalid:before,.custom-control .invalid:before{position:absolute;content:"";height:0;width:0;border-left:6px solid #ed756b;border-right:6px solid rgba(0,0,0,0);left:10px;border-bottom:6px solid rgba(0,0,0,0);bottom:-6px}.is-alter .form-control~.invalid,.is-alter .dual-listbox .dual-listbox__search~.invalid,.dual-listbox .is-alter .dual-listbox__search~.invalid,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid,.is-alter .input-group~.invalid{left:auto;right:0}.is-alter .form-control~.invalid::before,.is-alter .dual-listbox .dual-listbox__search~.invalid::before,.dual-listbox .is-alter .dual-listbox__search~.invalid::before,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid::before,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid::before,.is-alter .input-group~.invalid::before{left:auto;right:10px;border-right-color:#ed756b;border-left-color:rgba(0,0,0,0);bottom:-4px}.form-file{position:relative;display:inline-block;width:100%;height:calc(2.125rem + 2px);margin-bottom:0}.form-file-input{position:relative;z-index:2;width:100%;height:calc(2.125rem + 2px);margin:0;opacity:0}.form-file-input:focus~.form-file-label{border-color:#0fac81;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-file-input[disabled]~.form-file-label,.form-file-input:disabled~.form-file-label{background-color:#f5f6fa}.form-file-input:lang(en)~.form-file-label::after{content:"Browse"}.form-file-input~.form-file-label[data-browse]::after{content:attr(data-browse)}.form-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.125rem + 2px);padding:.4375rem 1rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;border:1px solid #dbdfea;border-radius:4px}.form-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.125rem;padding:.4375rem 1rem;line-height:1.25rem;color:#3c4d62;content:"Browse";background-color:#ebeef2;border-left:inherit;border-radius:0 4px 4px 0}.input-group>.form-control,.dual-listbox .input-group>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input,.input-group>.form-control-plaintext,.input-group>.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>select,.input-group>.form-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.dual-listbox .input-group>.dual-listbox__search+.form-control,.dual-listbox .input-group>.form-control+.dual-listbox__search,.dual-listbox .input-group>.dual-listbox__search+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input+.form-control,div.dataTables_wrapper div.dataTables_filter .dual-listbox .input-group>input+.dual-listbox__search,.dual-listbox div.dataTables_wrapper div.dataTables_filter .input-group>input+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-control+input,div.dataTables_wrapper div.dataTables_filter .dual-listbox .input-group>.dual-listbox__search+input,.dual-listbox div.dataTables_wrapper div.dataTables_filter .input-group>.dual-listbox__search+input,div.dataTables_wrapper div.dataTables_filter .input-group>input+input,.input-group>.form-control+.custom-select,.dual-listbox .input-group>.dual-listbox__search+.custom-select,div.dataTables_wrapper div.dataTables_filter .input-group>input+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-control+select,div.dataTables_wrapper div.dataTables_length .dual-listbox .input-group>.dual-listbox__search+select,.dual-listbox div.dataTables_wrapper div.dataTables_length .input-group>.dual-listbox__search+select,div.dataTables_wrapper div.dataTables_length div.dataTables_filter .input-group>input+select,div.dataTables_wrapper div.dataTables_filter div.dataTables_length .input-group>input+select,.input-group>.form-control+.form-file,.dual-listbox .input-group>.dual-listbox__search+.form-file,div.dataTables_wrapper div.dataTables_filter .input-group>input+.form-file,.input-group>.form-control-plaintext+.form-control,.dual-listbox .input-group>.form-control-plaintext+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-control-plaintext+input,.input-group>.form-control-plaintext+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-control-plaintext+select,.input-group>.form-control-plaintext+.form-file,.input-group>.custom-select+.form-control,.dual-listbox .input-group>.custom-select+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.custom-select+input,div.dataTables_wrapper div.dataTables_length .input-group>select+.form-control,div.dataTables_wrapper div.dataTables_length .dual-listbox .input-group>select+.dual-listbox__search,.dual-listbox div.dataTables_wrapper div.dataTables_length .input-group>select+.dual-listbox__search,div.dataTables_wrapper div.dataTables_length div.dataTables_filter .input-group>select+input,div.dataTables_wrapper div.dataTables_filter div.dataTables_length .input-group>select+input,.input-group>.custom-select+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>select+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.custom-select+select,div.dataTables_wrapper div.dataTables_length .input-group>select+select,.input-group>.custom-select+.form-file,div.dataTables_wrapper div.dataTables_length .input-group>select+.form-file,.input-group>.form-file+.form-control,.dual-listbox .input-group>.form-file+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-file+input,.input-group>.form-file+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-file+select,.input-group>.form-file+.form-file{margin-left:-1px}.input-group>.form-control:focus,.dual-listbox .input-group>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .input-group>input:focus,.input-group>.custom-select:focus,div.dataTables_wrapper div.dataTables_length .input-group>select:focus,.input-group>.form-file .form-file-input:focus~.form-file-label{z-index:3}.input-group>.form-file .form-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.dual-listbox .input-group>.dual-listbox__search:not(:last-child),div.dataTables_wrapper div.dataTables_filter .input-group>input:not(:last-child),.input-group>.custom-select:not(:last-child),div.dataTables_wrapper div.dataTables_length .input-group>select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.dual-listbox .input-group>.dual-listbox__search:not(:first-child),div.dataTables_wrapper div.dataTables_filter .input-group>input:not(:first-child),.input-group>.custom-select:not(:first-child),div.dataTables_wrapper div.dataTables_length .input-group>select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-file{display:flex;align-items:center}.input-group>.form-file:not(:last-child) .form-file-label,.input-group>.form-file:not(:last-child) .form-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-file:not(:first-child) .form-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-prepend .dual-listbox .dual-listbox__button,.dual-listbox .input-group-prepend .dual-listbox__button,.input-group-append .btn,.input-group-append .dual-listbox .dual-listbox__button,.dual-listbox .input-group-append .dual-listbox__button{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-prepend .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group-prepend .dual-listbox__button:focus,.input-group-append .btn:focus,.input-group-append .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group-append .dual-listbox__button:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .dual-listbox .dual-listbox__button+.btn,.dual-listbox .input-group-prepend .dual-listbox__button+.btn,.input-group-prepend .dual-listbox .btn+.dual-listbox__button,.dual-listbox .input-group-prepend .btn+.dual-listbox__button,.input-group-prepend .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .input-group-prepend .dual-listbox__button+.dual-listbox__button,.input-group-prepend .btn+.input-group-text,.input-group-prepend .dual-listbox .dual-listbox__button+.input-group-text,.dual-listbox .input-group-prepend .dual-listbox__button+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .dual-listbox .input-group-text+.dual-listbox__button,.dual-listbox .input-group-prepend .input-group-text+.dual-listbox__button,.input-group-append .btn+.btn,.input-group-append .dual-listbox .dual-listbox__button+.btn,.dual-listbox .input-group-append .dual-listbox__button+.btn,.input-group-append .dual-listbox .btn+.dual-listbox__button,.dual-listbox .input-group-append .btn+.dual-listbox__button,.input-group-append .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .input-group-append .dual-listbox__button+.dual-listbox__button,.input-group-append .btn+.input-group-text,.input-group-append .dual-listbox .dual-listbox__button+.input-group-text,.dual-listbox .input-group-append .dual-listbox__button+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .dual-listbox .input-group-text+.dual-listbox__button,.dual-listbox .input-group-append .input-group-text+.dual-listbox__button{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-lg>.form-control,.dual-listbox .input-group-lg>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-lg>input,.input-group-lg>.custom-select,div.dataTables_wrapper div.dataTables_length .input-group-lg>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,.dual-listbox .input-group-lg>.input-group-prepend>.dual-listbox__button,.input-group-lg>.input-group-append>.btn,.dual-listbox .input-group-lg>.input-group-append>.dual-listbox__button{font-size:15px}.input-group>.input-group-prepend>.btn,.dual-listbox .input-group>.input-group-prepend>.dual-listbox__button,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.dual-listbox .input-group>.input-group-append:not(:last-child)>.dual-listbox__button,.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),.dual-listbox .input-group>.input-group-append:last-child>.dual-listbox__button: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,.dual-listbox .input-group>.input-group-append>.dual-listbox__button,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.dual-listbox .input-group>.input-group-prepend:not(:first-child)>.dual-listbox__button,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.dual-listbox .input-group>.input-group-prepend:first-child>.dual-listbox__button: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-select,div.dataTables_wrapper div.dataTables_length select{height:calc(2.125rem + 2px);padding:.4375rem 2rem .4375rem 1rem !important;font-size:.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;vertical-align:middle;border:1px solid #dbdfea;border-radius:4px;appearance:none}.table-striped tbody tr:nth-of-type(odd){background-color:#f5f6fa}.table>:not(caption)>*>*{border-top:1px solid #dbdfea;border-bottom:0}.table-hover tbody tr:hover{color:#526484;background-color:#f5f6fa}.table-head{background:#f5f6fa}.table>:not(:first-child){border-top:none}.table thead tr:last-child th{border-bottom:1px solid #dbdfea}.table-dark thead tr:last-child th,.table thead.thead-dark tr:last-child th{border-color:#3c4d62}.table td:first-child,.table th:first-child{padding-left:1.25rem}.table td:last-child,.table th:last-child{padding-right:1.25rem}.table th{line-height:1.1}.table th.overline-title{line-height:1.25rem;font-weight:500}.table caption{font-style:italic;padding-left:1.25rem}.table-bordered td,.table-bordered th{padding-left:1rem;padding-right:1rem}.table-plain td:first-child,.table-plain th:first-child{padding-left:0}.table-plain td:last-child,.table-plain th:last-child{padding-right:0}.table-lg td{padding-top:1rem;padding-bottom:1rem}.table-lg th{padding-top:.75rem;padding-bottom:.75rem}.table-vm td,.table-vm th,.table td.vm,.table th.vm{vertical-align:middle}@media(min-width: 576px){.table-lg td:first-child,.table-lg th:first-child{padding-left:1.5rem}.table-lg td:last-child,.table-lg th:last-child{padding-right:1.5rem}}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table>:not(caption)>*>*{box-shadow:none}.table-sm th,.table-sm td{padding:.25rem}.table .table-light th{color:#364a63 !important;background-color:#f5f6fa;border:#dbdfea}.media{display:flex}.media-center{align-items:center}.media-object{display:inline-flex}.media>*:first-child{flex-shrink:0}.media>*:last-child{flex-grow:1;max-width:100%}.nav{margin:-0.5rem -1rem}.nav .nav-link{display:inline-flex;align-items:center}.nav .nav-link .icon+span,.nav .nav-link span+.icon{margin-left:.75rem}.nav .nav-link .icon{font-size:1.3em}.nav-tabs{font-family:Nunito,sans-serif;margin:0;font-size:.8125rem;border-bottom:1px solid #dbdfea}.nav-tabs-s2{border-bottom:none;justify-content:center}.nav-tabs+.tab-content{margin-top:1.25rem}.nav-tabs .nav-item{padding-right:1.25rem}.nav-tabs .nav-item:last-child{padding-right:0}.nav-tabs .nav-item.active .nav-link{color:#0fac81}.nav-tabs .nav-item.active .nav-link:after{opacity:1}.nav-tabs .nav-link{padding:1rem 0;font-weight:700;color:#526484;position:relative;border:none;outline:none;display:inline-flex;align-items:center}.nav-tabs .nav-link .icon{font-size:1.4em}.nav-tabs .nav-link .icon+span{margin-left:.5rem}.nav-tabs .nav-link .badge{margin-left:.25rem}.nav-tabs .nav-link:hover{color:#364a63}.nav-tabs .nav-link:focus{color:#0fac81}.nav-tabs .nav-link:before,.nav-tabs .nav-link:after{position:absolute;content:""}.nav-tabs .nav-link:after{left:0;right:0;bottom:0;height:3px;background:#0fac81;opacity:0}.nav-tabs .nav-link.active{color:#0fac81;border:none;background-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active:after{opacity:1}.nav-sm{font-size:.8125rem}@media(min-width: 768px){.nav-tabs .nav-item{padding-right:1.5rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(min-width: 992px){.nav-tabs .nav-item{padding-right:1.75rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}.nav-tabs .nav-link{font-size:.875rem}}@media(min-width: 1200px){.nav-tabs .nav-item{padding-right:2.25rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(max-width: 575.98px){.nav-tabs.is-stretch{margin-left:-18px;margin-right:-18px;padding-left:18px;padding-right:18px}}.nav-item-trigger{display:inline-flex;align-items:center;margin:-1px -0.5rem 0 auto}.nav-tabs-card{padding-left:1.25rem;padding-right:1.25rem;font-family:Roboto,sans-serif}@media(min-width: 576px){.nav-tabs-card{padding-left:1.5rem;padding-right:1.5rem}}@media(max-width: 767.98px){.nav-tabs-mb-icon .nav-item{padding-right:.75rem}.nav-tabs-mb-icon .nav-link .icon{font-size:1.25rem;padding:0 .5rem}.nav-tabs-mb-icon .nav-link .icon+span{display:none}}@media(max-width: 359px){.nav-tabs-mb-icon .nav-item{padding-right:.35rem}}.is-medium.nav-tabs .nav-link{padding:.75rem 0}.modal-content{position:relative;min-height:40px;box-shadow:0px 0px 1px 0px rgba(82,100,132,.2),0px 8px 15.52px .48px rgba(28,43,70,.15)}.modal-content>.close{position:absolute;top:.75rem;right:.75rem;height:2.25rem;width:2.25rem;display:inline-flex;justify-content:center;align-items:center;color:#526484;z-index:1;transition:all .3s}.modal-body .stretched{border-radius:0;margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body .stretched.alert{border:none}.modal-body .stretched.alert-icon{padding-left:3.25rem}.modal-body-md{padding:1.75rem 1.25rem}.modal-body-md .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-md .stretched.alert-icon{padding-left:4.5rem}.modal-body-lg{padding:2.25rem 1.25rem}.modal-body-lg .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-lg .stretched.alert-icon{padding-left:4.5rem}.modal-footer-stretch{justify-content:stretch}.modal-footer-between{display:flex;width:100%;align-items:center;justify-content:space-between;flex-wrap:wrap;margin:-0.25rem 0}.modal-footer-between>div{padding:.25rem 0}.modal-dialog{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog::before{height:calc(100vh - 1rem)}.modal.fade .modal-dialog{transform:translate(0, -10px)}.modal.zoom .modal-dialog{transform:scale(0.95);transition:transform .3s ease-out}.modal-dialog-top{align-items:flex-start}.modal.fade .modal-dialog-top{transform:translate(0, -30px)}.modal-dialog-bottom{align-items:flex-end}@media(min-width: 576px){.modal-dialog{min-height:calc(100% - 3.5rem)}.modal-dialog::before{height:calc(100vh - 3.5rem)}.modal-body{padding:1.5rem 1.5rem}.modal-body .stretched{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.modal-body .stretched.alert-icon{padding-left:3.5rem}.modal-body-sm{padding:1.25rem 1.25rem}.modal-body-sm .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-sm .stretched.alert-icon{padding-left:3.25rem}.modal-body-md{padding:2.25rem 2.5rem}.modal-body-md .stretched{margin-left:-2.5rem;margin-right:-2.5rem;padding-left:2.5rem;padding-right:2.5rem}.modal-body-md .stretched.alert-icon{padding-left:4.5rem}.modal-body-md .stretched.alert-icon>.icon{left:2.5rem}.modal-body-lg{padding:3.75rem 3.75rem}.modal-body-lg .stretched{margin-left:-3.75rem;margin-right:-3.75rem;padding-left:3.75rem;padding-right:3.75rem}.modal-body-lg .stretched.alert-icon{padding-left:5.75rem}.modal-header{padding:1rem 1.5rem}.modal-header-sm{padding:.75rem 1.25rem}.modal-footer{padding:1rem 1.5rem}.modal-footer-sm{padding:.75rem 1.25rem}}@media(min-width: 768px){.modal-md{max-width:600px}}.pagination-goto{display:inline-flex;align-items:center;font-size:.8125rem;text-transform:uppercase}.page-link{font-size:.8125rem;display:inline-flex;align-items:center;justify-content:center;line-height:1rem;min-width:calc(1rem + 1.125rem + 2px)}.pagination-sm .page-link{line-height:.875rem;min-width:calc(0.875rem + 0.875rem + 2px)}.pagination-lg .page-link{line-height:1.5rem;min-width:calc(1.5rem + 1.125rem + 2px)}.pagination-xl .page-link{padding:.875rem .75rem;font-size:1.38125rem;line-height:1.5rem;min-width:calc(1.5rem + 1.75rem + 2px)}.page-link .icon{font-size:.8125rem;line-height:inherit}.page-link:not([href]){background-color:rgba(0,0,0,0);color:inherit}.page-link:not([href]) .icon:before{position:relative;top:1px}.page-link-prev span,.page-link-next span{display:none}@media(min-width: 576px){.page-link-prev span,.page-link-next span{display:block}.page-link-prev .icon{padding-right:.25rem}.page-link-next .icon{padding-left:.25rem}}.progress-bar{height:100%;line-height:1}.progress-sm{height:.25rem}.progress-md{height:.375rem}.progress-lg{height:1rem}.progress-pill,.progress-pill .progress-bar{border-radius:100px}.progress-text{display:flex;align-items:center;justify-content:space-between;color:#8094ae;margin-bottom:.25rem}.progress-label{font-size:.875rem}.progress-amount{font-size:12px;padding-left:.5rem}.progress-alt{display:flex;align-items:center;overflow:visible}.progress-alt .progress-bar{border-radius:2px}.progress-reverse{flex-direction:row-reverse}.progress-bordered .progress-bar{margin-top:-2px;border:2px solid #fff;box-sizing:content-box}.progress-bordered .progress-bar:not(:first-child){margin-left:-4px}.progress-bordered.progress-reverse .progress-bar{margin-left:0}.progress-bordered.progress-reverse .progress-bar:not(:last-child){margin-left:-5px}.progress-rating{display:flex;align-items:center}.progress-rating-title{width:48px;flex-grow:0;line-height:1.25rem}.progress-rating-percent{width:40px;line-height:1.25rem;text-align:right}.progress-rating .progress{flex-grow:1}.toast .close{display:flex;border:none;background:rgba(0,0,0,0);font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5;margin-right:-0.5rem;margin-left:.5rem}.toast:not(:last-child){margin-bottom:.75rem}@font-face{font-family:"Nioicon";src:url("../fonts/Nioicon.eot");src:url("../fonts/Nioicon.eot#iefix") format("embedded-opentype"),url("../fonts/Nioicon.ttf") format("truetype"),url("../fonts/Nioicon.woff") format("woff"),url("../fonts/Nioicon.svg#Nioicon") format("svg");font-weight:normal;font-style:normal;font-display:block}.ni{font-family:"Nioicon" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ni-centos:before{content:""}.ni-covid:before{content:""}.ni-fedora:before{content:""}.ni-hot-fill:before{content:""}.ni-hot:before{content:""}.ni-linux-server:before{content:""}.ni-linux:before{content:""}.ni-note-add-fill:before{content:""}.ni-repeat-fill:before{content:""}.ni-tranx-fill:before{content:""}.ni-ubuntu:before{content:""}.ni-virus:before{content:""}.ni-b-chrome:before{content:""}.ni-b-edge:before{content:""}.ni-b-firefox:before{content:""}.ni-b-ie:before{content:""}.ni-b-opera:before{content:""}.ni-b-safari:before{content:""}.ni-b-si:before{content:""}.ni-b-uc:before{content:""}.ni-brick-fill:before{content:""}.ni-brick:before{content:""}.ni-col-3s:before{content:""}.ni-col-4s:before{content:""}.ni-col-2s:before{content:""}.ni-comments:before{content:""}.ni-dot-sq:before{content:""}.ni-dot:before{content:""}.ni-footer:before{content:""}.ni-header:before{content:""}.ni-heading:before{content:""}.ni-layout-alt-fill:before{content:""}.ni-layout-alt:before{content:""}.ni-layout-fill1:before{content:""}.ni-layout1:before{content:""}.ni-list-index-fill:before{content:""}.ni-list-index:before{content:""}.ni-list-thumb-alt-fill:before{content:""}.ni-list-thumb-alt:before{content:""}.ni-list-thumb-fill:before{content:""}.ni-list-thumb:before{content:""}.ni-masonry-fill:before{content:""}.ni-masonry:before{content:""}.ni-menu-circled:before{content:""}.ni-menu-squared:before{content:""}.ni-notice:before{content:""}.ni-pen2:before{content:""}.ni-property-blank:before{content:""}.ni-propert-blank:before{content:""}.ni-property-add:before{content:""}.ni-property-alt:before{content:""}.ni-property-remove:before{content:""}.ni-property:before{content:""}.ni-puzzle-fill:before{content:""}.ni-puzzle:before{content:""}.ni-quote-left:before{content:""}.ni-quote-right:before{content:""}.ni-row-mix:before{content:""}.ni-row-view1:before{content:""}.ni-sidebar-r:before{content:""}.ni-text2:before{content:""}.ni-tile-thumb-fill:before{content:""}.ni-tile-thumb:before{content:""}.ni-view-col-fill:before{content:""}.ni-view-col-sq:before{content:""}.ni-view-col:before{content:""}.ni-view-col2:before{content:""}.ni-view-col3:before{content:""}.ni-view-cols-fill:before{content:""}.ni-view-cols-sq:before{content:""}.ni-view-cols:before{content:""}.ni-view-grid-fill:before{content:""}.ni-view-grid-sq:before{content:""}.ni-view-grid-wd:before{content:""}.ni-view-grid:before{content:""}.ni-view-grid2-wd:before{content:""}.ni-view-grid3-wd:before{content:""}.ni-view-group-fill:before{content:""}.ni-view-group-wd:before{content:""}.ni-view-list-fill:before{content:""}.ni-view-list-sq:before{content:""}.ni-view-list-wd:before{content:""}.ni-view-list:before{content:""}.ni-view-panel-fill:before{content:""}.ni-view-panel-sq:before{content:""}.ni-view-panel:before{content:""}.ni-view-row-fill:before{content:""}.ni-view-row-sq:before{content:""}.ni-view-row-wd:before{content:""}.ni-view-row:before{content:""}.ni-view-x1:before{content:""}.ni-view-x2:before{content:""}.ni-view-x3:before{content:""}.ni-view-x4:before{content:""}.ni-view-x5:before{content:""}.ni-view-x6:before{content:""}.ni-view-x7:before{content:""}.ni-dashlite:before{content:""}.ni-dashlite-circle:before{content:""}.ni-dashlite-alt:before{content:""}.ni-master-card:before{content:""}.ni-paypal:before{content:""}.ni-visa-alt:before{content:""}.ni-coin-eur:before{content:""}.ni-coin-gbp:before{content:""}.ni-sign-ada-alt:before{content:""}.ni-sign-bch-alt:before{content:""}.ni-sign-bgp-alt:before{content:""}.ni-sign-bnb-alt:before{content:""}.ni-sign-brl-alt:before{content:""}.ni-sign-btc-alt:before{content:""}.ni-sign-cc-alt:before{content:""}.ni-sign-cc-alt2:before{content:""}.ni-sign-chf-alt:before{content:""}.ni-sign-cny-alt:before{content:""}.ni-sign-czk-alt:before{content:""}.ni-sign-dash-alt:before{content:""}.ni-sign-dkk-alt:before{content:""}.ni-sign-eos-alt:before{content:""}.ni-sign-eth-alt:before{content:""}.ni-sign-eur-alt2:before{content:""}.ni-sign-euro-alt:before{content:""}.ni-sign-gbp-alt2:before{content:""}.ni-sign-hkd-alt:before{content:""}.ni-sign-idr-alt:before{content:""}.ni-sign-inr-alt:before{content:""}.ni-sign-jpy-alt:before{content:""}.ni-sign-kr-alt:before{content:""}.ni-sign-ltc-alt:before{content:""}.ni-sign-ltc:before{content:""}.ni-sign-mxn-alt:before{content:""}.ni-sign-mxr-alt:before{content:""}.ni-sign-myr-alt:before{content:""}.ni-sign-paypal-alt:before{content:""}.ni-sign-paypal-full:before{content:""}.ni-sign-php-alt:before{content:""}.ni-sign-pln-alt:before{content:""}.ni-sign-rub-alt:before{content:""}.ni-sign-sek-alt:before{content:""}.ni-sign-sgd-alt:before{content:""}.ni-sign-kobo-alt:before{content:""}.ni-sign-steem-alt:before{content:""}.ni-sign-steller-alt:before{content:""}.ni-sign-stripe-fulll:before{content:""}.ni-sign-thb-alt:before{content:""}.ni-sign-trx-alt:before{content:""}.ni-sign-try-alt:before{content:""}.ni-sign-usd-alt:before{content:""}.ni-sign-usd-alt2:before{content:""}.ni-sign-usdc-alt:before{content:""}.ni-sign-usdt-alt:before{content:""}.ni-sign-visa-alt:before{content:""}.ni-sign-vnd-alt:before{content:""}.ni-sign-waves-alt:before{content:""}.ni-sign-xem-alt:before{content:""}.ni-sign-xrp-new-alt:before{content:""}.ni-sign-xrp-old-alt:before{content:""}.ni-sign-zcash-alt:before{content:""}.ni-chevron-left:before{content:""}.ni-chevron-right:before{content:""}.ni-chevron-up:before{content:""}.ni-chevron-down:before{content:""}.ni-chevron-left-round:before{content:""}.ni-chevron-right-round:before{content:""}.ni-chevron-up-round:before{content:""}.ni-chevron-down-round:before{content:""}.ni-chevron-left-round-fill:before{content:""}.ni-chevron-right-round-fill:before{content:""}.ni-chevron-up-round-fill:before{content:""}.ni-chevron-down-round-fill:before{content:""}.ni-chevron-left-c:before{content:""}.ni-chevron-right-c:before{content:""}.ni-chevron-up-c:before{content:""}.ni-chevron-down-c:before{content:""}.ni-chevron-left-fill-c:before{content:""}.ni-chevron-right-fill-c:before{content:""}.ni-chevron-up-fill-c:before{content:""}.ni-chevron-down-fill-c:before{content:""}.ni-chevron-left-circle:before{content:""}.ni-chevron-right-circle:before{content:""}.ni-chevron-up-circle:before{content:""}.ni-chevron-down-circle:before{content:""}.ni-chevron-left-circle-fill:before{content:""}.ni-chevron-right-circle-fill:before{content:""}.ni-chevron-up-circle-fill:before{content:""}.ni-chevron-down-circle-fill:before{content:""}.ni-caret-left:before{content:""}.ni-caret-right:before{content:""}.ni-caret-up:before{content:""}.ni-caret-down:before{content:""}.ni-caret-left-fill:before{content:""}.ni-caret-right-fill:before{content:""}.ni-caret-up-fill:before{content:""}.ni-caret-down-fill:before{content:""}.ni-sort:before{content:""}.ni-sort-up:before{content:""}.ni-sort-down:before{content:""}.ni-sort-fill:before{content:""}.ni-sort-up-fill:before{content:""}.ni-sort-down-fill:before{content:""}.ni-sort-v:before{content:""}.ni-swap-v:before{content:""}.ni-swap:before{content:""}.ni-arrow-left-round:before{content:""}.ni-arrow-right-round:before{content:""}.ni-arrow-up-round:before{content:""}.ni-arrow-down-round:before{content:""}.ni-arrow-left-round-fill:before{content:""}.ni-arrow-right-round-fill:before{content:""}.ni-arrow-up-round-fill:before{content:""}.ni-arrow-down-round-fill:before{content:""}.ni-arrow-left-c:before{content:""}.ni-arrow-right-c:before{content:""}.ni-arrow-up-c:before{content:""}.ni-arrow-down-c:before{content:""}.ni-arrow-left-fill-c:before{content:""}.ni-arrow-right-fill-c:before{content:""}.ni-arrow-up-fill-c:before{content:""}.ni-arrow-down-fill-c:before{content:""}.ni-arrow-left-circle:before{content:""}.ni-arrow-right-circle:before{content:""}.ni-arrow-up-circle:before{content:""}.ni-arrow-down-circle:before{content:""}.ni-arrow-left-circle-fill:before{content:""}.ni-arrow-up-circle-fill:before{content:""}.ni-arrow-down-circle-fill:before{content:""}.ni-arrow-right-circle-fill:before{content:""}.ni-chevrons-left:before{content:""}.ni-chevrons-right:before{content:""}.ni-chevrons-up:before{content:""}.ni-chevrons-down:before{content:""}.ni-first:before{content:""}.ni-last:before{content:""}.ni-back-ios:before{content:""}.ni-forward-ios:before{content:""}.ni-upword-ios:before{content:""}.ni-downward-ios:before{content:""}.ni-back-alt:before{content:""}.ni-forward-alt:before{content:""}.ni-upword-alt:before{content:""}.ni-downward-alt:before{content:""}.ni-back-alt-fill:before{content:""}.ni-forward-alt-fill:before{content:""}.ni-upword-alt-fill:before{content:""}.ni-downward-alt-fill:before{content:""}.ni-arrow-long-left:before{content:""}.ni-arrow-long-right:before{content:""}.ni-arrow-long-up:before{content:""}.ni-arrow-long-down:before{content:""}.ni-arrow-left:before{content:""}.ni-arrow-right:before{content:""}.ni-arrow-up:before{content:""}.ni-arrow-down:before{content:""}.ni-arrow-up-left:before{content:""}.ni-arrow-up-right:before{content:""}.ni-arrow-down-left:before{content:""}.ni-arrow-down-right:before{content:""}.ni-arrow-to-left:before{content:""}.ni-arrow-to-right:before{content:""}.ni-arrow-to-up:before{content:""}.ni-arrow-to-down:before{content:""}.ni-arrow-from-left:before{content:""}.ni-arrow-from-right:before{content:""}.ni-arrow-from-up:before{content:""}.ni-arrow-from-down:before{content:""}.ni-curve-down-left:before{content:""}.ni-curve-up-right:before{content:""}.ni-curve-up-left:before{content:""}.ni-curve-down-right:before{content:""}.ni-curve-left-up:before{content:""}.ni-curve-right-up:before{content:""}.ni-curve-left-down:before{content:""}.ni-curve-right-down:before{content:""}.ni-back-arrow:before{content:""}.ni-forward-arrow:before{content:""}.ni-back-arrow-fill:before{content:""}.ni-forward-arrow-fill:before{content:""}.ni-navigate:before{content:""}.ni-navigate-up:before{content:""}.ni-navigate-fill:before{content:""}.ni-navigate-up-fill:before{content:""}.ni-send:before{content:""}.ni-send-alt:before{content:""}.ni-unfold-less:before{content:""}.ni-unfold-more:before{content:""}.ni-exchange-v:before{content:""}.ni-exchange:before{content:""}.ni-expand:before{content:""}.ni-shrink:before{content:""}.ni-focus:before{content:""}.ni-maximize:before{content:""}.ni-minimize:before{content:""}.ni-maximize-alt:before{content:""}.ni-minimize-alt:before{content:""}.ni-shuffle:before{content:""}.ni-cross-sm:before{content:""}.ni-cross:before{content:""}.ni-cross-round:before{content:""}.ni-cross-circle:before{content:""}.ni-cross-c:before{content:""}.ni-cross-round-fill:before{content:""}.ni-cross-circle-fill:before{content:""}.ni-cross-fill-c:before{content:""}.ni-na:before{content:""}.ni-check:before{content:""}.ni-check-thick:before{content:""}.ni-done:before{content:""}.ni-check-round:before{content:""}.ni-check-circle:before{content:""}.ni-check-c:before{content:""}.ni-check-round-fill:before{content:""}.ni-check-circle-fill:before{content:""}.ni-check-fill-c:before{content:""}.ni-check-circle-cut:before{content:""}.ni-check-round-cut:before{content:""}.ni-bullet:before{content:""}.ni-circle:before{content:""}.ni-square:before{content:""}.ni-square-c:before{content:""}.ni-bullet-fill:before{content:""}.ni-circle-fill:before{content:""}.ni-square-fill:before{content:""}.ni-square-fill-c:before{content:""}.ni-plus-sm:before{content:""}.ni-minus-sm:before{content:""}.ni-plus:before{content:""}.ni-minus:before{content:""}.ni-plus-round:before{content:""}.ni-minus-round:before{content:""}.ni-plus-circle:before{content:""}.ni-minus-circle:before{content:""}.ni-plus-c:before{content:""}.ni-minus-c:before{content:""}.ni-plus-round-fill:before{content:""}.ni-plus-circle-fill:before{content:""}.ni-minus-round-fill:before{content:""}.ni-minus-circle-fill:before{content:""}.ni-plus-fill-c:before{content:""}.ni-minus-fill-c:before{content:""}.ni-plus-medi:before{content:""}.ni-plus-medi-fill:before{content:""}.ni-equal-sm:before{content:""}.ni-equal:before{content:""}.ni-calc:before{content:""}.ni-search:before{content:""}.ni-zoom-out:before{content:""}.ni-zoom-in:before{content:""}.ni-play:before{content:""}.ni-play-fill:before{content:""}.ni-play-circle:before{content:""}.ni-play-circle-fill:before{content:""}.ni-pause:before{content:""}.ni-pause-fill:before{content:""}.ni-pause-circle:before{content:""}.ni-pause-circle-fill:before{content:""}.ni-stop:before{content:""}.ni-stop-fill:before{content:""}.ni-stop-circle:before{content:""}.ni-stop-circle-fill:before{content:""}.ni-rewind:before{content:""}.ni-forward:before{content:""}.ni-rewind-fill:before{content:""}.ni-forward-fill:before{content:""}.ni-step-back:before{content:""}.ni-step-forward:before{content:""}.ni-vol-off:before{content:""}.ni-vol-no:before{content:""}.ni-vol-half:before{content:""}.ni-vol:before{content:""}.ni-mic:before{content:""}.ni-mic-off:before{content:""}.ni-video:before{content:""}.ni-video-off:before{content:""}.ni-video-fill:before{content:""}.ni-loader:before{content:""}.ni-power:before{content:""}.ni-signout:before{content:""}.ni-signin:before{content:""}.ni-upload:before{content:""}.ni-download:before{content:""}.ni-alert-circle:before{content:""}.ni-alert:before{content:""}.ni-caution:before{content:""}.ni-report:before{content:""}.ni-alert-c:before{content:""}.ni-alert-circle-fill:before{content:""}.ni-alert-fill:before{content:""}.ni-caution-fill:before{content:""}.ni-report-fill:before{content:""}.ni-alert-fill-c:before{content:""}.ni-info-i:before{content:""}.ni-info:before{content:""}.ni-info-fill:before{content:""}.ni-help:before{content:""}.ni-help-fill:before{content:""}.ni-archived:before{content:""}.ni-archive:before{content:""}.ni-unarchive:before{content:""}.ni-archived-fill:before{content:""}.ni-archive-fill:before{content:""}.ni-unarchive-fill:before{content:""}.ni-bag:before{content:""}.ni-bag-fill:before{content:""}.ni-bell:before{content:""}.ni-bell-off:before{content:""}.ni-bell-fill:before{content:""}.ni-bell-off-fill:before{content:""}.ni-wifi:before{content:""}.ni-wifi-off:before{content:""}.ni-live:before{content:""}.ni-signal:before{content:""}.ni-bluetooth:before{content:""}.ni-blank-alt:before{content:""}.ni-blank:before{content:""}.ni-blank-fill:before{content:""}.ni-blankf-fill:before{content:""}.ni-block-over:before{content:""}.ni-book-read:before{content:""}.ni-book:before{content:""}.ni-book-fill:before{content:""}.ni-bulb-fill:before{content:""}.ni-bulb:before{content:""}.ni-calendar-alt-fill:before{content:""}.ni-calendar-alt:before{content:""}.ni-calendar-booking-fill:before{content:""}.ni-calendar-booking:before{content:""}.ni-calendar-check-fill:before{content:""}.ni-calendar-check:before{content:""}.ni-calendar-fill:before{content:""}.ni-calendar:before{content:""}.ni-calender-date-fill:before{content:""}.ni-calender-date:before{content:""}.ni-call:before{content:""}.ni-call-alt:before{content:""}.ni-call-alt-fill:before{content:""}.ni-call-fill:before{content:""}.ni-camera-fill:before{content:""}.ni-camera:before{content:""}.ni-capsule:before{content:""}.ni-capsule-fill:before{content:""}.ni-cards:before{content:""}.ni-cards-fill:before{content:""}.ni-cart:before{content:""}.ni-cart-fill:before{content:""}.ni-cc:before{content:""}.ni-cc-alt:before{content:""}.ni-cc-alt2:before{content:""}.ni-cc-secure:before{content:""}.ni-cc-new:before{content:""}.ni-cc-off:before{content:""}.ni-cc-fill:before{content:""}.ni-cc-alt-fill:before{content:""}.ni-cc-alt2-fill:before{content:""}.ni-cc-secure-fill:before{content:""}.ni-msg-circle:before{content:""}.ni-chat-circle:before{content:""}.ni-msg:before{content:""}.ni-chat:before{content:""}.ni-question-alt:before{content:""}.ni-question:before{content:""}.ni-msg-circle-fill:before{content:""}.ni-chat-circle-fill:before{content:""}.ni-msg-fill:before{content:""}.ni-chat-fill:before{content:""}.ni-clip-h:before{content:""}.ni-clip-v:before{content:""}.ni-clip:before{content:""}.ni-link-alt:before{content:""}.ni-unlink:before{content:""}.ni-unlink-alt:before{content:""}.ni-link-h:before{content:""}.ni-link-v:before{content:""}.ni-link:before{content:""}.ni-clipboard:before{content:""}.ni-clipboad-check:before{content:""}.ni-clipboard-fill:before{content:""}.ni-clipboad-check-fill:before{content:""}.ni-clock:before{content:""}.ni-clock-fill:before{content:""}.ni-cloud:before{content:""}.ni-upload-cloud:before{content:""}.ni-download-cloud:before{content:""}.ni-cloud-fill:before{content:""}.ni-contact:before{content:""}.ni-contact-fill:before{content:""}.ni-coffee:before{content:""}.ni-coffee-fill:before{content:""}.ni-box-view:before{content:""}.ni-col-view:before{content:""}.ni-sidebar:before{content:""}.ni-layout:before{content:""}.ni-table-view:before{content:""}.ni-layout2:before{content:""}.ni-row-view:before{content:""}.ni-dot-box:before{content:""}.ni-layout-fill:before{content:""}.ni-box-view-fill:before{content:""}.ni-sidebar-fill:before{content:""}.ni-table-view-fill:before{content:""}.ni-dot-box-fill:before{content:""}.ni-template:before{content:""}.ni-browser:before{content:""}.ni-toolbar:before{content:""}.ni-browser-fill:before{content:""}.ni-toolbar-fill:before{content:""}.ni-template-fill:before{content:""}.ni-box:before{content:""}.ni-package:before{content:""}.ni-layer:before{content:""}.ni-layers:before{content:""}.ni-panel:before{content:""}.ni-server:before{content:""}.ni-layer-fill:before{content:""}.ni-layers-fill:before{content:""}.ni-package-fill:before{content:""}.ni-panel-fill:before{content:""}.ni-server-fill:before{content:""}.ni-color-palette:before{content:""}.ni-color-palette-fill:before{content:""}.ni-copy:before{content:""}.ni-copy-fill:before{content:""}.ni-crop-alt:before{content:""}.ni-crop:before{content:""}.ni-target:before{content:""}.ni-crosshair:before{content:""}.ni-crosshair-fill:before{content:""}.ni-db-fill:before{content:""}.ni-db:before{content:""}.ni-hard-drive:before{content:""}.ni-cpu:before{content:""}.ni-disk:before{content:""}.ni-pen:before{content:""}.ni-edit-alt:before{content:""}.ni-pen-fill:before{content:""}.ni-edit-alt-fill:before{content:""}.ni-pen-alt-fill:before{content:""}.ni-edit-fill:before{content:""}.ni-edit:before{content:""}.ni-external-alt:before{content:""}.ni-external:before{content:""}.ni-eye-alt:before{content:""}.ni-eye-alt-fill:before{content:""}.ni-eye:before{content:""}.ni-eye-fill:before{content:""}.ni-eye-off:before{content:""}.ni-eye-off-fill:before{content:""}.ni-file:before{content:""}.ni-file-minus:before{content:""}.ni-file-plus:before{content:""}.ni-file-remove:before{content:""}.ni-file-check:before{content:""}.ni-file-code:before{content:""}.ni-file-docs:before{content:""}.ni-file-img:before{content:""}.ni-file-doc:before{content:""}.ni-file-pdf:before{content:""}.ni-file-xls:before{content:""}.ni-file-zip:before{content:""}.ni-file-download:before{content:""}.ni-file-text:before{content:""}.ni-files:before{content:""}.ni-file-fill:before{content:""}.ni-file-minus-fill:before{content:""}.ni-file-plus-fill:before{content:""}.ni-file-remove-fill:before{content:""}.ni-file-check-fill:before{content:""}.ni-file-text-fill:before{content:""}.ni-files-fill:before{content:""}.ni-folder:before{content:""}.ni-folder-minus:before{content:""}.ni-folder-plus:before{content:""}.ni-folder-remove:before{content:""}.ni-folder-check:before{content:""}.ni-folder-list:before{content:""}.ni-folders:before{content:""}.ni-folder-fill:before{content:""}.ni-folders-fill:before{content:""}.ni-filter-alt:before{content:""}.ni-sort-line:before{content:""}.ni-filter-fill:before{content:""}.ni-filter:before{content:""}.ni-flag:before{content:""}.ni-flag-fill:before{content:""}.ni-notify:before{content:""}.ni-dashboard:before{content:""}.ni-dashboard-fill:before{content:""}.ni-grid-sq:before{content:""}.ni-grid:before{content:""}.ni-grid-c:before{content:""}.ni-grid-alt:before{content:""}.ni-grid-plus:before{content:""}.ni-grid-add-c:before{content:""}.ni-grid-fill:before{content:""}.ni-grid-fill-c:before{content:""}.ni-grid-alt-fill:before{content:""}.ni-grid-plus-fill:before{content:""}.ni-grid-add-fill-c:before{content:""}.ni-grid-box-alt-fill:before{content:""}.ni-grid-box-alt:before{content:""}.ni-grid-box:before{content:""}.ni-grid-box-fill:before{content:""}.ni-grid-line:before{content:""}.ni-menu-alt-left:before{content:""}.ni-menu-alt-r:before{content:""}.ni-menu-alt:before{content:""}.ni-menu-center:before{content:""}.ni-menu-left:before{content:""}.ni-menu-right:before{content:""}.ni-menu:before{content:""}.ni-trend-up:before{content:""}.ni-trend-down:before{content:""}.ni-line-chart-down:before{content:""}.ni-line-chart-up:before{content:""}.ni-line-chart:before{content:""}.ni-bar-chart:before{content:""}.ni-bar-chart-alt:before{content:""}.ni-chart-up:before{content:""}.ni-chart-down:before{content:""}.ni-growth:before{content:""}.ni-growth-fill:before{content:""}.ni-bar-chart-fill:before{content:""}.ni-bar-c:before{content:""}.ni-bar-fill-c:before{content:""}.ni-pie:before{content:""}.ni-pie-alt:before{content:""}.ni-pie-fill:before{content:""}.ni-activity:before{content:""}.ni-activity-alt:before{content:""}.ni-activity-round:before{content:""}.ni-activity-round-fill:before{content:""}.ni-meter:before{content:""}.ni-speed:before{content:""}.ni-happy:before{content:""}.ni-sad:before{content:""}.ni-meh:before{content:""}.ni-happy-fill:before{content:""}.ni-happyf-fill:before{content:""}.ni-sad-fill:before{content:""}.ni-meh-fill:before{content:""}.ni-home:before{content:""}.ni-home-alt:before{content:""}.ni-home-fill:before{content:""}.ni-img:before{content:""}.ni-img-fill:before{content:""}.ni-inbox:before{content:""}.ni-inbox-in:before{content:""}.ni-inbox-out:before{content:""}.ni-inbox-fill:before{content:""}.ni-inbox-in-fill:before{content:""}.ni-inbox-out-fill:before{content:""}.ni-link-group:before{content:""}.ni-lock:before{content:""}.ni-lock-alt:before{content:""}.ni-lock-fill:before{content:""}.ni-lock-alt-fill:before{content:""}.ni-unlock:before{content:""}.ni-unlock-fill:before{content:""}.ni-mail:before{content:""}.ni-emails:before{content:""}.ni-mail-fill:before{content:""}.ni-emails-fill:before{content:""}.ni-map-pin:before{content:""}.ni-location:before{content:""}.ni-map:before{content:""}.ni-map-pin-fill:before{content:""}.ni-list:before{content:""}.ni-list-ol:before{content:""}.ni-align-center:before{content:""}.ni-align-justify:before{content:""}.ni-align-left:before{content:""}.ni-align-right:before{content:""}.ni-list-check:before{content:""}.ni-list-round:before{content:""}.ni-card-view:before{content:""}.ni-list-fill:before{content:""}.ni-save:before{content:""}.ni-save-fill:before{content:""}.ni-move:before{content:""}.ni-scissor:before{content:""}.ni-text:before{content:""}.ni-text-a:before{content:""}.ni-bold:before{content:""}.ni-italic:before{content:""}.ni-underline:before{content:""}.ni-percent:before{content:""}.ni-at:before{content:""}.ni-hash:before{content:""}.ni-code:before{content:""}.ni-code-download:before{content:""}.ni-terminal:before{content:""}.ni-cmd:before{content:""}.ni-sun:before{content:""}.ni-sun-fill:before{content:""}.ni-moon-fill:before{content:""}.ni-moon:before{content:""}.ni-light:before{content:""}.ni-light-fill:before{content:""}.ni-more-v:before{content:""}.ni-more-h:before{content:""}.ni-more-h-alt:before{content:""}.ni-more-v-alt:before{content:""}.ni-music:before{content:""}.ni-movie:before{content:""}.ni-offer:before{content:""}.ni-offer-fill:before{content:""}.ni-opt-alt:before{content:""}.ni-opt:before{content:""}.ni-opt-dot-alt:before{content:""}.ni-opt-dot:before{content:""}.ni-opt-dot-fill:before{content:""}.ni-opt-alt-fill:before{content:""}.ni-user-alt:before{content:""}.ni-user-alt-fill:before{content:""}.ni-user:before{content:""}.ni-users:before{content:""}.ni-user-add:before{content:""}.ni-user-remove:before{content:""}.ni-user-check:before{content:""}.ni-user-cross:before{content:""}.ni-account-setting:before{content:""}.ni-account-setting-alt:before{content:""}.ni-user-list:before{content:""}.ni-user-fill:before{content:""}.ni-users-fill:before{content:""}.ni-user-add-fill:before{content:""}.ni-user-remove-fill:before{content:""}.ni-user-check-fill:before{content:""}.ni-user-cross-fill:before{content:""}.ni-account-setting-fill:before{content:""}.ni-user-list-fill:before{content:""}.ni-user-circle:before{content:""}.ni-user-circle-fill:before{content:""}.ni-user-c:before{content:""}.ni-user-fill-c:before{content:""}.ni-user-round:before{content:""}.ni-printer:before{content:""}.ni-printer-fill:before{content:""}.ni-laptop:before{content:""}.ni-monitor:before{content:""}.ni-tablet:before{content:""}.ni-mobile:before{content:""}.ni-undo:before{content:""}.ni-redo:before{content:""}.ni-reload-alt:before{content:""}.ni-reload:before{content:""}.ni-regen-alt:before{content:""}.ni-regen:before{content:""}.ni-invest:before{content:""}.ni-history:before{content:""}.ni-histroy:before{content:""}.ni-update:before{content:""}.ni-repeat:before{content:""}.ni-repeat-v:before{content:""}.ni-tranx:before{content:""}.ni-reply-all:before{content:""}.ni-reply:before{content:""}.ni-reply-fill:before{content:""}.ni-reply-all-fill:before{content:""}.ni-notes:before{content:""}.ni-note-add:before{content:""}.ni-notes-alt:before{content:""}.ni-article:before{content:""}.ni-text-rich:before{content:""}.ni-todo:before{content:""}.ni-report-profit:before{content:""}.ni-reports-alt:before{content:""}.ni-reports:before{content:""}.ni-task:before{content:""}.ni-note-add-c:before{content:""}.ni-task-c:before{content:""}.ni-todo-fill:before{content:""}.ni-note-add-fill-c:before{content:""}.ni-task-fill-c:before{content:""}.ni-scan-fill:before{content:""}.ni-scan:before{content:""}.ni-qr:before{content:""}.ni-money:before{content:""}.ni-coins:before{content:""}.ni-coin:before{content:""}.ni-coin-alt:before{content:""}.ni-coin-alt-fill:before{content:""}.ni-setting-alt-fill:before{content:""}.ni-setting-alt:before{content:""}.ni-setting-fill:before{content:""}.ni-setting:before{content:""}.ni-share-alt:before{content:""}.ni-share-fill:before{content:""}.ni-share:before{content:""}.ni-network:before{content:""}.ni-rss:before{content:""}.ni-shield:before{content:""}.ni-shield-star:before{content:""}.ni-shield-check:before{content:""}.ni-shield-alert:before{content:""}.ni-shield-off:before{content:""}.ni-security:before{content:""}.ni-policy:before{content:""}.ni-shield-alert-fill:before{content:""}.ni-shield-check-fill:before{content:""}.ni-shield-fill:before{content:""}.ni-shield-half:before{content:""}.ni-shield-star-fill:before{content:""}.ni-policy-fill:before{content:""}.ni-spark:before{content:""}.ni-spark-off:before{content:""}.ni-spark-fill:before{content:""}.ni-spark-off-fill:before{content:""}.ni-wallet:before{content:""}.ni-wallet-alt:before{content:""}.ni-wallet-in:before{content:""}.ni-wallet-out:before{content:""}.ni-wallet-saving:before{content:""}.ni-wallet-fill:before{content:""}.ni-star:before{content:""}.ni-star-half:before{content:""}.ni-star-half-fill:before{content:""}.ni-star-fill:before{content:""}.ni-star-round:before{content:""}.ni-heart:before{content:""}.ni-heart-fill:before{content:""}.ni-swap-alt-fill:before{content:""}.ni-swap-alt:before{content:""}.ni-thumbs-down:before{content:""}.ni-thumbs-up:before{content:""}.ni-tag:before{content:""}.ni-tag-alt:before{content:""}.ni-tags:before{content:""}.ni-tag-fill:before{content:""}.ni-tag-alt-fill:before{content:""}.ni-tags-fill:before{content:""}.ni-bookmark:before{content:""}.ni-bookmark-fill:before{content:""}.ni-label:before{content:""}.ni-label-fill:before{content:""}.ni-priority:before{content:""}.ni-piority:before{content:""}.ni-priority-fill:before{content:""}.ni-piority-fill:before{content:""}.ni-label-alt:before{content:""}.ni-label-alt-fill:before{content:""}.ni-ticket-alt:before{content:""}.ni-ticket:before{content:""}.ni-ticket-minus:before{content:""}.ni-ticket-plus:before{content:""}.ni-ticket-alt-fill:before{content:""}.ni-ticket-fill:before{content:""}.ni-ticket-minus-fill:before{content:""}.ni-ticket-plus-fill:before{content:""}.ni-toggle-off:before{content:""}.ni-toggle-on:before{content:""}.ni-trash-alt:before{content:""}.ni-trash-empty:before{content:""}.ni-trash:before{content:""}.ni-trash-fill:before{content:""}.ni-trash-empty-fill:before{content:""}.ni-delete-fill:before{content:""}.ni-delete:before{content:""}.ni-alarm-alt:before{content:""}.ni-alarm:before{content:""}.ni-bugs:before{content:""}.ni-building:before{content:""}.ni-building-fill:before{content:""}.ni-headphone:before{content:""}.ni-headphone-fill:before{content:""}.ni-aperture:before{content:""}.ni-help-alt:before{content:""}.ni-award:before{content:""}.ni-briefcase:before{content:""}.ni-gift:before{content:""}.ni-globe:before{content:""}.ni-umbrela:before{content:""}.ni-truck:before{content:""}.ni-sign-usd:before{content:""}.ni-sign-dollar:before{content:""}.ni-sign-mxn:before{content:""}.ni-sign-sgd:before{content:""}.ni-sign-euro:before{content:""}.ni-sign-eur:before{content:""}.ni-sign-gbp:before{content:""}.ni-sign-pound:before{content:""}.ni-sign-thb:before{content:""}.ni-sign-inr:before{content:""}.ni-sign-jpy:before{content:""}.ni-sign-yen:before{content:""}.ni-sign-cny:before{content:""}.ni-sign-kobo:before{content:""}.ni-sign-chf:before{content:""}.ni-sign-vnd:before{content:""}.ni-sign-php:before{content:""}.ni-sign-brl:before{content:""}.ni-sign-idr:before{content:""}.ni-sign-czk:before{content:""}.ni-sign-hkd:before{content:""}.ni-sign-kr:before{content:""}.ni-sign-dkk:before{content:""}.ni-sign-nok:before{content:""}.ni-sign-sek:before{content:""}.ni-sign-rub:before{content:""}.ni-sign-myr:before{content:""}.ni-sign-pln:before{content:""}.ni-sign-try:before{content:""}.ni-sign-waves:before{content:""}.ni-waves:before{content:""}.ni-sign-trx:before{content:""}.ni-tron:before{content:""}.ni-sign-xem:before{content:""}.ni-nem:before{content:""}.ni-sign-mxr:before{content:""}.ni-monero:before{content:""}.ni-sign-usdc:before{content:""}.ni-sign-steller:before{content:""}.ni-sign-steem:before{content:""}.ni-sign-usdt:before{content:""}.ni-tether:before{content:""}.ni-sign-btc:before{content:""}.ni-bitcoin:before{content:""}.ni-sign-bch:before{content:""}.ni-bitcoin-cash:before{content:""}.ni-sign-bnb:before{content:""}.ni-binance:before{content:""}.ni-sign-ada:before{content:""}.ni-sign-zcash:before{content:""}.ni-sign-eth:before{content:""}.ni-ethereum:before{content:""}.ni-sign-dash:before{content:""}.ni-dash:before{content:""}.ni-sign-xrp-old:before{content:""}.ni-ripple-old:before{content:""}.ni-sign-eos:before{content:""}.ni-eos:before{content:""}.ni-sign-xrp:before{content:""}.ni-ripple:before{content:""}.ni-american-express:before{content:""}.ni-jcb:before{content:""}.ni-cc-jcb:before{content:""}.ni-mc:before{content:""}.ni-cc-mc:before{content:""}.ni-discover:before{content:""}.ni-cc-discover:before{content:""}.ni-visa:before{content:""}.ni-cc-visa:before{content:""}.ni-cc-paypal:before{content:""}.ni-cc-stripe:before{content:""}.ni-amazon-pay:before{content:""}.ni-amazon-pay-fill:before{content:""}.ni-google-pay:before{content:""}.ni-google-pay-fill:before{content:""}.ni-apple-pay:before{content:""}.ni-apple-pay-fill:before{content:""}.ni-angular:before{content:""}.ni-react:before{content:""}.ni-laravel:before{content:""}.ni-html5:before{content:""}.ni-css3-fill:before{content:""}.ni-css3:before{content:""}.ni-js:before{content:""}.ni-php:before{content:""}.ni-python:before{content:""}.ni-bootstrap:before{content:""}.ni-ebay:before{content:""}.ni-google-wallet:before{content:""}.ni-google-drive:before{content:""}.ni-google-play-store:before{content:""}.ni-android:before{content:""}.ni-blogger-fill:before{content:""}.ni-blogger:before{content:""}.ni-hangout:before{content:""}.ni-apple-store:before{content:""}.ni-apple-store-ios:before{content:""}.ni-stripe:before{content:""}.ni-apple:before{content:""}.ni-microsoft:before{content:""}.ni-windows:before{content:""}.ni-amazon:before{content:""}.ni-paypal-alt:before{content:""}.ni-airbnb:before{content:""}.ni-adobe:before{content:""}.ni-mailchimp:before{content:""}.ni-dropbox:before{content:""}.ni-digital-ocean:before{content:""}.ni-slack:before{content:""}.ni-slack-hash:before{content:""}.ni-stack-overflow:before{content:""}.ni-soundcloud:before{content:""}.ni-blackberry:before{content:""}.ni-spotify:before{content:""}.ni-kickstarter:before{content:""}.ni-houzz:before{content:""}.ni-vine:before{content:""}.ni-yelp:before{content:""}.ni-yoast:before{content:""}.ni-envato:before{content:""}.ni-wordpress:before{content:""}.ni-wp:before{content:""}.ni-wordpress-fill:before{content:""}.ni-elementor:before{content:""}.ni-joomla:before{content:""}.ni-megento:before{content:""}.ni-git:before{content:""}.ni-github:before{content:""}.ni-github-round:before{content:""}.ni-github-circle:before{content:""}.ni-dribbble:before{content:""}.ni-dribbble-round:before{content:""}.ni-behance:before{content:""}.ni-behance-fill:before{content:""}.ni-flickr:before{content:""}.ni-flickr-round:before{content:""}.ni-medium:before{content:""}.ni-medium-round:before{content:""}.ni-reddit:before{content:""}.ni-reddit-round:before{content:""}.ni-reddit-circle:before{content:""}.ni-google:before{content:""}.ni-facebook-f:before{content:""}.ni-facebook-fill:before{content:""}.ni-facebook-circle:before{content:""}.ni-instagram:before{content:""}.ni-instagram-round:before{content:""}.ni-linkedin:before{content:""}.ni-linkedin-round:before{content:""}.ni-twitter:before{content:""}.ni-twitter-round:before{content:""}.ni-pinterest:before{content:""}.ni-pinterest-round:before{content:""}.ni-pinterest-circle:before{content:""}.ni-tumblr:before{content:""}.ni-tumblr-round:before{content:""}.ni-skype:before{content:""}.ni-viber:before{content:""}.ni-whatsapp:before{content:""}.ni-whatsapp-round:before{content:""}.ni-snapchat:before{content:""}.ni-snapchat-fill:before{content:""}.ni-telegram:before{content:""}.ni-telegram-circle:before{content:""}.ni-youtube-line:before{content:""}.ni-youtube:before{content:""}.ni-youtube-fill:before{content:""}.ni-youtube-round:before{content:""}.ni-vimeo:before{content:""}.ni-vimeo-fill:before{content:""}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#d14}.kwd,.linenums .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:18px;text-shadow:0 1px 0 #fff}.select2{width:100% !important;display:inline-block}.select2-container{box-sizing:border-box;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:calc(2.125rem + 2px);user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container.select2-lg .select2-selection--multiple{min-height:calc(2.625rem + 2px)}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border-radius:4px;box-shadow:none;border:1px solid #dbdfea;font-family:Roboto,sans-serif;font-size:13px;font-weight:400;display:block;position:absolute;left:-100000px;z-index:1051;padding:6px}.select2-dropdown--below{margin-top:-1px;border-radius:0 0 4px 4px}.select2-dropdown--above{margin-top:1px;border-radius:4px 4px 0 0}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0;border-radius:4px 4px}.select2-results__option{padding:.375rem .75rem;border-radius:4px;user-select:none;-webkit-user-select:none}.select2-results__option:not(:last-child){margin-bottom:.125rem}.select2-results__option[aria-selected]{cursor:pointer}.select2-lg .select2-results__option{padding:.5rem .75rem}.select2-container--open .select2-dropdown{left:0;border-color:#b4bdd3}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:.375rem .75rem;width:100%;border-radius:4px;margin-bottom:6px;color:#526484}.select2-search--dropdown .select2-search__field:focus{outline:none;border-color:#0fac81}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-lg .select2-search--dropdown .select2-search__field{padding:.5rem .75rem}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{height:calc(2.125rem + 2px);font-family:Roboto,sans-serif;font-size:13px;font-weight:400;background-color:#fff;border:1px solid #dbdfea;border-radius:4px;box-shadow:none;transition:all .3s}.select2-sm .select2-container--default .select2-selection--single{font-size:12px}.select2-lg .select2-container--default .select2-selection--single{font-size:15px}.select2-xl .select2-container--default .select2-selection--single{font-size:15px}.select2-container--default .select2-selection--single:focus{box-shadow:0 0 0 3px rgba(15,172,129,.1);border-color:#0fac81;outline:none}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#526484;line-height:1.25rem;padding:.4375rem calc(2.125rem + 2px) .4375rem 1rem}.select2-container--default .select2-selection--single .select2-selection__rendered:focus{outline:none}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#8094ae}.select2-container--default .select2-selection--single .select2-selection__arrow{height:calc(2.125rem + 2px);position:absolute;top:0;right:0;width:calc(2.125rem + 2px);display:flex;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:after{font-family:"Nioicon";content:"";line-height:1}.select2-container--default .select2-selection--single .select2-selection__arrow b{display:none}.select2-container--default.select2-sm .select2-selection--single{height:calc(1.75rem + 2px);font-size:12px}.select2-container--default.select2-sm .select2-selection--single .select2-selection__rendered{line-height:1.25rem;padding:.25rem calc(1.75rem + 2px) .25rem 1rem}.select2-container--default.select2-sm .select2-selection--single .select2-selection__arrow{height:calc(1.75rem + 2px);width:calc(1.75rem + 2px)}.select2-container--default.select2-lg .select2-selection--single{height:calc(2.625rem + 2px);font-size:15px}.select2-container--default.select2-lg .select2-selection--single .select2-selection__rendered{line-height:1.25rem;padding:.6875rem calc(2.625rem + 2px) .6875rem 1rem}.select2-container--default.select2-lg .select2-selection--single .select2-selection__arrow{height:calc(2.625rem + 2px);width:calc(2.625rem + 2px)}.select2-container--default.select2-xl .select2-selection--single{height:calc(3.25rem + 2px);font-size:15px}.select2-container--default.select2-xl .select2-selection--single .select2-selection__rendered{line-height:2rem;padding:.625rem calc(3.25rem + 2px) .625rem 1.25rem}.select2-container--default.select2-xl .select2-selection--single .select2-selection__arrow{height:calc(3.25rem + 2px);width:calc(3.25rem + 2px)}.select2-container--default.select2-container--below.select2-container--open .select2-selection--single{border-radius:4px 4px 0 0}.select2-container--default.select2-container--above.select2-container--open .select2-selection--single{border-radius:0 0 4px 4px}.select2-container--default.select2-container--disabled .select2-selection--single{border-color:#dbdfea;background-color:rgba(219,223,234,.3);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single{border-color:#b4bdd3 !important}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:after{content:""}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #dbdfea;border-radius:4px;font-family:Roboto,sans-serif;font-size:13px;font-weight:400;cursor:text}.select2-container--default .select2-selection--multiple .select2-search--inline input::placeholder{color:#8094ae}.select2-container--default .select2-selection--multiple .select2-search--inline .select2-search__field{padding-left:.8125rem !important}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:.125rem .1875rem;width:100%;display:inline-flex;flex-wrap:wrap}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;margin-top:5px;float:right;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e5e9f2;border-radius:3px;cursor:default;line-height:1.5rem;margin:.1875rem .1875rem;padding:0 .5rem}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#526484;cursor:pointer;display:inline-block;font-weight:bold;margin-right:.5rem}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#526484}.select2-container--default.select2-lg .select2-selection--multiple{font-size:15px}.select2-container--default.select2-lg .select2-selection--multiple .select2-selection__choice{border-radius:4px;padding:.25rem .75rem}.select2-container--default.select2-container--below.select2-container--open .select2-selection--multiple{border-radius:4px 4px 0 0}.select2-container--default.select2-container--above.select2-container--open .select2-selection--multiple{border-radius:0 0 4px 4px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #0fac81;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{border-color:#dbdfea;background-color:rgba(219,223,234,.3);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open .select2-selection--multiple{border-color:#b4bdd3}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #dbdfea}.select2-container--default .select2-search--inline .select2-search__field{background:rgba(0,0,0,0);border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:210px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:rgba(128,148,174,.7)}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#e5e9f2}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#e5e9f2}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}[data-simplebar]{position:relative;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto !important;height:auto !important;z-index:0}.simplebar-offset{direction:inherit !important;box-sizing:inherit !important;resize:none !important;position:absolute;top:0;left:0 !important;bottom:0;right:0 !important;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper,.simplebar-scroll-content{direction:inherit;box-sizing:border-box !important;position:relative;display:block;height:100%;width:auto;visibility:visible;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none;overflow:hidden scroll}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-scroll-content::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{width:0;height:0}.simplebar-content:before,.simplebar-content:after{content:" ";display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit !important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;user-select:none;-webkit-user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar .hidden-scrollbar{visibility:hidden}.simplebar-scrollbar:before{position:absolute;content:"";background:#8094ae;border-radius:7px;left:2px;right:2px;opacity:0;transition:opacity .2s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition:opacity 0s linear}.simplebar-track.simplebar-vertical{top:0;width:8px !important;transition:width .1s}.simplebar-track.simplebar-vertical.simplebar-hover{width:10px !important}.simplebar-track.simplebar-vertical .nk-sidebar{visibility:hidden !important}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{top:2px;bottom:2px}.simplebar-track.simplebar-horizontal{left:0;height:8px !important;transition:height .1s}.simplebar-track.simplebar-horizontal.simplebar-hover{height:10px !important}.nk-sidebar .simplebar-track.simplebar-horizontal,.nk-sidebar-fat .simplebar-track.simplebar-horizontal,.nk-apps-sidebar .simplebar-track.simplebar-horizontal{visibility:hidden !important}.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before{height:100%;left:2px;right:2px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:2px;height:7px;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.hs-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:rgba(0,0,0,0)}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block;margin-left:auto;margin-right:auto}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid rgba(0,0,0,0)}.slick-slide:focus{outline:none;border:none}.slick-slide.col{padding-left:14px;padding-right:14px}.slick-arrow.slick-hidden{display:none}.slick-dots{display:flex;justify-content:center;padding-top:1.5rem}.slick-dots li{display:inline-flex;padding:0 6px}.slick-dots li button{background-color:#dbdfea;border:none;border-radius:20px;text-indent:-99999px;height:8px;width:8px;padding:0;overflow:hidden;transition:all .4s linear}.slick-dots li button:focus{outline:none}.slick-dots li.slick-active button{background-color:#8094ae}.slick-next,.slick-prev{position:absolute;top:50%;transform:translateY(-50%);display:inline-flex;justify-content:center;align-items:center;border-radius:50%;height:44px;width:44px;z-index:9;font-size:24px;color:#8094ae;background:#fff;transition:all .4s linear;border:1px solid #e5e9f2}.slick-next:hover,.slick-prev:hover{color:#526484;background:#f5f6fa;border-color:#dbdfea;opacity:1}.slick-disabled .slick-next,.slick-disabled .slick-prev{cursor:default;color:#dbdfea}.slick-disabled .slick-next:hover,.slick-disabled .slick-prev:hover{color:#dbdfea;background:#fff;border-color:#e5e9f2}.slick-next{right:5px}.slick-prev{left:5px}@media(min-width: 576px){.slick-next{right:-10px}.slick-prev{left:-10px}}.datepicker{padding:10px;border-radius:4px;direction:ltr;border:1px solid #dbdfea;box-shadow:none;min-width:240px}.datepicker .table-condensed{width:100%}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:"";display:inline-block;border-left:7px solid rgba(0,0,0,0);border-right:7px solid rgba(0,0,0,0);border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:"";display:inline-block;border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:34px;height:24px;padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none;transition:all .3s}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:rgba(0,0,0,0)}.datepicker table tr td.day:hover,.datepicker table tr td.day.focused{background:#ebeef2;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#dbdfea}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#dbdfea;cursor:default}.datepicker table tr td.highlighted{background:#ebeef2;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#cfeee6;color:#0fac81}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#3fbd9a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#0fac81}.datepicker table tr td.today:hover:hover{color:#fff}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#dbdfea;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#6fcdb3;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#3fbd9a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#0fac81 \9 }.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#3c4d62;color:#fff}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#344357}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#2b3748 \9 }.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#3fbd9a;color:#fff}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0fac81}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#0fac81}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;transition:all .3s}.datepicker table tr td span:hover,.datepicker table tr td span.focused{background:#0fac81;color:#fff}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#dbdfea;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#3fbd9a;color:#fff}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0fac81}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#0fac81 \9 }.datepicker table tr td span.old,.datepicker table tr td span.new{color:#dbdfea}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .prev,.datepicker .next,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .prev:hover,.datepicker .next:hover,.datepicker tfoot tr th:hover{background:#ebeef2}.datepicker .prev.disabled,.datepicker .next.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#ebeef2;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{z-index:99999 !important}.ui-timepicker-container{position:absolute;overflow:hidden;box-sizing:border-box;z-index:1052 !important}.ui-timepicker{box-sizing:content-box;display:block;height:205px;list-style:none outside none;margin:0;padding:0 1px;text-align:center}.ui-timepicker-viewport{box-sizing:content-box;display:block;height:205px;margin:0;padding:0;overflow:auto;overflow-x:hidden}.ui-timepicker-standard{font-size:1.1em;background-color:#fff;border:1px solid #dbdfea;color:#526484;margin:0;padding:6px}.ui-timepicker-standard a{border:none;color:#526484;display:block;padding:.375rem .75rem;text-decoration:none}.ui-timepicker-standard .ui-state-hover{background-color:#ebeef2;border:none;font-weight:normal;color:#364a63;cursor:pointer;border-radius:4px}.ui-timepicker-standard .ui-menu-item{margin:0;padding:0}.ui-timepicker-corners,.ui-timepicker-corners .ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-timepicker-hidden{display:none}.ui-timepicker-no-scrollbar .ui-timepicker{border:none}@-webkit-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-moz-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-moz-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:1px dashed #e5e9f2;border-radius:4px;background:#fff;padding:20px 20px}.dropzone.small{min-height:86px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center;margin:1em 0}.dropzone .dz-message span{display:block;color:rgba(82,100,132,.6)}.dropzone .dz-message-text{font-size:13px}.dropzone .dz-message-text span{display:inline-block;color:#0fac81}.dropzone .dz-message-or{font-size:16px;margin-bottom:4px;text-transform:uppercase}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-ms-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid rgba(0,0,0,0)}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{-webkit-transform:scale(1.05, 1.05);-moz-transform:scale(1.05, 1.05);-ms-transform:scale(1.05, 1.05);-o-transform:scale(1.05, 1.05);transform:scale(1.05, 1.05);-webkit-filter:blur(8px);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{-webkit-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;-webkit-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-ms-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;-ms-transition:opacity .4s ease-in;-o-transition:opacity .4s ease-in;transition:opacity .4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{-webkit-animation:pulse 6s ease infinite;-moz-animation:pulse 6s ease infinite;-ms-animation:pulse 6s ease infinite;-o-animation:pulse 6s ease infinite;animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:16px;left:50%;top:50%;margin-top:-8px;width:80px;margin-left:-40px;background:rgba(255,255,255,.9);-webkit-transform:scale(1);border-radius:8px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#333;background:linear-gradient(to bottom, #666, #444);position:absolute;top:0;left:0;bottom:0;width:0;-webkit-transition:width 300ms ease-in-out;-moz-transition:width 300ms ease-in-out;-ms-transition:width 300ms ease-in-out;-o-transition:width 300ms ease-in-out;transition:width 300ms ease-in-out}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;-webkit-transition:opacity .3s ease;-moz-transition:opacity .3s ease;-ms-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#be2626;background:linear-gradient(to bottom, #be2626, #a92222);padding:.5em 1.2em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #be2626}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-connect{height:100%;width:100%}.noUi-origin{height:10%;width:10%}.noUi-vertical .noUi-origin{width:100%}.noUi-horizontal .noUi-origin{height:100%}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-handle:focus{outline:none}.noUi-touch-area{height:100%;width:100%}.noUi-touch-area:focus{outline:none}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit !important}.noUi-horizontal{height:8px}.noUi-horizontal .noUi-handle{width:28px;height:28px;right:-14px;top:50%;transform:translateY(-50%)}.noUi-vertical{width:8px;height:200px}.noUi-vertical .noUi-handle{width:28px;height:28px;left:50%;top:-14px;transform:translateX(-50%)}.noUi-target{background:#dbdfea;border-radius:4px}.noUi-connects{border-radius:3px}.noUi-connect{background:#0fac81}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #dbdfea;border-radius:50%;background:#fff;cursor:default;box-shadow:0 3px 12px 1px rgba(43,55,72,.15)}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:before,.noUi-handle:after{content:"";display:block;position:absolute;height:10px;width:1px;background:#dbdfea;left:50%;top:50%;transform:translate(-50%, -50%)}.noUi-horizontal .noUi-handle:before{margin-left:-2px}.noUi-horizontal .noUi-handle:after{margin-left:2px}.noUi-vertical .noUi-handle:before,.noUi-vertical .noUi-handle:after{width:10px;height:1px}.noUi-vertical .noUi-handle:before{margin-top:-2px}.noUi-vertical .noUi-handle:after{margin-top:2px}[disabled] .noUi-connect{background:#e5e9f2}[disabled].noUi-target,[disabled].noUi-handle,[disabled] .noUi-handle{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#ccc}.noUi-marker-sub{background:#aaa}.noUi-marker-large{background:#aaa}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%, 50%);transform:translate(-50%, 50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0, -50%);transform:translate(0, -50%);padding-left:25px}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#1f2b3a;color:#fff;padding:.25rem .75rem;text-align:center;white-space:nowrap;font-size:13px;opacity:0;transition:all .3s ease}.noUi-handle:hover .noUi-tooltip{opacity:.9}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%, 0);transform:translate(-50%, 0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0, -50%);transform:translate(0, -50%);top:50%;right:120%}#toast-container{position:fixed;z-index:999999;pointer-events:none;padding:1.25rem;width:100%}#toast-container[class*=-center] .toastr{margin-left:auto;margin-right:auto}#toast-container[class*=-left] .toastr{margin-right:auto}#toast-container[class*=-right] .toastr{margin-left:auto}#toast-container[class*=-full] .toastr{width:100%}#toast-container[class*=toast-top]{top:0}#toast-container[class*=toast-bottom]{bottom:0}.toastr{position:relative;pointer-events:auto;background:#fff;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);border-radius:4px;opacity:1;border-left:4px solid rgba(0,0,0,0);padding:1.25rem 4.5rem 1.25rem 1.25rem;width:430px;max-width:100%;font-size:.875rem;line-height:1.3rem}.is-dark .toastr{background:#101924;color:#fff}.toastr:not(:last-child){margin-bottom:.75rem}.toastr.toast-success{border-color:#1ee0ac}.toastr.toast-success .icon{color:#1ee0ac}.toastr.toast-error{border-color:#e85347}.toastr.toast-error .icon{color:#e85347}.toastr.toast-info{border-color:#09c2de}.toastr.toast-info .icon{color:#09c2de}.toastr.toast-warning{border-color:#f4bd0e}.toastr.toast-warning .icon{color:#f4bd0e}.toastr-icon{position:absolute;left:1.25rem;top:50%;transform:translateY(-50%);font-size:24px;line-height:1}.toastr-icon+.toastr-text{padding-left:2.35rem}.toastr h4,.toastr .h4,.toastr h5,.toastr .h5,.toastr h6,.toastr .h6{margin-bottom:.35rem;font-size:1rem}.is-dark .toastr h4,.is-dark .toastr .h4,.is-dark .toastr h5,.is-dark .toastr .h5,.is-dark .toastr h6,.is-dark .toastr .h6{color:#fff}.toast-close-button{position:absolute;right:12px;top:50%;transform:translateY(-50%);display:inline-block;height:32px;width:32px;text-indent:-9999px;cursor:pointer}.toast-close-button:after{position:absolute;top:0;left:0;text-indent:0;color:#8094ae;font-family:"Nioicon";content:"";font-size:18px;line-height:32px;width:100%;text-align:center}.is-dark .toast-close-button:after{color:#dbdfea}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}.toast-title{font-weight:bold}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#526484}.toast-message a:hover{color:#ccc;text-decoration:none}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;background:#fff;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto !important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-actions .btn,.swal2-popup.swal2-toast .swal2-actions .dual-listbox .dual-listbox__button,.dual-listbox .swal2-popup.swal2-toast .swal2-actions .dual-listbox__button{margin:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .5em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#1ee0ac}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;border-radius:4em 0 0 4em;transform:rotate(-45deg);transform-origin:2em 2em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;border-radius:0 4em 4em 0;transform-origin:0 1.5em}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show{background:rgba(28,43,70,.4)}.swal2-container.swal2-backdrop-hide{background:rgba(0,0,0,0) !important}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-start,.swal2-container.swal2-top-left{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-start,.swal2-container.swal2-center-left{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-start,.swal2-container.swal2-bottom-left{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-right>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex !important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex !important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-top,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-bottom{align-items:center}.swal2-container.swal2-grow-column.swal2-top-start,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-bottom-left{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-top-right,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-bottom-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex !important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-container .swal2-modal{margin:0 !important}}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:480px;max-width:100%;padding:2.75rem 2.5rem;border:none;border-radius:4px;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:none}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#364a63;font-size:1.5rem;font-weight:700;text-align:center;text-transform:none;word-wrap:break-word}.swal2-html-container{margin-bottom:1rem}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1rem auto 0}.swal2-actions .btn,.swal2-actions .dual-listbox .dual-listbox__button,.dual-listbox .swal2-actions .dual-listbox__button{margin:0 .75rem}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(31, 43, 58, 0.1), rgba(31, 43, 58, 0.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(31, 43, 58, 0.2), rgba(31, 43, 58, 0.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid rgba(0,0,0,0);border-radius:100%;border-color:rgba(0,0,0,0);background-color:rgba(0,0,0,0) !important;color:rgba(0,0,0,0);cursor:default;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #b4c4d7;border-radius:50%;margin-left:5px;border-right-color:rgba(0,0,0,0);box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.5rem;box-shadow:none;padding:.5rem 1rem;font-size:.9375rem;line-height:1.25rem;border-radius:5px;min-width:90px}.swal2-loading .swal2-styled{min-width:0}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#1ee0ac;color:#fff}.swal2-styled.swal2-confirm:focus{outline:none}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#e85347;color:#fff}.swal2-styled.swal2-cancel:focus{outline:none}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#5a7ca7;font-size:1em}.swal2-timer-progress-bar{position:absolute;bottom:0;left:0;width:100%;height:.25em;background:rgba(31,43,58,.2)}.swal2-image{max-width:100%;margin:0 auto 1.5rem}.swal2-close{position:absolute;z-index:2;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:rgba(0,0,0,0);color:#f7f8fa;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:rgba(0,0,0,0);color:#e85347}.swal2-close::-moz-focus-inner{border:0}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#8094ae;font-size:.875rem;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word}.swal2-input,.swal2-file,.swal2-textarea,.swal2-select,.swal2-radio,.swal2-checkbox{margin:1rem auto}.swal2-input,.swal2-file,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #dbdfea;border-radius:4px;background:inherit;box-shadow:none;color:inherit;font-size:.875rem}.swal2-input.swal2-inputerror,.swal2-file.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#e85347 !important;box-shadow:0 0 2px #e85347 !important}.swal2-input:focus,.swal2-file:focus,.swal2-textarea:focus{border:1px solid #0fac81;outline:none;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.swal2-input::placeholder,.swal2-file::placeholder,.swal2-textarea::placeholder{color:#f7f8fa}.swal2-range{margin:1rem auto;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.75rem;padding:0;font-size:.875rem;line-height:2.75rem}.swal2-input{height:2.75rem;padding:0 1rem}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:.875rem}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:.875rem}.swal2-radio,.swal2-checkbox{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-radio label,.swal2-checkbox label{margin:0 .6em;font-size:.875rem}.swal2-radio input,.swal2-checkbox input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#fff;color:#728fb3;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#e85347;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:-0.5rem auto 1.5rem;border:.25em solid rgba(0,0,0,0);border-radius:50%;font-family:inherit;line-height:5em;cursor:default;user-select:none;transform:scale(0.8)}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#e85347;color:#e85347}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#e85347}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#f6c630;color:#f4bd0e}.swal2-icon.swal2-info{border-color:#55e3f8;color:#09c2de}.swal2-icon.swal2-question{border-color:#8798b5;color:#526484}.swal2-icon.swal2-success{border-color:#1ee0ac;color:#1ee0ac}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(30,224,172,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#1ee0ac}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@supports(-ms-accelerator: true){.swal2-range input{width:100% !important}.swal2-range output{display:none}}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-range input{width:100% !important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(15,172,129,.4)}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-show{0%{opacity:0;transform:translate(0, 20px)}40%{opacity:1}100%{transform:translate(0, 0)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.7);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:scale(0.8) rotateX(100deg);opacity:0}100%{transform:scale(0.8) rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - 0.625em * 2);background-color:rgba(0,0,0,0) !important}body.swal2-no-backdrop .swal2-container>.swal2-modal{box-shadow:0 0 10px rgba(28,43,70,.4)}body.swal2-no-backdrop .swal2-container.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-top-start,body.swal2-no-backdrop .swal2-container.swal2-top-left{top:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-top-end,body.swal2-no-backdrop .swal2-container.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-container.swal2-center{top:50%;left:50%;transform:translate(-50%, -50%)}body.swal2-no-backdrop .swal2-container.swal2-center-start,body.swal2-no-backdrop .swal2-container.swal2-center-left{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-end,body.swal2-no-backdrop .swal2-container.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom-start,body.swal2-no-backdrop .swal2-container.swal2-bottom-left{bottom:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-bottom-end,body.swal2-no-backdrop .swal2-container.swal2-bottom-right{right:0;bottom:0}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static !important}}body.swal2-toast-shown .swal2-container{background-color:rgba(0,0,0,0)}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;bottom:auto;right:0;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{top:0;bottom:auto;left:0;right:auto}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{top:50%;bottom:auto;right:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;bottom:auto;right:0;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{top:auto;bottom:0;right:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;bottom:0;right:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}table.dataTable{clear:both;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_length label{display:inline-flex;align-items:center}div.dataTables_wrapper div.dataTables_length span{margin-left:.5rem;margin-right:.5rem}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap}div.dataTables_wrapper div.dataTables_filter input{display:inline-block}div.dataTables_wrapper div.dataTables_info{padding:.5rem 0;white-space:nowrap;font-size:.75rem}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;justify-content:center}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;margin-left:-100px;width:200px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_wrapper label{margin-bottom:0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;top:50%;transform:translateY(-50%);display:block;opacity:.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-sm>thead>tr>th{padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}@media(min-width: 768px){div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:flex-start}}table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>th:first-child{cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>th:first-child:before{content:"";font-family:"Nioicon";margin-right:.4rem}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:""}@media(max-width: 575px){div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:flex-start}div.dataTables_wrapper div.dataTables_paginate ul.pagination li:not(.previous):not(.next){display:none}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-link{padding-left:1rem;padding-right:1rem}div.dataTables_wrapper div.dataTables_info{text-align:right !important}}.dataTable td:focus{outline:none}.datatable-wrap{border:1px solid #e5e9f2;border-radius:4px}.dtr-details{padding-left:.25rem}.dtr-details .dtr-title{font-weight:700;margin-right:.25rem}.nk-tb-col-check,.nk-tb-col-tools{pointer-events:none}.nk-tb-col-check>*,.nk-tb-col-tools>*{pointer-events:auto}.nk-tb-col-check:before,.nk-tb-col-check:after,.nk-tb-col-tools:before,.nk-tb-col-tools:after{display:none !important}.nk-tb-col-check{padding-right:.5rem !important}@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#f5f6fa;box-shadow:0 0 0 200vh rgba(31,43,58,.3);border-radius:4px;text-align:center;z-index:2020;overflow:hidden;border:1px solid #e5e9f2}div.dt-button-info h2,div.dt-button-info .h2{padding:2rem;margin:0;font-weight:normal;border-bottom:1px solid #e5e9f2;background-color:#fff;font-size:1.75rem}div.dt-button-info>div{padding:1.25rem}div.dt-button-collection-title{text-align:center;padding:.3em 0 .5em;font-size:.9em}div.dt-button-collection-title:empty{display:none}div.dt-button-collection{position:absolute;z-index:1000;width:100%}div.dt-button-collection div.dropdown-menu{display:block;z-index:1001;min-width:100px;top:10px}.dropdown-position-right div.dt-button-collection div.dropdown-menu{right:0;left:auto}div.dt-button-collection div.dt-button-collection-title{background-color:#fff;border:1px solid rgba(0,0,0,.15)}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.fixed{max-width:none}div.dt-button-collection.fixed:before,div.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:rgba(31,43,58,.3);display:none !important}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:.5em}div.dt-buttons a.btn,div.dt-buttons .dual-listbox a.dual-listbox__button,.dual-listbox div.dt-buttons a.dual-listbox__button{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons .dual-listbox button.processing.dual-listbox__button,.dual-listbox div.dt-buttons button.processing.dual-listbox__button,div.dt-buttons div.btn.processing,div.dt-buttons .dual-listbox div.processing.dual-listbox__button,.dual-listbox div.dt-buttons div.processing.dual-listbox__button,div.dt-buttons a.btn.processing,div.dt-buttons .dual-listbox a.processing.dual-listbox__button,.dual-listbox div.dt-buttons a.processing.dual-listbox__button{color:rgba(0,0,0,.2)}div.dt-buttons button.btn.processing:after,div.dt-buttons .dual-listbox button.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons button.processing.dual-listbox__button:after,div.dt-buttons div.btn.processing:after,div.dt-buttons .dual-listbox div.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons div.processing.dual-listbox__button:after,div.dt-buttons a.btn.processing:after,div.dt-buttons .dual-listbox a.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons a.processing.dual-listbox__button:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid #282828;border-radius:50%;border-left-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0);animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}.dt-buttons .btn-secondary span{display:none}.dt-buttons .btn-secondary:before{font-size:1.125rem;font-weight:normal;font-style:normal;width:2.125rem;font-family:"Nioicon"}.dt-export-title{margin-left:.5rem;margin-right:.5rem}.buttons-copy:before{content:""}.buttons-pdf:before{content:""}.buttons-excel:before{content:""}.buttons-csv:before{content:""}.buttons-print:before{content:""}.buttons-colvis:before{content:""}.buttons-columnVisibility{position:relative;padding-right:42px;font-size:12px;font-weight:500;color:#526484;transition:all .4s}.buttons-columnVisibility.active:not(:hover){color:#526484;background-color:rgba(0,0,0,0)}.buttons-columnVisibility.active:after{content:"";position:absolute;top:50%;transform:translateY(-50%);right:1rem;font-family:"Nioicon"}@media(max-width: 600px){.with-export>.col-5,.with-export>.col-7,.with-export>.col-sm-4,.with-export>.col-sm-8{width:100% !important;flex:0 0 100%;max-width:100%}.with-export .datatable-filter .justify-content-end,.with-export .datatable-filter .justify-end{justify-content:space-between !important}.with-export .dataTables_filter label{display:block}.with-export .dataTables_filter .form-control,.with-export .dataTables_filter .dual-listbox .dual-listbox__search,.dual-listbox .with-export .dataTables_filter .dual-listbox__search,.with-export div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper .with-export div.dataTables_filter input{width:100% !important}}.jqvmap-label{position:absolute;display:none;border-radius:4px;background:rgba(31,43,58,.9);color:#fff;padding:.25rem .75rem;pointer-events:none;font-size:12px}.jqvmap-pin{pointer-events:none}.jqvmap-zoomin,.jqvmap-zoomout{position:absolute;left:10px;border-radius:3px;background:rgba(31,43,58,.9);padding:.125rem;color:#fff;width:1rem;height:1rem;cursor:pointer;line-height:.75rem;text-align:center}.jqvmap-zoomin{top:10px}.jqvmap-zoomout{top:30px}.jqvmap-region{cursor:pointer}.jqvmap-ajax_response{width:100%;height:500px}.tagify{display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #e5e9f2;padding:3px;line-height:1.1;cursor:text;outline:none;position:relative;transition:.1s;font-size:14px}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}@media(max-width: 576px){.tagify{padding:4px;font-size:12px}}.tagify:hover{border-color:#dbdfea}.tagify.tagify--focus{transition:0s;border-color:#0fac81}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.25rem .5rem .25rem .675rem}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg, #fff 25%, transparent 25%, transparent 50%, #fff 50%, #fff 75%, transparent 75%, transparent) 0/5px 5px;box-shadow:none;filter:brightness(0.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:"";vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;border:3px solid;border-color:#eee #bbb #888 rgba(0,0,0,0);border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none !important}.tagify__tag{display:inline-flex;align-items:center;margin:2px;position:relative;z-index:1;outline:none;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.25rem .5rem .25rem .675rem;color:#526484;line-height:inherit;border-radius:15px;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>*[contenteditable]{outline:none;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:"";position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;box-shadow:0 0 0 1.1em #fff inset;border:1px solid #e5e9f2}.tagify__tag:hover:not([readonly]) div::before{top:0;right:0;bottom:0;left:0;box-shadow:0 0 0 1.1em #f5f6fa inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0 !important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(114,128,146,.5) inset !important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg, #fff 25%, transparent 25%, transparent 50%, #fff 50%, #fff 75%, transparent 75%, transparent) 0/5px 5px;box-shadow:none;filter:brightness(0.95);border-color:none}.tagify__tag--editable>div{color:#526484}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #f5f6fa inset !important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #728092 inset !important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:11px "Nioicon";background:none;color:#364a63;width:14px;height:14px;margin-right:3.6666666667px;margin-left:-3.6666666667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{position:relative;content:"";top:1px}.tagify__tag__removeBtn:hover{color:#fff;background:#606c7c}.tagify__tag__removeBtn:hover+div::before{transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:60px;margin:2px;padding:.25rem .5rem .25rem .675rem;line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}.tagify__input:empty{display:flex}.tagify__input:empty::before{transition:.2s ease-out;opacity:.7;transform:none;width:auto}.tagify__input:focus{outline:none}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports(-moz-appearance: none){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.5;transform:none}@supports(-moz-appearance: none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#526484;white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports(-moz-appearance: none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#526484;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:">";opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%, -50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%, -50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{border-color:#728092}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(4px);overflow:hidden;box-shadow:0 1px 4px rgba(54,74,99,.1);border-radius:4px}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-4px);box-shadow:0 -1px 4px rgba(54,74,99,.1)}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(15,172,129,.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;border:1px solid #e5e9f2;padding:.25rem;border-radius:4px;transition:.25s cubic-bezier(0, 1, 0.5, 1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.25rem .5rem .25rem .675rem;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:none}.tagify__dropdown__item--active{background:#0fac81;color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#0fac81;color:#fff;border:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc *:before,.fc *:after{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc th,.fc td{vertical-align:top;padding:0}.fc .table-bordered{border-radius:4px}.fc .table-bordered th{border:1px solid #dbdfea}.fc .table-bordered td{border:1px solid #dbdfea}.fc .table-bordered thead th,.fc .table-bordered thead td{border-bottom-width:0}.fc .table-bordered thead>tr>th,.fc .table-bordered thead>tr>td{border-bottom-width:1px}.fc thead tr:first-child td:first-child,.fc thead tr:first-child th:first-child{border-radius:4px 0 0 0}.fc thead tr:first-child td:last-child,.fc thead tr:first-child th:last-child{border-radius:0 4px 0 0}.fc tbody tr:last-child td:first-child,.fc tbody tr:last-child th:first-child{border-radius:0 0 0 4px}.fc tbody tr:last-child td:last-child,.fc tbody tr:last-child th:last-child{border-radius:0 0 4px 0}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:"fcicons";src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:normal;font-style:normal}.fc-icon,.fa{display:inline-block;width:1em;height:1em;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:"fcicons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before,.fa-chevron-left:before{content:""}.fc-icon-chevron-right:before,.fa-chevron-right:before{content:""}.fc-icon-chevrons-left:before,.fa-chevrons-left:before{content:""}.fc-icon-chevrons-right:before,.fa-chevrons-right:before{content:""}.fc-icon-minus-square:before,.fa-minus-square:before{content:""}.fc-icon-plus-square:before,.fa-plus-square:before{content:""}.fc-icon-x:before,.fa-times:before{content:""}.fc .fc-button{border-radius:0;overflow:visible;text-transform:none;margin:0;font-family:inherit;font-size:inherit;line-height:inherit}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{display:inline-block;font-weight:400;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#2c3e50;background-color:var(--fc-button-bg-color, #2C3E50);border-color:#2c3e50;border-color:var(--fc-button-border-color, #2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color, #1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color, #1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#2c3e50;background-color:var(--fc-button-bg-color, #2C3E50);border-color:#2c3e50;border-color:var(--fc-button-border-color, #2C3E50)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled):active,.fc .fc-button-primary:not(:disabled).fc-button-active{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color, #1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color, #151e27)}.fc .fc-button-primary:not(:disabled):active:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex;vertical-align:middle}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button:hover{z-index:1}.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button.fc-button-active{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}@media(max-width: 767.98px){.fc .fc-toolbar{flex-direction:column}}.fc .fc-toolbar.fc-header-toolbar{margin:-0.5rem 0 .75rem}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk{display:flex;align-items:center;padding:.5rem 0}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk:empty{display:none}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button{position:relative;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;background:rgba(0,0,0,0);color:#8094ae;border:1px solid #dbdfea;text-transform:capitalize}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:disabled,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:disabled,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:disabled{background:rgba(0,0,0,0);color:#8094ae;border:1px solid #dbdfea}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:hover,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{color:#526484;background:#f5f6fa;border:1px solid #dbdfea}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(219,223,234,.5)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn.active,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .active.dual-listbox__button,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .active.dual-listbox__button{color:#364a63;border:1px solid #dbdfea;background:#f5f6fa;box-shadow:inset 0 0 4px -1px rgba(128,148,174,.25)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button{border:none !important}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button:focus{background:rgba(0,0,0,0) !important;box-shadow:none !important}@media(max-width: 767.98px){.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk{justify-content:space-between;width:100%}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button{color:rgba(0,0,0,0) !important;width:2.125rem}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button:before{color:#8094ae;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button:before{content:"M"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button:before{content:"W"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button:before{content:"D"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button:before{content:"L"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-title+.btn-group{margin-right:-0.75rem}}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.125rem;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0;border-bottom-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section{height:1px}.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section table{height:1px}.fc .fc-scrollgrid-section-liquid{height:auto}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-header>*,.fc .fc-scrollgrid-section-footer>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:#fff;background:var(--fc-page-bg-color, #fff);position:-webkit-sticky;position:sticky;z-index:2}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:-webkit-sticky;position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-non-business,.fc .fc-highlight{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color, rgba(215, 215, 215, 0.3))}.fc .fc-bg-event{background:#8fdf82;background:var(--fc-bg-event-color, rgb(143, 223, 130));opacity:.3;opacity:var(--fc-bg-event-opacity, 0.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color, rgba(188, 232, 241, 0.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc .fc-event{padding:.125rem .375rem;margin:.5rem .375rem}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event[href],.fc-event.fc-event-draggable{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event:hover .fc-event-resizer,.fc-event-selected .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width, 8px)/2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width, 1px);width:8px;width:var(--fc-event-resizer-dot-total-width, 8px);height:8px;height:var(--fc-event-resizer-dot-total-width, 8px);border-style:solid;border-color:inherit;background:#fff;background:var(--fc-page-bg-color, #fff)}.fc-event-selected .fc-event-resizer:before{content:"";position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color, rgba(0, 0, 0, 0.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{display:block;border:1px solid #0fac81;background-color:#0fac81}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness, 8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}:root{--fc-daygrid-event-dot-width: 8px}.fc .fc-popover{position:fixed;top:0;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd);background:#fff;background:var(--fc-page-bg-color, #fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc-daygrid-day-frame:before,.fc-daygrid-day-events:before,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc-daygrid-day-frame:after,.fc-daygrid-day-events:after,.fc-daygrid-event-harness:after{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(15,172,129,.07)}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.5}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin:.375rem .5rem !important}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:2px 3px 0}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));color:gray;color:var(--fc-neutral-text-color, #808080)}.fc .fc-more-popover{z-index:8}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:.25rem}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:.25rem}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px 0}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:bold}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:.25rem .25rem}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:bold}.fc-daygrid-dot-event:hover,.fc-daygrid-dot-event.fc-event-mirror{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:-2px 4px 0;box-sizing:content-box;width:0;height:0;border:3px solid #0fac81;border-radius:4px}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{display:block;border:1px solid #0fac81;background-color:#0fac81}.fc-v-event .fc-event-main{height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness, 8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{position:relative;z-index:1;min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table{position:relative;z-index:1}.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0;padding:.25rem}.fc .fc-timegrid-slot:empty:before{content:" "}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(15,172,129,.07)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc-media-screen .fc-timegrid-event-harness{position:absolute}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror{box-shadow:0px 0px 0px 1px #fff;box-shadow:0px 0px 0px 1px var(--fc-page-bg-color, #fff)}.fc-timegrid-event{font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);border-radius:3px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);margin-bottom:1px}.fc-timegrid-event-condensed .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-condensed .fc-event-time:after{content:" - "}.fc-timegrid-event-condensed .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size, 0.85em)}.fc-media-screen .fc-timegrid-event{position:absolute;top:0;bottom:1px;left:0;right:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:#e85347;border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:#e85347}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0)}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0)}:root{--fc-list-event-dot-width: 10px;--fc-list-event-hover-bg-color: #f5f5f5}.fc-theme-standard .fc-list{border:1px solid #ddd}.fc .fc-list-empty{background-color:#f5f6fa;height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:-webkit-sticky;position:sticky;top:0;background:#fff;background:var(--fc-page-bg-color, #fff)}.fc .fc-list-table th{padding:0}.fc .fc-list-table td,.fc .fc-list-day-cushion{padding:.75rem 1rem}.fc .fc-list-table th .fc-list-day-cushion{padding:.5rem 1rem}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;width:10px;height:10px;background-color:#0fac81;border:2px solid #0fac81;border-radius:5px}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc a.fc-event:not([href]){color:#fff;background:#0fac81}.fc a.fc-event:not([href]) .fc-daygrid-event-dot{border-color:#fff}.fc-prev-button,.fc-next-button{padding-left:.5rem;padding-right:.5rem}.fc-prev-button>.fa,.fc-next-button>.fa{font-size:1.25rem}span[class*=fc-event] .dot{display:inline-block;border:1px solid #0fac81;margin-right:.5rem}a.fc-event-primary{background-color:#0fac81 !important;border-color:#0fac81 !important;color:#fff !important}a.fc-event-primary .fc-daygrid-event-dot,a.fc-event-primary .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-primary{background-color:#0fac81 !important;border-color:#0fac81 !important}.modal-header.fc-event-primary .close,.modal-header.fc-event-primary .modal-title{color:#fff !important}span.fc-event-primary .dot{background-color:#0fac81 !important;border-color:#0fac81 !important}.fc-event-primary:not(a) .fc-list-event-dot{background-color:#0fac81 !important;border-color:#0fac81 !important}a.fc-event-success{background-color:#1ee0ac !important;border-color:#1ee0ac !important;color:#fff !important}a.fc-event-success .fc-daygrid-event-dot,a.fc-event-success .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-success{background-color:#1ee0ac !important;border-color:#1ee0ac !important}.modal-header.fc-event-success .close,.modal-header.fc-event-success .modal-title{color:#fff !important}span.fc-event-success .dot{background-color:#1ee0ac !important;border-color:#1ee0ac !important}.fc-event-success:not(a) .fc-list-event-dot{background-color:#1ee0ac !important;border-color:#1ee0ac !important}a.fc-event-info{background-color:#09c2de !important;border-color:#09c2de !important;color:#fff !important}a.fc-event-info .fc-daygrid-event-dot,a.fc-event-info .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-info{background-color:#09c2de !important;border-color:#09c2de !important}.modal-header.fc-event-info .close,.modal-header.fc-event-info .modal-title{color:#fff !important}span.fc-event-info .dot{background-color:#09c2de !important;border-color:#09c2de !important}.fc-event-info:not(a) .fc-list-event-dot{background-color:#09c2de !important;border-color:#09c2de !important}a.fc-event-warning{background-color:#f4bd0e !important;border-color:#f4bd0e !important;color:#fff !important}a.fc-event-warning .fc-daygrid-event-dot,a.fc-event-warning .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-warning{background-color:#f4bd0e !important;border-color:#f4bd0e !important}.modal-header.fc-event-warning .close,.modal-header.fc-event-warning .modal-title{color:#fff !important}span.fc-event-warning .dot{background-color:#f4bd0e !important;border-color:#f4bd0e !important}.fc-event-warning:not(a) .fc-list-event-dot{background-color:#f4bd0e !important;border-color:#f4bd0e !important}a.fc-event-danger{background-color:#e85347 !important;border-color:#e85347 !important;color:#fff !important}a.fc-event-danger .fc-daygrid-event-dot,a.fc-event-danger .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-danger{background-color:#e85347 !important;border-color:#e85347 !important}.modal-header.fc-event-danger .close,.modal-header.fc-event-danger .modal-title{color:#fff !important}span.fc-event-danger .dot{background-color:#e85347 !important;border-color:#e85347 !important}.fc-event-danger:not(a) .fc-list-event-dot{background-color:#e85347 !important;border-color:#e85347 !important}a.fc-event-secondary{background-color:#364a63 !important;border-color:#364a63 !important;color:#fff !important}a.fc-event-secondary .fc-daygrid-event-dot,a.fc-event-secondary .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-secondary{background-color:#364a63 !important;border-color:#364a63 !important}.modal-header.fc-event-secondary .close,.modal-header.fc-event-secondary .modal-title{color:#fff !important}span.fc-event-secondary .dot{background-color:#364a63 !important;border-color:#364a63 !important}.fc-event-secondary:not(a) .fc-list-event-dot{background-color:#364a63 !important;border-color:#364a63 !important}a.fc-event-dark{background-color:#1f2b3a !important;border-color:#1f2b3a !important;color:#fff !important}a.fc-event-dark .fc-daygrid-event-dot,a.fc-event-dark .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-dark{background-color:#1f2b3a !important;border-color:#1f2b3a !important}.modal-header.fc-event-dark .close,.modal-header.fc-event-dark .modal-title{color:#fff !important}span.fc-event-dark .dot{background-color:#1f2b3a !important;border-color:#1f2b3a !important}.fc-event-dark:not(a) .fc-list-event-dot{background-color:#1f2b3a !important;border-color:#1f2b3a !important}a.fc-event-blue{background-color:#559bfb !important;border-color:#559bfb !important;color:#fff !important}a.fc-event-blue .fc-daygrid-event-dot,a.fc-event-blue .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-blue{background-color:#559bfb !important;border-color:#559bfb !important}.modal-header.fc-event-blue .close,.modal-header.fc-event-blue .modal-title{color:#fff !important}span.fc-event-blue .dot{background-color:#559bfb !important;border-color:#559bfb !important}.fc-event-blue:not(a) .fc-list-event-dot{background-color:#559bfb !important;border-color:#559bfb !important}a.fc-event-azure{background-color:#1676fb !important;border-color:#1676fb !important;color:#fff !important}a.fc-event-azure .fc-daygrid-event-dot,a.fc-event-azure .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-azure{background-color:#1676fb !important;border-color:#1676fb !important}.modal-header.fc-event-azure .close,.modal-header.fc-event-azure .modal-title{color:#fff !important}span.fc-event-azure .dot{background-color:#1676fb !important;border-color:#1676fb !important}.fc-event-azure:not(a) .fc-list-event-dot{background-color:#1676fb !important;border-color:#1676fb !important}a.fc-event-indigo{background-color:#2c3782 !important;border-color:#2c3782 !important;color:#fff !important}a.fc-event-indigo .fc-daygrid-event-dot,a.fc-event-indigo .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-indigo{background-color:#2c3782 !important;border-color:#2c3782 !important}.modal-header.fc-event-indigo .close,.modal-header.fc-event-indigo .modal-title{color:#fff !important}span.fc-event-indigo .dot{background-color:#2c3782 !important;border-color:#2c3782 !important}.fc-event-indigo:not(a) .fc-list-event-dot{background-color:#2c3782 !important;border-color:#2c3782 !important}a.fc-event-purple{background-color:#816bff !important;border-color:#816bff !important;color:#fff !important}a.fc-event-purple .fc-daygrid-event-dot,a.fc-event-purple .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-purple{background-color:#816bff !important;border-color:#816bff !important}.modal-header.fc-event-purple .close,.modal-header.fc-event-purple .modal-title{color:#fff !important}span.fc-event-purple .dot{background-color:#816bff !important;border-color:#816bff !important}.fc-event-purple:not(a) .fc-list-event-dot{background-color:#816bff !important;border-color:#816bff !important}a.fc-event-pink{background-color:#ff63a5 !important;border-color:#ff63a5 !important;color:#fff !important}a.fc-event-pink .fc-daygrid-event-dot,a.fc-event-pink .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-pink{background-color:#ff63a5 !important;border-color:#ff63a5 !important}.modal-header.fc-event-pink .close,.modal-header.fc-event-pink .modal-title{color:#fff !important}span.fc-event-pink .dot{background-color:#ff63a5 !important;border-color:#ff63a5 !important}.fc-event-pink:not(a) .fc-list-event-dot{background-color:#ff63a5 !important;border-color:#ff63a5 !important}a.fc-event-orange{background-color:#ffa353 !important;border-color:#ffa353 !important;color:#fff !important}a.fc-event-orange .fc-daygrid-event-dot,a.fc-event-orange .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-orange{background-color:#ffa353 !important;border-color:#ffa353 !important}.modal-header.fc-event-orange .close,.modal-header.fc-event-orange .modal-title{color:#fff !important}span.fc-event-orange .dot{background-color:#ffa353 !important;border-color:#ffa353 !important}.fc-event-orange:not(a) .fc-list-event-dot{background-color:#ffa353 !important;border-color:#ffa353 !important}a.fc-event-teal{background-color:#20c997 !important;border-color:#20c997 !important;color:#fff !important}a.fc-event-teal .fc-daygrid-event-dot,a.fc-event-teal .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-teal{background-color:#20c997 !important;border-color:#20c997 !important}.modal-header.fc-event-teal .close,.modal-header.fc-event-teal .modal-title{color:#fff !important}span.fc-event-teal .dot{background-color:#20c997 !important;border-color:#20c997 !important}.fc-event-teal:not(a) .fc-list-event-dot{background-color:#20c997 !important;border-color:#20c997 !important}a.fc-event-primary-dim{background-color:#e0f4ef !important;border-color:#e0f4ef !important;color:#0fac81 !important}a.fc-event-primary-dim .fc-daygrid-event-dot,a.fc-event-primary-dim .fc-list-event-dot{border-color:#0fac81 !important}.modal-header.fc-event-primary-dim{background-color:#e0f4ef !important;color:#0fac81 !important;border-color:#cdede5 !important}.modal-header.fc-event-primary-dim .close,.modal-header.fc-event-primary-dim .modal-title{color:#0fac81 !important}span.fc-event-primary-dim .dot{background-color:#e0f4ef !important;border-color:#0fac81 !important}.fc-event-primary-dim:not(a) .fc-list-event-dot{background-color:#e0f4ef !important;border-color:#13dba4 !important}a.fc-event-success-dim{background-color:#e2fbf4 !important;border-color:#e2fbf4 !important;color:#1ee0ac !important}a.fc-event-success-dim .fc-daygrid-event-dot,a.fc-event-success-dim .fc-list-event-dot{border-color:#1ee0ac !important}.modal-header.fc-event-success-dim{background-color:#e2fbf4 !important;color:#1ee0ac !important;border-color:#ccf8ec !important}.modal-header.fc-event-success-dim .close,.modal-header.fc-event-success-dim .modal-title{color:#1ee0ac !important}span.fc-event-success-dim .dot{background-color:#e2fbf4 !important;border-color:#1ee0ac !important}.fc-event-success-dim:not(a) .fc-list-event-dot{background-color:#e2fbf4 !important;border-color:#4ae7bd !important}a.fc-event-info-dim{background-color:#dff7fb !important;border-color:#dff7fb !important;color:#09c2de !important}a.fc-event-info-dim .fc-daygrid-event-dot,a.fc-event-info-dim .fc-list-event-dot{border-color:#09c2de !important}.modal-header.fc-event-info-dim{background-color:#dff7fb !important;color:#09c2de !important;border-color:#c8f1f8 !important}.modal-header.fc-event-info-dim .close,.modal-header.fc-event-info-dim .modal-title{color:#09c2de !important}span.fc-event-info-dim .dot{background-color:#dff7fb !important;border-color:#09c2de !important}.fc-event-info-dim:not(a) .fc-list-event-dot{background-color:#dff7fb !important;border-color:#24daf6 !important}a.fc-event-warning-dim{background-color:#fef6e0 !important;border-color:#fef6e0 !important;color:#f4bd0e !important}a.fc-event-warning-dim .fc-daygrid-event-dot,a.fc-event-warning-dim .fc-list-event-dot{border-color:#f4bd0e !important}.modal-header.fc-event-warning-dim{background-color:#fef6e0 !important;color:#f4bd0e !important;border-color:#fdefc7 !important}.modal-header.fc-event-warning-dim .close,.modal-header.fc-event-warning-dim .modal-title{color:#f4bd0e !important}span.fc-event-warning-dim .dot{background-color:#fef6e0 !important;border-color:#f4bd0e !important}.fc-event-warning-dim:not(a) .fc-list-event-dot{background-color:#fef6e0 !important;border-color:#f6ca3f !important}a.fc-event-danger-dim{background-color:#fce9e7 !important;border-color:#fce9e7 !important;color:#e85347 !important}a.fc-event-danger-dim .fc-daygrid-event-dot,a.fc-event-danger-dim .fc-list-event-dot{border-color:#e85347 !important}.modal-header.fc-event-danger-dim{background-color:#fce9e7 !important;color:#e85347 !important;border-color:#f9d4d0 !important}.modal-header.fc-event-danger-dim .close,.modal-header.fc-event-danger-dim .modal-title{color:#e85347 !important}span.fc-event-danger-dim .dot{background-color:#fce9e7 !important;border-color:#e85347 !important}.fc-event-danger-dim:not(a) .fc-list-event-dot{background-color:#fce9e7 !important;border-color:#ee7d74 !important}a.fc-event-secondary-dim{background-color:#e5ecf5 !important;border-color:#e5ecf5 !important;color:#364a63 !important}a.fc-event-secondary-dim .fc-daygrid-event-dot,a.fc-event-secondary-dim .fc-list-event-dot{border-color:#364a63 !important}.modal-header.fc-event-secondary-dim{background-color:#e5ecf5 !important;color:#364a63 !important;border-color:#d3dfee !important}.modal-header.fc-event-secondary-dim .close,.modal-header.fc-event-secondary-dim .modal-title{color:#364a63 !important}span.fc-event-secondary-dim .dot{background-color:#e5ecf5 !important;border-color:#364a63 !important}.fc-event-secondary-dim:not(a) .fc-list-event-dot{background-color:#e5ecf5 !important;border-color:#486384 !important}a.fc-event-dark-dim{background-color:#d9e1ef !important;border-color:#d9e1ef !important;color:#1f2b3a !important}a.fc-event-dark-dim .fc-daygrid-event-dot,a.fc-event-dark-dim .fc-list-event-dot{border-color:#1f2b3a !important}.modal-header.fc-event-dark-dim{background-color:#d9e1ef !important;color:#1f2b3a !important;border-color:#c7d3e7 !important}.modal-header.fc-event-dark-dim .close,.modal-header.fc-event-dark-dim .modal-title{color:#1f2b3a !important}span.fc-event-dark-dim .dot{background-color:#d9e1ef !important;border-color:#1f2b3a !important}.fc-event-dark-dim:not(a) .fc-list-event-dot{background-color:#d9e1ef !important;border-color:#31445b !important}a.fc-event-blue-dim{background-color:#e9f2fe !important;border-color:#e9f2fe !important;color:#559bfb !important}a.fc-event-blue-dim .fc-daygrid-event-dot,a.fc-event-blue-dim .fc-list-event-dot{border-color:#559bfb !important}.modal-header.fc-event-blue-dim{background-color:#e9f2fe !important;color:#559bfb !important;border-color:#d1e4fd !important}.modal-header.fc-event-blue-dim .close,.modal-header.fc-event-blue-dim .modal-title{color:#559bfb !important}span.fc-event-blue-dim .dot{background-color:#e9f2fe !important;border-color:#559bfb !important}.fc-event-blue-dim:not(a) .fc-list-event-dot{background-color:#e9f2fe !important;border-color:#87b8fc !important}a.fc-event-azure-dim{background-color:#e1edfe !important;border-color:#e1edfe !important;color:#1676fb !important}a.fc-event-azure-dim .fc-daygrid-event-dot,a.fc-event-azure-dim .fc-list-event-dot{border-color:#1676fb !important}.modal-header.fc-event-azure-dim{background-color:#e1edfe !important;color:#1676fb !important;border-color:#c8defd !important}.modal-header.fc-event-azure-dim .close,.modal-header.fc-event-azure-dim .modal-title{color:#1676fb !important}span.fc-event-azure-dim .dot{background-color:#e1edfe !important;border-color:#1676fb !important}.fc-event-azure-dim:not(a) .fc-list-event-dot{background-color:#e1edfe !important;border-color:#4893fc !important}a.fc-event-indigo-dim{background-color:#e4e5ef !important;border-color:#e4e5ef !important;color:#2c3782 !important}a.fc-event-indigo-dim .fc-daygrid-event-dot,a.fc-event-indigo-dim .fc-list-event-dot{border-color:#2c3782 !important}.modal-header.fc-event-indigo-dim{background-color:#e4e5ef !important;color:#2c3782 !important;border-color:#d4d6e6 !important}.modal-header.fc-event-indigo-dim .close,.modal-header.fc-event-indigo-dim .modal-title{color:#2c3782 !important}span.fc-event-indigo-dim .dot{background-color:#e4e5ef !important;border-color:#2c3782 !important}.fc-event-indigo-dim:not(a) .fc-list-event-dot{background-color:#e4e5ef !important;border-color:#3947a8 !important}a.fc-event-purple-dim{background-color:#efecff !important;border-color:#efecff !important;color:#816bff !important}a.fc-event-purple-dim .fc-daygrid-event-dot,a.fc-event-purple-dim .fc-list-event-dot{border-color:#816bff !important}.modal-header.fc-event-purple-dim{background-color:#efecff !important;color:#816bff !important;border-color:#dad3ff !important}.modal-header.fc-event-purple-dim .close,.modal-header.fc-event-purple-dim .modal-title{color:#816bff !important}span.fc-event-purple-dim .dot{background-color:#efecff !important;border-color:#816bff !important}.fc-event-purple-dim:not(a) .fc-list-event-dot{background-color:#efecff !important;border-color:#ac9eff !important}a.fc-event-pink-dim{background-color:#ffebf3 !important;border-color:#ffebf3 !important;color:#ff63a5 !important}a.fc-event-pink-dim .fc-daygrid-event-dot,a.fc-event-pink-dim .fc-list-event-dot{border-color:#ff63a5 !important}.modal-header.fc-event-pink-dim{background-color:#ffebf3 !important;color:#ff63a5 !important;border-color:#ffd2e4 !important}.modal-header.fc-event-pink-dim .close,.modal-header.fc-event-pink-dim .modal-title{color:#ff63a5 !important}span.fc-event-pink-dim .dot{background-color:#ffebf3 !important;border-color:#ff63a5 !important}.fc-event-pink-dim:not(a) .fc-list-event-dot{background-color:#ffebf3 !important;border-color:#ff96c2 !important}a.fc-event-orange-dim{background-color:#fff3e9 !important;border-color:#fff3e9 !important;color:#ffa353 !important}a.fc-event-orange-dim .fc-daygrid-event-dot,a.fc-event-orange-dim .fc-list-event-dot{border-color:#ffa353 !important}.modal-header.fc-event-orange-dim{background-color:#fff3e9 !important;color:#ffa353 !important;border-color:#ffe5d0 !important}.modal-header.fc-event-orange-dim .close,.modal-header.fc-event-orange-dim .modal-title{color:#ffa353 !important}span.fc-event-orange-dim .dot{background-color:#fff3e9 !important;border-color:#ffa353 !important}.fc-event-orange-dim:not(a) .fc-list-event-dot{background-color:#fff3e9 !important;border-color:#ffbe86 !important}a.fc-event-teal-dim{background-color:#e2f8f1 !important;border-color:#e2f8f1 !important;color:#20c997 !important}a.fc-event-teal-dim .fc-daygrid-event-dot,a.fc-event-teal-dim .fc-list-event-dot{border-color:#20c997 !important}.modal-header.fc-event-teal-dim{background-color:#e2f8f1 !important;color:#20c997 !important;border-color:#cdf3e7 !important}.modal-header.fc-event-teal-dim .close,.modal-header.fc-event-teal-dim .modal-title{color:#20c997 !important}span.fc-event-teal-dim .dot{background-color:#e2f8f1 !important;border-color:#20c997 !important}.fc-event-teal-dim:not(a) .fc-list-event-dot{background-color:#e2f8f1 !important;border-color:#3ce0af !important}.fc-draggable{background-color:#0fac81;border-radius:4px;margin:.75rem 0;padding:.25rem .5rem;font-size:13px;color:#fff;list-style:none;display:inline-block}.fc-day{color:#364a63}.fc-day-other{color:#526484}.fc-col-header-cell{color:#526484}.nk-kanban{overflow:auto;padding-bottom:1rem}.kanban-container{position:relative;box-sizing:border-box;width:auto;display:flex;margin-left:-14px;margin-right:-14px;overflow:auto}.kanban-container>*{touch-action:pan-y}.kanban-container *{box-sizing:border-box}.kanban-board{padding:14px;position:relative;transition:all .3s cubic-bezier(0.23, 1, 0.32, 1);flex-shrink:0}.kanban-board.disabled-board{opacity:.3}.kanban-board.is-moving.gu-mirror{transform:rotate(3deg)}.kanban-board.is-moving.gu-mirror .kanban-drag{overflow:hidden;padding-right:50px}.kanban-board-header{background:#fff;border:1px solid #e5e9f2;border-top:3px solid #dbdfea;border-radius:4px;padding:.5rem 1.25rem;margin-bottom:1rem}.kanban-primary{border-top-color:#0fac81}.kanban-success{border-top-color:#1ee0ac}.kanban-info{border-top-color:#09c2de}.kanban-warning{border-top-color:#f4bd0e}.kanban-danger{border-top-color:#e85347}.kanban-title-content{display:flex;align-items:center}.kanban-title-content .title{font-size:.9375rem;margin-bottom:0;margin-right:.75rem;color:#526484}.kanban-title-board{display:flex;align-items:center;justify-content:space-between}.kanban-board header .kanban-title-button{float:right}.kanban-board .kanban-drag{min-height:100px;margin-bottom:1rem}.kanban-board .kanban-drag:empty{border-radius:4px;border:1px dashed #e5e9f2}.kanban-board:after{clear:both;display:block;content:""}.kanban-item{border-radius:4px;border:1px solid #e5e9f2;padding:1rem 1.25rem;margin-bottom:.75rem;background:#fff;transition:all .3s cubic-bezier(0.23, 1, 0.32, 1)}.kanban-item-title{display:flex;align-items:center;justify-content:space-between}.kanban-item-title+.kanban-item-text{margin-top:.5rem}.kanban-item-title .title{font-size:.9375rem;margin-bottom:0;margin-right:.75rem}.kanban-item-tags{display:flex;padding-top:.5rem;margin:-0.125rem}.kanban-item-tags li{padding:.125rem}.kanban-item-meta{display:flex;align-items:flex-end;justify-content:space-between;padding-top:.5rem}.kanban-item-meta-list{display:flex;align-items:center;flex-wrap:wrap;margin:0 -0.25rem}.kanban-item-meta-list:last-child{flex-wrap:nowrap}.kanban-item-meta-list:first-child{padding-right:1rem}.kanban-item-meta-list li{font-size:.8125rem;padding:0 .25rem;color:#8094ae}.kanban-item-meta-list li span{white-space:nowrap}.kanban-item-meta-list li .icon+span{margin-left:.25rem}.kanban-item:hover{cursor:move}.kanban-item:last-child{margin:0}.kanban-item.is-moving.gu-mirror{transform:rotate(3deg);height:auto !important}.gu-mirror{position:fixed !important;margin:0 !important;z-index:9999 !important}.gu-hide{display:none !important}.gu-unselectable{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.gu-transit{opacity:.2 !important;transform:rotate(0deg) !important}.drag_handler{background:#fff;border-radius:50%;width:24px;height:24px;position:relative;top:-3px;float:left;margin-right:4px}.drag_handler:hover{cursor:move}.drag_handler_icon{position:relative;display:block;background:#000;width:24px;height:2px;top:12px;transition:.5s ease-in-out}.drag_handler_icon:before,.drag_handler_icon:after{background:#000;content:"";display:block;width:100%;height:100%;position:absolute;transition:.5s ease-in-out}.drag_handler_icon:before{top:6px}.drag_handler_icon:after{bottom:6px}.kanban-add-task{color:#0fac81;background:#fff;border:1px dashed #e5e9f2;padding-top:.675rem;padding-bottom:.675rem}.kanban-add-task:hover{color:#fff;background:#0fac81;border:1px solid #0fac81}.kanban-add-task:focus{outline:none;box-shadow:none}.dual-listbox{display:flex;flex-direction:column}.dual-listbox .dual-listbox__container{display:flex;align-items:center;flex-direction:row;flex-wrap:wrap}.dual-listbox .dual-listbox__search{max-width:300px}.dual-listbox .dual-listbox__search--hidden{display:none}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{border:1px solid #e5e9f2;height:300px;overflow-y:auto;padding:0;width:300px;margin-top:0;border-radius:0 0 4px 4px}.dual-listbox .dual-listbox__buttons{display:flex;flex-direction:column;margin:10px;padding:10px 10px 0}.dual-listbox .dual-listbox__button{margin-bottom:5px;justify-content:center;text-transform:capitalize}.dual-listbox .dual-listbox__title{font-size:1rem;font-weight:500;padding:.5rem 1rem;border-left:1px solid #e5e9f2;border-right:1px solid #e5e9f2;border-top:1px solid #e5e9f2;margin-top:1rem;-webkit-margin-before:1rem;border-radius:4px 4px 0 0}.dual-listbox .dual-listbox__item{display:block;padding:.5rem 1rem;cursor:pointer;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;border-bottom:1px solid #e5e9f2;transition:background-color .2s ease}@media(min-width: 576px)and (max-width: 991.98px){.dual-listbox .dual-listbox__container{flex-wrap:nowrap}.dual-listbox .dual-listbox__container>div:not(.dual-listbox__buttons){width:100%}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{width:auto}.dual-listbox .dual-listbox__buttons{margin:10px auto}.dual-listbox__buttons{flex-shrink:0}}@media(max-width: 575.98px){.dual-listbox .dual-listbox__container>div:not(.dual-listbox__buttons){width:100%}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{width:100%}.dual-listbox .dual-listbox__buttons{margin:10px auto 0}}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;box-shadow:none;touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}button.mfp-close{overflow:visible;cursor:pointer;border:0;-webkit-appearance:none;display:flex;align-items:center;justify-content:center;outline:none;padding:0;z-index:1046;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;transform:translate(50%, -50%);color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace;background-color:#fff;border-radius:50%}.mfp-close:hover,.mfp-close:focus{opacity:1}.mfp-close:active{top:1px}.mfp-close:after{position:absolute;font-family:"Nioicon";content:"";color:#526484}.mfp-close-btn-in .mfp-close{color:#333}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px;white-space:nowrap}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1}.mfp-arrow:before,.mfp-arrow:after{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:calc(100% - 34px);max-width:900px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000;border-radius:8px}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;box-sizing:border-box;margin:0 auto;border-radius:8px}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small,.mfp-figure .small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:calc(100% - 34px)}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small,.mfp-img-mobile .mfp-figure .small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.gu-mirror{position:fixed !important;margin:0 !important;z-index:9999 !important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80);cursor:grabbing}.gu-hide{display:none !important}.gu-unselectable{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.dragula-container>*:not(:last-child){margin-bottom:.75rem}.dragula-container>*{cursor:move;cursor:grab;touch-action:none}.dragula-container.has-handle>*{cursor:initial}.dragula-handle{display:flex}.dragula-handle .handle{position:relative;font-size:1.125rem;cursor:move;margin:0 .875rem}.dragula-handle .handle:after{position:absolute;top:0;right:0;bottom:0;font-family:"Nioicon";content:"";font-size:1rem}.google-map{height:400px;width:100%}body{min-width:320px}body.nav-shown{overflow:hidden}.nk-body{outline:none}.nk-app-root{outline:none}.nk-main{position:relative}.nk-wrap{display:flex;flex-direction:column;min-height:100vh}.nk-content{padding:20px 4px}.nk-content-fs{min-height:calc(100vh - (65px + 65px));display:flex;align-items:center}@media(min-width: 576px){.nk-content{padding:24px 22px}.nk-content-fluid{padding-left:22px;padding-right:22px}}@media(min-width: 992px){.nk-content-lg{padding-top:30px;padding-bottom:30px}.nk-content-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1200px){.nk-content{padding:14px 22px 24px}}@media(min-width: 1660px){.nk-content-lg{padding-top:45px;padding-bottom:45px}.nk-content-fluid{padding-left:44px;padding-right:44px}}.nk-content-body{flex-grow:1}.nk-wrap-nosidebar .nk-content{padding:0 !important;min-height:100vh;display:flex;flex-direction:column}.logo-link{position:relative;display:inline-block;align-items:center}.logo-dark{opacity:1}.tc-light .logo-dark,.is-dark .logo-dark,.is-theme .logo-dark{opacity:0}.logo-light{opacity:0}.tc-light .logo-light,.is-dark .logo-light,.is-theme .logo-light{opacity:1}.logo-img{max-height:36px}.logo-img-lg{max-height:60px}.logo-img-sm{max-height:28px}.logo-img-icon{max-height:33px}.logo-img:not(:first-child){position:absolute;left:0;top:50%;transform:translateY(-50%)}.nk-header{padding:0 6px;border-bottom:1px solid #e5e9f2;z-index:1010}.nk-header-fixed{position:fixed;top:0;left:0;right:0;background:#fff;min-width:320px}.nk-header-fixed+.nk-content{margin-top:65px;position:relative}.nk-header-wrap{position:relative;display:flex;align-items:center;margin:0 -0.25rem}.nk-header-wrap>*{padding:0 .25rem}.nk-header-right{align-items:center;justify-content:flex-end}.nk-header-center{justify-content:center}.nk-header-tools{margin-left:auto;padding-top:14px;padding-bottom:14px}.nk-header-brand{flex-shrink:0;padding-top:14px;padding-bottom:14px}.nk-header-search{display:none}.nk-header-search .form-control,.nk-header-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-header-search input,.nk-header-search .dual-listbox .dual-listbox__search,.dual-listbox .nk-header-search .dual-listbox__search{background-color:rgba(0,0,0,0);border:none}.is-dark .nk-header-search .icon{color:#fff}.is-theme .nk-header-search .icon{color:#fff}.nk-header .dropdown-menu .lead-text{color:#364a63}.nk-header .dropdown-menu .sub-text,.nk-header .dropdown-menu .overline-title,.nk-header .dropdown-menu .overline-title-alt{color:#8094ae}.nk-quick-nav{display:flex;align-items:center;margin:0 -6px}.nk-quick-nav>li{padding:0 6px}.nk-quick-nav>li.user-dropdown>a{padding:0 2px}.nk-quick-nav-icon{display:inline-flex;position:relative;font-size:1.5rem;z-index:1;color:#526484;padding:.375rem}.is-dark .nk-quick-nav-icon{color:#9faec2}.is-theme .nk-quick-nav-icon{color:#abe2d3}.is-theme .nk-quick-nav-icon.nk-nav-toggle{color:#fff}.nk-quick-nav-icon:focus{box-shadow:none}.nk-quick-nav-icon:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.is-dark .nk-quick-nav-icon:before{background-color:#0b1219}.is-theme .nk-quick-nav-icon:before{background-color:#03231a}.show>.nk-quick-nav-icon:before{opacity:1;height:116%;width:116%}.nk-quick-nav-icon:hover:before,.nk-quick-nav-icon.active:before{opacity:1;height:116%;width:116%}@media(max-width: 359px){.nk-quick-nav{margin:0 -3px}.nk-quick-nav>li{padding:0 3px}.hide-mb-xs{display:none}}@media(max-width: 575px){.hide-mb-sm{display:none}}@media(min-width: 576px){.nk-header{padding-left:22px;padding-right:22px}.nk-header-search{display:flex;align-items:center;flex-grow:1}.nk-quick-nav{margin:0 -10px}.nk-quick-nav>li{padding:0 10px}}@media(min-width: 992px){.nk-header-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1200px){.nk-header{border-bottom:none;padding-top:.5rem}.nk-header-fixed{left:340px}}.nk-header-menu{position:fixed;top:0;left:0;transform:translateX(-100%);width:280px;height:100vh;max-height:100vh;z-index:999;background:#fff}.nk-header-menu-inner{max-height:100%;min-height:100%}.nk-header-menu.mobile-menu{padding-top:65px;padding-left:0;padding-right:0;transition:transform .4s ease}.nk-header-menu.nk-sidebar-active{transform:translateX(0)}.nk-header-mobile{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:0 28px;border-bottom:1px solid #e5e9f2}.nk-header-mobile .logo-dark{opacity:1}.nk-header-mobile .logo-light{opacity:0}.nk-header-mobile .nk-nav-toggle.nk-quick-nav-icon{color:#526484}.nk-header-mobile .nk-nav-toggle.nk-quick-nav-icon:before{background-color:#e5e9f2}@media(min-width: 992px){.nk-header-menu{position:static;background:rgba(0,0,0,0);height:auto;max-height:auto;border-right:none;width:auto;padding:0;overflow:visible;transform:translateX(0) !important}.nk-header-menu .nk-header-mobile{display:none}}.nk-header-app-name{display:flex;align-items:center;flex-shrink:0}.nk-header-app-logo{flex-shrink:0;width:32px;height:32px;margin-right:.75rem}.nk-header-app-logo .icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;font-size:20px;color:#0fac81;background:rgba(15,172,129,.3)}.nk-header-app-info{line-height:1.3}.nk-header-app-info .sub-text{font-size:11px;margin-bottom:.125rem}.nk-header-app-info .lead-text{font-size:14px}.nk-header-app-switch{position:relative}.nk-header-app-switch .nk-header-app-name{padding:1.5rem 24px}.nk-header-app-switch>a{display:block;width:100%}.nk-header-app-switch>a:after{position:absolute;right:24px;top:50%;transform:translateY(-50%);font-size:1rem;content:"";font-family:"Nioicon"}.mobile-menu .nk-header-app-switch{width:100%;border-bottom:1px solid #e5e9f2}.nk-header-app-switch .toggle-content{width:100%;top:0;transform:translateY(0);height:calc(100vh - 65px);overflow:auto;box-shadow:none;border-radius:0;background:#fff}.nk-header-app-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 24px}.nk-header-app-head .title{font-size:16px;font-weight:500}.nk-header-app-head .toggle{position:relative;height:24px;width:24px;display:inline-flex;align-items:center;justify-content:center}.nk-header-app-list li{border-bottom:1px solid #e5e9f2}.nk-header-app-list .nk-header-app-name{padding:1rem 24px}@media(max-height: 615px){.nk-header-app-switch .dropdown-menu{max-height:416px;overflow:auto}}@media(min-width: 768px){.nk-header-onlymobile{display:none}.nk-header-onlymobile+.nk-content{margin-top:0}}.quick-icon{display:inline-flex;height:24px;width:24px;border-radius:50%}.quick-icon img.icon{border-radius:50%}.nk-sidebar{position:fixed;top:0;display:flex;width:340px;min-height:100vh;max-height:100vh;box-shadow:1px 0px 6px 0px rgba(54,74,99,.08);z-index:1021;left:0;transform:translateX(-100%);transition:left 450ms ease,transform 450ms ease}.nk-sidebar-bar{width:81px;background:#f5f6fa;border-right:1px solid #e5e9f2}.nk-sidebar-bar.is-light{background:#fff;border-right-color:#ebeef2}.nk-sidebar-bar.is-dark{background:#101924;border-right-color:#203247}.nk-sidebar-bar.is-dark+.is-dark{background:#131e2b}.nk-sidebar-bar.is-theme{background:#064936;border-right-color:#0a7859}.nk-sidebar-bar.is-theme+.is-theme{background:#07523d}.nk-sidebar-bar .dropdown-menu .lead-text{color:#364a63}.nk-sidebar-bar .dropdown-menu .sub-text,.nk-sidebar-bar .dropdown-menu .overline-title,.nk-sidebar-bar .dropdown-menu .overline-title-alt{color:#8094ae}.nk-sidebar-main{flex-grow:1;width:259px;background:#f5f6fa;border-right:1px solid #e5e9f2}.nk-sidebar-main.is-light{background:#fff;border-right-color:#ebeef2}.nk-sidebar-main.is-dark{background:#101924;border-right-color:#203247}.nk-sidebar-main.is-theme{background:#064936;border-right-color:#0a7859}.nk-sidebar-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:801;animation:overlay-fade-in .4s ease 1}.nk-sidebar-element{overflow:hidden;width:100%;max-height:100%}.nk-sidebar.nk-sidebar-active{transform:translateX(0)}.nk-sidebar-fixed{position:fixed;max-height:100vh}.nk-sidebar-head{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;min-width:100%;width:340px;height:65px;border-bottom:1px solid #e5e9f2}.is-dark .nk-sidebar-head{border-color:#203247}.is-theme .nk-sidebar-head{border-color:#0a7859}.nk-sidebar-brand{position:relative;flex-shrink:0}.nk-sidebar-logo{transition:opacity .3s ease}.nk-sidebar-logo .logo-img:not(:first-child){position:absolute;left:0;top:50%;transform:translateY(-50%)}.nk-sidebar-footer{margin-top:auto;padding:.75rem .1875rem .5rem}.nk-sidebar-body{position:relative}.nk-sidebar-body .simplebar-content{padding-bottom:.25rem !important;min-height:100%;display:flex;flex-direction:column}.nk-sidebar-body .simplebar-scroll-content{min-height:100%;width:100%}.nk-sidebar-content{display:flex;flex-direction:column;height:calc(100vh - (65px + 60px))}.nk-sidebar-content .nk-sidebar-menu{padding-top:1.5rem}.nk-sidebar-content .nk-sidebar-menu[data-simplebar]{height:100%}.nk-sidebar-content[data-simplebar]>div{width:100%}.nk-sidebar-profile-fixed{position:fixed;bottom:0;width:81px;display:flex;justify-content:center;padding:.25rem 0 1rem;z-index:9}.nk-sidebar-profile-dropdown.content-active{display:block;left:100%;bottom:0}.nk-sidebar-inner{padding:1.5rem 1.75rem 2rem;max-height:calc(100vh - 65px)}.nk-sidebar.mobile-menu{transition:transform .4s ease}.nk-sidebar .nk-menu:not(.apps-menu) .nk-menu-heading{padding-left:0;padding-right:0}.nk-sidebar .nk-menu:not(.apps-menu) .nk-menu-toggle:after{right:0}.nk-sidebar .nk-menu:not(.apps-menu)>li>a{padding-left:0;padding-right:0}@keyframes overlay-fade-in{0%{opacity:0}100%{opacity:1}}@media(max-width: 991.98px){.nk-sidebar-mobile{width:340px !important}}@media(max-width: 575.98px){.nk-sidebar-inner{padding:1.25rem 1.25rem 2.5rem}}@media(min-width: 1200px){.nk-sidebar-content .nk-sidebar-menu{padding-top:.25rem;padding-bottom:1.5rem}.nk-sidebar{transform:translateX(0)}.nk-sidebar-overlay{display:none}.has-sidebar .nk-wrap{padding-left:340px}}@media(max-width: 420px){.nk-sidebar-main{max-width:calc(100vw - 81px - 20px)}.nk-sidebar-profile-dropdown{max-width:calc(100vw - 81px - 10px);min-width:calc(100vw - 81px - 10px)}}.nk-apps-brand .logo-link{position:relative;padding:1.25rem 1.5rem 1.25rem}.nk-apps-brand .logo-img:not(:first-child){left:1.5rem}.nk-apps-brand.has-dropdown .logo-link:after{position:absolute;bottom:0;left:50%;transform:translateX(-50%);content:"";font-family:"Nioicon";color:#8094ae;font-size:1.25rem}.nk-apps-brand:hover .nk-apps-dropdown{opacity:1;transform:translateX(0);visibility:visible}.nk-apps-dropdown{position:absolute;top:0;left:0;border-radius:0 0 4px 0;transform:translateX(-25px);width:280px;background:#fff;box-shadow:0 .125rem .25rem rgba(43,55,72,.15);z-index:1109;opacity:0;visibility:hidden;transition:all .3s}.nk-apps-dropdown-list li:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-apps-dropdown-item{display:flex;align-items:center;padding:1.25rem 1.5rem}.nk-apps-dropdown-icon{flex-shrink:0;width:36px}.nk-apps-dropdown-icon+.nk-apps-dropdown-text{margin-left:1rem}.nk-sidebar-short{overflow:hidden;width:81px;box-shadow:1px 0px 6px 0px rgba(54,74,99,.08);flex-direction:column}.nk-sidebar-short.nk-sidebar-mobile .nk-sidebar-logo{opacity:1}.nk-sidebar-short.nk-sidebar-mobile .nk-sidebar-menu-middle{margin-top:0}.nk-sidebar-short .nk-sidebar-logo{opacity:0}.nk-sidebar-short .nk-sidebar-logo-small{display:none}.nk-sidebar-short .nk-sidebar-menu-middle{margin-top:auto}.nk-sidebar-short .nk-sidebar-footer{padding:1rem 0}.nk-sidebar-short .nk-menu-trigger{display:none}@media(min-width: 768px){.nk-sidebar-short{transform:none}.nk-sidebar-short.nk-sidebar-mobile{width:80px !important}.nk-sidebar-short+.nk-wrap{padding-left:81px}.nk-sidebar-short .nk-sidebar-head{width:80px;border-bottom:none}.nk-sidebar-short .nk-sidebar-logo{display:none}.nk-sidebar-short .nk-sidebar-logo-small{display:block}}.nk-menu li a{vertical-align:middle;display:flex;position:relative;align-items:center;transition:color .3s,background-color .3s}.nk-menu-item{padding:2px 0}.nk-menu-sub .nk-menu-item{padding:1px 0}.nk-menu-item.has-sub{position:relative}.nk-menu>.nk-menu-item.menu-without-icon>.nk-menu-sub .nk-menu-link{padding-left:0}.nk-menu-link{padding:.375rem 40px .375rem 24px;color:#6e82a5;font-family:Nunito,sans-serif;font-weight:700;font-size:14px;letter-spacing:.01em;text-transform:none;line-height:1.25rem}.nk-menu-link:hover,.active>.nk-menu-link{color:#11c393}.nk-menu-link:hover .count,.active>.nk-menu-link .count{color:#11c393}.nk-menu-sub .nk-menu-link{padding:.375rem 28px .375rem 28px;font-family:Nunito,sans-serif;font-weight:400;font-size:13px;letter-spacing:normal;text-transform:none;line-height:1.25rem;color:#6e82a5}.no-icon .nk-menu-sub .nk-menu-link{padding:.375rem 28px .375rem 18.6666666667px}.nk-menu-link.is-disable{cursor:default}.nk-menu-link.is-disable:hover,.active>.nk-menu-link.is-disable{color:#6e82a5}.nk-menu-link.is-disable:hover .count,.active>.nk-menu-link.is-disable .count{color:#6e82a5}.is-light .nk-menu-link{color:#526484}.is-theme .nk-menu-link{color:#8dd8c3}.is-light .nk-menu-link:hover,.is-light .active>.nk-menu-link{color:#11c393}.is-theme .nk-menu-link:hover,.is-theme .active>.nk-menu-link{color:#fff}.nk-menu-link span.small{color:#8094ae;margin-left:.5rem}.nk-menu-icon{font-weight:normal;letter-spacing:normal;width:28px;line-height:1;flex-grow:0;color:#8094ae}.is-theme .nk-menu-icon{color:#8dd8c3}.nk-menu-icon svg,.nk-menu-icon img{width:28px}.nk-menu-icon .icon{font-size:18px;letter-spacing:normal;vertical-align:middle;color:currentColor;transition:color .4s,background-color .4s}.nk-menu-link:hover .nk-menu-icon,.nk-menu-item.active>.nk-menu-link .nk-menu-icon,.nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon{color:#11c393}.is-theme .nk-menu-link:hover .nk-menu-icon,.is-theme .nk-menu-item.active>.nk-menu-link .nk-menu-icon,.is-theme .nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon{color:#fff}.nk-menu-link.is-disable:hover .nk-menu-icon{color:#8094ae}.is-theme .nk-menu-link.is-disable:hover .nk-menu-icon{color:#abe2d3}.nk-menu-text{flex-grow:1;display:inline-block}.nk-menu-badge{border-radius:3px;padding:0 .4rem;font-size:11px;color:#3fbd9a;background:#e2f5f0;position:absolute;top:50%;right:24px;transform:translateY(-50%)}.is-dark .nk-menu-badge{color:#6fcdb3;background:#203247}.is-theme .nk-menu-badge{color:#abe2d3;background:#0b8160}.nk-menu-main .nk-menu-sub .nk-menu-badge{color:#3fbd9a;background:#e2f5f0}.nk-menu-main .nk-menu-badge{position:static;transform:translateY(0);margin-left:.5rem}.nk-menu-heading{padding:.25rem 24px .5rem;color:#8094ae}.is-theme .nk-menu-heading{color:#72ceb5}.nk-menu-item+.nk-menu-heading{padding-top:2.5rem}.nk-menu-heading .overline-title{color:inherit}.nk-menu-heading span{font-size:13px;font-weight:400}.nk-menu-hr{margin:1.25rem 0;border-bottom:1px solid #dbdfea}.is-dark .nk-menu-hr{border-color:rgba(255,255,255,.12)}.is-theme .nk-menu-hr{border-color:rgba(255,255,255,.12)}.nk-menu-hr+.nk-menu-heading{padding-top:1rem}.nk-menu-sub{padding-bottom:.25rem}.nk-menu-toggle+.nk-menu-sub{display:none}.active>.nk-menu-sub{display:block}.nk-menu-sub .nk-menu-link:hover{color:#0fac81}.is-theme .nk-menu-sub .nk-menu-link:hover{color:#fff}.nk-menu-sub .active>.nk-menu-link{color:#0fac81}.is-theme .nk-menu-sub .active>.nk-menu-link{color:#fff}.nk-menu-sub .nk-menu-icon{width:24px;margin-top:-1px}.nk-menu-sub .nk-menu-icon .icon{margin-top:-1px;font-size:1.2em}.nk-menu-sub .nk-menu-sub{margin-left:1.25rem}.nk-menu-toggle{position:relative}.nk-menu-toggle:after{position:absolute;font-family:"Nioicon";top:50%;right:1.25rem;content:"";transform:translateY(-50%);font-size:1rem;color:#8094ae;transition:transform .3s,color .1s}.is-dark .nk-menu-toggle:after,.is-theme .nk-menu-toggle:after{color:rgba(255,255,255,.4)}.has-sub.active>.nk-menu-toggle:after{transform:translateY(-50%) rotate(90deg)}.nk-menu .count{display:inline-block;font-size:.85em;margin-left:.25rem;color:#8094ae;line-height:1}.nk-menu-icon-colored .nk-menu-icon{color:#0fac81}.nk-menu-tooltip{position:absolute;top:0;right:0;bottom:0;left:0}.nk-menu-content{display:none}.nk-menu-content.menu-active{display:block}.nk-menu-content .title{margin:.325rem 0 1.5rem}.nk-menu+.nk-menu-md{padding-top:5rem}.nk-menu-md .nk-menu-heading{color:#526484}.nk-menu-md .nk-menu-link{padding-top:.325rem;padding-bottom:.325rem}.nk-menu-md .nk-menu-sub .nk-menu-link{padding:.375rem 32px .375rem 1.75rem}.nk-menu-md .nk-menu-sub .nk-menu-sub{border-left:1px solid #e5e9f2;margin-left:1.75rem}.nk-menu-md .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:1rem}.nk-menu-md .nk-menu-icon{width:1.75rem;margin-top:-2px}.nk-menu-md .nk-menu-icon .icon{font-size:1.25rem}.nk-menu-md .nk-menu-text{font-size:14px;line-height:1.25rem}.nk-menu-inline{display:flex}.nk-menu-inline .nk-menu-link{padding-left:0;padding-right:0}.nk-menu-footer{display:flex}.nk-menu-footer .nk-menu-link{padding-left:0;padding-right:0;padding-top:.25rem;padding-bottom:.25rem;color:#8094ae;font-family:Roboto,sans-serif;font-weight:500}.nk-menu-footer .nk-menu-link:hover{color:#11c393}.is-theme .nk-menu-footer .nk-menu-link{color:#abe2d3}.nk-menu-footer .nk-menu-icon{width:1.375rem;color:#0fac81}.nk-menu-footer .nk-menu-icon .icon{font-size:1rem}.nk-menu-footer .nk-menu-text{font-size:12px;line-height:1.125rem}.nk-menu-main.nk-menu{padding-top:.75rem}.nk-menu-main .nk-menu-link{color:#526484;padding-left:24px}.nk-menu-main .nk-menu-sub{padding:0;margin:0;transition:none}.nk-menu-main .nk-menu-sub .nk-menu-link{color:#526484}.nk-menu-main .nk-menu-sub .nk-menu-sub{border-left:1px solid #dbdfea;margin:.25rem 0 .25rem 24px;padding-bottom:0}.nk-menu-main .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:.875rem}.nk-menu-main .nk-menu-link:hover,.nk-menu-main .nk-menu-link:focus,.nk-menu-main .nk-menu-item.active>.nk-menu-link,.nk-menu-main .nk-menu-item.current-menu>.nk-menu-link,.nk-menu-main .nk-menu-item:hover>.nk-menu-link{color:#11c393}.nk-menu-main>li>.nk-menu-link{font-family:Roboto,sans-serif;font-weight:500;letter-spacing:-0.01rem}@media(max-width: 1199.98px){.nk-menu-main.nk-menu{max-height:calc(100vh - 65px);overflow:auto}}@media(min-width: 992px){.nk-menu-main.nk-menu{padding:0 .5rem 0 .5rem}.nk-menu-main>li{padding:0;display:inline-block}.nk-menu-main>li.nk-menu-item{padding:0 .75rem}.nk-menu-main>li.nk-menu-item>.nk-menu-link{padding:1.25rem 0;font-size:15px}.nk-menu-main>li>.nk-menu-link:before{position:absolute;content:"";bottom:0;left:0;right:0;height:3px;background:#11c393;border-radius:3px 3px 0 0;opacity:0}.nk-menu-main>li.nk-menu-item.active>.nk-menu-link:before,.nk-menu-main>li.nk-menu-item.current-menu>.nk-menu-link:before{opacity:1}.nk-menu-main>li>.nk-menu-sub{border-top-left-radius:0;border-top-right-radius:0}.nk-menu-main .nk-menu-link{padding:.5rem 1.25rem;font-size:13px}.nk-menu-main .nk-menu-icon{display:none}.nk-menu-main .nk-menu-text{line-height:1.5rem}.nk-menu-main .nk-menu-item .nk-menu-toggle:after{line-height:1;position:static;transform:translateY(0);content:"";vertical-align:middle;color:rgba(128,148,174,.7);margin-left:.5rem;margin-right:-2px;margin-top:-1px;transition:color .1s}.nk-menu-main .nk-menu-item:hover>.nk-menu-sub{opacity:1;visibility:visible;margin-top:0}.nk-menu-main .nk-menu-sub{position:absolute;left:0;top:100%;width:200px;background:#fff;border:1px solid #e5e9f2;box-shadow:0 .125rem .25rem rgba(43,55,72,.15);border-radius:4px;padding:.5rem 0;opacity:0;visibility:hidden;margin-top:6px;transition:opacity .4s,margin .2s;display:block !important}.nk-menu-main .nk-menu-sub .nk-menu-link{padding-top:.5rem;padding-bottom:.5rem}.nk-menu-main .nk-menu-sub .nk-menu-sub{top:-9px;padding:.5rem 0;border:1px solid #e5e9f2;margin:0;margin-top:6px;margin-left:-0.75rem;left:100%}.nk-menu-main .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:1.5rem}.nk-menu-main .nk-menu-sub .nk-menu-item:hover>a{background:#f5f6fa}.nk-menu-main .nk-menu-sub .nk-menu-toggle:after{content:""}.is-dark .nk-menu-main>li>.nk-menu-link:before,.is-theme .nk-menu-main>li>.nk-menu-link:before{border-radius:0;bottom:auto;top:0}.is-dark .nk-menu-main>li>.nk-menu-link{color:#9faec2}.is-dark .nk-menu-main>li>.nk-menu-link.nk-menu-toggle:after{color:rgba(128,148,174,.7)}.is-dark .nk-menu-main>li:hover>.nk-menu-link,.is-dark .nk-menu-main>li.active>.nk-menu-link,.is-dark .nk-menu-main>li.current-menu>.nk-menu-link,.is-dark .nk-menu-main>li>.nk-menu-link:hover{color:#fff}.is-theme .nk-menu-main>li>.nk-menu-link{color:#abe2d3}.is-theme .nk-menu-main>li>.nk-menu-link.nk-menu-toggle:after{color:rgba(171,226,211,.7)}.is-theme .nk-menu-main>li:hover>.nk-menu-link,.is-theme .nk-menu-main>li.active>.nk-menu-link,.is-theme .nk-menu-main>li.current-menu>.nk-menu-link,.is-theme .nk-menu-main>li>.nk-menu-link:hover{color:#fff}}@media(min-width: 1200px){.nk-menu-main.nk-menu{padding:0 1.5rem 0 2rem}.nk-menu-main>li.nk-menu-item{padding:0 1rem}}.apps-menu .nk-menu-item{padding:.25rem 1.125rem}.apps-menu .nk-menu-link{padding:.625rem;border-radius:4px;text-align:center}.apps-menu .nk-menu-icon{width:100%}.apps-menu .nk-menu-icon .icon{font-size:24px}.apps-menu.nk-menu-md .nk-menu-item{padding:.125rem 1.125rem}.apps-menu.nk-menu-md .nk-menu-link{padding:.625rem;text-align:center}.apps-menu.nk-menu-md .nk-menu-icon{width:100%}.apps-menu.nk-menu-md .nk-menu-icon .icon{font-size:18px}.apps-menu .active>.nk-menu-link{background-color:#fff}.is-light .apps-menu .active>.nk-menu-link{background-color:#e2f5f0}.is-dark .apps-menu .active>.nk-menu-link{background-color:#0b1219}.is-theme .apps-menu .active>.nk-menu-link{background-color:#03231a}@media(min-width: 992px){.apps-menu>li.nk-menu-item.active>.nk-menu-link:before{opacity:1}}.nk-sidebar-mobile .nk-sidebar-footer .short-menu{display:flex;align-items:center;flex-wrap:wrap;padding:0 1rem}.short-menu .nk-menu-item{padding:.125rem .875rem}.nk-sidebar-mobile .nk-sidebar-footer .short-menu .nk-menu-item{width:50%}.nk-sidebar-footer .short-menu .nk-menu-item{padding:.125rem 0}.short-menu .nk-menu-item.active .nk-menu-link{background-color:#fff}.is-light .short-menu .nk-menu-item.active .nk-menu-link{background-color:#e2f5f0}.is-dark .short-menu .nk-menu-item.active .nk-menu-link{background-color:#0b1219}.is-theme .short-menu .nk-menu-item.active .nk-menu-link{background-color:#03231a}.short-menu .nk-menu-link{border-radius:4px;padding:.625rem}.short-menu .nk-menu-link:hover,.short-menu .nk-menu-link.active{background-color:#fff}.is-light .short-menu .nk-menu-link:hover,.is-light .short-menu .nk-menu-link.active{background-color:#e2f5f0}.is-dark .short-menu .nk-menu-link:hover,.is-dark .short-menu .nk-menu-link.active{background-color:#0b1219}.is-theme .short-menu .nk-menu-link:hover,.is-theme .short-menu .nk-menu-link.active{background-color:#03231a}.nk-sidebar-footer .short-menu .nk-menu-link{color:#0fac81;font-size:13px}.nk-sidebar-footer .short-menu .nk-menu-icon{width:28px;color:#0fac81}.nk-sidebar-footer .short-menu .nk-menu-icon .icon{font-size:1.125rem}.short-menu .nk-menu-text{opacity:0}.nk-sidebar-mobile .short-menu .nk-menu-text{opacity:1}.short-menu .nk-menu-tooltip{display:none}@media(min-width: 768px){.nk-sidebar-footer .short-menu{padding:0}.short-menu .nk-menu-item{padding:.125rem 1.125rem}.nk-sidebar-footer .short-menu .nk-menu-item{padding:.125rem 1.3125rem}.short-menu .nk-menu-link{padding:.625rem}.short-menu .nk-menu-icon{text-align:center;width:auto !important}.short-menu .nk-menu-text{display:none}.short-menu .nk-menu-tooltip{display:block}}.nk-footer{margin-top:auto;background:#fff;border-top:1px solid #e5e9f2;padding:20px 6px}.nk-footer.is-dark:not([class*=bg-]){background:#074d3a}.nk-footer-wrap{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}.nk-footer-copyright{color:#8094ae}.nk-footer-copyright a{color:inherit}.nk-footer-copyright a:hover{color:#0fac81}@media(min-width: 576px){.nk-footer{padding:20px 22px}}@media(min-width: 992px){.nk-footer-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1660px){.nk-footer-fluid{padding-left:44px;padding-right:44px}}.nk-split{position:relative;display:flex}.nk-split-page{min-height:100vh}.nk-split-content{position:relative;flex-shrink:0;width:100%;min-height:100%}@media(min-width: 768px){.nk-split-content-md{width:642px}}.nk-split-stretch{flex-grow:1;flex-shrink:1}@media(max-width: 991.98px){.nk-split-stretch.toggle-break-lg{width:460px}}@media(max-width: 575.98px){.nk-split-sm{flex-wrap:wrap}}@media(max-width: 767.98px){.nk-split-md{flex-wrap:wrap}}@media(max-width: 991.98px){.nk-split-lg{flex-wrap:wrap}}@media(max-width: 1199.98px){.nk-split-xl{flex-wrap:wrap}}@media(max-width: 1539.98px){.nk-split-xxl{flex-wrap:wrap}}@media(min-width: 992px){.npc-apps .nk-header,.npc-apps .nk-footer,.npc-apps .nk-content{padding-left:14px;padding-right:14px}}canvas{width:100%;max-width:100%}a:hover{text-decoration:none}p:last-child{margin-bottom:0}.del{text-decoration:line-through}span[data-toggle=tooltip]:focus{outline:none}li{list-style:none}.g-0:not(.row){margin:0}.g-0:not(.row)>li,.g-0:not(.row)>div{padding:0}.gx-0:not(.row){margin-left:0;margin-right:0}.gx-0:not(.row)>li,.gx-0:not(.row)>div{padding-left:0;padding-right:0}.gy-0:not(.row){margin-top:0;margin-bottom:0}.gy-0:not(.row)>li,.gy-0:not(.row)>div{padding-top:0;padding-bottom:0}.g-1:not(.row){margin:-0.1875rem}.g-1:not(.row)>li,.g-1:not(.row)>div{padding:.1875rem}.gx-1:not(.row){margin-left:-0.1875rem;margin-right:-0.1875rem}.gx-1:not(.row)>li,.gx-1:not(.row)>div{padding-left:.1875rem;padding-right:.1875rem}.gy-1:not(.row){margin-top:-0.1875rem;margin-bottom:-0.1875rem}.gy-1:not(.row)>li,.gy-1:not(.row)>div{padding-top:.1875rem;padding-bottom:.1875rem}.g-2:not(.row){margin:-0.375rem}.g-2:not(.row)>li,.g-2:not(.row)>div{padding:.375rem}.gx-2:not(.row){margin-left:-0.375rem;margin-right:-0.375rem}.gx-2:not(.row)>li,.gx-2:not(.row)>div{padding-left:.375rem;padding-right:.375rem}.gy-2:not(.row){margin-top:-0.375rem;margin-bottom:-0.375rem}.gy-2:not(.row)>li,.gy-2:not(.row)>div{padding-top:.375rem;padding-bottom:.375rem}.g-3:not(.row){margin:-0.5rem}.g-3:not(.row)>li,.g-3:not(.row)>div{padding:.5rem}.gx-3:not(.row){margin-left:-0.5rem;margin-right:-0.5rem}.gx-3:not(.row)>li,.gx-3:not(.row)>div{padding-left:.5rem;padding-right:.5rem}.gy-3:not(.row){margin-top:-0.5rem;margin-bottom:-0.5rem}.gy-3:not(.row)>li,.gy-3:not(.row)>div{padding-top:.5rem;padding-bottom:.5rem}.g-4:not(.row){margin:-0.75rem}.g-4:not(.row)>li,.g-4:not(.row)>div{padding:.75rem}.gx-4:not(.row){margin-left:-0.75rem;margin-right:-0.75rem}.gx-4:not(.row)>li,.gx-4:not(.row)>div{padding-left:.75rem;padding-right:.75rem}.gy-4:not(.row){margin-top:-0.75rem;margin-bottom:-0.75rem}.gy-4:not(.row)>li,.gy-4:not(.row)>div{padding-top:.75rem;padding-bottom:.75rem}.g-5:not(.row){margin:-1.375rem}.g-5:not(.row)>li,.g-5:not(.row)>div{padding:1.375rem}.gx-5:not(.row){margin-left:-1.375rem;margin-right:-1.375rem}.gx-5:not(.row)>li,.gx-5:not(.row)>div{padding-left:1.375rem;padding-right:1.375rem}.gy-5:not(.row){margin-top:-1.375rem;margin-bottom:-1.375rem}.gy-5:not(.row)>li,.gy-5:not(.row)>div{padding-top:1.375rem;padding-bottom:1.375rem}.g-gs:not(.row){margin:-14px}.g-gs:not(.row)>li,.g-gs:not(.row)>div{padding:14px}.gx-gs:not(.row){margin-left:-14px;margin-right:-14px}.gx-gs:not(.row)>li,.gx-gs:not(.row)>div{padding-left:14px;padding-right:14px}.gy-gs:not(.row){margin-top:-14px;margin-bottom:-14px}.gy-gs:not(.row)>li,.gy-gs:not(.row)>div{padding-top:14px;padding-bottom:14px}.gap{width:100%;display:block;height:28px}.gap-0{height:0}.gap-1{height:.375rem}.gap-2{height:.75rem}.gap-3{height:1rem}.gap-4{height:1.5rem}.gap-5{height:2.75rem}.gap-gs{height:28px}.gap-sm{height:.75rem}.gap-md{height:1.25rem}.gap-lg{height:2rem}.gap-xl{height:2.5rem}.gap-10px{height:10px}.gap-20px{height:20px}.gap-30px{height:30px}.gap-40px{height:40px}.gap-50px{height:50px}.gap-60px{height:60px}.gap-70px{height:70px}.gap-80px{height:80px}.gap-90px{height:90px}.gap-100px{height:100px}.li-col2x>li{width:50%;float:left}.li-col3x>li{width:33.3333333333%;float:left}.li-col4x>li{width:25%;float:left}.alert-cta{display:flex;justify-content:space-between;align-items:center}.alert-actions{display:inline-flex;align-items:center}.alert-actions a+a{margin-left:1rem}.accordion{background:#fff}.accordion-heading{padding-bottom:1.5rem}.accordion-body{border-radius:4px;padding:0}.accordion-item{border-bottom:0 !important}.accordion-item:last-of-type{border-bottom:1px solid #dbdfea !important}.accordion-item:not(:last-child) .accordion-head{border-bottom:1px solid #dbdfea}.accordion-item:not(:last-child) .accordion-inner{border-bottom:1px solid #dbdfea}.accordion-item:last-child .accordion-inner{border-top:1px solid #dbdfea}.accordion-head{padding:1rem 2.25rem 1rem 1.25rem;display:block;position:relative}.accordion-head .title{margin-bottom:0;font-size:1rem;color:#364a63;line-height:1.3}.accordion-head.collapsed .title{color:#526484}.accordion-inner{padding:1rem 1.25rem 1.25rem}.accordion-icon{position:absolute;right:1rem;top:50%;font-size:1rem;color:#364a63;transform:translateY(-50%);transition:rotate .4s;width:20px;height:20px;text-align:center;line-height:20px}.accordion-icon:before{content:"";font-family:"Nioicon";transition:.4s}.accordion-head.collapsed .accordion-icon:before{content:""}@media(min-width: 768px){.accordion-head{padding:1rem 1.5rem}.accordion-inner{padding:1rem 1.5rem 1.25rem}.accordion-icon{right:1.5rem}}.accordion-s2 .accordion-item,.accordion-s3 .accordion-item{border:0 !important}.accordion-s2{border:none}.accordion-s2 .accordion-icon{right:0}.accordion-s2 .accordion-icon:before{content:""}.accordion-s2 .accordion-head{padding:.5rem 2.25rem .5rem 0;border:none !important}.accordion-s2 .accordion-head .title{font-size:1.1rem;color:#0fac81}.accordion-s2 .accordion-head.collapsed .title{color:#526484}.accordion-s2 .accordion-head.collapsed .accordion-icon:before{content:""}.accordion-s2 .accordion-inner{padding:.5rem 0 .625rem;border:none !important}@media(min-width: 768px){.accordion-s2 .accordion-head{padding:.5rem 2.25rem .5rem 0}.accordion-s2 .accordion-inner{padding:.5rem 0 .625rem}}.accordion-s3{border:none}.accordion-s3 .accordion-icon{left:0;right:auto}.accordion-s3 .accordion-icon:before{content:""}.accordion-s3 .accordion-head{padding:.5rem 0 .5rem 2.25rem;border:none !important}.accordion-s3 .accordion-head .title{font-size:1.1rem;color:#0fac81}.accordion-s3 .accordion-head.collapsed .title{color:#526484}.accordion-s3 .accordion-head.collapsed .accordion-icon:before{content:""}.accordion-s3 .accordion-inner{padding:.5rem 0 .625rem;border:none !important}@media(min-width: 768px){.accordion-s3 .accordion-head{padding:.5rem 0 .5rem 2.25rem}.accordion-s3 .accordion-inner{padding:.5rem 2.25rem .625rem}}.dot{position:relative;display:inline-block;border-radius:50%;height:8px;width:8px}.dot-label:after{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:50%;background:#fff;content:"";transform:scale(0.65)}.dot.sq{border-radius:3px}.dot.sq:after{border-radius:3px}.dot-xs{height:4px;width:4px}.dot-sm{height:6px;width:6px}.dot-md{height:8px;width:8px}.dot-rg{height:10px;width:10px}.dot-lg{height:12px;width:12px}.dot-xl{height:16px;width:16px}.dot-primary{background:#0fac81}.dot-secondary{background:#364a63}.dot-success{background:#1ee0ac}.dot-info{background:#09c2de}.dot-warning{background:#f4bd0e}.dot-danger{background:#e85347}.dot-light{background:#e5e9f2}.dot-dark{background:#1f2b3a}.dot-gray{background:#8091a7}.dot-lighter{background:#f5f6fa}.list:not(:last-child){margin-bottom:1rem}.list li{position:relative;padding-left:1.5rem;line-height:1.5rem}.list li:not(:last-child){padding-bottom:.5rem}.list li:before{position:absolute;left:0;font-size:14px;line-height:1.5rem;font-family:"Nioicon";content:""}.list li span{color:#8094ae}.list li ul{margin-top:.5rem}.list-checked li:before{color:#0fac81;content:""}.list-checked-circle li:before{color:#0fac81;content:""}.list-cross li:before{color:rgba(232,83,71,.8);content:""}.list-status{list-style:none;line-height:1.3}.list-status li{display:inline-flex;align-items:center;padding-right:1rem;vertical-align:middle}.list-status .icon{margin-right:.375rem;line-height:1.3}.list-lg li{padding-left:2rem}.list-lg li:not(:last-child){padding-bottom:.75rem}.list-lg li:before{font-size:1.35rem}.list-sm li{padding-left:1.2rem}.list-sm li:not(:last-child){padding-bottom:.35rem}.list-sm li:before{font-size:12px}.list-step li{color:#8094ae;font-weight:500}.list-step li:before{content:""}.list-step li.list-step-current{color:#364a63}.list-step li.list-step-current:before{content:"";color:#0fac81}.list-step li.list-step-done{color:#526484}.list-step li.list-step-done:before{content:"";color:#1ee0ac}.list-plain a{color:#526484;display:block;line-height:1.3;padding:.5rem 0}.list-plain a:hover{color:#0fac81}.list-category a{font-weight:500}.list-download li>a{display:inline-block;padding:.25rem}.list-download li>a>.icon{margin:0 .25rem;font-size:1.25rem}.list-primary li:before{color:#0fac81}.list-secondary li:before{color:#364a63}.list-success li:before{color:#1ee0ac}.list-info li:before{color:#09c2de}.list-warning li:before{color:#f4bd0e}.list-danger li:before{color:#e85347}.list-light li:before{color:#e5e9f2}.list-dark li:before{color:#1f2b3a}.list-gray li:before{color:#8091a7}.list-lighter li:before{color:#f5f6fa}.link-bdr-t,.link-list-plain li+li,.link-list-opt li+li,.link-list+.link-list,.link-tidy li+li,.link-check+.link-check{border-top:1px solid #e5e9f2}.link-bdr-b{border-bottom:1px solid #e5e9f2}.link-pd-sm,.link-list-plain.sm a,.link-tidy.sm li{padding:6px 1rem}.link-act-check:after,.link-list-opt li.active>a:after,.link-list-opt a.active:after,.link-check li.active>a:after,.link-check li a.active:after{content:"";position:absolute;top:50%;transform:translateY(-50%);right:1rem;font-family:"Nioicon"}.link-check{padding:.5rem 0}.link-check .divider{margin:.5rem 0}.link-check li{display:block}.link-check li>span,.link-check li a{display:block;line-height:1.25rem;padding:.35rem 1rem}.link-check li>span{text-transform:uppercase;color:#364a63;font-weight:700;font-size:12px;letter-spacing:1px}.link-check li a{display:flex;align-items:center;color:#526484;font-size:13px;position:relative}.link-check li a:hover{color:#0fac81;background:#f5f6fa}.link-check li .icon{width:1.75rem;font-size:1.125rem}.link-tidy.no-bdr{padding:.5rem 0}.link-tidy.no-bdr li:not(.divider){border-top-width:0}.link-tidy .divider{margin:.5rem 0}.link-tidy li{position:relative;padding:.625rem 1.1rem;line-height:1.3rem}.link-list{padding:.75rem 0}.link-list .divider{margin:.5rem 0}.link-list a{display:flex;align-items:center;color:#526484;font-size:13px;line-height:1.4rem;font-weight:500;padding:.575rem 0;position:relative}.link-list a:hover{color:#0fac81}.link-list a .icon{font-size:1.125rem;width:1.5rem;line-height:1}.link-list-opt.no-bdr{padding:.5rem 0}.link-list-opt.no-bdr li:not(.divider){border-top-width:0}.link-list-opt .divider{margin:.5rem 0}.link-list-opt a{display:flex;align-items:center;padding:.625rem 1.25rem;font-size:12px;font-weight:500;color:#526484;transition:all .4s;line-height:1.3rem;position:relative}.link-list-opt a:hover{color:#0fac81;background:#f5f6fa}.link-list-opt a .icon{font-size:1.125rem;width:1.75rem;opacity:.8}.link-list-opt li.disabled>a,.link-list-opt a.disabled{pointer-events:none;color:#8094ae;opacity:.7}.link-list-opt .opt-head{padding:.25rem 1.25rem;color:#8094ae}.link-list-opt.ui-v2 a{font-weight:400}.link-list-opt.no-bdr+.link-check{margin-top:-0.75rem}.link-list-opt.ui-colored li.active>a,.link-list-opt.ui-colored a.active{color:#0fac81}.link-list-menu{padding:.75rem 0}.link-list-menu .divider{margin:.5rem 0}.link-list-menu a{position:relative;display:flex;align-items:center;padding:.75rem 1.25rem;font-weight:500;color:#526484;transition:all .4s;line-height:1.3rem}.link-list-menu a:after{position:absolute;font-size:1rem;font-family:"Nioicon";content:"";right:1.25rem;color:#8094ae;transition:.3s ease}.link-list-menu a .icon{font-size:1.125rem;width:1.75rem;opacity:.8;color:#8094ae;margin-top:-2px}.link-list-menu li.active>a,.link-list-menu a.active,.link-list-menu a:hover,.link-list-menu li.active>a .icon,.link-list-menu a.active .icon,.link-list-menu a:hover .icon,.link-list-menu li.active>a:after,.link-list-menu a.active:after,.link-list-menu a:hover:after{color:#0fac81}.link-list-menu.nav{display:block}@media(min-width: 576px){.link-list-menu a{padding:1rem 1.5rem}}.link-list-plain.no-bdr{padding:.5rem 0}.link-list-plain.no-bdr li{border-top-width:0}.link-list-plain .divider{margin:.5rem 0}.link-list-plain a{display:flex;align-items:center;padding:.5rem 1.25rem;color:#526484;transition:all .4s;line-height:1.4rem;position:relative}.link-list-plain a:hover{color:#0fac81;background:#f5f6fa}.link-list-plain a .icon{font-size:1.125rem;width:1.75rem;opacity:.8;color:#0fac81}.link-list-plain li.active>a,.link-list-plain a.active{color:#0fac81;background:#f5f6fa}.link-list-plain.text-center a{justify-content:center;padding-left:.25rem;padding-right:.25rem}.link-list-plain.li-col2x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col2x>li:nth-child(2n){border-right:none}.link-list-plain.li-col3x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col3x>li:nth-child(3n){border-right:none}.link-list-plain.li-col4x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col4x>li:nth-child(4n){border-right:none}.link-list-template a{font-weight:400}.passcode-icon{display:none}.passcode-icon.icon-show{display:block}.is-shown .passcode-icon.icon-show{display:none}.is-hidden .passcode-icon.icon-show{display:block}.is-shown .passcode-icon.icon-hide{display:block}.is-hidden .passcode-icon.icon-hide{display:none}.form-dropdown{position:absolute;right:0;top:0;bottom:0;padding:0 20px;display:inline-flex;align-items:center;justify-content:center;color:#8094ae}.form-dropdown>div>span{margin:0 .5rem}.form-dropdown .dropdown>a{display:inline-flex}.form-clip,.form-text-hint{position:absolute;right:2px;top:2px;height:calc(2.125rem - 2px);display:flex;align-items:center;color:#0fac81;padding-left:1rem;padding-right:.75rem;background:#fff;border-radius:4px}.form-clip.sm,.form-text-hint.sm{height:calc(1.75rem + 2px)}.form-clip.lg,.form-text-hint.lg{height:calc(2.625rem + 2px)}.form-clip.xl,.form-text-hint.xl{height:calc(3.25rem + 2px)}.form-clip .icon+span,.form-clip span+.icon,.form-text-hint .icon+span,.form-text-hint span+.icon{margin-left:.25rem}.nk-upload-input{position:relative;z-index:2;width:100%;height:calc(2.125rem + 2px);margin:0;opacity:0}.nk-upload-label{position:relative;display:flex;flex-direction:column;justify-content:center;padding:1.5rem;width:100%;min-height:150px;border-radius:4px;border:1px dashed #e5e9f2;padding-bottom:0}.nk-upload-init{display:block;text-align:center}.nk-upload-files{padding-top:2rem;display:flex;justify-content:center;margin:-0.5rem;padding-bottom:2rem}.nk-upload-files li{position:relative;display:flex;flex-wrap:wrap;align-items:center;flex-direction:column;text-align:center;padding:.5rem}.nk-upload-files li img{width:60px;flex-shrink:0;border-radius:4px}.is-multiple .nk-upload-files li img{width:40px}.is-multiple .nk-upload-files li .nk-upload-name{display:none}.nk-upload-name{margin:.5rem 0 0;color:#526484;font-size:.8125rem;font-weight:500;width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-upload-response{margin-left:auto;display:inline-flex;align-items:center}.nk-upload-response .message{font-size:12px;color:#8094ae}.nk-upload-response .message+.icon{margin-left:.5rem}.nk-upload-response .icon:after{font-family:"Nioicon"}.nk-upload-response .icon+.message{margin-left:.5rem}.nk-upload-response.invalid .icon{color:#f4bd0e}.nk-upload-response.invalid .icon:after{content:""}.nk-upload-response.valid .icon{color:#1ee0ac}.nk-upload-response.valid .icon:after{content:""}.nk-upload-response.error .icon{color:#e85347}.nk-upload-response.error .icon:after{content:""}.nk-upload-foot{display:flex;justify-content:space-between;border-top:1px dashed #e5e9f2;padding:1rem 1.25rem;margin:0 -1.5rem}.nk-upload-foot>span,.nk-upload-foot>button{margin:.25rem}.form-editor-custom textarea{border-radius:4px 4px 0 0}.form-editor-action{border:1px solid #dbdfea;border-top:0;border-radius:0 0 4px 4px;padding:.25rem .5rem}.form-editor-action>.link{padding:.5rem}.form-editor-action>.link.collapsed{color:#8094ae}.form-editor-action>.link .icon{margin-right:.25rem}.form-editor-btn-group,.form-btn-group{display:flex;align-items:center;margin:-0.25rem;flex-wrap:wrap}.form-editor-btn-group li,.form-btn-group li{padding:.25rem;line-height:.5rem}.form-btn-group li:first-child{margin-right:.5rem}.form-btn-secondary{margin-left:auto}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}.number-spinner{padding-left:3.125rem;padding-right:3.125rem;text-align:center}.number-spinner:focus{border-color:#dbdfea}.number-spinner-btn{position:absolute;top:0}.number-plus{right:0;border-top-left-radius:0;border-bottom-left-radius:0}.number-minus{left:0;border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon{display:flex;align-items:center;padding:.25rem .75rem;background-color:#f5f6fa;border:1px solid #dbdfea;font-size:.75rem;border-radius:4px}.input-group-addon:not(:last-child){border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:first-child){border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,textarea:-webkit-autofill,textarea:-webkit-autofill:hover,textarea:-webkit-autofill:focus,select:-webkit-autofill,select:-webkit-autofill:hover,select:-webkit-autofill:focus{-webkit-text-fill-color:#3c4d62;transition:background-color 5000s ease-in-out 0s}.page-title{font-family:Nunito,sans-serif;font-size:1.5rem;font-weight:700}@media(min-width: 992px){.page-title{font-size:1.75rem}}.overline-title{font-size:11px;line-height:1.2;letter-spacing:.2em;color:#8094ae;text-transform:uppercase;font-weight:700;font-family:Roboto,sans-serif}.text-light .overline-title{color:#8094ae}.is-dark .overline-title{color:#b7c2d0}.is-theme .overline-title{color:#abe2d3}.overline-title-alt{font-family:Roboto,sans-serif;font-weight:700;line-height:1.2;letter-spacing:.15em;font-size:11px;color:#8094ae;text-transform:uppercase}.is-dark .overline-title-alt{color:#8094ae}.is-theme .overline-title-alt{color:#abe2d3}.overline-title-sap{position:relative;display:inline-block;margin-bottom:0;padding-left:.35rem;padding-right:.25rem;color:#b6c6e3}.overline-title-sap:before,.overline-title-sap:after{position:absolute;top:50%;transform:translateY(-50%);width:20px;height:1px;content:"";background:#b6c6e3}.overline-title-sap:before{right:100%}.overline-title-sap:after{left:100%}.caption-text{font-size:16px;font-weight:400;line-height:1.3;letter-spacing:-0.01em}.caption-text+.sub-text,.caption-text+.sub-text-sm{margin-top:.5rem;display:block}.lead-text{font-size:.875rem;font-weight:700;color:#364a63;display:block}.lead-text+.sub-text{font-size:12px}.lead-text span{color:#526484;font-weight:400}.lead-text-lg{font-size:1.125rem;font-weight:500;color:#364a63;display:block}.is-theme .lead-text-lg{color:#fff}.is-theme .is-light .lead-text-lg{color:#364a63}.is-dark .lead-text{color:#b7c2d0}.is-dark .lead-text span{color:#8091a7}.is-theme .lead-text{color:#fff}.is-theme .lead-text span{color:#abe2d3}.is-theme .is-light .lead-text,.is-dark .is-light .lead-text{color:#364a63}.is-theme .is-light .lead-text span,.is-dark .is-light .lead-text span{color:#526484}.sub-text{display:block;font-size:13px;color:#8094ae}.sub-text span+.dot,.sub-text .dot+span{margin-left:.25rem}.sub-text-sm,.sub-text+.sub-text{font-size:12px}.sub-text-sm{color:#8094ae}.is-theme .sub-text-sm{color:#abe2d3}.is-theme .is-light .sub-text-sm{color:#8094ae}.text-ellipsis .sub-text{display:inline}.sub-text strong{color:#526484;font-weight:700}.is-theme .sub-text strong{color:#abe2d3}.is-theme .is-light .sub-text strong{color:#526484}.sub-text span{white-space:nowrap}.is-theme .sub-text{color:#abe2d3}.is-theme .is-light .sub-text{color:#8094ae}.text-date span{color:#526484}h6 .badge,.h6 .badge{margin-left:.5rem}.fs-9px{font-size:9px}.fs-10px{font-size:10px}.fs-11px{font-size:11px}.fs-12px{font-size:12px}.fs-13px{font-size:13px}.fs-14px{font-size:14px}.fs-15px{font-size:15px}.fs-16px{font-size:16px}.fs-17px{font-size:17px}.fs-18px{font-size:18px}.fs-19px{font-size:19px}.fs-20px{font-size:20px}.fs-21px{font-size:21px}.fs-22px{font-size:22px}.note-text{font-size:12px;font-style:italic;color:#8094ae}.is-dark .title{color:#b7c2d0}.is-theme .title{color:#abe2d3}.card{border:1px solid #dbdfea}.card .table{margin-bottom:0}.card .table tr:first-child th,.card .table tr:first-child td{border-top:none}.card .table tr:last-child td:first-child{border-bottom-left-radius:4px}.card .table tr:last-child td:last-child{border-bottom-right-radius:4px}.card .table tr:first-child th:first-child{border-top-left-radius:4px}.card .table tr:first-child th:last-child{border-top-right-radius:4px}.card+.lead-text{margin-top:2rem}.lead-text+.card{margin-top:1rem}.card-custom-s1 .card-inner-group .card-inner{border-bottom:1px solid #dbdfea}@media(max-width: 991.98px){.card-custom-s1 .card-inner-lg{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width: 992px){.card-custom-s1 .card-inner-group{border-right:1px solid #dbdfea}.card-custom-s1 .card-inner-group .card-inner:last-child{border-bottom:none}}@media(min-width: 576px){.card-search .card-body{padding:1.5rem}}.card-aside{width:300px;background-color:#fff;min-height:100vh;flex-shrink:0}.card-aside-left{order:-1;border-right:1px solid #e5e9f2}.card-aside-right{order:100;border-left:1px solid #e5e9f2}.card-aside-wrap{display:flex}.card-aside-wrap .card-inner,.card-aside-wrap .card-content{flex-grow:1}@media(max-width: 767.98px){.toggle-break-md.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 991.98px){.toggle-break-lg.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 1199.98px){.toggle-break-xl.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 1539.98px){.toggle-break-xxl.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(min-width: 992px){.card-aside{position:static;display:block}}@media(min-width: 1540px){.card-aside{width:380px}}.user-avatar,[class^=user-avatar]:not([class*=-group]){border-radius:50%;height:40px;width:40px;display:flex;justify-content:center;align-items:center;color:#fff;background:#3fbd9a;font-size:14px;font-weight:500;letter-spacing:.06em;flex-shrink:0;position:relative}.user-avatar+.user-info,[class^=user-avatar]:not([class*=-group])+.user-info{margin-left:1rem}.user-avatar+.user-name,[class^=user-avatar]:not([class*=-group])+.user-name{margin-left:.75rem}.user-avatar img,[class^=user-avatar]:not([class*=-group]) img{border-radius:50%}.user-avatar.md+.user-info,[class^=user-avatar]:not([class*=-group]).md+.user-info{margin-left:1.5rem}.user-avatar.md+.user-name,[class^=user-avatar]:not([class*=-group]).md+.user-name{margin-left:1.25rem}.user-avatar .edit,[class^=user-avatar]:not([class*=-group]) .edit{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background-color:rgba(31,43,58,.5);display:flex;justify-content:center;align-items:center;color:#fff;opacity:0;transition:opacity .3s}.user-avatar:hover .edit,[class^=user-avatar]:not([class*=-group]):hover .edit{opacity:1}.user-avatar .status,[class^=user-avatar]:not([class*=-group]) .status{border:2px solid #fff;position:absolute;bottom:0;right:0}.user-avatar.sq,[class^=user-avatar]:not([class*=-group]).sq{border-radius:4px}.user-avatar.sq img,[class^=user-avatar]:not([class*=-group]).sq img{border-radius:4px}.user-avatar.sq .status,[class^=user-avatar]:not([class*=-group]).sq .status{bottom:-6px;right:-6px}.user-avatar-multiple{background-color:rgba(0,0,0,0) !important}.user-avatar-multiple .user-avatar{position:absolute;height:70%;width:70%;font-size:80%;border:2px solid #fff}.user-avatar-multiple .user-avatar:nth-child(1){top:0;right:0}.user-avatar-multiple .user-avatar:nth-child(2){bottom:0;left:0}.user-card .user-avatar.d-none{margin-right:1rem}.user-card .user-avatar.d-none+.user-info,.user-card .user-avatar.d-none+.user-name{margin-left:0}.user-avatar-xl,.user-avatar.xl{height:110px;width:110px;font-size:40px;font-weight:400}.user-avatar-xl .status,.user-avatar.xl .status{bottom:9px;right:9px}.user-avatar-lg,.user-avatar.lg{height:80px;width:80px;font-size:28px;font-weight:400}.user-avatar-lg .status,.user-avatar.lg .status{bottom:5px;right:5px}.user-avatar-md,.user-avatar.md{height:60px;width:60px;font-size:18px}.user-avatar-md .status,.user-avatar.md .status{bottom:2px;right:2px}.user-avatar-sm,.user-avatar.sm{height:32px;width:32px;font-size:12px}.user-avatar-sm .status,.user-avatar.sm .status{bottom:-2px;right:-2px}.user-avatar-xs,.user-avatar.xs{height:26px;width:26px;font-size:9px;font-weight:700}.user-avatar-xs .status,.user-avatar.xs .status{bottom:-2px;right:-2px}.user-avatar[class*=-blue-dim]{color:#559bfb}.user-avatar[class*=-azure-dim]{color:#1676fb}.user-avatar[class*=-indigo-dim]{color:#2c3782}.user-avatar[class*=-purple-dim]{color:#816bff}.user-avatar[class*=-pink-dim]{color:#ff63a5}.user-avatar[class*=-orange-dim]{color:#ffa353}.user-avatar[class*=-teal-dim]{color:#20c997}.user-avatar[class*=-primary-dim]{color:#0fac81}.user-avatar[class*=-secondary-dim]{color:#364a63}.user-avatar[class*=-success-dim]{color:#1ee0ac}.user-avatar[class*=-info-dim]{color:#09c2de}.user-avatar[class*=-warning-dim]{color:#f4bd0e}.user-avatar[class*=-danger-dim]{color:#e85347}.user-avatar[class*=-dark-dim]{color:#1f2b3a}.user-avatar[class*=-gray-dim]{color:#8091a7}.user-avatar[class*=-lighter]{color:#8094ae}.user-avatar[class*=-light]{color:#526484}.user-card{display:flex;align-items:center}.user-card-wrap{padding-top:1.125rem;padding-bottom:1.125rem}.user-card .user-info{color:#8094ae}.user-card-menu{position:absolute;right:1rem;top:1rem}.user-toggle{display:flex;align-items:center;padding:0 1px 1px}.user-status{font-size:11px;font-weight:500;line-height:1;padding-top:.125rem;padding-bottom:.375rem}.user-status-unverified{color:#e85347}.user-status-verified{color:#1ee0ac}.user-name{color:#526484;font-size:12px;line-height:16px;font-weight:700}.is-dark .user-name{color:#90a1b8}.is-theme .user-name{color:#abe2d3}.user-action{margin-left:auto;font-size:20px;color:#8094ae}.user-account-info{padding-top:1.5rem;padding-bottom:1.25rem}.user-account-data li{display:flex;justify-content:space-between;padding:.125rem 0}.user-account-actions:not(:first-child){margin-top:1.5rem}.user-account-actions ul{display:flex}.user-account-actions ul li{width:44%}.user-account-actions ul li:last-child{width:56%}.user-account-actions .btn,.user-account-actions .dual-listbox .dual-listbox__button,.dual-listbox .user-account-actions .dual-listbox__button{width:100%;font-size:12px;letter-spacing:.04em;padding-left:.5rem;padding-right:.5rem;text-transform:uppercase}.user-account-links{padding:1rem 0;border-bottom:1px solid #e5e9f2}.user-account-info .user-account-links:last-child{border-bottom:0;padding-bottom:0}.user-account-info+.user-account-links{padding-top:0;margin-top:-0.5rem}.user-account-links a:link{padding:.5rem 0;display:flex}.user-account-value{display:inline-flex}.user-balance{font-size:1.5rem;line-height:1;padding:.125rem 0 .375rem;color:#0fac81}.user-balance small,.user-balance .small{font-size:1rem}.user-balance-alt{font-size:15px;color:#526484;font-weight:700}.user-balance-alt span{font-weight:400}.user-balance-sub{font-size:13px;color:#8094ae}.user-balance-sub span{color:#526484}.user-balance-sub+a{margin-top:1rem}.user-card-s2{display:flex;flex-direction:column;text-align:center;padding:.5rem}.user-card-s2 .user-avatar{margin:0 auto}.user-card-s2 .user-info{margin:1.25rem 0 0 !important}.user-card-s2 .user-info .sub-text{justify-content:center}.user-card-s2 .user-info .badge{margin-bottom:1rem}.user-card-md .lead-text{font-size:1rem}.user-card-md .sub-text{font-size:.875rem}.user-activity{display:flex}.user-activity-group{display:flex;flex-wrap:wrap}.user-activity-ck{height:110px;padding:.5rem .375rem 0}.user-activity .icon{width:2.25rem;font-size:1.5rem;color:#8094ae}.user-activity .info span{display:block}.user-activity .amount{font-size:1.125rem;line-height:1.3;font-weight:500;color:#526484}.user-activity .title{font-size:12px;color:#8094ae}.user-activity .gfx{align-self:flex-end;width:50px;margin-left:1rem;margin-bottom:.25rem}.user-contacts li{color:#526484;display:flex;font-size:.875rem;line-height:1.4rem;padding:.375rem 0}.user-contacts li .icon{color:#8094ae;font-size:1rem;width:1.75rem;line-height:inherit;display:inline-block}.user-avatar-group{display:flex}.user-avatar-group .user-avatar{border:2px solid #fff}.user-avatar-group .user-avatar:not(:first-child){margin-left:-20%}.user-avatar-group .user-avatar.sm:not(:first-child){margin-left:-1rem}.user-avatar-group .user-avatar.xs:not(:first-child){margin-left:-0.5rem}.user-info .lead-text,.user-info .sub-text{display:flex;align-items:center}.user-info .edit{font-size:1.25rem;color:#8094ae;margin-left:.5rem;display:inline-flex}.user-info .edit:hover{color:#0fac81}.user-plan{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.75rem 0}.user-plan-title{display:flex;align-items:center;color:#364a63;font-weight:700;font-size:1rem}.user-plan-title .icon{font-size:1.5rem;margin-right:.75rem;color:#0fac81}.user-plan-info,.user-plan-actions{padding:.5rem 0}.user-plan-status{font-size:13px;font-weight:500;color:#8094ae;text-transform:uppercase;margin-top:.5rem}.user-plan-progress{width:100%;margin-top:1rem}.data-list:not(:first-child){margin-top:1.5rem}.data-item{position:relative;padding:1rem 1.25rem;display:flex;align-items:center}.data-item .icon{color:#8094ae;text-align:center;height:32px;vertical-align:middle;line-height:32px;display:inline-block}.data-item:not(:last-child){border-bottom:1px solid #e5e9f2}.data-item[data-toggle]{cursor:pointer}.data-item:hover .data-label{color:#526484}.data-item:hover .data-value,.data-item:hover .icon{color:#364a63}.data-head{padding:.5rem 1.25rem;margin-bottom:.25rem;background-color:#ebeef2;border-radius:4px}.data-head.is-plain{margin-bottom:0;background-color:rgba(0,0,0,0)}.data-head.is-plain:first-child{margin-top:1rem}.data-head .title{color:#526484}.data-col{flex-grow:1}.data-col span:not(.data-more){display:inline-block;transition:color .3s}.data-col-end{flex-grow:0;margin-left:auto}.data-label{color:#8094ae;width:100%;flex-shrink:0}.data-value{color:#526484;font-size:.9375rem}.data-more{position:relative;z-index:4;text-align:center;line-height:28px;height:28px;width:28px;display:inline-grid;align-content:center}.data-more:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.data-item:hover .data-more:before{opacity:1;height:40px;width:40px}.data-more.disable:before{display:none}.data-list-s2:not(:first-child){margin-top:1rem}.data-list-s2 .data-item,.data-list-s2 .data-head{padding-left:0;padding-right:0;background:rgba(0,0,0,0)}.data-list-s2 .data-head{border-bottom:1px solid #dbdfea}.data-list-s2 .data-item:not(:last-child){border-bottom-color:#dbdfea}.data-list-s2 .data-label{color:#526484}.data-list-s2 .data-placeholder{color:#8094ae}@media(min-width: 768px){.data-list:not(:first-child){margin-top:2rem}.data-list-s2:not(:first-child){margin-top:1.25rem}.data-item{padding:1.5rem 1.25rem}.data-col{display:flex;align-items:center}.data-col-end{width:200px;text-align:right;justify-content:flex-end}.data-label:not([class^=w-]){width:50%}}@media(min-width: 1200px)and (max-width: 1359px){.card-aside-wrap .data-list .data-col{flex-wrap:wrap}.card-aside-wrap .data-list .data-label{width:100%}}.is-compact .data-item{padding-top:.75rem;padding-bottom:.75rem}.is-medium .data-item{padding-top:1.125rem;padding-bottom:1.125rem}.dropdown-menu .nk-notification{max-height:239px;overflow:auto}.nk-notification-item{display:flex;align-items:center;padding:1.25rem 1.75rem}.nk-notification-icon{flex-shrink:0;margin-right:.75rem}.nk-notification-text{font-size:13px;color:#526484}.nk-notification-text span{color:#364a63}.nk-notification-time{font-size:11px;color:#8094ae}.dropdown-menu .nk-chat-list,.dropdown-menu .chat-list{max-height:274px;overflow:auto}.icon-light{color:#fff}.icon-dark{color:#364a63}.icon-text{display:flex;align-items:center;font-size:13px}.icon-text .icon{font-size:1.5em;width:1.75rem}.icon-image{width:70px}.icon-image+h6,.icon-image+.h6{margin-top:1rem}.icon-circle{display:inline-flex;justify-content:center;align-items:center;border-radius:50%;background:#0fac81;color:#fff;font-size:18px;height:36px;width:36px}.icon-circle-sm,.icon-circle.sm{height:20px;width:20px;font-size:12px}.icon-circle-md,.icon-circle.md{height:28px;width:28px;font-size:14px}.icon-circle-lg,.icon-circle.lg{height:44px;width:44px;font-size:24px}.icon-circle-xxl,.icon-circle.xxl{height:80px;width:80px;font-size:40px}.icon-status{position:relative;display:inline-flex}.icon-status:after{position:absolute;border-radius:50%;right:0;top:1px;height:10px;width:10px;border:2px solid #fff;content:""}.icon-status-info:after{background:#09c2de}.icon-status-danger:after{background:#e85347}.icon-status-success:after{background:#1ee0ac}.icon-status-warning:after{background:#f4bd0e}.icon-status-on:after{background:#1ee0ac}.icon-status-off:after{background:#8094ae}.icon-status-na:after{display:none}.icon-overlap{display:inline-flex;align-items:center;flex-direction:row-reverse;flex-shrink:0}.icon-overlap li{border-radius:50%;border:2px solid #fff}.icon-overlap li+li{margin-right:-14px}.icon-overlap-alt{display:inline-flex;align-items:flex-end;flex-shrink:0}.icon-overlap-alt li{border-radius:50%}.icon-overlap-alt li+li{margin-left:-16px;margin-bottom:-10px}.icon-circle[class*=btc]{background:#f9841e}.icon-circle[class*=facebook]{background:#3b5998}.icon-circle[class*=google]{background:#de5246}.icon-circle[class*=btc-dim]{background:#feefe2}.icon-circle[class*=eth-dim]{background:#eaedf6}.icon-circle[class*=white]{background:#fff}.icon[class*=bg-blue-dim]{color:#559bfb}.icon[class*=bg-azure-dim]{color:#1676fb}.icon[class*=bg-indigo-dim]{color:#2c3782}.icon[class*=bg-purple-dim]{color:#816bff}.icon[class*=bg-pink-dim]{color:#ff63a5}.icon[class*=bg-orange-dim]{color:#ffa353}.icon[class*=bg-teal-dim]{color:#20c997}.icon[class*=bg-primary-dim]{color:#0fac81}.icon[class*=bg-secondary-dim]{color:#364a63}.icon[class*=bg-success-dim]{color:#1ee0ac}.icon[class*=bg-info-dim]{color:#09c2de}.icon[class*=bg-warning-dim]{color:#f4bd0e}.icon[class*=bg-danger-dim]{color:#e85347}.icon[class*=bg-light]{color:#526484}.icon[class*=bg-lighter]{color:#8094ae}.icon[class*=bg-dark-dim]{color:#dde2ea}.icon[class*=bg-gray-dim]{color:#e9f0f9}.icon[class*=bg-facebook-dim]{color:#3b5998}.icon[class*=bg-google-dim]{color:#de5246}.icon[class*=bg-btc-dim]{color:#f9841e}.icon[class*=bg-eth-dim]{color:#6174b9}.icon[class*=bg-white]{color:#526484}.icon-avatar{width:1.5rem;height:1.5rem;display:inline-block;text-align:center;line-height:1.5rem;border-radius:50%;background:#cfeee6;color:#3fbd9a;margin-right:.5rem;font-size:12px}.icon-avatar-md{width:2rem;height:2rem;line-height:2rem;font-size:14px}.tb-col-hide,.tb-col-xxl,.tb-col-xl,.tb-col-lg,.tb-col-md,.tb-col-sm,.tb-col-xs,.tb-col-mb{display:none !important}@media(min-width: 576px){.tb-col-sm{display:table-cell !important}}@media(min-width: 768px){.tb-col-md{display:table-cell !important}}@media(min-width: 992px){.tb-col-lg{display:table-cell !important}}@media(min-width: 1200px){.tb-col-xl{display:table-cell !important}}@media(min-width: 1540px){.tb-col-xxl{display:table-cell !important}}@media(min-width: 359px){.tb-col-xs{display:table-cell !important}}@media(min-width: 414px){.tb-col-mb{display:table-cell !important}}.table-middle td,.tb-row-middle td{vertical-align:middle}.tb-col-end,.tb-col-action{text-align:right}.tb-col-middle{vertical-align:middle}.tb-col-action .link-cross,.tb-col-action .link-done{font-size:1rem;text-align:center;line-height:28px;height:24px;width:24px;display:inline-block;color:#8094ae;vertical-align:middle;border-radius:12px}.tb-col-action .link-cross .icon,.tb-col-action .link-done .icon{padding-left:1px}.tb-col-action .link-cross:hover{color:#e85347;background:#fce7e5}.tb-col-action .link-done:hover{color:#1ee0ac;background:#e0fbf3}@media(max-width: 575.98px){.table-ulogs th.tb-col-ip{display:none}.table-ulogs tr{display:flex;flex-wrap:wrap;width:100%;position:relative;padding:.5rem 1.25rem}.table-ulogs tr:not(:first-child){border-top:1px solid #dbdfea}.table-ulogs tr td{padding:0;border:0}.table-ulogs tr td:first-child,.table-ulogs tr td:last-child{padding:0}.table-ulogs tr td,.table-ulogs tr th{flex-grow:1}.table-ulogs tr td.tb-col-os{width:100%}.table-ulogs tr th.tb-col-os{width:40%;min-width:142px;flex-grow:0}.table-ulogs tr td.tb-col-ip{width:40%;min-width:130px;flex-grow:0}.table-ulogs tr .tb-col-action{position:absolute;right:10px;top:50%;transform:translateY(-50%);padding:0}.table-ulogs thead tr{padding:0}}.toggle-content{opacity:0;visibility:hidden;position:absolute;top:calc(100% + 10px);z-index:9;background:#fff;border-radius:4px;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);transform:translateY(10px)}.toggle-content-right{left:auto;right:0}.toggle-content-bottom{top:auto;bottom:0}.toggle-content.content-active{transition:all .2s ease;opacity:1;visibility:visible;transform:translateY(0)}.toggle-slide{position:fixed;top:0;z-index:999;min-width:260px;max-width:calc(100% - 40px);transition:transform 650ms ease}.toggle-slide-left{left:0;transform:translateX(-100%)}.toggle-slide-right{right:0;transform:translateX(100%)}.toggle-slide.content-active{transform:translate(0) !important}.toggle-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(31,43,58,.2);z-index:900;animation:overlay-fade-in .4s ease 1}.toggle-expand-content{display:none}.toggle-expand-content.expanded{display:block}.toggle-expand .inactive-text,.toggle-opt .inactive-text{display:block}.toggle-expand.active>.inactive-text,.toggle-opt.active>.inactive-text{display:none}.toggle-expand .active-text,.toggle-opt .active-text{display:none}.toggle-expand.active>.active-text,.toggle-opt.active>.active-text{display:block}body.toggle-shown{overflow:hidden}@media(min-width: 576px){.nk-block-tools-toggle .toggle-expand{display:none}.nk-block-tools-toggle .toggle-expand-content{display:block !important}}@media(max-width: 575.98px){.nk-block-tools-toggle .toggle-expand-content{position:absolute;left:0;right:0;top:100%;z-index:99;padding:0 18px !important;background:#fff;margin-left:-18px;margin-right:-18px;box-shadow:0 20px 35px rgba(0,0,0,.2)}.nk-block-tools-toggle .nk-block-tools{padding-top:20px;padding-bottom:20px}.nk-block-tools-toggle .nk-block-tools-opt{margin-left:auto}}@media(max-width: 575.98px){.card-tools-toggle .card-title-group{position:static}.card-tools-toggle .toggle-wrap .toggle-content{padding:1.25rem 1rem;transform:translate(0);top:0;left:0;right:0;bottom:0}.card-tools-toggle .toggle-wrap .toggle-close{margin-right:auto}.card-tools-toggle .toggle-wrap .toggle-close .btn-trigger:before{opacity:0}.card-tools-toggle .toggle-wrap .toggle-close .btn-trigger:hover:before{opacity:1}}@media(min-width: 576px){.card-tools-toggle{z-index:9}.card-tools-toggle .toggle-wrap .toggle{display:none}.card-tools-toggle .toggle-wrap .toggle-content{z-index:9;opacity:1;visibility:visible;position:static;background:rgba(0,0,0,0);box-shadow:none;transform:translate(0)}.card-tools-toggle .toggle-wrap .toggle-close{display:none}}@media(min-width: 576px){.toggle-break-sm{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-sm.collapse{display:block}}@media(min-width: 768px){.toggle-break-md{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-md.collapse{display:block}}@media(min-width: 992px){.toggle-break-lg{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-lg.collapse{display:block}}@media(min-width: 1200px){.toggle-break-xl{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-xl.collapse{display:block}}@media(min-width: 1540px){.toggle-break-xxl{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-xxl.collapse{display:block}}.nav-switch{display:inline-flex;margin-bottom:1.5rem;border:1px solid #dbdfea;border-radius:30px;padding:5px}.nav-switch .nav-link{padding:5px 16px;line-height:20px;border-radius:20px;position:static;text-transform:uppercase;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;color:#8094ae}.nav-switch .nav-link.active{background:#0fac81;color:#fff}.nav-switch .nav-link:after{display:none}.nav-switch .nav-item{padding:0;margin:0 1px}.nav-switch .nav-item:last-child{margin-right:0}.nav-switch .nav-item:first-child{margin-left:0}@media(min-width: 576px){.nav-switch{margin-bottom:2.5rem}}.nav-switch-s2{display:inline-flex;border-radius:4px;border:none}.nav-switch-s2 .nav-link{padding:.25rem .7rem;line-height:20px;border-radius:0;position:static;text-transform:uppercase;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;color:#8094ae;border:1px solid #dbdfea}.nav-switch-s2 .nav-link:hover,.nav-switch-s2 .nav-link:focus{color:#526484;background:#f5f6fa;border:1px solid #dbdfea}.nav-switch-s2 .nav-link.active{color:#364a63;border:1px solid #dbdfea;background:#f5f6fa;box-shadow:inset 0 0 4px -1px rgba(128,148,174,.25)}.nav-switch-s2 .nav-link:after{display:none}.nav-switch-s2 .nav-item{padding:0;margin:0}.nav-switch-s2 .nav-item:last-child{margin-right:0}.nav-switch-s2 .nav-item:last-child .nav-link{border-radius:0 4px 4px 0}.nav-switch-s2 .nav-item:first-child{margin-left:0}.nav-switch-s2 .nav-item:first-child .nav-link{border-radius:4px 0 0 4px}.nav-switch-s2 .nav-item:not(:first-child){margin-left:-1px}.widget-title{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.widget-title>*{margin-bottom:0}.text-center .widget-title{justify-content:center}.is-theme .widget-title a:hover{color:#fff}.side-wg:not(:last-child){margin-bottom:2.5rem}.side-wg-title{padding-bottom:.75rem}.side-wg .back-to{font-size:.875rem;line-height:1.1;font-weight:400;position:relative;color:#8094ae;display:inline-flex;align-items:center}.side-wg .back-to .icon{font-size:1.25rem;width:1.75rem;margin-top:-3px;display:inline-block}.nk-ck{height:260px}.nk-ck-sm{height:180px}.nk-ck1{height:120px}.nk-ck2{height:240px}.nk-ck3{height:160px}.nk-cktv{height:300px;overflow:hidden;border:1px solid #dbdfea;border-radius:4px}.nk-cktv .tradingview-widget-container{overflow:hidden;position:relative;top:8px}.nk-cktv .tradingview-widget-container>div{margin:-1px}@media(min-width: 576px){.nk-ck{height:260px}.nk-ck-sm{height:180px}.nk-ck1{height:120px}.nk-ck2{height:240px}.nk-ck3{height:258px}}.nk-wg6-title:not(:first-child){margin-top:1.5rem}.nk-wg6-title:not(:last-child){margin-bottom:1.5rem}.nk-wg6-text:not(:last-child){margin-bottom:1.5rem}.aside-wg+.aside-wg{padding-top:2rem}.nk-modal-title:not(:first-child){margin-top:1.5rem}.nk-modal-title:not(:last-child){margin-bottom:1.5rem}.nk-modal-title.title{font-size:1.5rem}.nk-modal-text:not(:last-child){margin-bottom:1.5rem}.nk-modal-text .lead{font-size:1.1rem;line-height:1.5}.nk-modal-text .sub-text{font-size:14px}.nk-modal-action{margin-top:1.5rem}.nk-modal-action-sm{margin-top:1rem}.nk-modal-action-md{margin-top:2rem}.nk-modal-action-lg{margin-top:2.25rem}.modal-body-lg .tab-content{margin-top:2rem}@media(min-width: 576px){.nk-modal-action-md{margin-top:2.5rem}.nk-modal-action-lg{margin-top:3.25rem}}[data-bs-toggle=modal]{cursor:pointer}.search-wrap{position:absolute;top:0;bottom:0;left:0;right:0;opacity:0;background:#fff;transition:opacity .4s;border-radius:6px;pointer-events:none;display:flex;align-items:center}.search-wrap.active{opacity:1;z-index:9;pointer-events:auto}.search-wrap-extend{margin-top:-1rem;left:-2px;right:-2px}.search-toggle{transition:all .4s;opacity:1}.search-toggle.active{opacity:0}.search-content{position:relative;width:100%}.search-content .form-control,.search-content div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .search-content input,.search-content .dual-listbox .dual-listbox__search,.dual-listbox .search-content .dual-listbox__search{padding-left:calc(2.125rem + 2px);padding-right:calc(2.125rem + 2px)}.search-content .form-control-sm{padding-left:calc(1.75rem + 2px);padding-right:calc(1.75rem + 2px)}.search-back,.search-submit{position:absolute;top:50%}.search-back:focus,.search-submit:focus{box-shadow:none}.search-back{left:0;transform:translate(-0.25rem, -50%)}.search-submit{right:0;transform:translate(0.5rem, -50%)}.search-submit:hover{color:#0fac81}.nk-search-box{margin-top:1.5rem;margin-bottom:1.25rem}.nk-search-box .form-icon{height:100%;border:none;background:rgba(0,0,0,0);width:3.5rem}.nk-search-box .form-control,.nk-search-box div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-search-box input,.nk-search-box .dual-listbox .dual-listbox__search,.dual-listbox .nk-search-box .dual-listbox__search{border-radius:1.5rem;padding-left:1.25rem;padding-right:1.5rem}.nk-block+.nk-block,.nk-block+.nk-block-head{padding-top:28px}.nk-block+.nk-block-lg,.nk-block+.nk-block-head-lg{padding-top:2.5rem}.nav-tabs+.nk-block{padding-top:1.5rem}.nav-tabs+.nk-block-sm{padding-top:1rem}.nk-block-area{display:flex}.nk-block-area-column{flex-direction:column}.nk-block-between{display:flex;justify-content:space-between;align-items:center}.nk-block-between>.title:first-child{margin-bottom:0}.nk-block-middle{margin-top:auto;margin-bottom:auto}.nk-block-head{position:relative;padding-bottom:1.25rem}.nk-block-head:only-child{padding-bottom:0}.nk-block-head h2:not(:last-child),.nk-block-head .h2:not(:last-child){margin-bottom:1rem}.nk-block-head-sub{font-size:1rem;line-height:1.5rem;margin-bottom:.5rem;color:#8094ae;font-weight:400;position:relative}.nk-block-head-sub .back-to{color:inherit;display:inline-flex;align-items:center}.nk-block-head-sub .back-to .icon{font-size:1.5rem;width:2rem;margin-top:-3px;display:inline-block}.nk-block-head-sub .dropdown{position:absolute;right:-8px;top:-6px}.nk-block-head-xs{padding-bottom:.75rem}.nk-block-head-sm{padding-bottom:1rem}.nk-block-head-lg{padding-bottom:1.5rem}.nk-block-head+.nav-tabs{margin-top:-1rem}.nk-content-body>.nk-block-head:first-child{padding-bottom:1.25rem}.nk-block-head .nk-block-text{margin-top:1.5rem}.nk-block-head .nk-block-text+.btn,.nk-block-head .dual-listbox .nk-block-text+.dual-listbox__button,.dual-listbox .nk-block-head .nk-block-text+.dual-listbox__button{margin-top:1.5rem}.nk-block-tools{display:flex;align-items:center}.nk-block-tools>*{display:inline-flex}.nk-block-des{color:#526484}.nk-block-des strong{color:#364a63}.nk-block-des .icon{vertical-align:middle}.nk-block-content+.nk-block-head{padding-top:2rem}.nk-block-content+.nk-block-head-sm{padding-top:1.5rem}.nk-block-content-head:not(:last-child){margin-bottom:1rem}.nk-block-title-group{display:flex;justify-content:space-between;align-items:center}.nk-block-title-group .title{margin-bottom:0}.nk-block-title-group:not(:last-child){margin-bottom:.5rem}@media(min-width: 576px){.nk-block-head-lg{padding-bottom:2.5rem}.nk-content-body>.nk-block-head:first-child{padding-bottom:1.5rem}.nk-block-content+.nk-block-head{padding-top:4rem}.nk-block-content+.nk-block-head-sm{padding-top:2.5rem}}@media(min-width: 768px){.nk-content-body>.nk-block-head:first-child{padding-bottom:2.5rem}.nk-content-body>.nk-block-head-sm:first-child{padding-bottom:1.75rem}.nav-tabs+.nk-block{padding-top:2.5rem}.nav-tabs+.nk-block-sm{padding-top:2rem}.nav-tabs+.nk-block-xs{padding-top:1.25rem}.nk-block-text h5,.nk-block-text .h5,.nk-block-text h6,.nk-block-text .h6{font-size:1rem}}@media(max-width: 767.98px){.nk-block-tools .opt-menu-md{order:100;margin-left:auto}}@media(min-width: 768px){.nk-block-between-md{display:flex;justify-content:space-between;align-items:center}}.nk-block-subhead{padding-bottom:.5rem;border-bottom:1px solid #dbdfea}.nk-feature-center{text-align:center}.filter-wg label.overline-title{margin-bottom:.5rem}.change{line-height:1}.change .sign{font-family:"Nioicon"}.change .sign:before{content:""}.change.up{color:#1ee0ac !important}.change.up .sign:before{content:""}.change.down{color:#e85347 !important}.change.down .sign:before{content:""}.nk-knob>div{position:relative;display:inline-block !important}.knob{height:100% !important;margin-top:0 !important;font-size:1.5rem !important}.knob-half{height:50% !important;font-size:1.25rem !important}[class*=knob]{text-align:center;pointer-events:none;width:100% !important;font-weight:400 !important;font-family:Roboto,sans-serif !important;color:#364a63 !important;margin-left:0 !important;left:0;border:none}[class*=knob]:focus{outline:none}.stats{padding:0 0 1rem}@media(min-width: 1540px){.nk-content-sidebar .stats{padding:1.25rem 1.5rem 1rem}}.collapse-shown{display:inline-block !important}.collapsed .collapse-shown{display:none !important}.collapse-hidden{display:none !important}.collapsed .collapse-hidden{display:inline-block !important}.clipboard-init{cursor:pointer}.clipboard-success .clipboard-init{color:#1bca9b}.clipboard-text{font-size:12px}.clipboard-success .form-control:focus,.clipboard-success div.dataTables_wrapper div.dataTables_filter input:focus,div.dataTables_wrapper div.dataTables_filter .clipboard-success input:focus,.clipboard-success .dual-listbox .dual-listbox__search:focus,.dual-listbox .clipboard-success .dual-listbox__search:focus{border-color:#dbdfea;box-shadow:inset 0 1px 1px rgba(16,25,36,.075)}.nk-news-item{display:flex;align-items:center}.nk-news-icon{width:2rem;display:inline-flex;flex-shrink:0}.nk-news-icon .icon{font-size:24px;color:#0fac81}.is-theme .nk-news-icon .icon{color:#11c393}.nk-news-icon img{width:24px}.nk-news-text{display:flex;align-items:center;max-width:calc(100% - 1.5rem)}.nk-news-text p{font-size:13px;margin-bottom:0;color:#526484;font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:calc(100% - 2rem)}.nk-news-text p span{color:#8094ae;font-weight:400}.is-dark .nk-news-text p{color:#90a1b8}.is-dark .nk-news-text p span{color:rgba(128,148,174,.9)}.is-theme .nk-news-text p{color:#bee9dd}.is-theme .nk-news-text p span{color:rgba(171,226,211,.8)}.nk-news-text .icon{color:#8094ae;margin-left:.25rem}.is-dark .nk-news-text .icon{color:#8094ae}.is-theme .nk-news-text .icon{color:#abe2d3}.nk-news-item:hover .nk-news-text .icon{color:#0fac81}.language-list li:not(:last-child) .language-item{border-bottom:1px solid #ecf2ff}.language-item{display:flex;align-items:center;padding:12px 20px;color:#344357;transition:all .4s}.language-item:hover{color:#3c4d62;background:#ebeef2}.language-name{font-size:12px}.language-flag{width:24px;margin-right:12px}.entry img,.entry .video,.entry .image-group{border-radius:4px}.entry img+p,.entry img+h2,.entry img+.h2,.entry img+h3,.entry img+.h3,.entry img+h4,.entry img+.h4,.entry img+h5,.entry img+.h5,.entry img+h6,.entry img+.h6,.entry img+ul,.entry img+ol,.entry .video+p,.entry .video+h2,.entry .video+.h2,.entry .video+h3,.entry .video+.h3,.entry .video+h4,.entry .video+.h4,.entry .video+h5,.entry .video+.h5,.entry .video+h6,.entry .video+.h6,.entry .video+ul,.entry .video+ol,.entry .image-group+p,.entry .image-group+h2,.entry .image-group+.h2,.entry .image-group+h3,.entry .image-group+.h3,.entry .image-group+h4,.entry .image-group+.h4,.entry .image-group+h5,.entry .image-group+.h5,.entry .image-group+h6,.entry .image-group+.h6,.entry .image-group+ul,.entry .image-group+ol{margin-top:2rem}.entry p+img{margin-top:1rem}.entry p+h2,.entry p+.h2,.entry p+h3,.entry p+.h3,.entry p+h4,.entry p+.h4,.entry p+h5,.entry p+.h5,.entry p+h6,.entry p+.h6,.entry p+.video,.entry p+.image-group{padding-top:.75rem}p>span>.icon.ni{vertical-align:middle}.btn-trigger+.dropdown-menu-end,.btn-trigger+.dropdown-menu-start{margin:-0.75rem 0 !important}.btn-trigger+.dropdown-menu-end{margin-right:16px !important}.btn-trigger+.dropdown-menu-start{margin-left:16px}@media(max-width: 420px){.btn-trigger+.dropdown-menu-xl,.btn-trigger+.dropdown-menu-lg,.btn-trigger+.dropdown-menu-md{margin-right:-16px !important;margin-top:0 !important}}.bq-note-item:not(:first-child){margin-top:1.75rem}.bq-note-text{padding:1rem 1.25rem;background:#f5f6fa;border-radius:4px}.bq-note-meta{font-size:12px;color:#8094ae;margin-top:.75rem}.bq-note-meta span>span{color:#526484}.bq-note-meta .link{margin-left:.75rem}.bq-note-sep{height:.25rem;display:block;visibility:hidden;padding:0 .25rem}.bq-note-by{display:inline-block}@media(min-width: 576px){.bq-note-text{padding:1.25rem 1.5rem}.bq-note-sep{height:auto;display:inline-block;visibility:visible}}@media(min-width: 1200px)and (max-width: 1359px){.form-settings .col-lg-5,.form-settings .col-lg-7{flex:0 0 100%;max-width:100%}}.ratio{border-radius:4px}.video{position:relative;overflow:hidden;border-radius:4px}.video:before{position:absolute;content:"";bottom:0;right:0;left:0;height:120px;background:linear-gradient(to top, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0))}.video-play{display:flex;align-items:center;position:absolute;left:2rem;bottom:2rem;color:#fff;font-size:1.25rem}.video-play:hover{color:#fff}.video-play .icon{font-size:2rem}.nk-slider{position:relative}.nk-slider-s1{width:290px;max-width:100%}.nk-slider-s1 .slick-dots{position:absolute;right:1.25rem;top:1.5rem;padding-top:0}.nk-slider-s2 .slider-arrows>div{padding:.5rem 0}.project-head{display:flex;justify-content:space-between;margin-bottom:1.25rem;align-items:start}.project-title{display:flex;align-items:center;margin-right:.75rem}.project-title .user-avatar{margin-right:1rem}.project-title .title{font-size:.975rem}.project-title .title:not(:last-child){margin-bottom:.125rem}.project-details{margin-bottom:1rem}.project-progress{margin-bottom:1rem}.project-progress-details{display:flex;justify-content:space-between;margin-bottom:.5rem}.project-progress-task{display:flex;align-items:center;color:#8094ae}.project-progress-task .icon{font-size:1rem;line-height:1.5rem;margin-right:.25rem}.project-progress-percent{color:#526484;font-weight:500}.project-meta{display:flex;align-items:center;justify-content:space-between}.project-users{display:flex;align-items:center}.project-list-progress{display:flex;align-items:center}.project-list-progress .progress{width:100px;margin-right:.5rem}@media(min-width: 1540px){.project-list-progress .progress{width:140px;margin-right:1rem}}.team{position:relative}.team-info{padding:1rem 0 1.25rem}.team-info li{display:flex;align-items:center;justify-content:space-between;font-size:.9375rem;line-height:1.75rem}.team-info li span:first-child{color:#8094ae}.team-info li span:last-child{color:#526484}.team-status{position:absolute;left:0;display:flex;align-items:center;justify-content:center;height:20px;width:20px;border-radius:50%}.team-options{position:absolute;top:-0.25rem;right:-0.25rem}.team-details{padding-top:.5rem;text-align:center;max-width:200px;margin:0 auto}.team-statistics{display:flex;justify-content:space-around;text-align:center;padding:1rem 0 1.5rem}.team-statistics li span{display:block}.team-statistics li span:first-child{font-size:1.125rem;color:#1c2b46}.team-statistics li span:last-child{font-size:.875rem;color:#8094ae}.team-view{display:flex;justify-content:center;padding-bottom:.25rem}.rating{display:flex;align-items:center;margin:0 -0.125rem;color:#f4bd0e}.rating>*{padding:0 .125rem;display:inline-flex}.rating .icon{font-size:1rem}.rating-wrap{display:inline-flex;align-items:flex-start}.rating-wrap .amount{line-height:1.25rem}.rating-wrap .rating+span,.rating-wrap span+.rating{margin-left:.75rem}.rating-pill{padding:.35rem .875rem;border-radius:3rem}.rating-card-description .icon{color:#0fac81}.rating-card-description li{color:#8094ae}.rating-progress{display:flex;align-items:center}.icon+span,span+.icon{margin-left:.25rem}.nk-auth-body{padding:1.25rem}.nk-auth-footer{padding-bottom:40px}.nk-auth-body,.nk-auth-footer{width:100%;max-width:420px;margin-left:auto;margin-right:auto}.nk-auth-footer{padding-left:1.25rem;padding-right:1.25rem}.nk-auth-footer-full{margin-top:0}@media(min-width: 992px){.nk-auth-container{width:45%}}@media(min-width: 1540px){.nk-split .nk-auth-body,.nk-split .nk-auth-footer{margin-right:90px}}.nk-error-ld{padding:2rem 1rem}.nk-error-gfx{padding-bottom:30px;max-width:90%}.nk-error-head{font-size:160px;font-weight:700;background:-webkit-linear-gradient(#0fac81, #07523d);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);opacity:.9}.nk-error-title{padding-bottom:1rem}.nk-error-text{font-size:1rem}@media(min-width: 576px){.nk-error-lead{font-size:200px}.nk-error-gfx{padding-bottom:60px;max-width:520px}}.clipboard-success-message{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;color:#1ee0ac;background:rgba(255,255,255,.9);border-radius:4px;opacity:0;pointer-events:none;transition:opacity .3s}.clipboard-success .clipboard-success-message{opacity:1}.has-shadow.bg-lighter .card,.dual-listbox .has-shadow.dual-listbox__item:hover .card,.has-shadow.bg-lighter .sp-pdl-item,.dual-listbox .has-shadow.dual-listbox__item:hover .sp-pdl-item,.has-shadow.bg-lighter .invoice-wrap,.dual-listbox .has-shadow.dual-listbox__item:hover .invoice-wrap,.has-shadow.bg-lighter .accordion,.dual-listbox .has-shadow.dual-listbox__item:hover .accordion{box-shadow:0 0 8px -3px rgba(60,77,98,.15)}.has-shadow .card,.has-shadow .sp-pdl-item,.has-shadow .invoice-wrap,.has-shadow .accordion{box-shadow:0 0 6px -2px rgba(60,77,98,.2)}.has-shadow .data-head,.has-shadow .data-item{padding-left:1.5rem;padding-right:1.5rem}.has-shadow .card .data-head:not(.is-plain){margin-left:.75rem;margin-right:.75rem;padding-left:.75rem}.has-shadow .nav-tabs{box-shadow:0 2px 0 -1px rgba(60,77,98,.06)}.has-shadow .nk-header{box-shadow:0 3px 0 -1px rgba(60,77,98,.04)}.nio-version{text-transform:uppercase;font-size:9px;font-weight:700;letter-spacing:.02em;position:absolute;right:-1px;bottom:-3px}.code-tag{color:#816bff}.code-class{color:#ff63a5}.code-fnc{color:#09c2de}.nk-switch-icon{color:#90a1b8;height:1.5rem;width:1.5rem;display:flex;align-items:center;justify-content:center}.nk-switch-icon .icon{font-size:1.5rem}.nk-switch-icon .icon-sm{font-size:1.25rem}.nk-switch-icon:hover{color:#526484}.nk-switch-icon.active{color:#0fac81}.dark-switch{position:relative}.dark-switch:before,.dark-switch:after{position:absolute;content:"";transform:translateY(-50%);border-radius:1.5rem;display:block;top:50%}.dark-switch:before{right:0;width:3rem;height:1.5rem;background-color:#fff;border:#dbdfea solid 2px}.dark-switch:after{height:1rem;width:1rem;right:calc(2rem - 2px - .125rem);background-color:#dbdfea}.dark-switch.active:before{background-color:#0fac81;border-color:#0fac81}.dark-switch.active:after{right:calc(2px + .125rem);background-color:#fff}.is-scrollable{overflow:auto}.country-list{display:flex;flex-wrap:wrap}.country-list li{width:100%}.country-item{display:flex;align-items:center}.country-flag{width:1.25rem;margin-right:.75rem}.country-name{font-size:1rem;color:#526484}@media(min-width: 576px){.country-list li{width:50%}}@media(min-width: 992px){.country-list li{width:33.33%}}.collapsed .switch-text-normal{display:none}.switch-text-collapsed{display:none}.collapsed .switch-text-collapsed{display:inline-flex}.close{float:right;font-size:1.505rem;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):hover-focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}.popover-header{border-bottom:1px solid #eaeaea}.profile-ud-label{display:block;color:#8094ae}.plain .profile-ud-label{font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.1em}.wider .profile-ud-label{display:inline-flex;letter-spacing:-0.01em;width:120px;flex-shrink:0}.profile-ud-value{color:#526484}.wider .profile-ud-value{text-align:right;font-weight:500;width:100%}.profile-ud.wider{display:flex;padding:.5rem 0}.profile-ud-item:nth-child(n+2) .profile-ud.plain{margin-top:1.25rem}@media(min-width: 768px){.profile-ud.wider{padding:.75rem 0}.profile-ud-list{display:flex;flex-wrap:wrap;margin:-0.25rem -3.25rem;max-width:960px}.profile-ud-item{width:50%;padding:0 3.25rem}.profile-ud-item:nth-child(2) .profile-ud.plain{margin-top:0}}.profile-stats .amount{font-size:1.125rem;font-weight:700}.profile-balance-group{display:flex;align-items:flex-end}.profile-balance-ck{position:relative;height:70px;margin-top:.5rem}.profile-balance-sub{font-size:.875rem;color:#8094ae}.profile-balance-subtitle{font-size:.75rem;margin-top:.5rem}.profile-balance-sub .icon{font-size:.75rem}.profile-balance-plus{position:absolute}.profile-balance-plus .icon{font-size:1rem;line-height:1.5rem}.profile-balance-plus~*{padding-left:24px}.profile-balance-amount .number{font-size:1.25rem;font-weight:700;color:#364a63;line-height:1.5rem;white-space:nowrap}.profile-balance-amount .number small,.profile-balance-amount .number .small{font-weight:400}.steps ul{display:flex}.steps ul li{flex-grow:1}.steps .current-info{display:none}.actions ul{display:flex;margin:-10px;padding-top:20px}.actions ul li{padding:10px}.actions ul li:first-child{order:1}.actions ul li a{display:inline-block;position:relative;color:#fff;font-weight:500;transition:all .4s ease;border-color:#0fac81;background:#0fac81;padding:.4375rem 1.125rem;font-size:0.8125rem;border-radius:4px;line-height:1.25rem}.actions ul li.disabled{display:none}.nk-wizard-head{display:none}.nk-wizard-simple .steps{margin-bottom:20px}.nk-wizard-simple .steps ul li{position:relative;padding-bottom:5px;padding-right:1rem;margin-bottom:.5rem}.nk-wizard-simple .steps ul li h5,.nk-wizard-simple .steps ul li .h5{border:none;padding:0 0 6px 0;letter-spacing:.02em;font-size:13px;text-transform:uppercase;font-weight:500;color:#8094ae}.nk-wizard-simple .steps ul li .number{font-size:13px;color:#8094ae;font-weight:700}.nk-wizard-simple .steps ul li:after{position:absolute;height:1px;width:100%;left:0;bottom:0;content:"";transition:all .4s;background:#e5e9f2}.nk-wizard-simple .steps ul li.done:after,.nk-wizard-simple .steps ul li.current:after{height:2px;background:#0fac81;width:100%}.nk-wizard-simple .steps ul li.done h5,.nk-wizard-simple .steps ul li.done .h5,.nk-wizard-simple .steps ul li.done .number,.nk-wizard-simple .steps ul li.current h5,.nk-wizard-simple .steps ul li.current .h5,.nk-wizard-simple .steps ul li.current .number{color:#0fac81}.nk-wizard-simple .steps ul li.current~.done:after{height:1px;background:#e5e9f2}.nk-wizard-simple .steps ul li.current~.done h5,.nk-wizard-simple .steps ul li.current~.done .h5,.nk-wizard-simple .steps ul li.current~.done .number{color:#8094ae}.nk-wizard-simple .steps .current-info{display:none}.nk-wizard.is-vertical .steps ul{flex-wrap:wrap}.nk-wizard.is-vertical .steps ul li h5,.nk-wizard.is-vertical .steps ul li .h5{text-transform:none}@media(min-width: 768px){.nk-wizard.is-vertical{display:flex;flex-wrap:wrap}.nk-wizard.is-vertical .steps{width:33%;padding-right:2rem}.nk-wizard.is-vertical .steps ul li{width:100%}.nk-wizard.is-vertical .steps ul li:not(:last-child){margin-bottom:1rem}.nk-wizard.is-vertical .content{width:66%}.nk-wizard.is-vertical .actions{margin-left:33%}}.tb-tnx-head{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;background:#f5f6fa}.tb-tnx-head td,.tb-tnx-head th{color:#8094ae;padding:.625rem .25rem}.tb-tnx-head th{border-radius:0}.tb-tnx-head th:first-child{border-top-left-radius:4px}.tb-tnx-head th:last-child{border-top-right-radius:4px}.tb-tnx-item{font-size:14px}.tb-tnx-item td{padding:1.25rem .25rem;vertical-align:middle}.is-compact .tb-tnx-item td{padding-top:.4rem;padding-bottom:.4rem}.tb-tnx-id a{display:block}.tb-tnx-id span{font-weight:500}.tb-tnx-item .tb-tnx-total{font-weight:500;color:#526484}.tb-tnx-desc{padding-right:.5rem}.tb-tnx-item .tb-tnx-date{color:#8094ae}.tb-tnx-item .tb-tnx-date .date{font-size:13px}.tb-tnx-action{width:60px;text-align:right}.tb-tnx-action .dropdown{margin-top:-0.25rem;margin-bottom:-0.25rem}.tb-tnx-btns .btn+.btn,.tb-tnx-btns .dual-listbox .dual-listbox__button+.btn,.dual-listbox .tb-tnx-btns .dual-listbox__button+.btn,.tb-tnx-btns .dual-listbox .btn+.dual-listbox__button,.dual-listbox .tb-tnx-btns .btn+.dual-listbox__button,.tb-tnx-btns .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .tb-tnx-btns .dual-listbox__button+.dual-listbox__button{margin-left:.5rem}.tb-tnx-btns+.dropdown{margin-left:1rem}@media(max-width: 767px){.tb-tnx-item,.tb-tnx-head{display:flex;width:100%}.tb-tnx-item th,.tb-tnx-head th{flex-grow:1;padding-top:.5rem;padding-bottom:.5rem}.tb-tnx-item td,.tb-tnx-head td{flex-grow:1;border:none;padding-top:0;padding-bottom:0}.tb-tnx-item{flex-wrap:wrap;padding-top:1rem;padding-bottom:1rem}.tb-tnx-item:not(:last-child){border-bottom:1px solid #e5e9f2}.tb-tnx-amount{width:110px;text-align:right}.tb-tnx-id,.tb-tnx-head th:first-child{min-width:85px;padding-right:.25rem !important;flex-grow:0 !important}.tb-tnx-info{width:45%}.tb-tnx-date .date{font-size:12px}.tb-tnx-date .date+.date{padding-left:.5rem}.tb-tnx-action:last-child{flex-grow:0;padding-left:.5rem;display:inline-flex;align-items:center}}@media(max-width: 575px){.tb-tnx-item{font-size:13px}.tb-tnx-id{width:100%}.tb-tnx-id+td{padding-left:1.25rem}.tb-tnx-info{width:65%}.tb-tnx-amount:last-child{width:25%}.tb-tnx-amount:not(:last-child){display:none}.tb-tnx-amount.is-alt{position:absolute;display:inline-flex;right:1.25rem;width:auto}.tb-tnx-amount.is-alt .tb-tnx-total{order:5;padding-left:1.25rem}}@media(min-width: 768px){.tb-tnx-desc,.tb-tnx-date,.tb-tnx-total,.tb-tnx-status{display:inline-block;vertical-align:middle}.tb-tnx-desc,.tb-tnx-date{width:calc(50% - 4px)}.tb-tnx-total{width:calc(60% - 4px)}.tb-tnx-status{width:calc(40% - 4px)}.tb-tnx-amount{width:25%}.tb-tnx-date .date,.tb-tnx-date>span>span{width:calc(50% - 4px);display:inline-block}.tb-tnx-date .date+.date,.tb-tnx-date>span>span+span{padding-left:.75rem}}.tb-odr-item{font-size:14px}.tb-odr-item td{padding:1rem .25rem;vertical-align:middle}.tb-odr-id,.tb-odr-total{display:block}.tb-odr-item .tb-odr-id,.tb-odr-item .tb-odr-total{font-weight:500}.tb-odr-id a{display:block}.tb-odr-id span{font-weight:500}.tb-odr-item .tb-odr-total{color:#364a63}.tb-odr-head .tb-odr-item .tb-odr-total{color:inherit}.tb-odr-item .tb-odr-date{color:#8094ae}.tb-odr-head .tb-odr-item .tb-odr-date{color:inherit}.tb-odr-action>div,.tb-odr-action>.btn,.dual-listbox .tb-odr-action>.dual-listbox__button{vertical-align:middle}.tb-odr-action:last-child{padding-left:1.25rem;text-align:right}.tb-odr-btns .btn+.btn,.tb-odr-btns .dual-listbox .dual-listbox__button+.btn,.dual-listbox .tb-odr-btns .dual-listbox__button+.btn,.tb-odr-btns .dual-listbox .btn+.dual-listbox__button,.dual-listbox .tb-odr-btns .btn+.dual-listbox__button,.tb-odr-btns .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .tb-odr-btns .dual-listbox__button+.dual-listbox__button{margin-left:.5rem}.tb-odr-id{min-width:90px}.tb-odr-head{background:#f5f6fa}.tb-odr-head th{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:#8094ae;padding:.625rem .25rem}@media(max-width: 767px){.tb-odr-item th,.tb-odr-item td{flex-grow:1}.tb-odr-amount{text-align:right}}@media(max-width: 575px){.tb-odr-item{font-size:13px}.tb-odr-amount{width:24%}.tb-odr-info{width:44%}.tb-odr-action{width:2rem;min-width:auto}.tb-odr-item .tb-odr-action{padding-left:.5rem}}@media(min-width: 768px){.tb-odr-info{min-width:55%}.tb-odr-amount{width:30%}.tb-odr-total{min-width:100px}.tb-odr-id,.tb-odr-total{display:inline-block}.tb-odr-id+span,.tb-odr-total+span{padding-left:1rem}.tb-odr-btns+.dropdown,.tb-odr-btns+.btn,.dual-listbox .tb-odr-btns+.dual-listbox__button{margin-left:.75rem}}@media(min-width: 992px){.tb-odr-id{min-width:120px}.tb-odr-total{min-width:50%}}.is-compact .tb-tnx-item td,.is-compact .tb-odr-item td{padding-top:.4rem;padding-bottom:.4rem}@media(max-width: 767px){.is-compact .tb-tnx-item,.is-compact .tb-odr-item{padding-top:.5rem;padding-bottom:.5rem}.is-compact .tb-tnx-item td,.is-compact .tb-odr-item td{padding-top:0;padding-bottom:0}}.nk-tb-list{display:table;width:100%;font-size:13px;color:#8094ae}.nk-tb-list.is-alt{color:#526484}.nk-tb-list .list-status,.nk-tb-list .tb-status{font-size:12px;font-weight:500}.nk-tb-list .tb-lead,.nk-tb-list .tb-amount{font-weight:500;color:#364a63;display:block;line-height:1.4}.nk-tb-list .tb-lead-sub,.nk-tb-list .tb-amount-sub{color:#526484;display:block;line-height:1.4}.nk-tb-list .tb-sub,.nk-tb-list .tb-amount-sm{font-size:.9em}.nk-tb-list .tb-amount span,.nk-tb-list .tb-amount .currency{color:#526484;font-weight:400}.nk-tb-list .user-info .tb-lead+span,.nk-tb-list .tb-lead+.tb-date{font-size:11px}.nk-tb-list .tb-country{display:flex;align-items:center}.nk-tb-list .tb-country .name{color:#364a63}.nk-tb-list .tb-country .flag{height:16px;border-radius:3px}.nk-tb-list .tb-country .flag+.name{margin-left:.6875rem}.nk-tb-list .tb-product{display:flex;align-items:center}.nk-tb-list .tb-product .thumb{width:48px;border-radius:4px;margin-right:1rem}.nk-tb-list .tb-product .title{font-weight:700;font-size:.875rem;color:#364a63}.nk-tb-list .tb-asterisk{font-size:1.125rem;line-height:1;vertical-align:middle}.nk-tb-list .tb-asterisk a,.nk-tb-list .tb-asterisk .asterisk-on,.nk-tb-list .tb-asterisk a:hover,.nk-tb-list .tb-asterisk a.active{color:#0fac81}.nk-tb-item{transition:background-color .3s,box-shadow .3s;display:table-row}.nk-tb-item:not(.nk-tb-head):hover,.nk-tb-item:not(.nk-tb-head).seleted{background:#f8f9fc;box-shadow:0 0 10px -4px rgba(54,74,99,.2)}.nk-tb-col{position:relative;display:table-cell;vertical-align:middle;padding:1rem .5rem}.nk-tb-col:first-child{padding-left:1.25rem}.nk-tb-col:last-child{padding-right:1.25rem}.nk-tb-col-tools{max-width:3.75rem}.nk-tb-col-check{width:3rem}.nk-tb-col-check .custom-control{vertical-align:middle}.nk-tb-item:not(:last-child) .nk-tb-col{border-bottom:1px solid #dbdfea}.nk-tb-head .nk-tb-col{padding-top:.5rem;padding-bottom:.5rem;color:#8094ae;font-size:.9em;border-bottom:1px solid #dbdfea}.nk-tb-col-action{text-align:right}.nk-tb-col-action>.dropdown:last-child{right:-0.5rem}.nk-tb-col-nosort:before,.nk-tb-col-nosort:after{display:none !important}.nk-tb-actions{display:flex;align-items:center;justify-content:flex-end;position:relative}.nk-tb-ulist .nk-tb-actions,.nk-tb-actions-adj .nk-tb-actions{right:-0.5rem}.nk-tb-actions.visible1{width:1rem}.nk-tb-action-hidden{opacity:0;transition:.3s ease}.nk-tb-item:hover .nk-tb-action-hidden{opacity:1;background:#f8f9fc}.nk-tb-list .nk-tb-head .btn-trigger .icon{font-size:1.5em}.nk-tb-list.is-separate{margin-top:-8px;border-collapse:separate;border-spacing:0 8px}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{background:#fff;border:none;box-shadow:0px 1px 3px 0px rgba(54,74,99,.05)}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-radius:4px 0 0 4px}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-radius:0 4px 4px 0}.nk-tb-list.is-separate .nk-tb-item:hover .nk-tb-action-hidden{background:#fff}.nk-tb-list.is-separate .nk-tb-head .nk-tb-col{padding-top:.75rem;padding-bottom:.75rem}@media(min-width: 576px){.nk-tb-col-check{width:3.25rem}.nk-tb-item .nk-tb-col:first-child{padding-left:1.5rem}.nk-tb-item .nk-tb-col:last-child{padding-right:1.5rem}}@media(min-width: 1540px){.nk-tb-list{font-size:14px}.nk-tb-list .list-status,.nk-tb-list .tb-status{font-size:13px}.nk-tb-list .user-info .tb-lead+span,.nk-tb-list .tb-lead+.tb-date{font-size:12px}}.is-loose .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:1.125rem;padding-bottom:1.125rem}.is-medium .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:.75rem;padding-bottom:.75rem}.is-compact .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:.5rem;padding-bottom:.5rem}.nk-tnx-type{display:flex;align-items:center}.nk-tnx-type-icon{font-size:1.125rem;flex-shrink:0;height:2.5rem;width:2.5rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:#e5e9f2;margin-right:1rem}@media(max-width: 991.98px){.nk-tb-tnx{font-size:12px;letter-spacing:-0.01em}.nk-tnx-type-icon{font-size:.875rem;height:1.75rem;width:1.75rem;margin-right:.75rem}}@media(max-width: 575.98px){.nk-tb-tnx .nk-tb-head .nk-tb-col-tools{opacity:0}.nk-tb-tnx .nk-tb-col-status{text-align:right;padding-right:1.25rem !important}.nk-tb-tnx .nk-tb-col-tools{position:absolute;right:0;opacity:0;transition:.3s ease}.nk-tb-tnx .nk-tb-item:hover .nk-tb-col-tools{opacity:1}.nk-tnx-type-icon{margin-right:.5rem}}@media(min-width: 768px){.nk-tb-tnx .nk-tb-col-status{padding-left:2.5rem}}@media(min-width: 1800px){.nk-tb-tnx .nk-tb-col-status{padding-left:6rem}}.timeline{color:#8094ae;line-height:1.3}.timeline+.timeline,.timeline-list+.timeline-head{margin-top:1.75rem}.timeline-head{font-size:14px;color:#8094ae;margin-bottom:1rem}.timeline-item{position:relative;display:flex;align-items:flex-start}.timeline-item:not(:last-child){padding-bottom:1.5rem}.timeline-item:not(:last-child):before{position:absolute;height:calc(100% - 11px);width:1px;background:#dbdfea;content:"";top:13px;left:5px}.timeline-status{position:relative;height:11px;width:11px;border-radius:50%;flex-shrink:0;margin-top:2px}.timeline-status.is-outline:after{position:absolute;height:7px;width:7px;border-radius:50%;background:#fff;content:"";top:2px;left:2px}.timeline-date{position:relative;color:#8094ae;width:90px;margin-left:.75rem;flex-shrink:0;line-height:1rem}.timeline-date .icon{vertical-align:middle;color:#8094ae;display:inline-block;position:absolute;margin-right:.25rem;right:0;top:2px}.timeline-data{padding-left:8px}.timeline-title{font-size:15px;color:#364a63;margin-bottom:.75rem}.timeline-des{color:#8094ae}.timeline-des p{margin-bottom:.25rem}.timeline .time{display:block;font-size:12px;color:#8094ae}@media(min-width: 576px){.timeline+.timeline,.timeline-list+.timeline-head{margin-top:2.5rem}}@media(max-width: 413px){.timeline-item{flex-wrap:wrap}.timeline-date{width:80px}.timeline-data{padding:.75rem 0 0 24px}}.nk-ecwg .amount{font-size:2rem;font-weight:500;color:#364a63}.nk-ecwg .amount-sm{font-size:1.5rem}.nk-ecwg .amount-xs{font-size:.875rem}.is-dark .nk-ecwg .amount{color:#fff}.nk-ecwg .info{font-size:.875rem}.is-dark .nk-ecwg .info{color:#abe2d3}.nk-ecwg .sub-title{font-size:.875rem;font-weight:500}.is-dark .nk-ecwg .sub-title{color:#fff}.nk-ecwg .data{margin-top:.5rem}.nk-ecwg .data:not(:last-child){margin-bottom:2rem}.nk-ecwg .data-group{display:flex;align-items:center;justify-content:space-between}.nk-ecwg .data-group .data{margin:0;padding-right:20px}.nk-ecwg1-ck{height:110px}.nk-ecwg2-ck{height:182px}.nk-ecwg3-ck{height:66px}.nk-ecwg4{display:flex;flex-direction:column}.nk-ecwg4-ck{height:180px;width:180px;margin-right:1.5rem}.nk-ecwg4-legends{flex-grow:1;padding:1rem 0}.nk-ecwg4-legends li{display:flex;justify-content:space-between;padding:.25rem 0}.nk-ecwg4-legends .title{display:flex;align-items:center}.nk-ecwg4-legends .title .dot{margin-right:.5rem}.nk-ecwg5-ck{height:140px}.nk-ecwg5 .data-group{margin-bottom:30px}.nk-ecwg6-ck{width:100px;height:40px;margin-left:20px}.nk-ecwg7-ck{height:180px;width:180px;margin:0 auto 15px}.nk-ecwg7-legends{display:flex;justify-content:center;flex-wrap:wrap}.nk-ecwg7-legends li{padding:.25rem 1rem}.nk-ecwg7-legends .title{display:flex;align-items:center;color:#8094ae}.nk-ecwg7-legends .title .dot{margin-right:.5rem}.nk-ecwg8-ck{height:200px}.nk-ecwg8-legends{display:flex;justify-content:center;flex-wrap:wrap;margin-bottom:1rem}.nk-ecwg8-legends li{padding:.25rem 1rem}.nk-ecwg8-legends .title{display:flex;align-items:center;color:#8094ae}.nk-ecwg8-legends .title .dot{margin-right:.5rem}@media(max-width: 490px){.nk-ecwg4 .data-group{flex-wrap:wrap}.nk-ecwg8-ck{height:140px}}@media(min-width: 1540px){.nk-ecwg4-ck{height:210px;width:210px;margin-right:2.5rem}}.nk-top-products .item{display:flex;align-items:center;padding:.625rem 0;line-height:1.2}.nk-top-products .thumb{width:44px;margin-right:1rem}.nk-top-products .thumb img{border-radius:4px}.nk-top-products .total{margin-left:auto;text-align:right}.nk-top-products .title,.nk-top-products .amount{font-size:.9375rem;color:#364a63;margin-bottom:.25rem}.nk-top-products .price,.nk-top-products .count{font-size:.8125rem;color:#8094ae;margin-bottom:1px}.nk-store-statistics .item{display:flex;align-items:center;justify-content:space-between;padding:.5rem 0}.nk-store-statistics .title{font-size:.8125rem;color:#8094ae}.nk-store-statistics .count{font-size:1.25rem;color:#364a63;font-weight:700}.nk-store-statistics .icon{display:flex;align-items:center;justify-content:center;font-size:1.5rem;height:44px;width:44px;border-radius:6px}.nk-download{display:flex;width:100%;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:1.25rem;border-radius:4px;background:#fff}.nk-download .data{display:flex;flex-grow:1}.nk-download .info{margin-top:.35rem}.nk-download .title{font-size:1rem;line-height:1.2}.nk-download .thumb{flex-shrink:0;width:3rem;margin-right:1rem}.nk-download .meta .version,.nk-download .meta .release{display:block;line-height:1.2;padding:.25rem 0}.nk-download .title .badge{margin-left:1rem}@media(min-width: 768px){.nk-download{padding:1.5rem}.nk-download .thumb{width:2.5rem;margin-right:1.5rem}.nk-download .data{align-items:center}.nk-download .meta .version,.nk-download .meta .release{display:inline-block;padding-right:1.5rem}}@media(max-width: 575px){.nk-download .data{width:100%;padding-left:4rem}.nk-download .thumb{position:absolute;margin-left:-4rem}.nk-download .actions{margin:.75rem 0 0;padding-left:4rem}}.nk-add-product{top:0;background-color:#fff;width:400px;height:100%;padding:1.5rem}.nk-add-product+.toggle-overlay{z-index:901}.invoice{position:relative}.invoice-wrap{padding:1.25rem;border:1px solid #dbdfea;border-radius:4px;background:#fff}.invoice-action{position:absolute;right:1.25rem;top:1.25rem}.invoice-brand{padding-bottom:1.5rem}.invoice-brand img{max-height:60px}.invoice-bills{font-size:12px}.invoice-bills .table{min-width:580px}.invoice-bills .table th{color:#0fac81;font-size:12px;text-transform:uppercase;border-top:0}.invoice-bills .table th:last-child,.invoice-bills .table td:last-child{text-align:right}.invoice-bills .table tfoot{border-top:1px solid #dbdfea}.invoice-bills .table tfoot td{border-top:0;white-space:nowrap;padding-top:.25rem;padding-bottom:.25rem}.invoice-bills .table tfoot tr:last-child td:not(:first-child),.invoice-bills .table tfoot tr:first-child td:not(:first-child){font-weight:500;padding-top:1.25rem;padding-bottom:.25rem}.invoice-bills .table tfoot tr:last-child td:not(:first-child){border-top:1px solid #dbdfea;padding-top:.25rem;padding-bottom:.25rem}.invoice-head{padding-bottom:1.5rem;display:flex;justify-content:space-between;flex-direction:column}.invoice-desc{width:210px;padding-top:1.5rem}.invoice-desc .title{text-transform:uppercase;color:#0fac81}.invoice-desc ul li{padding:.25rem 0}.invoice-desc ul span{font-size:13px;font-weight:500;color:#526484}.invoice-desc ul span:first-child{min-width:90px;display:inline-block;text-transform:uppercase;letter-spacing:1px;color:#8094ae}.invoice-desc ul span:last-child{padding-left:.75rem}.invoice-contact .title{margin-bottom:1rem}.invoice-contact ul li{padding:.5rem 0;line-height:1.3}.invoice-contact ul li:first-child{padding-top:0}.invoice-contact ul li:last-child{padding-bottom:0}.invoice-contact ul .icon{line-height:1.3;font-size:1.1em;display:inline-block;vertical-align:top;margin-top:-2px;color:#0fac81;margin-right:.5rem}.invoice-contact ul .icon+span{display:inline-block;vertical-align:top;color:#8094ae}.invoice-print{max-width:940px;margin:2rem auto}.invoice-print .invoice-wrap{padding:0;border:none !important}@media(min-width: 768px){.invoice-wrap{padding:3rem}.invoice-head{flex-direction:row}.invoice-desc{padding-top:0}.invoice-bills{font-size:.875rem}}.pricing{position:relative;height:100%}.pricing-badge{position:absolute;right:.5rem;top:.5rem}.pricing-head{text-align:center;padding:1.75rem 1.5rem;border-bottom:1px solid #e5e9f2}.pricing-title{max-width:100% !important}.pricing-title .title{margin-bottom:.25rem}.pricing-title:not(:last-child){padding-bottom:1.25rem}.pricing-body{padding:1.75rem 1.75rem 2rem}.pricing-features li{display:flex;padding:.25rem 0}.pricing-action{margin-top:1.5rem;text-align:center}.pricing-media{padding:.25rem 0;margin-bottom:1.5rem}.pricing-media img{max-width:90px}.pricing-amount{font-size:.875rem;color:#8094ae}.pricing-amount .amount{font-size:1.5rem;font-weight:700;color:#526484}.nk-add-product{top:65px;background-color:#fff;width:400px;height:calc(100vh - 65px);padding:1.5rem}.nk-add-product+.toggle-overlay{z-index:700}.rating{display:flex;align-items:center;margin:0 -0.125rem;color:#f4bd0e}.rating>*{padding:0 .125rem}.rating .icon{font-size:1rem}.product-card{overflow:hidden;height:100%}.product-thumb{position:relative}.product-badges{position:absolute;top:1rem;left:1rem;display:flex;flex-wrap:wrap;margin:-0.25rem}.product-badges>li{padding:.25rem}.product-tags{display:flex;flex-wrap:wrap;justify-content:center}.product-tags>li{padding:.25rem}.product-tags a{color:#8094ae}.product-tags a:hover{color:#0fac81}.product-tags+.product-title{margin-top:.5rem}.product-title a{color:#364a63}.product-title+.product-price{margin-top:1rem}.product-actions{position:absolute;bottom:.25rem;left:50%;transform:translateX(-50%);border-radius:4px 4px 0 0;overflow:hidden;transition:.2s linear;display:flex;opacity:0}.product-card:hover .product-actions{opacity:1}.product-actions li{padding:0 .125rem}.product-actions li a{display:inline-flex;align-items:center;justify-content:center;color:#526484;font-size:15.6px;height:2.125rem;width:2.125rem;transition:.3s ease}.product-actions li a:hover{color:#0fac81}.product-gallery{position:relative;height:auto;margin:0 0 30px 0;border-radius:4px;border:1px solid #e5e9f2}.product-gallery .slick-list{padding-left:0 !important;padding-right:0 !important}.product-gallery .slider-nav{position:absolute;bottom:-30px;left:50%;transform:translateX(-50%);width:282px}.product-gallery .slider-nav .slider-item{padding:0 8px}.product-gallery .slider-nav .slider-item .thumb{width:78px;padding:1px;border:2px solid #e5e9f2;box-shadow:inset 1px 1px 0 #fff,inset -1px -1px 0 #fff,inset 1px -1px 0 #fff,inset -1px 1px 0 #fff;border-radius:4px;transition:all .3s ease;cursor:pointer}.product-gallery .slider-nav .slider-item.slick-current .thumb{border-color:#0fac81;cursor:default}.product-rating{display:flex;align-items:center}.product-rating .amount{margin-left:.5rem;color:#8094ae}.product-excrept{margin-top:1.5rem}.product-meta{margin-top:2rem}.product-meta+.product-meta{margin-top:1.25rem}@media(max-width: 420px){.product-gallery .slider-nav{width:188px}}@media(min-width: 768px){.product-gallery .slider-nav{width:384px}}@media(min-width: 1540px){.product-gallery .slider-nav{width:470px}}.gallery-image{position:relative;z-index:1}.nk-order-ovwg-ck{height:180px}.nk-order-ovwg-data{padding:.75rem 1.25rem 1.25rem;border:2px solid rgba(0,0,0,0);border-radius:4px}.nk-order-ovwg-data .amount{font-size:1.5rem;font-weight:700}.nk-order-ovwg-data .amount small,.nk-order-ovwg-data .amount .small{font-weight:400}.nk-order-ovwg-data .info{font-size:12px;color:#8094ae;margin-bottom:.25rem}.nk-order-ovwg-data .info strong{color:#364a63}.nk-order-ovwg-data .title{font-size:14px;line-height:1.3;color:#8094ae;font-weight:500}.nk-order-ovwg-data .title .icon{font-size:1rem;height:28px;width:28px;border-radius:50%;background:#f5f6fa;display:inline-flex;align-items:center;justify-content:center;margin-right:.5rem}.nk-order-ovwg-data.buy{border-color:#8ff0d6}.nk-order-ovwg-data.buy .amount,.nk-order-ovwg-data.buy .title .icon{color:#1ee0ac}.nk-order-ovwg-data.sell{border-color:#87d6c0}.nk-order-ovwg-data.sell .amount,.nk-order-ovwg-data.sell .title .icon{color:#0fac81}@media(min-width: 1540px){.nk-order-ovwg-ck{height:260px}}.nk-wg-action{display:flex;align-items:center;justify-content:space-between}.nk-wg-action-content{position:relative;padding-left:2rem;padding-right:1rem}.nk-wg-action-content .icon{font-size:1.5rem;left:0;position:absolute;color:#8094ae}.nk-wg-action-content .title{font-size:14px;font-weight:500;padding-bottom:.25rem}.nk-wg-action-content p{color:#8094ae;font-size:13px;line-height:1.25rem}.nk-wg-action-content p strong{color:#0fac81}.nk-coin-ovwg{display:flex}.nk-coin-ovwg-ck{flex-grow:1;height:165px}.nk-coin-ovwg-legends{width:100px;flex-shrink:0}.nk-coin-ovwg-legends li{display:flex;align-items:center;line-height:1.25rem;font-size:12px;padding:.25rem 0;color:#8094ae}.nk-coin-ovwg-legends li .dot{margin-right:.5rem}.nk-tb-orders-type{width:66px}.nk-sale-data{flex-shrink:0}.nk-sale-data-group{display:flex;flex-wrap:wrap}.nk-sale-data .amount{display:block;font-size:1.75rem;color:#364a63}.nk-sale-data .amount .change{font-size:.875rem}.nk-sale-data .amount.sm{font-size:1.125rem;color:#8094ae}.nk-sale-data .sub-title{color:#8094ae;font-size:12px}.nk-sale-data .sub-title .change{margin-right:.5rem}.nk-sales-ck{height:80px;flex-grow:1}.nk-sales-ck.large{height:200px}@media(min-width: 992px)and (max-width: 1539.98px){.nk-sales-ck.sales-revenue{height:164px}}.nk-activity-item{display:flex;align-items:center;padding:1.25rem}.nk-activity-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-activity-data{margin-left:1rem}.nk-activity-data .time{display:block;font-size:12px;color:#8094ae;line-height:1.3}@media(min-width: 576px){.nk-activity-item{display:flex;padding:1rem 1.5rem}}.nk-support-item{display:flex;padding:1.25rem}.nk-support-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-support-content{flex-grow:1;margin-left:1rem}.nk-support-content .title{font-size:.875rem;font-weight:700;color:#364a63;display:flex;justify-content:space-between;align-items:center}.nk-support-content p{margin-bottom:0;margin-top:.25rem}.nk-support-content .time{display:block;font-size:12px;color:#8094ae}@media(min-width: 576px){.nk-support-item{display:flex;padding:1.25rem 1.5rem}}.device-status{display:flex;flex-direction:column;padding-top:1rem}.device-status-ck{height:200px;margin:auto 0}.device-status-group{display:flex;justify-content:space-between;padding-top:1.75rem;margin:auto;width:280px;max-width:100%}.device-status-data>.icon{font-size:1.5rem}.device-status-data .title{font-size:12px;color:#8094ae;margin-bottom:.5rem}.device-status-data .amount{font-size:1.125rem;color:#364a63;font-weight:500}.device-status-data .change{margin-left:-0.125rem}.traffic-channel{margin-top:1rem}.traffic-channel-ck{height:44px;width:130px;margin-top:-4px;margin-bottom:-4px}.traffic-channel-doughnut-ck{height:160px}.traffic-channel-group{display:flex;flex-wrap:wrap;padding-top:1.75rem;margin-left:auto !important;margin-right:auto !important;width:320px;max-width:100%}.traffic-channel-data{width:50%}.traffic-channel-data .title{display:flex;align-items:center;color:#8094ae;font-size:12px}.traffic-channel-data .title .dot{margin-right:.5rem}.traffic-channel-data .amount{font-size:1.125rem;color:#364a63;margin-left:1.25rem}.traffic-channel-data .amount small,.traffic-channel-data .amount .small{font-size:12px;color:#8094ae}@media(max-width: 575.98px){.traffic-channel-ck{width:100%}.traffic-channel-table .nk-tb-item{display:flex;flex-wrap:wrap;border-bottom:1px solid #e5e9f2;padding:1.125rem 0}.traffic-channel-table .nk-tb-col{border-bottom:none !important;padding-top:0 !important;padding-bottom:0 !important}.traffic-channel-table .nk-tb-channel{width:50%}.traffic-channel-table .nk-tb-sessions{width:25%}.traffic-channel-table .nk-tb-prev-sessions{display:none}.traffic-channel-table .nk-tb-change{width:25%}.traffic-channel-table .nk-tb-trend{width:100%;padding-left:1.25rem}}@media(min-width: 1540px)and (max-width: 1800px){.traffic-channel-data .amount{font-size:1rem}}.analytic-data-group{display:flex;flex-wrap:wrap}.analytic-data .title{font-size:12px;font-weight:500;color:#8094ae;margin-bottom:.375rem}.analytic-data .title span{font-weight:400}.analytic-data .amount{color:#364a63;font-size:1.5rem;line-height:1.2;margin-bottom:.25rem}.analytic-data .amount-sm{font-size:1.125rem}.analytic-data .change{font-size:13px;margin-left:-0.125rem}.analytic-data .subtitle{font-size:12px;color:#8094ae}@media(min-width: 1540px)and (max-width: 1800px){.analytic-data .amount{font-size:1.25rem;line-height:1.75rem}.analytic-data .amount-sm{font-size:1.125rem}}.analytic-ov-data{width:50%}.analytic-ov-ck{height:175px;margin-top:2rem}@media(min-width: 480px){.analytic-ov-data{width:25%}}.analytic-au-data{width:33.3333%}.analytic-au-ck{height:170px;margin-top:2.25rem}.analytic-wp-data{display:flex;justify-content:space-between;align-items:flex-end}.analytic-wp-ck{height:36px}.analytic-wp-graph{width:150px;margin-top:.125rem;margin-bottom:.125rem}.analytic-wp-graph .title{margin-bottom:0}.analytic-wp-text{text-align:right;margin-left:.5rem}@media(min-width: 420px)and (max-width: 767px){.analytic-wp-graph{width:60%}}@media(min-width: 1540px)and (max-width: 1800px){.analytic-wp-graph{width:120px}}.chart-label{font-size:12px;color:#8094ae}.chart-label-group{margin-top:.5rem;display:flex;justify-content:space-between}.analytics-map .vector-map{height:160px;margin:1rem 0}.analytics-map-data{font-size:.875rem}.analytics-map-data td{padding:.25rem 0}.analytics-map-data .country{color:#8094ae}.analytics-map-data .amount{color:#364a63;text-align:right}.analytics-map-data .percent{text-align:right;color:#8094ae}.analytics-map-data-list{width:100%;margin-bottom:-0.25rem}.card-title .subtitle{color:#8094ae;font-size:13px;font-weight:500}.card-amount{display:flex;align-items:baseline}.card-amount .change{margin-left:.5rem}.card-amount .amount{font-size:1.5rem;color:#364a63}.card-amount .amount span{color:#526484}@media(min-width: 768px)and (max-width: 991.98px){.card-amount .amount{font-size:1rem;font-weight:500}.card-amount .amount span{font-weight:400}.card-amount .change{font-size:12px}}.card-inner .nav-tabs-card{margin-left:-1.25rem;margin-right:-1.25rem}@media(min-width: 576px){.card-inner .nav-tabs-card{margin-left:-1.5rem;margin-right:-1.5rem}}.nav-tabs-xs .nav-link{padding:.75rem 0;font-size:13px;font-weight:500}@media(min-width: 768px){.nav-tabs-xs .nav-item{padding-right:1.25rem}}@media(min-width: 992px){.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(min-width: 1200px){.nav-tabs-sm .nav-item{padding-right:1.25rem}}.invest-data{display:flex;align-items:flex-end;justify-content:space-between}.invest-data-history{margin-right:20px;flex-grow:1}.invest-data-history .title{font-size:11px;color:#8094ae;text-transform:uppercase;margin-bottom:.125rem;letter-spacing:.1em}.invest-data-history .amount{font-size:.9375rem;line-height:1.1;color:#364a63}.invest-data-history .amount span{color:#526484}.invest-data-amount{display:flex;flex-shrink:0;flex-grow:1}.invest-data-ck{flex-grow:1;height:48px;width:80px;margin-bottom:.125rem}@media(min-width: 768px)and (max-width: 1350px),(max-width: 359px){.invest-data{margin-top:.75rem}.invest-data-amount{flex-wrap:wrap;flex-shrink:1}.invest-data-ck{height:68px;width:140px}}@media(min-width: 768px)and (max-width: 991.98px){.invest-data-history .amount{font-size:.75rem;font-weight:700}.invest-data-history .amount span{font-weight:400}}.invest-ov{padding:1.25rem 0 1rem}.invest-ov:last-child{padding-bottom:0}.invest-ov:not(:last-child){border-bottom:1px solid #e5e9f2}.invest-ov .subtitle{color:#8094ae;font-size:13px;font-weight:500;margin-bottom:.25rem}.invest-ov .title{font-size:11px;color:#8094ae;text-transform:uppercase;margin-top:.25rem;letter-spacing:.1em}.invest-ov .amount{font-size:1.25rem;line-height:1.1;color:#364a63}.invest-ov .amount span{color:#526484}.invest-ov-details{display:flex}.invest-ov-info{width:60%}.invest-ov-stats{width:40%}.invest-ov-stats>div{display:flex;align-items:baseline}.invest-ov-stats .change{margin-left:.25rem}.invest-top-ck{padding-top:20px;height:70px}.asterisk a{position:relative;color:#8094ae;display:inline-flex}.asterisk a:hover,.asterisk a.active{color:#ffa353}.asterisk a:hover .asterisk-on,.asterisk a.active .asterisk-on{opacity:1}.asterisk a.active:hover .asterisk-on{opacity:0}.asterisk-on{opacity:0;position:absolute;left:0;color:#ffa353;z-index:1;transition:opacity .2s}.nk-reply{height:100%;max-height:100%;overflow:auto}.nk-reply-item{padding:2rem 1.25rem}.nk-reply-item+.nk-reply-item{padding-top:0}.nk-reply-item>div:not(.nk-reply-header){margin-left:48px}.nk-reply-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.nk-reply-header .user-name{margin-left:1rem;font-size:.875rem}.nk-reply-header .user-name span{color:#8094ae;font-weight:400}.nk-reply-header .date-time{color:#8094ae;font-size:12px}.nk-reply-entry.note{background:#f5f6fa;padding:1.25rem;border-radius:4px}.nk-reply-from{margin-top:1.25rem;padding:.375rem .75rem;background:#f5f6fa;border-radius:4px;display:inline-block;font-size:13px}.nk-reply-meta{overflow:hidden;text-align:center;margin:0 1.25rem;padding:0 2rem}.nk-reply-meta-info{position:relative;display:inline-block;padding:0 .75rem;color:#8094ae;font-size:13px;line-height:1.4}.nk-reply-meta-info span,.nk-reply-meta-info strong,.nk-reply-meta-info .who{color:#526484}.nk-reply-meta-info .whom{color:#0fac81}.nk-reply-meta-info:before,.nk-reply-meta-info:after{position:absolute;height:1px;background:#e5e9f2;content:"";width:100vw;top:50%}.nk-reply-meta-info:before{right:100%}.nk-reply-meta-info:after{left:100%}.nk-reply-form{border-top:1px solid #e5e9f2}.nk-reply-form-dropdown{margin-left:-0.5rem;margin-right:.75rem}.nk-reply-form-header{display:flex;align-items:center;justify-content:space-between;padding:0 1.25rem;border-bottom:1px solid #e5e9f2}.nk-reply-form-title{display:flex;align-items:center}.nk-reply-form-title .title{color:#8094ae;margin-right:.75rem}.nk-reply-form-field{padding:.5rem 1.25rem}.nk-reply-form-field:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-reply-form-field .form-control,.nk-reply-form-field div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-reply-form-field input,.nk-reply-form-field .dual-listbox .dual-listbox__search,.dual-listbox .nk-reply-form-field .dual-listbox__search{font-size:.875rem}.nk-reply-form-field textarea.form-control,.nk-reply-form-field .dual-listbox textarea.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.dual-listbox__search{min-height:78px}.nk-reply-form-field textarea.form-control.ex-large,.nk-reply-form-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.ex-large.dual-listbox__search{min-height:160px}.nk-reply-form-field+.nk-reply-form-tools{border-top:0}.nk-reply-form-tools{padding:1.25rem;border-top:1px solid #e5e9f2;display:flex;justify-content:space-between}.nk-reply-form-actions{display:inline-flex;align-items:center}.nk-reply-form-options{display:inline-flex}.nk-reply-form-input{display:flex}.nk-reply-form-input .label{margin:.3rem .5rem .3rem 0;width:1.25rem;color:#8094ae}.nk-reply-form-input-group{width:100%}.nk-reply-form-input-cc,.nk-reply-form-input-bcc{display:none}.nk-reply-form-input-cc.expanded,.nk-reply-form-input-bcc.expanded{display:flex}.nk-reply-form-input .toggle-opt{display:inline-flex;align-items:center;color:#364a63}.nk-reply-form-input .toggle-opt:hover{color:#0fac81}.nk-reply-form-group{position:relative;padding:1rem 0;flex-grow:1;display:flex;align-items:flex-start}.nk-reply-form-input-to{padding-right:3.5rem}.nk-reply-form-nav{position:absolute;display:flex;align-items:center;align-self:flex-start;padding:1.0625rem 0 0;right:0;top:0;margin:0 -0.375rem}.nk-reply-form-nav li a{font-size:12px;color:#8094ae;display:block;line-height:1.5rem;padding:.25rem .375rem}.nk-reply-form-nav li a:hover{color:#0fac81}.is-collapsed .nk-reply-msg-info{display:none}.nk-reply-msg-excerpt{color:#526484;display:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.is-collapsed .nk-reply-msg-excerpt{display:block}.nk-reply-msg-meta{padding:.75rem}.nk-reply-msg-meta li{display:flex;line-height:1.125rem;padding:.1875rem 0}.nk-reply-msg-meta li .label{width:75px;color:#8094ae;font-size:12px;text-align:right;margin-right:.75rem}.nk-reply-msg-meta li .info{font-size:13px}.nk-reply-msg-meta li .info a{color:#526484}.nk-reply-tools{display:flex;align-items:center;flex-shrink:0;cursor:default}.nk-reply-tools .date{margin-right:1rem;line-height:2.25rem;color:#526484}.nk-reply-tools .attach-msg{font-size:1.25rem;margin-right:.375rem}.nk-reply-desc{display:flex;flex-grow:1}.is-collapsed .nk-reply-desc{overflow:hidden}.nk-reply-header .nk-reply-desc{align-items:center}.nk-reply-info{margin-left:1rem;max-width:calc(100% - 4.5rem)}.nk-reply-header.is-collapsed{margin-bottom:0}.nk-reply-header:not(.is-opened){cursor:pointer}.is-collapsed+.nk-reply-body{display:none}.nk-reply-quick-btns ul{display:flex;align-items:center}.is-collapsed .prev-msg,.is-collapsed .next-msg,.is-collapsed .more-actions,.is-collapsed .replyto-msg,.is-collapsed .forwardto-msg{display:none}.input-mail{width:100%;border:none}@media(max-width: 767.98px){.nk-reply-tools{flex-wrap:wrap}.nk-reply-tools .date{margin-right:.5rem;font-size:13px}.nk-reply-tools .attach-msg{font-size:1.25rem;margin-right:.375rem}}@media(max-width: 575.98px){.nk-reply-info{margin-left:.75rem;max-width:calc(100% - 2.5rem)}.is-collapsed .nk-reply-info{max-width:calc(100% - 4.5rem)}.nk-reply-info .date{font-size:11px;color:#8094ae;margin-left:.375rem}.nk-reply-info .lead-text{font-size:13px}.nk-reply-form-dropdown{margin-right:.5rem}.nk-reply-form-group{flex-wrap:wrap;align-items:center}.nk-reply-form-title{font-weight:500}.nk-reply-tools .attach-msg,.nk-reply-tools .date-msg{display:none}.nk-reply-avatar{height:30px;width:30px}.nk-reply-msg-excerpt{font-size:12px;margin-top:.25rem}.nk-reply-msg-info .sub-text{font-size:12px}.nk-reply-msg-info .dropdown-menu{margin-right:16px !important}}@media(min-width: 576px){.nk-reply-form{margin:.5rem 2.25rem 2.25rem;border:1px solid #e5e9f2;border-radius:4px}.nk-reply-form-header{padding:0 1.5rem}.nk-reply-form-field{padding:.5rem 1.5rem}.nk-reply-form-field textarea.form-control.ex-large,.nk-reply-form-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.ex-large.dual-listbox__search{min-height:278px}.nk-reply-form-tools{padding:1rem 1.5rem}.modal-body .nk-reply-form-tools{padding:1.5rem}.nk-reply-item{padding:2rem 2.25rem}.nk-reply-meta{margin:0 2.25rem}.nk-reply-header .date-time{font-size:13px}.nk-reply-quick-btns{margin:.5rem 2.25rem 2.25rem}}@media(min-width: 992px){.nk-reply-form{margin:.5rem 2.5rem 2.5rem}.nk-reply-item{padding:2rem 2.5rem}.nk-reply-meta{margin:0 2.5rem}.nk-reply-quick-btns{margin:.5rem 2.5rem 2.5rem}}.attach-files{margin-top:1.75rem;border:1px solid #e5e9f2;border-radius:4px}.attach-list{padding:1rem 1.25rem;margin-bottom:-0.5rem;display:flex;flex-wrap:wrap}.attach-item{width:180px;padding-right:2rem;padding-bottom:.5rem}.attach-item a{display:flex;align-items:center;width:100%;color:#526484}.attach-item .icon{font-size:1.5rem;color:#0fac81;margin-right:.75rem}.attach-foot{border-top:1px solid #e5e9f2;background:#f5f6fa;padding:.75rem 1.25rem;display:flex;flex-wrap:wrap;justify-content:space-between}.attach-info{font-weight:500;color:#364a63}.attach-download span{color:#8094ae;transition:all .3s}.attach-download:hover span{color:#0fac81}@media(max-width: 359px){.attach-info{font-size:12px}.attach-download{font-size:12px}}.nk-msg-nav{position:relative;border-bottom:1px solid #e5e9f2;padding:0 1.25rem;background:#f5f6fa;z-index:2}.nk-msg-nav .search-wrap{padding:0 1rem;bottom:-1px;border-bottom:1px solid #e5e9f2}.nk-msg-nav .search-submit{transform:translate(0.25rem, -50%)}.nk-msg-menu{display:flex;margin:0 -0.75rem}.nk-msg-menu-item{padding:0 .75rem}.nk-msg-menu-item a{display:inline-flex;position:relative;color:#8094ae;font-weight:500;font-size:.875rem;line-height:1.5rem;padding:1rem 0}.nk-msg-menu-item a:after{position:absolute;content:"";height:2px;background:#0fac81;bottom:-1px;left:0;right:0;opacity:0;transition:.3s ease}.nk-msg-menu-item a .icon{font-size:1.125rem;line-height:1.5rem}.nk-msg-menu-item a:hover{color:#0fac81}.nk-msg-menu-item.active a{color:#0fac81}.nk-msg-menu-item.active a:after{opacity:1}.nk-msg{position:relative;display:flex;overflow:hidden}.nk-msg-aside{background:#f5f6fa;width:100%;overflow:hidden;max-height:calc(100vh - (65px + 96px));position:relative;display:flex;flex-direction:column;flex-shrink:0;border:1px solid #e5e9f2;border-radius:4px}.nk-msg-list{max-height:100%;height:100%;overflow:auto}.nk-msg-item{display:flex;padding:1.25rem 1.25rem;cursor:pointer}.nk-msg-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-msg-item.active,.nk-msg-item.current{background:#fff;cursor:default}.nk-msg-info{max-width:calc(100% - 52px);margin-left:.75rem;flex-grow:1}.nk-msg-from{display:flex;justify-content:space-between;align-items:center}.nk-msg-context{display:flex;justify-content:space-between;margin-top:.25rem}.nk-msg-context .asterisk{margin-top:auto}.nk-msg-sender{display:inline-flex;align-items:center;color:#8094ae;font-size:12px}.nk-msg-sender .name{margin-right:.5rem}.is-unread .nk-msg-sender .name{font-weight:500;color:#364a63}.nk-msg-meta{display:inline-flex;align-items:center;color:#8094ae;font-size:12px}.nk-msg-meta .attchment .icon{font-size:1.125rem}.nk-msg-meta .date{margin-left:.75rem}.nk-msg-text{max-width:calc(100% - 35px);flex-grow:0;padding-right:.5rem}.nk-msg-text .title{font-size:15px;margin-bottom:.25rem}.nk-msg-text p{font-size:13px;color:#8094ae;max-height:42px;overflow:hidden}.is-unread .nk-msg-text p{color:#526484;font-weight:500}.nk-msg-lables{text-align:center;margin:-0.125rem;display:inline-flex;flex-direction:column}.nk-msg-lables>div{padding:.125rem}.nk-msg-lables .icon{font-size:1.125rem}.nk-msg-lables .badge{line-height:14px;font-size:10px;padding:0 .25rem}.nk-msg-body{position:fixed;top:0;left:0;right:0;bottom:0;flex-grow:1;display:flex;flex-direction:column;overflow:hidden;transition:padding .3s ease-in-out;opacity:0;pointer-events:none;z-index:5;border:1px solid #e5e9f2;border-radius:4px}.nk-msg-body.show-message{opacity:1;pointer-events:auto;z-index:2999}.nk-msg-profile{position:absolute;top:0;right:0;transform:translateX(100%);width:280px;height:100%;max-height:100%;transition:transform .3s ease-in-out;background:#fff;z-index:100}.nk-msg-profile .card{border:none;box-shadow:none !important}.nk-msg-profile-toggle{position:absolute;height:36px;width:36px;display:none;align-items:center;justify-content:center;bottom:-18px;right:-18px;margin-right:40px;transition:right .3s ease-in-out,margin .3s ease-in-out .2s;border:1px solid #e5e9f2;background-color:#fff;border-radius:50%;font-size:1.125rem;z-index:2;color:#8094ae;z-index:110}.nk-msg-profile-toggle.active{margin-right:0;transform:rotate(-180deg)}.nk-msg-profile-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:600;z-index:90;animation:overlay-fade-in .4s ease 1}.nk-msg-profile.visible{transform:none}.nk-msg-head{position:relative;padding:.75rem 1.25rem;border-bottom:1px solid #e5e9f2}.nk-msg-head .title{margin-bottom:.5rem}.nk-msg-head-meta{display:flex;justify-content:space-between;align-items:center}.nk-msg-hide{font-size:1rem}.nk-msg-tags{margin:0 -0.75rem}.nk-msg-tags li{padding:0 .75rem;color:#8094ae}.nk-msg-tags li>span{display:inline-flex;align-items:center}.nk-msg-tags li>span .icon{color:#0fac81;margin-right:.25rem}.nk-msg-actions{display:flex;margin:0 -0.25rem}.nk-msg-actions li{padding:0 .25rem}@media(min-width: 576px){.nk-msg-nav{padding:0 2rem}.nk-msg-nav .search-wrap{padding:0 1.7rem}.nk-msg-item{padding:1.25rem 2rem}.nk-msg-head{padding:1rem 2.25rem}.nk-msg-head .title{margin-bottom:1rem}.nk-msg-aside{max-height:calc(100vh - (65px + 108px))}}@media(min-width: 576px)and (max-width: 991.98px){.nk-msg-text .title{margin-top:.125rem;margin-bottom:.375rem}}@media(min-width: 768px){.nk-msg-aside{max-height:calc(100vh - (65px + 112px))}}@media(min-width: 992px){.nk-msg-nav{padding:0 1.75rem}.nk-msg-nav .search-wrap{padding:0 1.425rem}.nk-msg-item{padding:1.25rem 1.75rem}.nk-msg-head{padding:2rem 2.5rem}.nk-msg-head .title{max-height:82px;overflow:hidden}.nk-msg-aside{width:320px;border-right:1px solid #e5e9f2;margin-right:1.5rem}.nk-msg-body{position:relative;opacity:1;pointer-events:auto;max-height:calc(100vh - (65px + 112px))}.nk-msg-profile{border-left:1px solid #e5e9f2}.nk-msg-profile-toggle{margin-right:55px;display:flex}}@media(min-width: 1540px){.nk-msg-aside{width:380px}}@media(max-width: 1539.98px){.profile-shown .nk-msg-profile-toggle{right:262px}.has-apps-sidebar .profile-shown .nk-msg-profile-toggle{right:-18px}}@media(max-width: 1279px){.has-apps-sidebar .profile-shown .nk-msg-profile-toggle{right:262px}}@media(min-width: 1540px){.nk-msg-body.profile-shown{padding-right:280px}}@media(min-width: 1280px){.has-apps-sidebar .nk-msg-body.profile-shown{padding-right:280px}}.ibx-count{position:relative;padding:.3125rem .75rem;font-size:.75rem;color:#8094ae;background:#fff;border:1px solid #e5e9f2;display:inline-block;font-weight:400;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.ibx-count:before,.ibx-count:after{position:absolute;height:0;width:0;top:50%;transform:translateY(-50%);content:"";border-style:solid}.ibx-count:before{right:-8px;border-width:4px 0 4px 7px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #e5e9f2}.ibx-count:after{right:-6px;border-width:3px 0 3px 6px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #fff}.nk-ibx-context{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nk-ibx-context-group{display:flex;align-items:center}.nk-ibx-context-badges{margin-right:.75rem}.nk-ibx-context-text{display:inline;color:#8094ae}.is-unread .nk-ibx-context-text{color:#526484}.nk-ibx-context-text .heading{color:#364a63}.is-unread .nk-ibx-context-text .heading{font-weight:500}.ibx-actions{position:relative;display:inline-block;transition:background-color .3s}.ibx-actions-hidden{position:absolute;display:flex;right:calc(100% + 8px);opacity:0;transition:background-color .3s}.nk-ibx-item:hover .ibx-actions-hidden{opacity:1;background-color:#f5f6fa}.nk-ibx-item:hover .ibx-actions{background-color:#f5f6fa}.nk-ibx{position:relative;display:flex;align-items:flex-start;border-radius:4px}.nk-ibx-aside{position:fixed;top:0;left:0;transform:translateX(-100%);background:#fff;width:230px;overflow:hidden;height:100%;display:flex;flex-direction:column;align-items:stretch;flex-shrink:0;border:1px solid #e5e9f2;z-index:799;transition:transform .4s linear}.nk-ibx-aside.content-active{transform:none}.nk-ibx-aside .simplebar-content{height:100%;display:flex;flex-direction:column}.nk-ibx-aside.content-active{z-index:901}.nk-ibx-nav{overflow:auto;flex-grow:1;height:100%;max-width:100%;padding-bottom:1rem}.nk-ibx-nav-head{display:flex;align-items:center;justify-content:space-between;padding:2rem 1.5rem .75rem}.nk-ibx-nav-head .title{font-size:1rem;margin-bottom:0}.nk-ibx-nav-head .dropdown>a,.nk-ibx-nav-head>.link{color:#8094ae;font-size:.875rem}.nk-ibx-head{position:relative;display:flex;align-items:center;justify-content:space-between;padding:.75rem;border-bottom:1px solid #e5e9f2;min-height:61px}.nk-ibx-head .title{font-size:1rem;margin-bottom:0}.nk-ibx-head-actions,.nk-ibx-head-tools{display:flex;align-items:center}.nk-ibx-head-tools .btn-icon.btn-trigger .icon,.nk-ibx-head-tools .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-head-tools .btn-trigger.btn-secondary .icon{font-size:1.25rem}.nk-ibx-head .search-wrap{padding:0 1.365rem 0 1rem}.nk-ibx-head .search-wrap .icon{font-size:1.25rem}.nk-ibx-head .search-back{transform:translate(-0.5rem, -50%)}.nk-ibx-head-check{display:flex;margin-right:.325rem}.nk-ibx-action{position:relative;padding:1rem 1.5rem;border-bottom:1px solid #e5e9f2}.nk-ibx-action-list{display:flex;justify-content:space-between;align-items:center}.nk-ibx-action-item a{display:flex;align-items:center}.nk-ibx-action-item .icon{font-size:1.5rem}.nk-ibx-action-item .icon+span{margin-left:.5rem}.nk-ibx-action-item .search-toggle .icon{font-size:1.125rem}.nk-ibx-menu li{margin:2px 0}.nk-ibx-menu li:hover{background:#f5f6fa;border-radius:3px}.nk-ibx-menu li.active{background:#e2f5f0;border-radius:3px}.nk-ibx-menu-item{position:relative;display:flex;align-items:center;padding:.5rem .75rem;border-radius:4px}.nk-ibx-menu-item .icon{font-size:1.25rem;line-height:1.5rem;width:2rem;color:#8094ae}.nk-ibx-menu-item .badge{margin-left:auto;min-width:2.25rem;justify-content:center}.active .nk-ibx-menu-item .icon{color:#0fac81}.nk-ibx-menu-text{font-size:.875rem;color:#526484;font-weight:500;line-height:1.5rem}.active .nk-ibx-menu-text{color:#0fac81}.nk-ibx-label>li,.nk-ibx-contact>li{position:relative;display:flex;align-items:center;border-radius:4px;margin:2px 0;transition:background-color .3s}.nk-ibx-label>li>a,.nk-ibx-contact>li>a{display:flex;padding:.5rem .75rem;flex-grow:1}.nk-ibx-label>li .dropdown,.nk-ibx-contact>li .dropdown{opacity:0}.nk-ibx-label>li .dropdown>a,.nk-ibx-contact>li .dropdown>a{color:#526484;padding:.6875rem}.nk-ibx-label>li:hover,.nk-ibx-contact>li:hover{background:#f5f6fa}.nk-ibx-label>li:hover .dropdown,.nk-ibx-contact>li:hover .dropdown{opacity:1}.nk-ibx-label>li.active,.nk-ibx-contact>li.active{background:#abe2d3}.nk-ibx-label-text{line-height:1;margin-left:1rem;font-size:.875rem;color:#526484;font-weight:500}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:.75rem;padding-right:.75rem}.nk-ibx-menu{padding-top:.75rem}.nk-ibx-contact{padding-bottom:1.75rem}.nk-ibx-status{background:#f5f6fa;padding:1.5rem 1.5rem;margin-top:auto}.nk-ibx-status-info{margin-bottom:.5rem}.nk-ibx-status-info .icon{width:1.25rem;display:inline-block}.nk-ibx-body{position:relative;display:flex;flex-direction:column;overflow:hidden;flex-grow:1;flex-shrink:1;border:1px solid #dbdfea;border-radius:4px}.nk-ibx-list{display:flex;flex-direction:column;max-height:100%;height:100%;overflow:auto;min-height:280px}.nk-ibx-item{position:relative;display:flex;align-items:center;background:#fff;padding:1rem 1.25rem;transition:background-color .3s;cursor:pointer}.nk-ibx-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-ibx-item:not(.no-hover):hover,.nk-ibx-item.active{background:#f5f6fa}.nk-ibx-item.is-unread{background:rgba(245,246,250,.6)}.nk-ibx-item-elem{padding:0 8px;flex-shrink:0}.nk-ibx-item-elem:first-child{padding-left:0}.nk-ibx-item-check{width:28px;display:inline-flex}.nk-ibx-item-fluid{flex-grow:1;flex-shrink:1;width:100%;max-width:100%;overflow:hidden}.nk-ibx-item-user .user-name{max-width:calc(100% - 50px)}.nk-ibx-item-user .user-name .lead-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400}.is-unread .nk-ibx-item-user .user-name .lead-text{font-weight:500}.nk-ibx-item-count{width:3.25rem}.nk-ibx-item-time{width:80px;text-align:right}.nk-ibx-item-attach{width:2.25rem;text-align:center}.nk-ibx-item-star .asterisk{padding:0 .25rem}.nk-ibx-item-star .asterisk a{display:flex}.nk-ibx-item-star .asterisk .icon{line-height:1;font-size:1.125rem}.nk-ibx-item-tools{padding-right:0;margin-left:auto;text-align:right}.nk-ibx-item-check,.nk-ibx-item-star,.nk-ibx-item-attach{position:relative;z-index:2}.nk-ibx-item-tools{position:relative}.nk-ibx-link{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1}.nk-ibx-link+.nk-ibx-item-elem{padding-left:0}.nk-ibx-view{background:#fff;display:flex;flex-direction:column}.nk-ibx-reply-head{padding:1.5rem 1.25rem 0;display:flex;align-items:flex-start;justify-content:space-between}.nk-ibx-reply-head .title{margin-bottom:.75rem}.nk-ibx-reply-header{margin-right:-0.5rem}.nk-ibx-reply-item{position:relative}.nk-ibx-reply-item>div:not(.nk-reply-header){margin-left:0;margin-top:1.25rem;margin-bottom:.75rem}.nk-ibx-reply-item:not(:last-child):after{position:absolute;left:1.25rem;right:1.25rem;height:1px;bottom:1rem;content:"";background:#e5e9f2}@media(min-width: 576px){.nk-ibx-item,.nk-ibx-head{padding-left:2.25rem;padding-right:2.25rem}.nk-ibx-head .search-wrap{padding:0 2.375rem 0 2rem}.nk-ibx-reply-head{padding:2em 2.25rem 0}.nk-ibx-reply-item{padding-bottom:2.75rem}.nk-ibx-reply-item>div:not(.nk-reply-header){margin-left:56px}.nk-ibx-reply-item:not(:last-child):after{bottom:1.375rem;left:2.25rem;right:2.25rem}.nk-ibx-reply-quick-btns,.nk-ibx-reply-form{margin-left:5.75rem}}@media(min-width: 768px){.nk-ibx-item-user{width:180px}}@media(min-width: 992px){.nk-ibx-aside{position:static;transform:none;transition:none;height:auto;margin-right:1.5rem;border-radius:4px}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:1rem;padding-right:1rem}.nk-ibx-menu{padding-top:1rem}.nk-ibx-contact{padding-bottom:1rem}.nk-ibx-nav-head{padding-left:1.75rem;padding-right:1.75rem}.nk-ibx-item,.nk-ibx-head{padding-left:1.75rem;padding-right:1.75rem}.nk-ibx-aside .nk-ibx-head{padding-left:1rem;padding-right:1rem}.nk-ibx-head .search-wrap{padding:0 2.25rem 0 1.5rem}.nk-ibx-body{max-width:calc(100% - 230px)}.nk-ibx-reply-quick-btns,.nk-ibx-reply-form{margin-left:5.25rem}.nk-ibx-reply-item,.nk-ibx-reply-head{padding-left:1.75rem;padding-right:1.75rem}}@media(min-width: 1200px){.nk-ibx-aside{width:230px}.nk-ibx-item-user{width:200px}.nk-ibx-item-time{margin-right:5rem}}@media(min-width: 1540px){.nk-ibx-item-user{width:260px}.nk-ibx-item-tools{margin-left:5rem}}@media(max-width: 1199.98px){.nk-ibx-item-attach{display:none}}@media(max-width: 767.98px){.nk-ibx-item{flex-wrap:wrap}.nk-ibx-item-elem{padding:0 4px}.nk-ibx-item-fluid{padding-left:32px;padding-right:48px;margin-top:6px;width:calc(100% - 2.5rem)}.nk-ibx-item-fluid .heading{display:block}.nk-ibx-item-count,.nk-ibx-item-attach{display:none}.nk-ibx-item-user{flex-grow:1}.nk-ibx-item-user .user-avatar{height:28px;width:28px;font-size:12px}.nk-ibx-item-time{position:absolute;right:32px;top:19px}.nk-ibx-item-tools{position:absolute;text-align:right;right:28px;bottom:18px}.nk-ibx-item-star{position:absolute;left:28px;top:50px}.nk-ibx-context-badges{display:none}.ibx-actions-hidden{display:none}}@media(max-width: 575.98px){.nk-ibx-item-star{left:12px}.nk-ibx-item-time{right:12px}.nk-ibx-item-tools{right:8px}.nk-ibx-reply-head .title{font-size:1.125rem}.nk-ibx-reply .btn-icon.btn-trigger,.nk-ibx-reply .dt-buttons .btn-trigger.btn-secondary,.dt-buttons .nk-ibx-reply .btn-trigger.btn-secondary{padding-top:.3125rem;padding-bottom:.3125rem}.nk-ibx-reply .btn-icon.btn-trigger .icon,.nk-ibx-reply .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-reply .btn-trigger.btn-secondary .icon{width:1.875rem}}@media(max-width: 359px){.nk-ibx-head .btn-icon.btn-trigger,.nk-ibx-head .dt-buttons .btn-trigger.btn-secondary,.dt-buttons .nk-ibx-head .btn-trigger.btn-secondary{padding-top:.3125rem;padding-bottom:.3125rem}.nk-ibx-head .btn-icon.btn-trigger .icon,.nk-ibx-head .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-head .btn-trigger.btn-secondary .icon{width:1.875rem}}@media(min-width: 576px)and (max-width: 991.98px){.nk-ibx-aside{width:320px}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:1.5rem;padding-right:1.5rem}.nk-ibx-nav-head{padding-left:2.25rem;padding-right:2.25rem}}.nk-fmg{position:relative}.nk-fmg-aside{position:fixed;width:265px;overflow:hidden;height:100%;max-height:100%;border:1px solid #e5e9f2;background:#fff;flex-shrink:0;z-index:799;transform:translateX(-100%);left:0;top:0;transition:transform .4s linear;min-height:100vh;max-height:100vh;overflow-y:auto}.nk-fmg-aside.content-active{transform:none;z-index:901}.nk-fmg-aside .simplebar-content{height:100%}.nk-fmg-aside-wrap{height:100%;display:flex;flex-direction:column}.nk-fmg-aside-top{margin-bottom:auto}.nk-fmg-actions{padding:1.25rem 1rem 0}.nk-fmg-menu{padding:1rem}.nk-fmg-menu li{margin:2px 0}.nk-fmg-menu-item{position:relative;display:flex;align-items:center;padding:.5rem .75rem;border-radius:4px}.nk-fmg-menu-item:hover{background:#f5f6fa;border-radius:3px}.active>.nk-fmg-menu-item{background:#e2f5f0;border-radius:3px}.nk-fmg-menu-item .icon{font-size:1.25rem;line-height:1.25rem;margin-top:-2px;width:2rem;color:#8094ae}.nk-fmg-menu-item .badge{margin-left:auto;min-width:2.25rem}.active>.nk-fmg-menu-item .icon{color:#0fac81}.nk-fmg-menu-text{font-size:.875rem;color:#526484;font-weight:500;line-height:1.5rem}.active>.nk-fmg-menu-item>.nk-fmg-menu-text{color:#0fac81}.nk-fmg-menu li ul{margin-top:-0.125rem;margin-bottom:.5rem;padding-left:2.75rem}.nk-fmg-menu li ul ul{padding-left:.75rem;border-left:1px solid #e5e9f2}.nk-fmg-menu li ul .nk-fmg-menu-item{padding:.125rem 0}.nk-fmg-menu li ul .nk-fmg-menu-item:hover,.nk-fmg-menu li ul .nk-fmg-menu-item.active{background:rgba(0,0,0,0)}.nk-fmg-menu li ul .nk-fmg-menu-item:hover span,.nk-fmg-menu li ul .nk-fmg-menu-item.active span{color:#0fac81}.nk-fmg-menu li ul .nk-fmg-menu-text{font-size:90%;line-height:1.375rem}.nk-fmg-status{padding:1.75rem}.nk-fmg-status-title{font-size:.875rem;display:flex;align-items:center;color:#526484;margin-bottom:1rem}.nk-fmg-status-title .icon{font-size:1.25rem;margin-right:.75rem}.nk-fmg-status-info{font-size:12px;font-weight:500;color:#8094ae;margin-top:1rem}.nk-fmg-body{display:flex;flex-direction:column;max-height:100%;border-radius:4px;background-color:#fff;border:1px solid #dbdfea;flex-grow:1}.nk-fmg-body-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:.75rem 1.25rem;border-bottom:1px solid #dbdfea;position:sticky;top:65px;z-index:9}.nk-fmg-body-content{padding:1.125rem 1.25rem;height:100%;max-height:100%;overflow:auto}.nk-fmg-body .simplebar-content{min-height:470px}.nk-fmg-search{display:flex;align-items:center;flex-grow:1}.nk-fmg-filter{margin-bottom:1.25rem}.nk-fmg-filter .form-label{font-weight:500;font-size:13px;color:#8094ae}.nk-fmg-filter .form-group{margin-bottom:1rem}.nk-fmg-switch{background-color:#e5e9f2;border-top:1px solid #e5e9f2}.nk-fmg-switch>div{width:100%}.nk-fmg-switch .dropdown-toggle{padding:1.25rem 1.75rem;width:100%;flex-direction:column;align-items:flex-start}.nk-fmg-switch .dropdown-toggle:after{position:absolute;right:1.5rem;top:50%;transform:translateY(-50%);font-size:1rem;color:#526484}.nk-fmg-listing{min-height:380px}.nk-fmg-listing.is-scrollable{min-height:auto;max-height:298px}@media(min-width: 576px){.nk-fmg-body-content{padding-top:1.25rem;padding-bottom:1.25rem}}@media(min-width: 992px){.nk-fmg{display:flex}.nk-fmg-aside{transform:translateX(0);transition:none;width:265px;position:static;margin-right:1.5rem;min-height:auto;max-height:none;border-radius:4px}.nk-fmg-body-head{padding:.75rem 1.75rem;z-index:9}.nk-fmg-body-content{padding:1.75rem}}@media(min-width: 1200px){.nk-fmg-filter.toggle-expand-content{display:block !important}}@media(min-width: 576px)and (max-width: 991.98px){.nk-fmg-aside{width:320px}.nk-fmg-body-head,.nk-fmg-body-content,.nk-fmg-status,.nk-fmg-switch .dropdown-toggle{padding-left:2.25rem;padding-right:2.25rem}.nk-fmg-actions{padding:1.25rem 1.75rem 0}.nk-fmg-menu{padding:1rem 1.75rem}}.nk-file .tb-sub{font-size:12px;color:#8094ae}.nk-file .tb-head{font-weight:500;font-size:13px;color:#8094ae}.nk-file-info:hover .nk-file-name .asterisk a,.nk-file-info .nk-file-name .asterisk a.active{opacity:1}.nk-file-icon{margin-right:6px;flex-shrink:0}.nk-file-icon-link{display:block;text-decoration:none;color:inherit}.nk-file-icon-type{width:32px;display:inline-block;text-decoration:none;color:inherit;margin:auto}.nk-file-title{display:flex;align-items:center}.nk-file-title .breadcrumb{padding-top:.25rem;padding-bottom:0}.nk-file-name{font-weight:500;color:#364a63;position:relative;line-height:1.4}.nk-file-name-text{padding-right:1.375rem;display:inline-block}.nk-file-name-text .title{transition:color .3s;display:inline-block;text-decoration:none;word-break:break-word}.nk-file-name-text a.title{color:#364a63}.nk-file-name-text a.title:hover{color:#0fac81}.nk-file-name-sub{font-size:12px;color:#8094ae}.nk-file-name .asterisk{position:absolute;display:inline-flex;margin-left:6px;transition:.3s opacity;margin-top:-1px;top:50%;transform:translateY(-50%)}.nk-file-name .asterisk a{opacity:0}.nk-file-name .asterisk .icon{font-size:1.125rem;color:#0fac81}.nk-file-desc{display:flex;align-items:center;margin:0 -0.375rem}.nk-file-desc li{position:relative;padding:0 .375rem;font-size:12px;color:#8094ae}.nk-file-desc li:not(:first-child):before{content:"";font-family:"Nioicon";position:absolute;top:50%;left:0;transform:translate(-50%, -50%);font-size:11px;line-height:10px;opacity:.8}.nk-file-link{text-decoration:none;color:inherit;display:block}.nk-file-link:hover .title{color:#0fac81}.nk-file-info>.nk-file-link{padding:.75rem 0}.is-compact .nk-file-info>.nk-file-link{padding:.375rem 0}.nk-file-share-header{display:flex;align-items:center;justify-content:space-between;padding:0 1.25rem;border-bottom:1px solid #e5e9f2}.nk-file-share-field{padding:.5rem 1.25rem}.nk-file-share-field:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-file-share-field .form-control,.nk-file-share-field div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-file-share-field input,.nk-file-share-field .dual-listbox .dual-listbox__search,.dual-listbox .nk-file-share-field .dual-listbox__search{font-size:.875rem}.nk-file-share-field textarea.form-control,.nk-file-share-field .dual-listbox textarea.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.dual-listbox__search{min-height:78px}.nk-file-share-field textarea.form-control.ex-large,.nk-file-share-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.ex-large.dual-listbox__search{min-height:160px}.nk-file-share-input{display:flex}.nk-file-share-input .label{margin:.3rem .5rem .3rem 0;width:1.25rem;color:#8094ae}.nk-file-share-input-group{width:100%}.nk-file-share-group{position:relative;padding:1rem 0;flex-grow:1;display:flex;align-items:center}.nk-file-share-nav{flex-shrink:0}.nk-file-details-row{display:flex;flex-wrap:wrap;padding:.25rem 0}.nk-file-details-col{font-size:13px}.nk-file-details-col:first-child{color:#8094ae;width:100%}.nk-file-details-col:last-child{color:#526484}.nk-file-details-col .breadcrumb{padding:0}@media(min-width: 420px){.nk-file-details-row{flex-wrap:nowrap;padding:.375rem 0}.nk-file-details-col:first-child{width:100px;flex-shrink:0}}@media(min-width: 576px){.nk-file-share-field textarea.form-control.ex-large,.nk-file-share-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.ex-large.dual-listbox__search{min-height:278px}}.nk-files .nk-file .hideable{opacity:0;transition:opacity .3s}.nk-files .nk-file:hover .hideable{opacity:1}.nk-files .nk-file-item{display:table-row}.nk-files .nk-file-item>div{position:relative;display:table-cell;padding:.5rem;vertical-align:middle}.nk-files .nk-file-actions{width:60px;text-align:center}.nk-files-head{display:table-header-group}.nk-files-head .nk-file-item>div{font-weight:500;font-size:.8125rem;padding:.25rem}.nk-files-head .nk-file-item>div:first-child{padding-left:0}.nk-files-head .nk-file-item>div:last-child{padding-right:.5rem}.nk-files-head .dropdown-menu-xs{min-width:140px;max-width:140px}.nk-files-list{display:table-row-group}.nk-files-view-list{display:table;width:100%}.nk-files-view-list .nk-file{display:table-row}.nk-files-view-list .nk-file.selected{background:#cfeee6}.nk-files-view-list .nk-file.selected>div{background:rgba(0,0,0,0)}.nk-files-view-list .nk-file>div{padding:.5rem .375rem;border-bottom:1px solid #dbdfea;height:4rem;background-color:#fff}.nk-files-view-list .nk-file>div:first-child{border-left:1px solid #dbdfea;padding-left:1.25rem}.nk-files-view-list .nk-file>div:last-child{border-right:1px solid #dbdfea}.nk-files-view-list .nk-file>div.nk-file-info{padding-top:.125rem;padding-bottom:.125rem}.nk-files-view-list .nk-file:first-child>div{border-top:1px solid #dbdfea}.nk-files-view-list .nk-file:first-child>div:first-child{border-top-left-radius:4px}.nk-files-view-list .nk-file:first-child>div:last-child{border-top-right-radius:4px}.nk-files-view-list .nk-file:last-child>div:first-child{border-bottom-left-radius:4px}.nk-files-view-list .nk-file:last-child>div:last-child{border-bottom-right-radius:4px}.nk-files-view-list .nk-file .custom-checkbox{margin-right:1rem}.nk-files-view-list .nk-file-members .tb-shared{position:absolute;left:-1rem;top:50%;transform:translateY(-50%);font-size:1rem}.nk-files-view-list .nk-file-name-text a.title{padding:1rem 0 .875rem}.nk-files-view-list .nk-file-icon+.nk-file-name a.title{padding-left:40px;margin-left:-40px}.nk-files-view-list.is-compact .nk-file>div{height:3rem}.nk-files-view-grid .nk-files-head,.nk-files-view-group .nk-files-head{margin-bottom:.25rem;width:100%;display:flex}.nk-files-view-grid .nk-files-head .nk-file-item,.nk-files-view-group .nk-files-head .nk-file-item{display:flex;justify-content:space-between;align-items:center;width:100%;padding:0}.nk-files-view-grid .nk-files-head .nk-file-item>div:not(.nk-file-info):not(.nk-file-actions),.nk-files-view-group .nk-files-head .nk-file-item>div:not(.nk-file-info):not(.nk-file-actions){display:none}.nk-files-view-grid .nk-files-head .nk-file-actions,.nk-files-view-group .nk-files-head .nk-file-actions{width:30px;padding:0 !important;margin-right:-4px}.nk-files-view-grid .nk-files-list,.nk-files-view-group .nk-files-list{display:flex;flex-wrap:wrap;margin:-8px}.nk-files-view-grid .nk-files-list .nk-file-actions,.nk-files-view-group .nk-files-list .nk-file-actions{position:absolute;border:0 none;background:rgba(0,0,0,0);width:46px;right:4px;top:10px}.nk-files-view-grid .nk-files-list .custom-control,.nk-files-view-group .nk-files-list .custom-control{position:absolute}.nk-files-view-grid .nk-file,.nk-files-view-group .nk-file{display:flex;position:relative;margin:8px;background:#fff;border:1px solid #dbdfea;border-radius:4px}.nk-files-view-grid .nk-file .nk-file-members,.nk-files-view-group .nk-file .nk-file-members{display:none}.nk-files-view-grid .nk-file{display:block;position:relative;width:calc(50% - 16px);text-align:center;padding:.5rem .25rem}.nk-files-view-grid .nk-file>div{display:block;padding:0}.nk-files-view-grid .nk-file-title{display:flex;flex-direction:column}.nk-files-view-grid .nk-file-icon{display:block;margin:0;width:100%}.nk-files-view-grid .nk-file-icon-type{width:72px;padding:.5rem 0}.nk-files-view-grid .nk-file-name .title{padding:.5rem .125rem .5rem}.nk-files-view-grid .nk-file-name-text{padding-left:1.5rem;padding-right:1.5rem}.nk-files-view-grid .nk-file-desc{padding:0 .25rem .75rem;margin-top:-0.125rem;justify-content:center}.nk-files-view-grid .nk-file-desc .members{display:none}.nk-files-view-grid .nk-file-info>.nk-file-link{padding:.5rem 0}.nk-files-view-grid .nk-file .nk-file-members{display:none}.nk-files-view-grid .nk-file .nk-file-meta{padding-bottom:.5rem}.nk-files-view-grid .nk-file .custom-control{top:.75rem;left:1rem}.nk-files-view-group .nk-file{position:relative;padding:.5rem .5rem;width:100%}.nk-files-view-group .nk-file>div{display:block;width:100%;padding-right:2rem}.nk-files-view-group .nk-file-desc{padding:.25rem .125rem 0}.nk-files-view-group .nk-file-name-text a.title{padding:.125rem 0}.nk-files-view-group .nk-file-icon+.nk-file-name a.title{padding-left:40px;margin-left:-40px}.nk-files-view-group .nk-file .nk-file-actions{right:2px;top:4px}.nk-files-view-group .nk-file .custom-control{right:.5rem;bottom:.5rem}.nk-files-view-group .nk-file .nk-file-meta{display:none}.nk-files-group>.title{border-top:1px solid #e5e9f2;font-size:12px;letter-spacing:.04em;text-transform:uppercase;padding:1rem 0;margin:0}.nk-files-group+.nk-files-group{margin-top:3rem}@media(max-width: 767.98px){.nk-file-name-text{font-size:13px}.nk-files-view-grid .nk-file-name-text{font-size:12px}}@media(max-width: 991.98px){.nk-fmg-body .nk-block-tools .btn-icon.btn-trigger .icon,.nk-fmg-body .nk-block-tools .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-fmg-body .nk-block-tools .btn-trigger.btn-secondary .icon{font-size:1.25rem}}@media(min-width: 576px){.nk-files-view-grid .nk-file{width:calc(33.33% - 16px)}.nk-files-view-group .nk-file{width:calc(50% - 16px)}}@media(min-width: 1200px){.nk-files-view-grid .nk-file{width:calc(33.33% - 16px)}.nk-files-view-group .nk-file{width:calc(50% - 16px)}}@media(min-width: 1440px){.nk-files-view-grid .nk-file{width:calc(25% - 16px)}.nk-files-view-group .nk-file{width:calc(33.33% - 16px)}}@media(min-width: 1540px){.nk-files-view-grid .nk-file{width:calc(20% - 16px)}.nk-files-view-group .nk-file{width:calc(25% - 16px)}}@media(min-width: 1800px){.nk-files-view-grid .nk-file{width:calc(16.66% - 16px)}.nk-files-view-group .nk-file{width:calc(20% - 16px)}}@media(max-width: 1199px)and (min-width: 992px),(max-width: 767px){.nk-files-view-list .nk-file-members,.nk-files-view-list .nk-file-size{display:none !important}}@media(max-width: 599px){.nk-files-view-list .nk-file-icon-type{width:24px}.nk-files-view-list .nk-file-meta,.nk-files-view-list .nk-file-date,.nk-files-view-list .nk-file-size{display:none !important}.nk-files-view-list .nk-file .custom-checkbox{margin-right:.75rem}}.nk-upload-form{margin-bottom:2.25rem}.nk-upload-list>.title{font-size:.875rem;padding-bottom:1rem}.nk-upload-item{display:flex;align-items:center;padding:.5rem;border-radius:4px;border:1px solid #e5e9f2;margin:.5rem 0}.nk-upload-icon{width:48px;margin-right:.25rem;flex-shrink:0}.nk-upload-info{font-weight:500;color:#364a63;flex-grow:1;padding-right:.75rem}.nk-upload-title{display:flex;align-items:flex-end}.nk-upload-title .title{font-size:.875rem}.nk-upload-title .meta{font-size:12px;margin-left:auto;color:#8094ae;font-weight:400}.nk-upload-size{font-size:12px;color:#8094ae;font-weight:400}.nk-upload-progress{margin:.375rem 0 .25rem}.nk-upload-action{margin-left:auto}.add-opt:hover .sub-text,.add-opt:hover .icon{color:#0fac81}.add-opt-icon .icon-circle,.contacts-add-link .icon-circle,.chat-members-link .icon-circle,.chat-option-link .icon-circle{height:32px;width:32px;font-size:1rem}.add-opt-icon .icon+span,.contacts-add-link .icon+span,.chat-members-link .icon+span,.chat-option-link .icon+span,.add-opt-icon .icon+div,.contacts-add-link .icon+div,.chat-members-link .icon+div,.chat-option-link .icon+div{margin-left:.75rem}.chat-item{position:relative;border-radius:4px;transition:background-color .3s}.chat-item:hover{background-color:#ebeef2}.chats-dropdown .chat-item:hover{background-color:#f5f6fa}.chat-item:hover .chat-actions{opacity:1;pointer-events:initial;transition:opacity .5s}.chat-item.current{background-color:#f5f6fa}.chat-item.current:hover{background-color:#ebeef2}.chat-link{display:flex;align-items:center;width:100%;padding:.75rem;cursor:pointer}.chat-media{height:44px;width:44px}.chat-media+.chat-info{margin-left:1rem}.chat-info{width:calc(100% - 3.75rem)}.chat-from{display:flex;align-items:center;justify-content:space-between}.chat-from .name{font-size:.9375rem;margin-bottom:0;font-weight:500;color:#526484}.is-unread .chat-from .name{font-weight:700;color:#364a63}.chat-from .time{font-size:12px;color:#8094ae}.chat-context{display:flex;align-items:center;justify-content:space-between}.chat-context .text{width:calc(100% - 2.5rem);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:13px;color:#8094ae}.is-unread .chat-context .text{font-weight:500;color:#526484}.chat-context .status{display:flex;color:rgba(128,148,174,.8)}.is-unread .chat-context .status{color:#0fac81}.chat-context .status.seen{color:#0fac81}.chat-actions{background-color:#ebeef2;position:absolute;top:0;bottom:0;right:.75rem;opacity:0;pointer-events:none;z-index:2;display:flex;align-items:center;justify-content:flex-end;width:3rem}.chat-profile-group{border-top:1px solid #e5e9f2;padding:.25rem 0}.chat-profile-head{padding:1.25rem 1.5rem;display:flex;align-items:center;justify-content:space-between}.chat-profile-head .title{margin-bottom:0}.chat-profile-head .indicator-icon{display:inline-flex}.chat-profile-head.collapsed .indicator-icon{transform:rotate(-180deg)}.chat-profile-body-inner{padding:0 1.5rem 1.5rem}.chat-profile-options{margin:-0.25rem}.chat-profile-options li{padding:.25rem}.chat-profile-settings{margin:-0.5rem}.chat-profile-settings li{padding:.5rem}.chat-profile-settings .custom-control-sm .custom-control-label{padding-left:.25rem;font-size:13px;font-weight:500;color:#526484}.chat-profile-media{display:flex;margin:0 -0.25rem}.chat-profile-media li{width:33.33%;padding:.25rem}.chat-profile-media li a{display:inline-block}.chat-profile-media li img{border-radius:4px}.chat-option-link{display:flex;align-items:center}.chat-option-link .lead-text{font-weight:500;font-size:13px;transition:color .3s;color:#526484}.chat-option-link:hover .lead-text{color:#1c2b46}.chat-members{margin:-0.375rem -0.5rem}.chat-members li{position:relative}.chat-members-link{display:flex;align-items:center;padding:.375rem .5rem}.chat-members .user-card{position:relative;padding:.375rem .5rem;border-radius:3px;transition:background-color .3s}.chat-members .user-card>a{width:100%;display:flex;align-items:center}.chat-members .user-card:hover{background-color:#ebeef2}.chat-members .user-card:hover .user-actions{opacity:1;pointer-events:initial;transition:opacity .5s}.chat-members .user-role{margin-left:auto;font-size:12px;color:#8094ae}.chat-members .user-actions{position:absolute;top:0;right:.25rem;bottom:0;width:3rem;background-color:#ebeef2;display:flex;align-items:center;justify-content:flex-end;opacity:0;pointer-events:none}.chat{display:flex;align-items:flex-end;margin:-4px}.chat>div{padding:4px}.chat+.chat{padding-top:.5rem}.chat-avatar{margin-bottom:1.4rem}.chat-avatar.no-meta{margin-bottom:0}.chat-bubble{display:flex;align-items:center;padding:.125rem 0}.chat-bubble:hover .chat-msg-more{opacity:1}.chat-bubbles .attach-files{margin-top:.75rem}.chat-msg{background-color:#fff;border-radius:8px;padding:.5rem 1rem}.chat-msg-more{display:flex;align-items:center;margin:0 .75rem;opacity:0;flex-shrink:0;transition:all .3s}.chat-msg-more>li{padding:.25rem}.chat-msg.is-light{background-color:#e5e9f2;color:#526484}.chat-msg.is-theme{background-color:#0fac81;color:#fff}.chat-meta{display:flex;align-items:center;margin:.25rem -0.375rem 0}.chat-meta li{position:relative;padding:0 .375rem;font-size:12px;color:#8094ae}.chat-meta li:not(:first-child):before{content:"";font-family:"Nioicon";position:absolute;top:50%;left:0;transform:translate(-50%, -50%);font-size:11px;line-height:10px;opacity:.8}.chat-sap{overflow:hidden;text-align:center;padding:1rem 0}.chat-sap-meta{position:relative;display:inline-block;padding:0 .75rem;color:#8094ae;font-size:12px;line-height:1.4}.chat-sap-meta:before,.chat-sap-meta:after{position:absolute;height:1px;background:#dbdfea;content:"";width:100vw;top:50%}.chat-sap-meta:before{right:100%}.chat-sap-meta:after{left:100%}.chat.is-you .chat-bubbles .attach-files{border-color:#fff;overflow:hidden}.chat.is-you .chat-bubbles .attach-files,.chat.is-you .chat-bubbles .attach-foot{background-color:#fff}.chat.is-you .chat-bubble:last-child .chat-msg{border-bottom-left-radius:0}.chat.is-you .chat-bubble:not(:first-child) .chat-msg{border-top-left-radius:4px}.chat.is-you .chat-bubble:not(:last-child) .chat-msg{border-bottom-left-radius:4px}.chat.is-me{justify-content:flex-end}.chat.is-me .chat-msg{background-color:#0fac81;color:#fff}.chat.is-me .chat-meta{justify-content:flex-end}.chat.is-me .chat-bubble{flex-direction:row-reverse}.chat.is-me .chat-bubbles .attach-files{border-color:#abe2d3;overflow:hidden}.chat.is-me .chat-bubbles .attach-files,.chat.is-me .chat-bubbles .attach-foot{background-color:#fff}.chat.is-me .chat-bubble:last-child .chat-msg{border-bottom-right-radius:0}.chat.is-me .chat-bubble:not(:first-child) .chat-msg{border-top-right-radius:4px}.chat.is-me .chat-bubble:not(:last-child) .chat-msg{border-bottom-right-radius:4px}.chat-upload-option{display:none;position:absolute;left:100%;padding:.5rem;background-color:#fff}.chat-upload-option.expanded{display:block}.chat-upload-option ul{display:flex;align-items:center}.chat-upload-option a{color:#0fac81;font-size:1.25rem;height:36px;width:36px;display:inline-flex;align-items:center;justify-content:center}.chat-upload-option a:hover{color:#0c8665}.fav-list{display:flex;margin:-0.375rem;overflow-x:auto}.fav-list li{padding:.375rem}.fav-list a:hover>.user-avatar:after{opacity:1}.fav-list .user-avatar{height:44px;width:44px}.fav-list .user-avatar:after{content:"";position:absolute;width:100%;left:0;height:100%;background:#e5e9f2;transform:scale(1.15);opacity:0;border-radius:50%;z-index:-1;transition:opacity .3s}@media(min-width: 768px){.fav-list{flex-wrap:wrap}}@media(max-width: 859px){.fav-list{margin:-0.375rem 0}.fav-list li:first-child{padding-left:0}.fav-list li:last-child{padding-right:0}}.channel-list li{margin:.125rem -0.5rem}.channel-list a{padding:.375rem .5rem;display:block;transition:all .3s;font-weight:500;color:#526484;border-radius:3px}.channel-list a:hover,.channel-list a.active{color:#0fac81;background:#e2f5f0}.contacts-list{margin:-0.375rem -0.5rem}.contacts-list+.contacts-list{margin-top:1.75rem}.contacts-list li{position:relative}.contacts-list li>.title{padding-left:1.25rem;margin-bottom:.25rem}.contacts-list .user-card{position:relative;padding:.375rem .5rem;border-radius:3px;transition:background-color .3s}.contacts-list .user-card>a{width:100%;display:flex;align-items:center}.contacts-list .user-card:hover{background-color:#ebeef2}.contacts-list .user-card:hover .user-actions{opacity:1;pointer-events:initial;transition:opacity .4s}.contacts-list .user-meta{margin-left:auto;font-size:12px;color:#8094ae}.contacts-list .user-actions{font-size:12px;position:absolute;top:0;right:.25rem;bottom:0;width:4.5rem;background-color:#ebeef2;display:flex;align-items:center;justify-content:flex-end;opacity:0;pointer-events:none}.contacts-list .user-actions>a{padding:0 .375rem}.contacts-add-link{padding:.375rem .5rem;display:flex;align-items:center}.contacts-add-link .lead-text{font-weight:500;font-size:13px}.nk-chat{position:relative;display:flex;overflow:hidden}.nk-chat-blank{display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;background-color:#e5e9f2}.nk-chat-blank-icon{margin-bottom:1.5rem}.nk-chat-aside{background:#fff;width:100%;overflow:hidden;max-height:calc(100vh - (65px + 96px));position:relative;display:flex;flex-direction:column;flex-shrink:0;border:1px solid #e5e9f2;border-radius:4px;padding-bottom:1.25rem}.nk-chat-aside-head{display:flex;align-items:center;justify-content:space-between;padding:1.125rem 1.25rem .875rem}.nk-chat-aside-user .title{font-size:1.375rem;color:#364a63}.nk-chat-aside-user .user-avatar{height:36px;width:36px}.nk-chat-aside-user .user-avatar+.title{margin-left:1rem}.nk-chat-aside-user .dropdown-toggle:after{font-size:1.125rem;color:#8094ae;margin-left:1rem}.nk-chat-aside-tools{display:flex;align-items:center}.nk-chat-aside-body{max-height:100%;height:100%;overflow:auto}.nk-chat-aside-search{padding:0 1.25rem;margin-bottom:1.75rem;margin-top:.25rem}.nk-chat-aside-search .form-control,.nk-chat-aside-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-chat-aside-search input,.nk-chat-aside-search .dual-listbox .dual-listbox__search,.dual-listbox .nk-chat-aside-search .dual-listbox__search{background-color:#f5f6fa;border-color:#f5f6fa}.nk-chat-aside-search .form-control::placeholder,.nk-chat-aside-search div.dataTables_wrapper div.dataTables_filter input::placeholder,div.dataTables_wrapper div.dataTables_filter .nk-chat-aside-search input::placeholder,.nk-chat-aside-search .dual-listbox .dual-listbox__search::placeholder,.dual-listbox .nk-chat-aside-search .dual-listbox__search::placeholder{color:#8094ae}.nk-chat-aside-panel{padding:0 1.25rem 1.75rem}.nk-chat-aside-panel .title{margin-bottom:.75rem}.nk-chat-list{padding:0 .5rem}.nk-chat-list .title{margin-left:.75rem}.nk-chat-body{background:#fff;position:absolute;top:0;left:0;right:0;bottom:0;flex-grow:1;display:flex;flex-direction:column;overflow:hidden;transition:padding .3s ease-in-out;opacity:0;pointer-events:none;z-index:5;border:1px solid #e5e9f2}.nk-chat-body.show-chat{opacity:1;pointer-events:auto}.nk-chat-head{position:relative;display:flex;align-items:center;justify-content:space-between;padding:1rem 1.75rem;border-bottom:1px solid #e5e9f2;background-color:#fff}.nk-chat-head-info{width:60%}.nk-chat-head-info .user-avatar+.user-info{margin-left:.75rem}.nk-chat-head-info .user-info .lead-text{display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.nk-chat-head-info,.nk-chat-head-tools{display:flex;align-items:center;margin:-0.125rem}.nk-chat-head-info>li,.nk-chat-head-tools>li{padding:.125rem}.nk-chat-head-info .btn-icon .icon,.nk-chat-head-info .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-head-info .btn-secondary .icon,.nk-chat-head-tools .btn-icon .icon,.nk-chat-head-tools .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-head-tools .btn-secondary .icon{font-size:1.25rem}.nk-chat-head-search{position:absolute;top:calc(100% + 1rem);left:0;z-index:9;width:100%;padding:0 1.75rem;opacity:0;pointer-events:none;transform:translateY(-10px);transition:all .5s}.nk-chat-head-search.show-search{opacity:1;pointer-events:auto;transform:none}.nk-chat-panel{background-color:rgba(235,238,242,.7);height:100%;max-height:100%;overflow:auto;padding:1.25rem}.nk-chat-editor{display:flex;align-items:center;padding:1rem 1.25rem;background-color:#fff}.nk-chat-editor-form{padding:0 .5rem;flex-grow:1}.nk-chat-editor-form .form-control,.nk-chat-editor-form div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-chat-editor-form input,.nk-chat-editor-form .dual-listbox .dual-listbox__search,.dual-listbox .nk-chat-editor-form .dual-listbox__search{min-height:36px;padding-top:.5rem}.nk-chat-editor-upload,.nk-chat-editor-tools{display:flex;align-items:center}.nk-chat-editor-upload .btn-icon .icon,.nk-chat-editor-upload .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-editor-upload .btn-secondary .icon,.nk-chat-editor-tools .btn-icon .icon,.nk-chat-editor-tools .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-editor-tools .btn-secondary .icon{font-size:1.5rem}.nk-chat-editor-upload{position:relative;z-index:2}.nk-chat-editor-upload .toggle-opt{transition:.3s}.nk-chat-editor-upload .toggle-opt.active{opacity:.7;transform:rotate(-45deg)}.nk-chat-profile{position:absolute;top:0;right:0;transform:translateX(100%);width:325px;height:100%;max-height:100%;transition:transform .3s ease-in-out;background:#fff;z-index:100}.nk-chat-profile-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:600;z-index:90;animation:overlay-fade-in .4s ease 1}.nk-chat-profile.visible{transform:none}@media(max-width: 575.98px){.nk-chat-head{padding:.75rem 1.25rem}.nk-chat-head-user{max-width:calc(100% - 34px)}.nk-chat-head-user .user-avatar{height:36px;width:36px}.nk-chat-head-user .user-info{width:calc(100% - 36px - .75rem)}}@media(min-width: 576px){.nk-chat-head-info,.nk-chat-head-tools{margin:-0.375rem}.nk-chat-head-info>li,.nk-chat-head-tools>li{padding:.375rem}.nk-chat-aside{max-height:calc(100vh - (65px + 108px))}}@media(min-width: 576px)and (max-width: 991px){.nk-chat-aside-head,.nk-chat-aside-search{padding-left:2.25rem;padding-right:2.25rem}.nk-chat-aside-panel{padding:0 2.25rem 1.75rem}.nk-chat-list{padding:0 1.5rem}.nk-chat-head,.nk-chat-panel,.nk-chat-editor{padding-left:2.25rem;padding-right:2.25rem}.nk-chat-head-search{padding:0 2.25rem}}@media(min-width: 860px){.nk-chat-aside{width:320px;margin-right:1.5rem;max-height:calc(100vh - (65px + 112px))}.nk-chat-body{position:relative;opacity:1;pointer-events:auto;max-height:calc(100vh - (65px + 112px));border-radius:4px}.nk-chat-body-close{display:none}}@media(max-width: 859px){.nk-chat-body{position:fixed}.nk-chat-body.show-chat{z-index:2999}.nk-chat-head{padding-top:.75rem;padding-bottom:.75rem}}@media(min-width: 860px)and (max-width: 991px){.nk-chat-aside{width:345px}}@media(min-width: 992px){.nk-chat-aside-panel,.nk-chat-aside-head,.nk-chat-aside-search{padding-left:1.75rem;padding-right:1.75rem}.nk-chat-list{padding:0 1rem}.nk-chat-aside{width:325px}.nk-chat-panel{padding:1.25rem 1.75rem}.chat-profile-head,.chat-profile-body-inner{padding-right:1.75rem;padding-left:1.75rem}}@media(min-width: 1200px){.nk-chat-profile{border-left:1px solid #e5e9f2}}@media(min-width: 1540px){.nk-chat-aside{width:382px}.nk-chat-profile{width:365px}}@media(max-width: 359px){.nk-chat-profile{width:280px}}.nk-code-preview-box{display:block;color:#8094ae;padding:.15rem 1.25rem;border-left:1px solid #e5e9f2}.dashboard-preview{height:200px;justify-content:center}.dropdown-preview .dropdown-menu{position:static;display:block}.dropdown-preview:after{display:block;clear:both;content:""}@media(max-width: 420px){.dropdown-preview .dropdown-menu-xl,.dropdown-preview .dropdown-menu-lg,.dropdown-preview .dropdown-menu-md{min-width:100%;max-width:100%}}.prettyprint{padding:1.25rem;white-space:pre;box-shadow:none !important;margin-bottom:0;border-radius:4px;overflow:auto}.card-preview{border:1px solid #dbdfea}.code-block{position:relative;border:1px solid #dbdfea;padding:1.25rem;background:#fff;border-radius:4px}.code-block .clipboard-init{position:absolute;top:12px;right:12px}.code-block+.code-block,.card-preview+.code-block{margin-top:28px}.code-block+.code-block{border-top-color:#e5e9f2;border-radius:0 0 4px 4px}.code-block+.card-preview,.code-block+.nk-block-head{margin-top:40px}.code-block .prettyprint{background:#f5f6fa;border:none;padding:.75rem;font-size:11px;line-height:20px;max-height:136px}.code-block .title{margin-bottom:1rem}.code-block .btn,.code-block .dual-listbox .dual-listbox__button,.dual-listbox .code-block .dual-listbox__button{background-color:#fff}.code-block .btn:focus,.code-block .dual-listbox .dual-listbox__button:focus,.dual-listbox .code-block .dual-listbox__button:focus,.code-block .btn:hover,.code-block .dual-listbox .dual-listbox__button:hover,.dual-listbox .code-block .dual-listbox__button:hover{border-color:#dbdfea;box-shadow:none}.code-block-clean .title{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:#8094ae;font-weight:500;margin-bottom:.45rem;display:block}.preview-icon-list{display:flex;flex-wrap:wrap;margin:-15px}.preview-icon-item{flex:1 0 150px;padding:15px;max-width:50%}.preview-icon-box{position:relative;padding:25px 20px;text-align:center}.preview-icon-box .btn-clipboard{position:absolute;top:0;right:0;opacity:0;z-index:1}.preview-icon-box .btn-clipboard:focus{border-color:rgba(0,0,0,0);box-shadow:none}.preview-icon-box:hover .btn-clipboard{opacity:1}.preview-icon-wrap{padding-bottom:5px}.preview-icon-wrap .ni{font-size:30px}.preview-icon-svg .preview-icon-wrap{margin-bottom:.5rem}.preview-icon-svg .preview-icon-wrap svg{width:90px}.preview-icon-name{color:#8094ae;font-size:11px}.preview-title,.preview-title-lg{display:block;padding-bottom:.75rem}.preview-title-lg{font-size:13px}.preview-hr{border-top:1px solid #dbdfea;margin-top:2rem;margin-bottom:2rem}.preview-hr+.preview-title{padding-top:.5rem}.nk-block-head+.preview-hr{margin-top:.5rem}.preview-list{display:flex;flex-wrap:wrap;margin:-0.75rem}.preview-item{padding:.75rem}.preview-btn-list{display:flex;flex-wrap:wrap;margin:-0.75rem}.preview-btn-item{width:50%;padding:.75rem}.preview-btn-list-fw .preview-btn-item{width:100%}.preview-btn-list-3x .preview-btn-item{width:33.33%}.example-width>div,.example-height>div,.example-border>div,.example-spacing>div{font-size:11px;padding:.5rem;text-align:center;background-color:#f5f6fa}.example-border{margin:-0.5rem}.example-border>div{height:4.5rem;width:4.5rem;margin:.5rem}.example-border-all>div{border:1px solid #dbdfea}.example-width>div{height:2rem;background-color:#e5e9f2;margin-bottom:.25rem}.example-height{height:8rem}.example-height>div{width:8rem;background-color:#e5e9f2;margin-right:.5rem}.example-spacing>div{height:2rem;width:4.5rem;background-color:#e5e9f2;margin-bottom:.5rem}.example-spacing-pd>div{margin-right:.5rem;height:auto;width:auto}.example-spacing-pd>div>span{display:block;padding:.25rem;line-height:1;border-radius:2px;background-color:#fff}.example-alerts:not(:last-child){margin-bottom:28px}.components-preview h4.title,.components-preview .title.h4,.components-preview h5.title,.components-preview .title.h5{font-size:1.25rem;letter-spacing:-0.01rem;font-family:Roboto,sans-serif;font-weight:500}.components-preview .card-preview>.card-inner{padding:1.25rem}@media(min-width: 768px){.preview-btn-item{width:25%}.preview-btn-list-fw .preview-btn-item{width:25%}.preview-btn-list-3x .preview-btn-item{width:16.66%}}@media(min-width: 992px){.components-preview .nk-block+.nk-block-lg{padding-top:3.75rem}}@media(max-width: 767.98px){.preview-reference tr,.preview-reference th,.preview-reference td{display:block;border:0;width:100% !important}.preview-reference tbody tr{padding:.5rem 0}.preview-reference tbody tr:not(:last-child){border-bottom:1px solid #e5e9f2}.preview-reference tbody tr:nth-child(2n){background-color:rgba(245,246,250,.3)}.preview-reference tr td{padding:.2rem 1.25rem}.preview-reference tr th:not(:first-child){display:none}}.nk-body.ui-clean{background:#fff !important}.nk-body.ui-softy,.nk-body.ui-shady,.nk-body.ui-softy .nk-header-fixed,.nk-body.ui-shady .nk-header-fixed{background:#f5f6fa !important}.ui-softy .card,.ui-softy .code-block,.ui-softy .invoice-wrap,.ui-softy .accordion:not(.accordion-s2):not(.accordion-s3),.ui-shady .card,.ui-shady .code-block,.ui-shady .invoice-wrap,.ui-shady .accordion:not(.accordion-s2):not(.accordion-s3){border:none}.ui-softy .table .table-light th,.ui-shady .table .table-light th{background:rgba(245,246,250,.5);box-shadow:0 -1px 5px -5px rgba(31,43,58,.7)}.ui-softy .tb-tnx-head,.ui-shady .tb-tnx-head{background:rgba(245,246,250,.5)}.ui-softy .card .card-inner+.table .tb-tnx-head,.ui-shady .card .card-inner+.table .tb-tnx-head{border-top:1px solid #dbdfea}.ui-softy .kanban-board-header,.ui-shady .kanban-board-header{border-left:0;border-right:0;border-bottom:0}.ui-softy .kanban-item,.ui-shady .kanban-item{border:0}.ui-softy .card,.ui-softy .code-block,.ui-softy .invoice-wrap,.ui-softy .accordion:not(.accordion-s2):not(.accordion-s3),.ui-softy.npc-apps-messages .nk-reply-form,.ui-softy.npc-apps-inbox .nk-reply-form,.ui-softy .nk-files-view-grid .nk-file,.ui-softy .nk-files-view-group .nk-file,.ui-softy .nk-files-view-list .nk-files-list,.ui-softy .chat-msg,.ui-softy .kanban-board-header,.ui-softy .kanban-item,.ui-softy .kanban-add-task{box-shadow:0 1px 4px rgba(31,43,58,.15)}.ui-softy .card .accordion:not(.accordion-s2):not(.accordion-s3){box-shadow:none;border:1px solid #dbdfea}.ui-shady .card,.ui-shady .code-block,.ui-shady .invoice-wrap,.ui-shady .accordion:not(.accordion-s2):not(.accordion-s3),.ui-shady.npc-apps-messages .nk-reply-form,.ui-shady.npc-apps-inbox .nk-reply-form,.ui-shady .nk-files-view-grid .nk-file,.ui-shady .nk-files-view-group .nk-file,.ui-shady .nk-files-view-list .nk-files-list,.ui-shady .chat-msg,.ui-shady .kanban-board-header,.ui-shady .kanban-item,.ui-shady .kanban-add-task{box-shadow:0 0 25px -12px rgba(31,43,58,.15)}.ui-shady .card .accordion:not(.accordion-s2):not(.accordion-s3){box-shadow:none;border:1px solid #dbdfea}.ui-softy .nk-ibx-aside,.ui-softy .nk-ibx-body,.ui-softy .nk-fmg-aside,.ui-softy .nk-fmg-body,.ui-softy .nk-msg-aside,.ui-softy .nk-msg-body,.ui-softy .nk-chat-aside,.ui-softy .nk-chat-body{box-shadow:0 1px 4px rgba(31,43,58,.15)}.ui-shady .nk-ibx-aside,.ui-shady .nk-ibx-body,.ui-shady .nk-fmg-aside,.ui-shady .nk-fmg-body,.ui-shady .nk-msg-aside,.ui-shady .nk-msg-body,.ui-shady .nk-chat-aside,.ui-shady .nk-chat-body{box-shadow:0 0 25px -12px rgba(31,43,58,.15)}.ui-shady .nk-msg-aside,.ui-shady .nk-msg-nav,.ui-softy .nk-msg-aside,.ui-softy .nk-msg-nav{background:#fff}.ui-shady .nk-msg-item.active,.ui-shady .nk-msg-item.current,.ui-softy .nk-msg-item.active,.ui-softy .nk-msg-item.current{background:rgba(245,246,250,.5);position:relative}.ui-shady .nk-msg-item.active:after,.ui-shady .nk-msg-item.current:after,.ui-softy .nk-msg-item.active:after,.ui-softy .nk-msg-item.current:after{position:absolute;content:"";left:0;top:0;height:100%;width:2px;background:#0fac81}.ui-shady.npc-apps-messages .nk-msg-item.active,.ui-shady.npc-apps-messages .nk-msg-item.current,.ui-softy.npc-apps-messages .nk-msg-item.active,.ui-softy.npc-apps-messages .nk-msg-item.current{background:#f5f6fa}.ui-shady.npc-apps-messages .nk-msg-item.active:after,.ui-shady.npc-apps-messages .nk-msg-item.current:after,.ui-softy.npc-apps-messages .nk-msg-item.active:after,.ui-softy.npc-apps-messages .nk-msg-item.current:after{width:3px}.ui-shady.npc-apps-messages .nk-msg-reply,.ui-softy.npc-apps-messages .nk-msg-reply{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-shady.npc-apps-inbox .nk-ibx-reply,.ui-shady.npc-apps-inbox .nk-ibx-nav,.ui-softy.npc-apps-inbox .nk-ibx-reply,.ui-softy.npc-apps-inbox .nk-ibx-nav{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-shady.npc-apps-inbox .nk-ibx-item,.ui-softy.npc-apps-inbox .nk-ibx-item{box-shadow:0 0 7px -1px rgba(16,25,36,.1)}.ui-shady.npc-apps-chat .nk-chat-panel,.ui-softy.npc-apps-chat .nk-chat-panel{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-clean.npc-apps-messages .nk-msg-aside,.ui-clean.npc-apps-messages .nk-msg-nav{background:#fff}.ui-clean.npc-apps-messages .nk-msg-item.active,.ui-clean.npc-apps-messages .nk-msg-item.current{background:#f5f6fa}.ui-clean.npc-apps-chat .nk-chat-panel{background:#fff}.ui-clean.npc-apps-chat .chat.is-you .chat-msg{background-color:#e5e9f2;color:#364a63}.ui-rounder .card,.ui-rounder .ratio,.ui-rounder .accordion,.ui-rounder .invoice,.ui-rounder .code-block,.ui-rounder .swal2-popup,.ui-rounder .prettyprint,.ui-rounder .invoice-wrap,.ui-rounder .nk-ibx,.ui-rounder .nk-ibx-body,.ui-rounder .nk-fmg-body,.ui-rounder .nk-msg-aside,.ui-rounder .nk-msg-body,.ui-rounder .nk-chat-aside,.ui-rounder .note-editor.note-frame,.ui-rounder .tox-tinymce{border-radius:12px}.ui-rounder .card>.list-group:first-child,.ui-rounder .card-header:first-child,.ui-rounder .card-img,.ui-rounder .card-img-top,.ui-rounder .ql-toolbar,.ui-rounder .note-toolbar{border-top-left-radius:11px;border-top-right-radius:11px}.ui-rounder .card>.list-group:last-child,.ui-rounder .card-footer:last-child,.ui-rounder .ql-container{border-bottom-right-radius:11px;border-bottom-left-radius:11px}.ui-rounder .card .table tr:first-child th:first-child{border-top-left-radius:11px}.ui-rounder .card .table tr:first-child th:last-child{border-top-right-radius:11px}@media(min-width: 860px){.nk-chat-body{border-radius:12px}}@media(min-width: 992px){.nk-ibx-aside,.nk-fmg-aside{border-radius:12px}}body.dark-mode{background:#101924 !important;color:#b6c6e3}body.dark-mode.bg-lighter,.dual-listbox body.dark-mode.dual-listbox__item:hover,body.dark-mode.bg-light{background:#0b1219 !important}body.dark-mode.nk-body.ui-softy,body.dark-mode.nk-body.ui-shady{background:#101924 !important}.dark-mode .logo-dark{opacity:0}.dark-mode .logo-light{opacity:1}.dark-mode h1,.dark-mode h2,.dark-mode h3,.dark-mode h4,.dark-mode h5,.dark-mode h6,.dark-mode .h1,.dark-mode .h2,.dark-mode .h3,.dark-mode .h4,.dark-mode .h5,.dark-mode .h6,.dark-mode .lead-text,.dark-mode .dropdown-title,.dark-mode pre{color:#fff}.dark-mode .text-base,.dark-mode .text-body,.dark-mode .link-text{color:#b6c6e3 !important}.dark-mode .text-secondary,.dark-mode .icon[class*=bg-secondary-dim],.dark-mode .user-avatar[class*=-light],.dark-mode .icon[class*=bg-light]{color:#8094ae !important}.dark-mode .text-dark{color:#fff !important}.dark-mode .text-muted{color:#8094ae !important}.dark-mode .text-light,.dark-mode .user-avatar[class*=-dark]{color:#8091a7 !important}.dark-mode .text-lighter{color:#3c4d62 !important}.dark-mode .text-indigo{color:#6370ca !important}.dark-mode .bg-light{background-color:#0b1219 !important}.dark-mode .bg-lighter,.dark-mode .dual-listbox .dual-listbox__item:hover,.dual-listbox .dark-mode .dual-listbox__item:hover{background-color:#0e1720 !important}.dark-mode .table-striped tbody tr:nth-of-type(odd){background-color:#101924 !important}.dark-mode .bg-white{background-color:#18212d !important}.dark-mode .bg-transparent.bg-transparent{background-color:rgba(0,0,0,0) !important}.dark-mode .bg-dark{background-color:#ebeef2 !important}.dark-mode .bg-blue-dim{background-color:#21334c !important}.dark-mode .bg-azure-dim{background-color:#182e4c !important}.dark-mode .bg-indigo-dim{background-color:#1b243a !important}.dark-mode .bg-purple-dim{background-color:#282c4d !important}.dark-mode .bg-pink-dim{background-color:#3b2b3f !important}.dark-mode .bg-orange-dim{background-color:#3b3533 !important}.dark-mode .bg-teal-dim{background-color:#193a3d !important}.dark-mode .bg-primary-dim,.dark-mode .dual-listbox .dual-listbox__item:active,.dual-listbox .dark-mode .dual-listbox__item:active,.dark-mode .dual-listbox .dual-listbox__item.dual-listbox__item--selected,.dual-listbox .dark-mode .dual-listbox__item.dual-listbox__item--selected{background-color:#17363a !important}.dark-mode .bg-success-dim{background-color:#193e40 !important}.dark-mode .bg-info-dim{background-color:#163948 !important}.dark-mode .bg-warning-dim{background-color:#393828 !important}.dark-mode .bg-danger-dim{background-color:#372931 !important}.dark-mode .bg-secondary-dim{background-color:#1e2938 !important}.dark-mode .bg-dark-dim{background-color:#19232f !important}.dark-mode .bg-gray-dim{background-color:#28323f !important}.dark-mode .bg-btc-dim{background-color:#3a302b !important}.dark-mode .bg-eth-dim{background-color:#232d42 !important}.dark-mode .alert-primary{color:#0fac81;background-color:#17363a;border-color:#17363a}.dark-mode .alert-primary hr{border-top-color:#17363a}.dark-mode .alert-primary .alert-link{color:#0b7d5e}.dark-mode .alert-fill.alert-primary{color:#fff;background:#0fac81}.dark-mode .alert-fill.alert-primary .alert-link{color:#fff}.dark-mode .alert-pro.alert-primary{border-color:#0fac81}.dark-mode .alert-secondary{color:#8ca3c0;background-color:#1e2938;border-color:#1e2938}.dark-mode .alert-secondary hr{border-top-color:#1e2938}.dark-mode .alert-secondary .alert-link{color:#6b89ae}.dark-mode .alert-fill.alert-secondary{color:#fff;background:#8ca3c0}.dark-mode .alert-fill.alert-secondary .alert-link{color:#fff}.dark-mode .alert-pro.alert-secondary{border-color:#8ca3c0}.dark-mode .alert-success{color:#1ee0ac;background-color:#193e40;border-color:#193e40}.dark-mode .alert-success hr{border-top-color:#193e40}.dark-mode .alert-success .alert-link{color:#18b389}.dark-mode .alert-fill.alert-success{color:#fff;background:#1ee0ac}.dark-mode .alert-fill.alert-success .alert-link{color:#fff}.dark-mode .alert-pro.alert-success{border-color:#1ee0ac}.dark-mode .alert-warning{color:#f4bd0e;background-color:#393828;border-color:#393828}.dark-mode .alert-warning hr{border-top-color:#393828}.dark-mode .alert-warning .alert-link{color:#c69909}.dark-mode .alert-fill.alert-warning{color:#fff;background:#f4bd0e}.dark-mode .alert-fill.alert-warning .alert-link{color:#fff}.dark-mode .alert-pro.alert-warning{border-color:#f4bd0e}.dark-mode .alert-info{color:#09c2de;background-color:#163948;border-color:#163948}.dark-mode .alert-info hr{border-top-color:#163948}.dark-mode .alert-info .alert-link{color:#0797ad}.dark-mode .alert-fill.alert-info{color:#fff;background:#09c2de}.dark-mode .alert-fill.alert-info .alert-link{color:#fff}.dark-mode .alert-pro.alert-info{border-color:#09c2de}.dark-mode .alert-danger{color:#e85347;background-color:#372931;border-color:#372931}.dark-mode .alert-danger hr{border-top-color:#372931}.dark-mode .alert-danger .alert-link{color:#e02b1c}.dark-mode .alert-fill.alert-danger{color:#fff;background:#e85347}.dark-mode .alert-fill.alert-danger .alert-link{color:#fff}.dark-mode .alert-pro.alert-danger{border-color:#e85347}.dark-mode .alert-gray{color:#b7c2d0;background-color:#28323f;border-color:#28323f}.dark-mode .alert-gray hr{border-top-color:#28323f}.dark-mode .alert-gray .alert-link{color:#98a8bc}.dark-mode .alert-fill.alert-gray{color:#fff;background:#b7c2d0}.dark-mode .alert-fill.alert-gray .alert-link{color:#fff}.dark-mode .alert-pro.alert-gray{border-color:#b7c2d0}.dark-mode .alert-dark{color:#1f2b3a;background-color:#19232f;border-color:#19232f}.dark-mode .alert-dark hr{border-top-color:#19232f}.dark-mode .alert-dark .alert-link{color:#0d1219}.dark-mode .alert-fill.alert-dark{color:#fff;background:#1f2b3a}.dark-mode .alert-fill.alert-dark .alert-link{color:#fff}.dark-mode .alert-pro.alert-dark{border-color:#1f2b3a}.dark-mode .alert-light{color:#ebeef2;background-color:#28323f;border-color:#28323f}.dark-mode .alert-light hr{border-top-color:#28323f}.dark-mode .alert-light .alert-link{color:#ccd4de}.dark-mode .alert-fill.alert-light{color:#000;background:#ebeef2}.dark-mode .alert-fill.alert-light .alert-link{color:#000}.dark-mode .alert-pro.alert-light{border-color:#ebeef2}.dark-mode .badge-dim.bg-primary{color:#0fac81;background-color:#17363a !important;border-color:#17363a}.dark-mode .badge-dim.bg-outline-primary{color:#0fac81;background-color:#17363a;border-color:#14594f}.dark-mode .badge-dim.bg-secondary{color:#8ca3c0;background-color:#293543 !important;border-color:#293543}.dark-mode .badge-dim.bg-outline-secondary{color:#8ca3c0;background-color:#293543;border-color:#465568}.dark-mode .badge-dim.bg-success{color:#1ee0ac;background-color:#193e40 !important;border-color:#193e40}.dark-mode .badge-dim.bg-outline-success{color:#1ee0ac;background-color:#193e40;border-color:#1a6d60}.dark-mode .badge-dim.bg-info{color:#09c2de;background-color:#163948 !important;border-color:#163948}.dark-mode .badge-dim.bg-outline-info{color:#09c2de;background-color:#163948;border-color:#126174}.dark-mode .badge-dim.bg-warning{color:#f4bd0e;background-color:#393828 !important;border-color:#393828}.dark-mode .badge-dim.bg-outline-warning{color:#f4bd0e;background-color:#393828;border-color:#705f21}.dark-mode .badge-dim.bg-danger{color:#e85347;background-color:#372931 !important;border-color:#372931}.dark-mode .badge-dim.bg-outline-danger{color:#e85347;background-color:#372931;border-color:#6b3537}.dark-mode .badge-dim.bg-light{color:#b7c2d0;background-color:#303945 !important;border-color:#303945}.dark-mode .badge-dim.bg-outline-light{color:#b7c2d0;background-color:#303945;border-color:#58616e}.dark-mode .badge-dim.bg-dark{color:#e5e9f2;background-color:#373f4b !important;border-color:#373f4b}.dark-mode .badge-dim.bg-outline-dark{color:#e5e9f2;background-color:#373f4b;border-color:#6a717c}.dark-mode .badge-dim.bg-gray{color:#8091a7;background-color:#28323f !important;border-color:#28323f}.dark-mode .badge-dim.bg-outline-gray{color:#8091a7;background-color:#28323f;border-color:#424e5e}.dark-mode .badge-dim.bg-lighter,.dark-mode .dual-listbox .badge-dim.dual-listbox__item:hover,.dual-listbox .dark-mode .badge-dim.dual-listbox__item:hover{color:#8091a7;background-color:#28323f !important;border-color:#28323f}.dark-mode .badge-dim.bg-outline-lighter{color:#8091a7;background-color:#28323f;border-color:#424e5e}.dark-mode .bg-outline-secondary,.dark-mode .badge-dot.bg-dark,.dark-mode .badge-dot.bg-secondary{color:#b7c2d0}.dark-mode .bg-outline-dark{color:#e5e9f2;border-color:#e5e9f2}.dark-mode .bg-outline-light{color:#b7c2d0;border-color:#344357}.dark-mode .badge-dot.bg-dark,.dark-mode .badge-dot.bg-light{background-color:rgba(0,0,0,0) !important}.dark-mode .badge-dot.bg-light{color:#8091a7}.dark-mode .bg-light,.dark-mode .code-block .btn,.dark-mode .code-block .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .code-block .dual-listbox__button{color:#e5e9f2;background:#344357;border-color:#344357}.dark-mode .bg-dark{color:#1f2b3a;background:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-light,.dark-mode .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .dual-listbox__button{color:#e5e9f2;background:#344357;border-color:#344357}.dark-mode .btn-light:not(:disabled):not(.disabled):hover,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):hover,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):hover,.dark-mode .btn-light:not(:disabled):not(.disabled):focus,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):focus,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):focus,.dark-mode .btn-light:not(:disabled):not(.disabled).focus,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled).focus,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled).focus,.dark-mode .btn-light:not(:disabled):not(.disabled):active,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):active,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):active,.dark-mode .btn-light:not(:disabled):not(.disabled).active,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled).active,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled).active{background:#435771;border-color:#435771;color:#e5e9f2}.dark-mode .btn-dark{color:#1f2b3a;background:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-dark:not(:disabled):not(.disabled):hover,.dark-mode .btn-dark:not(:disabled):not(.disabled):focus,.dark-mode .btn-dark:not(:disabled):not(.disabled).focus,.dark-mode .btn-dark:not(:disabled):not(.disabled):active,.dark-mode .btn-dark:not(:disabled):not(.disabled).active{background:#fff;border-color:#fff;color:#1f2b3a}.dark-mode .btn-outline-dark{border-color:#e5e9f2;color:#e5e9f2}.dark-mode .btn-outline-dark:not(:disabled):not(.disabled):hover{background:#e5e9f2;color:#1f2b3a}.dark-mode .btn-outline-secondary{border-color:#5a7ba5;color:#5a7ba5}.dark-mode .btn-outline-secondary:not(:disabled):not(.disabled):hover{background:#5a7ba5;color:#fff}.dark-mode .btn-outline-light,.dark-mode .dt-buttons .btn-secondary,.dt-buttons .dark-mode .btn-secondary{border-color:#3c4d62;color:#b7c2d0}.dark-mode .btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):hover{background:#3c4d62;color:#fff}.dark-mode .btn-dim.btn-primary{color:#0fac81;background-color:#163a3c;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-primary:not(:disabled):not(.disabled):hover{color:#13dba4;background-color:#205356;border-color:#205356}.dark-mode .btn-dim.btn-secondary{color:#adbdd2;background-color:#202b3b;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#ced8e4;background-color:#2d3c52;border-color:#2d3c52}.dark-mode .btn-dim.btn-success{color:#1ee0ac;background-color:#194344;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-success:not(:disabled):not(.disabled):hover{color:#4ae7bd;background-color:#235d5e;border-color:#235d5e}.dark-mode .btn-dim.btn-warning{color:#f4bd0e;background-color:#403d27;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-warning:not(:disabled):not(.disabled):hover{color:#f6ca3f;background-color:#565235;border-color:#565235}.dark-mode .btn-dim.btn-info{color:#09c2de;background-color:#153e4d;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-info:not(:disabled):not(.disabled):hover{color:#24daf6;background-color:#1d5569;border-color:#1d5569}.dark-mode .btn-dim.btn-danger{color:#e85347;background-color:#3d2a32;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-danger:not(:disabled):not(.disabled):hover{color:#ee7d74;background-color:#523943;border-color:#523943}.dark-mode .btn-dim.btn-gray{color:#b7c2d0;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-gray:not(:disabled):not(.disabled):hover{color:#d6dce4;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-dark{color:#e5e9f2;background-color:#353e4a;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#444f5f;border-color:#444f5f}.dark-mode .btn-dim.btn-light,.dark-mode .dual-listbox .btn-dim.dual-listbox__button,.dual-listbox .dark-mode .btn-dim.dual-listbox__button{color:#ebeef2;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-light:not(:disabled):not(.disabled):hover,.dark-mode .dual-listbox .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover,.dual-listbox .dark-mode .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover{color:#fff;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-lighter{color:#b7c2d0;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-lighter:not(:disabled):not(.disabled):hover{color:#d6dce4;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-outline-primary{color:#0fac81;background-color:#163a3c;border-color:#15524a}.dark-mode .btn-dim.btn-outline-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.dark-mode .btn-white.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#0fac81;background:#163a3c}.dark-mode .btn-dim.btn-outline-success{color:#1ee0ac;background-color:#194344;border-color:#1a6459}.dark-mode .btn-dim.btn-outline-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.dark-mode .btn-white.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1ee0ac;background:#194344}.dark-mode .btn-dim.btn-outline-warning{color:#f4bd0e;background-color:#403d27;border-color:#655822}.dark-mode .btn-dim.btn-outline-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.dark-mode .btn-white.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#f4bd0e;background:#403d27}.dark-mode .btn-dim.btn-outline-info{color:#09c2de;background-color:#153e4d;border-color:#13596b}.dark-mode .btn-dim.btn-outline-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.dark-mode .btn-white.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#09c2de;background:#153e4d}.dark-mode .btn-dim.btn-outline-danger{color:#e85347;background-color:#3d2a32;border-color:#613336}.dark-mode .btn-dim.btn-outline-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.dark-mode .btn-white.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e85347;background:#3d2a32}.dark-mode .btn-dim.btn-outline-secondary{color:#6b89ae;background-color:#202b3b;border-color:#2d3e53}.dark-mode .btn-dim.btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#6b89ae;border-color:#6b89ae}.dark-mode .btn-white.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#6b89ae;background:#202b3b}.dark-mode .btn-dim.btn-outline-gray{color:#b7c2d0;background-color:#2b3543;border-color:#3c4858}.dark-mode .btn-dim.btn-outline-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#b7c2d0;border-color:#b7c2d0}.dark-mode .btn-white.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#b7c2d0;background:#2b3543}.dark-mode .btn-dim.btn-outline-dark{color:#e5e9f2;background-color:#353e4a;border-color:#505966}.dark-mode .btn-dim.btn-outline-dark:not(:disabled):not(.disabled):hover{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-white.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e5e9f2;background:#353e4a}.dark-mode .btn-dim.btn-outline-light,.dark-mode .dt-buttons .btn-dim.btn-secondary,.dt-buttons .dark-mode .btn-dim.btn-secondary{color:#8091a7;background-color:#1e2937;border-color:#3c4858}.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.dark-mode .btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#8091a7;background:#1e2937}.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .btn-white.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):hover,.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):active,.dark-mode .btn-white.btn-outline-light:not(:disabled):not(.disabled):active,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):active,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):active,.dark-mode .show>.btn-white.btn-outline-light.dropdown-toggle,.dark-mode .dt-buttons .show>.dropdown-toggle.btn-secondary,.dt-buttons .dark-mode .show>.dropdown-toggle.btn-secondary{background:#3c4d62;border-color:#3c4d62;color:#fff}.dark-mode .btn-white,.dark-mode .dt-buttons .btn-secondary,.dt-buttons .dark-mode .btn-secondary,.dark-mode .btn-white.btn-dim,.dark-mode .btn-white.btn-outline-light{background:#18212d}.dark-mode .btn-outline-light:focus,.dark-mode .dt-buttons .btn-secondary:focus,.dt-buttons .dark-mode .btn-secondary:focus,.dark-mode .btn-outline-light.focus,.dark-mode .dt-buttons .focus.btn-secondary,.dt-buttons .dark-mode .focus.btn-secondary{box-shadow:0 0 0 .2rem rgba(255,255,255,.07) !important}.dark-mode .border,.dark-mode .border-bottom,.dark-mode .border-top,.dark-mode .border-left,.dark-mode .border-right,.dark-mode .dropdown-inner+.dropdown-inner,.dark-mode .dropdown-head,.dark-mode .dropdown-foot,.dark-mode .preview-hr,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .ql-picker-options,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .select2-container--default .select2-search--dropdown .select2-search__field,.dark-mode .ui-timepicker-standard,.dark-mode .ql-toolbar,.dark-mode .ql-container,.dark-mode .note-editor,.dark-mode .note-toolbar,.dark-mode .tox .tox-menubar,.dark-mode .tox-toolbar-overlord,.dark-mode .tox-tinymce,.dark-mode .tox .tox-toolbar__group:not(:last-of-type),.dark-mode .tox .tox-statusbar,.dark-mode .tox .tox-menu,.dark-mode .tox-toolbar,.dark-mode .tox-editor-header,.dark-mode .tox .tox-toolbar,.dark-mode .tox .tox-toolbar__primary,.dark-mode .tox .tox-toolbar__overflow,.dark-mode .tox .tox-collection--list .tox-collection__group,.dark-mode .note-btn-group .note-btn,.dark-mode .note-statusbar,.dark-mode .nk-code-preview-box,.dark-mode .swal2-footer,.dark-mode .example-border-all>div,.dark-mode .btn-toolbar-sep,.dark-mode .page-link,.dark-mode .table th,.dark-mode .table td,.dark-mode .table-bordered,.dark-mode .table-bordered th,.dark-mode .table-bordered td,.dark-mode .datatable-wrap,.dark-mode .nk-tb-head .nk-tb-col,.dark-mode .list-group-item,.dark-mode .modal-header,.dark-mode .modal-footer,.dark-mode .popover,.dark-mode .popover-header,.dark-mode .tagify__tag>div::before,.dark-mode .tagify__tag:hover:not([readonly]) div::before,.dark-mode .nk-tb-item:not(:last-child) .nk-tb-col,.dark-mode .nk-activity-item:not(:last-child),.dark-mode .nk-support-item:not(:last-child),.dark-mode .card-inner-group .card-inner:not(:last-child),.dark-mode .card-aside,.dark-mode .nav-tabs,.dark-mode .divider,.dark-mode .data-item:not(:last-child),.dark-mode .nk-footer,.dark-mode .nav-switch-s2 .nav-link,.dark-mode .user-avatar-multiple .user-avatar{border-color:#23364e !important}.dark-mode .select2-search--dropdown .select2-search__field{color:#b6c6e3}.dark-mode .card,.dark-mode .code-block,.dark-mode .alert-pro,.dark-mode .modal-content,.dark-mode .toast,.dark-mode .toastr{box-shadow:0px 1px 3px 0px rgba(0,0,0,.4)}.dark-mode .toast-header{color:#8094ae}.dark-mode .toast,.dark-mode .toast-header{border-color:#263b55;background:#1b2633}.dark-mode .table-active,.dark-mode .table-active>th,.dark-mode .table-active>td,.dark-mode .table-hover tbody tr:hover,.dark-mode .code-block .prettyprint,.dark-mode .prettyprint,.dark-mode .list-group-item,.dark-mode .example-spacing-pd>div>span,.dark-mode .form-file-label::after,.dark-mode .ql-picker-options,.dark-mode .data-more:before,.dark-mode .ui-state-hover,.dark-mode .note-editor.note-frame .note-statusbar,.dark-mode .note-editor.note-airframe .note-statusbar,.dark-mode .swal2-popup,.dark-mode .select2-container--default .select2-results__option--highlighted[aria-selected],.dark-mode .select2-container--default .select2-results__option[aria-selected=true],.dark-mode .select2-container--default .select2-selection--multiple .select2-selection__choice,.dark-mode .select2-container--default .select2-search--dropdown .select2-search__field,.dark-mode .example-width>div,.dark-mode .example-height>div,.dark-mode .example-border>div,.dark-mode .example-spacing>div{background:#101924}.dark-mode .tox .tox-tbtn:hover,.dark-mode .tox .tox-collection--list .tox-collection__item--active,.dark-mode .tox .tox-mbtn--active,.dark-mode .tox .tox-mbtn:focus:not(:disabled),.dark-mode .tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active),.dark-mode .tox .tox-collection--list .tox-collection__item--enabled{background:#0a0f16}.dark-mode .list-group-item{color:#b6c6e3}.dark-mode .icon-overlap li{border-color:#18212d}.dark-mode .card,.dark-mode .kanban-add-task,.dark-mode .kanban-board-header,.dark-mode .kanban-item{background:#18212d;border-color:#212d3d}.dark-mode .accordion,.dark-mode .form-clip,.dark-mode .form-text-hint,.dark-mode .card-aside,.dark-mode .code-block,.dark-mode .alert-pro,.dark-mode .modal-content,.dark-mode .toastr,.dark-mode .toggle-content,.dark-mode .nav-switch-s2 .nav-link:hover,.dark-mode .nav-switch-s2 .nav-link:focus,.dark-mode .nav-switch-s2 .nav-link.active,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .form-file-label,.dark-mode .form-select,.dark-mode .popover,.dark-mode .search-wrap,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .form-label-outlined,.dark-mode .input-mail,.dark-mode .page-link,.dark-mode .ui-timepicker-standard,.dark-mode .note-editor,.dark-mode .note-toolbar,.dark-mode .tox .tox-edit-area__iframe,.dark-mode .tox .tox-menubar,.dark-mode .tox-toolbar-overlord,.dark-mode .tox .tox-toolbar,.dark-mode .tox .tox-toolbar__primary,.dark-mode .tox .tox-toolbar__overflow,.dark-mode .tox .tox-statusbar,.dark-mode .tox .tox-menu,.dark-mode .datepicker table tr td.today,.dark-mode .datepicker table tr td.today:hover,.dark-mode .datepicker table tr td.today.disabled,.dark-mode .datepicker table tr td.today.disabled:hover,.dark-mode .datepicker table tr td.day:hover,.dark-mode .datepicker table tr td.day.focused,.dark-mode .datepicker .datepicker-switch:hover,.dark-mode .datepicker .prev:hover,.dark-mode .datepicker .next:hover,.dark-mode .datepicker tfoot tr th:hover{background:#18212d !important}.dark-mode .accordion-item{background:#18212d !important;border-color:#23364e !important}.dark-mode .clipboard-success-message{background:rgba(24,33,45,.9)}.dark-mode .tagify__tag>div::before,.dark-mode .tagify__tag:hover:not([readonly]) div::before{box-shadow:0 0 0 1.1em #101924 inset}.dark-mode .popover-header{background-color:#1d2937}.dark-mode .popover{box-shadow:0 0 20px -5px rgba(0,0,0,.6)}.dark-mode .bs-popover-top>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{border-top-color:#23364e !important}.dark-mode .bs-popover-top>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-top-color:#18212d !important}.dark-mode .bs-popover-bottom>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{border-bottom-color:#23364e !important}.dark-mode .bs-popover-bottom>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-bottom-color:#18212d !important}.dark-mode .bs-popover-end>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{border-right-color:#23364e !important}.dark-mode .bs-popover-end>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-right-color:#18212d !important}.dark-mode .bs-popover-start>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{border-left-color:#23364e !important}.dark-mode .bs-popover-start>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-left-color:#18212d !important}.dark-mode .team-info li span:last-child,.dark-mode .team-statistics li span:first-child,.dark-mode .project-progress-percent,.dark-mode .kanban-title-content .title,.dark-mode .card-tools-nav li a:hover,.dark-mode .card-tools-nav li a.active,.dark-mode .card-tools-nav li.active a,.dark-mode .card-amount .amount,.dark-mode .accordion-head .title,.dark-mode .form-file-label::after,.dark-mode .input-mail,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .form-control:focus,.dark-mode .form-label,.dark-mode .form-label-outlined,.dark-mode .input-group-text,.dark-mode .table .table-light th,.dark-mode .table-hover tbody tr:hover,.dark-mode .close,.dark-mode .close:hover,.dark-mode .user-name,.dark-mode .nk-news-text p,.dark-mode .data-item:hover .icon,.dark-mode .accordion-icon{color:#fff !important}.dark-mode .close{text-shadow:0 1px 0 #18212d}.dark-mode .close:focus{outline:none !important}.dark-mode .is-theme .nk-menu-icon,.dark-mode .nk-block-des,.dark-mode .card-title p,.dark-mode .nk-sale-data .sub-title,.dark-mode .link-check li span,.dark-mode .data-value,.dark-mode .form-file-label,.dark-mode .form-select,.dark-mode .form-control-select-multiple .form-select option,.dark-mode .select2-container--default .select2-selection--single .select2-selection__rendered,.dark-mode .select2-container--default .select2-selection--multiple .select2-selection__rendered,.dark-mode .ui-timepicker-standard a,.dark-mode .note-placeholder,.dark-mode [class*=knob],.dark-mode .tox .tox-tbtn:hover,.dark-mode .tox .tox-statusbar a,.dark-mode .tox .tox-statusbar__path-item,.dark-mode .tox .tox-statusbar__wordcount,.dark-mode .tox-collection__item-label>*,.dark-mode .nk-quick-nav-icon,.dark-mode .dropzone .dz-message span,.dark-mode .datepicker table tr td.today,.dark-mode .datepicker table tr td.today:hover,.dark-mode .datepicker table tr td.today.disabled,.dark-mode .datepicker table tr td.today.disabled:hover,.dark-mode .datepicker table tr td.day:hover,.dark-mode .datepicker table tr td.day.focused,.dark-mode .page-link,.dark-mode .alert-pro,.dark-mode .nk-news-text p span,.dark-mode .language-item,.dark-mode .nk-tb-list .tb-lead-sub,.dark-mode .nk-tb-list .tb-amount-sub{color:#8094ae !important}.dark-mode .tox .tox-collection__item-accessory{color:#526484}.dark-mode .nk-menu-link,.dark-mode .link-dark,.dark-mode .nk-menu-main .nk-menu-sub .nk-menu-link,.dark-mode .link-list a{color:#8094ae}.dark-mode .nk-menu-link:hover,.dark-mode .link-dark:hover,.dark-mode .nk-menu-main .nk-menu-sub .nk-menu-link:hover,.dark-mode .link-list a:hover{color:#0fac81}.dark-mode .nk-menu-badge{color:#dbdfea;background:#2d3f55}.dark-mode .is-dark .nk-menu-badge{color:#cfeee6}.dark-mode .is-dark .nk-menu-badge{color:#6fcdb3}.dark-mode .ql-picker.ql-expanded .ql-picker-label,.dark-mode .active>.nk-menu-link,.dark-mode .is-theme .nk-menu-link:hover .nk-menu-icon,.dark-mode .is-theme .nk-menu-item.active>.nk-menu-link .nk-menu-icon,.dark-mode .is-theme .nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon,.dark-mode .is-theme .nk-menu-sub .nk-menu-link:hover,.dark-mode .is-theme .nk-menu-sub .active>.nk-menu-link,.dark-mode .page-link:hover{color:#0fac81 !important}.dark-mode .nk-menu-hr,.dark-mode .nk-menu-main .nk-menu-sub,.dark-mode .nk-sidebar .nk-menu>li .nk-menu-sub .nk-menu-sub,.dark-mode .user-avatar-group .user-avatar{border-color:#23364e}.dark-mode .table .table-light th,.dark-mode .page-item.disabled .page-link,.dark-mode .page-link:hover,.dark-mode .tb-odr-head,.dark-mode .tb-tnx-head,.dark-mode .custom-control-input[disabled]~.custom-control-label::before,.dark-mode .custom-control-input:disabled~.custom-control-label::before{background-color:#2b3c51 !important}.dark-mode .progress,.dark-mode .data-head,.dark-mode .custom-control-label::before,.dark-mode .input-group-text,.dark-mode .nk-msg-profile-toggle{background-color:#243244 !important}.dark-mode .nk-msg-profile-toggle,.dark-mode .custom-control-label::before,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .input-mail,.dark-mode .form-file-label,.dark-mode .input-group-text,.dark-mode .form-select,.dark-mode .swal2-input,.dark-mode .swal2-file,.dark-mode .swal2-textarea,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .note-popover .popover-content .dropdown-style>li[aria-label=pre],.dark-mode .note-editor .note-toolbar .dropdown-style>li[aria-label=pre],.dark-mode .link-bdr-t,.link-tidy .dark-mode li+li,.link-list-opt .dark-mode li+li,.link-list-plain .dark-mode li+li,.dark-mode .link-check+.link-check,.dark-mode .link-tidy li+li,.dark-mode .link-list+.link-list,.dark-mode .link-list-opt li+li,.dark-mode .link-list-plain li,.dark-mode .link-list-plain li+li{border-color:#3b526f !important}.dark-mode .custom-switch .custom-control-label::after{background-color:#869fbe !important}.dark-mode .custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff !important}.dark-mode .custom-control-input:checked~.custom-control-label::before{background-color:#0fac81 !important;border-color:#0fac81 !important}.dark-mode .btn-trigger:before,.dark-mode .btn-trigger.active:hover:before,.dark-mode .nk-quick-nav-icon:before{background-color:#070a0f}.dark-mode .dropdown-menu{background-color:#1b2633;border-color:#2a3a4e;box-shadow:0 3px 20px 1px rgba(0,0,0,.4)}.dark-mode .dropdown-menu-s1{border-top-color:#0fac81}.dark-mode .link-list-plain a,.dark-mode .link-list-opt a,.dark-mode .link-check li a{color:#b6c6e3}.dark-mode .link-list-plain a:hover,.dark-mode .link-list-opt a:hover,.dark-mode .link-check li a:hover{background:#2d3f55}.dark-mode .border-transparent{border-color:rgba(0,0,0,0) !important}.dark-mode .note-editor .btn,.dark-mode .note-editor .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .note-editor .dual-listbox__button,.dark-mode .ql-picker,.dark-mode .tox .tox-tbtn__select-label,.dark-mode .tox .tox-mbtn__select-label,.dark-mode .lead-text span,.dark-mode .data-list-s2 .data-label,.dark-mode .btn-trigger,.dark-mode .dropdown .btn.btn-icon:not(.btn-light),.dark-mode .dropdown .dual-listbox .btn-icon.dual-listbox__button:not(.btn-light),.dual-listbox .dark-mode .dropdown .btn-icon.dual-listbox__button:not(.btn-light),.dark-mode .dropdown .dt-buttons .btn.btn-secondary:not(.btn-light),.dt-buttons .dark-mode .dropdown .btn.btn-secondary:not(.btn-light),.dark-mode .dropdown .dual-listbox .dt-buttons .dual-listbox__button.btn-secondary:not(.btn-light),.dual-listbox .dt-buttons .dark-mode .dropdown .dual-listbox__button.btn-secondary:not(.btn-light),.dark-mode .dropdown .dt-buttons .dual-listbox .dual-listbox__button.btn-secondary:not(.btn-light),.dt-buttons .dual-listbox .dark-mode .dropdown .dual-listbox__button.btn-secondary:not(.btn-light),.dark-mode .list-step li.list-step-done{color:#8094ae}.dark-mode .ql-fill,.dark-mode .ql-stroke.ql-fill,.dark-mode .tox .tox-tbtn svg{fill:#8094ae}.dark-mode .ql-stroke{stroke:#8094ae}.dark-mode .swal2-validation-message{background:#23364e}.dark-mode .team-info li span:first-child,.dark-mode .team-statistics li span:last-child,.dark-mode .project-progress-task,.dark-mode .table,.dark-mode .nk-tb-list,.dark-mode .nk-tb-list .tb-amount span,.dark-mode .nk-tb-list .tb-amount .currency,.dark-mode .tb-tnx-item .tb-tnx-total,.dark-mode .tb-odr-item .tb-odr-total,.dark-mode .user-balance-sub span,.dark-mode .dropdown-menu,.dark-mode .pln,.dark-mode .overline-title,.dark-mode .nk-block-des strong,.dark-mode .data-item:hover .data-value,.dark-mode .data-item:hover .data-label,.dark-mode .nk-notification-text,.dark-mode .profile-ud-value,.dark-mode .bq-note-meta span>span,.dark-mode .tagify__tag>div,.dark-mode .popover-body,.dark-mode .input-mail::placeholder,.dark-mode .list-apps-title{color:#b6c6e3}.dark-mode .tb-tnx-item{border-color:#23364e !important}.dark-mode .nk-notification-text span,.dark-mode .is-unread .chat-context .text{color:#dfe9fe}.dark-mode .nav-tabs .nav-link{color:#b6c6e3}.dark-mode .nav-tabs .nav-link.active{color:#0fac81}.dark-mode .nav-tabs .nav-link:hover{color:#fff}.dark-mode .link-list-menu a,.dark-mode .list-plain a{color:#8094ae}.dark-mode .link-list-menu a:hover,.dark-mode .link-list-menu a.active,.dark-mode .list-plain a:hover,.dark-mode .list-plain a.active{color:#0fac81}.dark-mode .nav-switch .nav-link.active,.dark-mode .list-apps a:hover .list-apps-title{color:#fff}.dark-mode .nk-tb-item:not(.nk-tb-head):hover,.dark-mode .nk-tb-item:not(.nk-tb-head).seleted{box-shadow:0 2px 15px -4px rgba(0,0,0,.7)}.dark-mode .nk-tb-item:hover .nk-tb-action-hidden,.dark-mode .bq-note-text,.dark-mode .nk-tb-item:not(.nk-tb-head):hover,.dark-mode .nk-tb-item:not(.nk-tb-head).seleted{background:#141c26}.dark-mode .nk-apps-sidebar .dropdown-menu .lead-text,.dark-mode .list-step li.list-step-current,.dark-mode .nk-tb-list .tb-lead,.dark-mode .nk-tb-list .tb-amount,.dark-mode .nk-support-content .title,.dark-mode .nk-sale-data .amount{color:#fff}.dark-mode .nk-support-content .time,.dark-mode .page-item.disabled .page-link,.dark-mode .card-hint,.dark-mode .list-step li{color:#526484}.dark-mode .nk-order-ovwg-data .title .icon,.dark-mode .timeline-item:not(:last-child):before,.dark-mode .timeline-status.is-outline:after{background-color:#2a3a4e}.dark-mode .nk-footer{background-color:#101924}.dark-mode .nk-order-ovwg-data .info strong,.dark-mode .user-activity .amount,.dark-mode .invest-data-history .amount,.dark-mode .analytic-data .amount,.dark-mode .traffic-channel-data .amount,.dark-mode .analytics-map-data .amount,.dark-mode .device-status-data .amount,.dark-mode .invest-ov .amount,.dark-mode .profile-balance-amount .number{color:#fff}.dark-mode .invest-ov:not(:last-child){border-color:#3b526f}.dark-mode .nk-header .dropdown-menu .lead-text,.dark-mode .nk-sidebar-bar .dropdown-menu .lead-text{color:#fff}.dark-mode .nk-header-fixed{background:#101924}.dark-mode .nk-sidebar-bar.is-theme,.dark-mode .nk-sidebar-bar,.dark-mode .nk-menu-hr,.dark-mode .nk-sidebar-main,.dark-mode .nk-header-fixed{border-color:#203247}.dark-mode .nk-sidebar-bar.is-theme,.dark-mode .nk-sidebar-bar{background:#101924}.dark-mode .nk-sidebar-bar.is-dark+.is-dark,.dark-mode .nk-sidebar-main.is-theme,.dark-mode .nk-sidebar-main{background:#121b28}.dark-mode .apps-menu .active>.nk-menu-link{background-color:#0b1219}.dark-mode .nk-chat-aside-user .title,.dark-mode .nk-file-name,.dark-mode .nk-file-name-text a.title,.dark-mode .is-unread .nk-ibx-context-text .heading,.dark-mode .chat-profile-settings .custom-control-sm .custom-control-label,.dark-mode .attach-info,.dark-mode .profile-stats .amount,.dark-mode .is-unread .chat-from .name{color:#fff}.dark-mode .chat-upload-option{background-color:#18212d}.dark-mode .nk-fmg-menu-item .icon,.dark-mode .nk-ibx-menu-item .icon{color:#8094ae}.dark-mode .nk-fmg-menu-text,.dark-mode .nk-ibx-label-text,.dark-mode .nk-ibx-menu-text,.dark-mode .attach-item a,.dark-mode .user-contacts li,.dark-mode .nk-ibx-context-text .heading,.dark-mode .chat-option-link:hover .lead-text,.dark-mode .chat-from .name,.dark-mode .user-plan-title{color:#b6c6e3}.dark-mode .nk-file-name-text a.title:hover,.dark-mode .active>.nk-fmg-menu-item .icon,.dark-mode .active .nk-ibx-menu-text,.dark-mode .active .nk-ibx-menu-item .icon{color:#0fac81}.dark-mode .nk-chat,.dark-mode .nk-chat-aside,.dark-mode .nk-chat-profile,.dark-mode .nk-chat-head,.dark-mode .chat-profile-group,.dark-mode .nk-fmg,.dark-mode .nk-fmg-aside,.dark-mode .nk-fmg-body-head,.dark-mode .nk-fmg-switch,.dark-mode .nk-files-view-grid .nk-file,.dark-mode .nk-files-view-group .nk-file,.dark-mode .nk-ibx,.dark-mode .nk-ibx-aside,.dark-mode .nk-ibx-head,.dark-mode .nk-ibx-item,.dark-mode .nk-reply-form,.dark-mode .nk-reply-form-header,.dark-mode .nk-reply-form-tools,.dark-mode .nk-reply-form-field:not(:last-child),.dark-mode .nk-msg,.dark-mode .nk-msg-head,.dark-mode .nk-msg-profile,.dark-mode .attach-files,.dark-mode .attach-foot,.dark-mode .nk-msg-item:not(:last-child),.dark-mode .nk-msg-aside,.dark-mode .nk-msg-nav,.dark-mode .nk-msg-nav .search-wrap,.dark-mode .nk-msg-body,.dark-mode .nk-fmg-body,.dark-mode .nk-chat-body,.dark-mode .nk-ibx-body,.dark-mode .nk-files-group>.title,.dark-mode .nk-file-share-header,.dark-mode .nk-files-view-list .nk-file>div{border-color:#23364e !important}.dark-mode .nk-block-subhead,.dark-mode .data-list-s2 .data-head,.dark-mode .nk-profile-toggle,.dark-mode .nk-profile-content,.dark-mode .user-account-links{border-color:#2b3748}.dark-mode .nk-upload-item,.dark-mode .dropzone{border-color:#354358 !important}.dark-mode .data-list-s2 .data-head,.dark-mode .nk-header-search .form-control,.dark-mode .nk-header-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-header-search input,.dark-mode .nk-header-search .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-header-search .dual-listbox__search{background:rgba(0,0,0,0) !important}.dark-mode .chat-sap-meta:before,.dark-mode .chat-sap-meta:after,.dark-mode .nk-profile-content,.dark-mode .active>.nk-fmg-menu-item,.dark-mode .nk-fmg-menu-item:hover,.dark-mode .nk-ibx-status,.dark-mode .nk-ibx-reply-item:not(:last-child):after,.dark-mode .nk-reply-meta-info:before,.dark-mode .nk-reply-meta-info:after{background:#23364e}.dark-mode .nk-chat-aside,.dark-mode .nk-chat-profile,.dark-mode .nk-chat-head,.dark-mode .chat-msg,.dark-mode .nk-chat-editor,.dark-mode .nk-chat-blank,.dark-mode .nk-chat-editor .form-control,.dark-mode .nk-chat-editor div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-chat-editor input,.dark-mode .nk-chat-editor .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-chat-editor .dual-listbox__search,.dark-mode .nk-fmg-aside,.dark-mode .nk-fmg-body,.dark-mode .nk-fmg-body .form-control,.dark-mode .nk-fmg-body div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-fmg-body input,.dark-mode .nk-fmg-body .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-fmg-body .dual-listbox__search,.dark-mode .nk-fmg-body-head,.dark-mode .nk-files-view-grid .nk-file,.dark-mode .nk-files-view-group .nk-file,.dark-mode .nk-ibx-aside,.dark-mode .nk-ibx-item,.dark-mode .nk-ibx-view,.dark-mode .nk-msg-head,.dark-mode .nk-msg-profile,.dark-mode .nk-fmg-switch{background:#18212d}.dark-mode .nk-ibx-status .progress{background:#18212d !important}.dark-mode .nk-chat-panel,.dark-mode .chat-item:hover,.dark-mode .chat-item.current,.dark-mode .chat-item:hover .chat-actions,.dark-mode .chat-members .user-card:hover,.dark-mode .chat-members .user-actions,.dark-mode .nk-profile-content,.dark-mode .nk-msg-item.active,.dark-mode .nk-msg-item.current,.dark-mode .channel-list a:hover,.dark-mode .channel-list a.active{background:#0d141d !important}.dark-mode .fav-list .user-avatar:after{background:#445f80}.dark-mode .nk-files-view-list .nk-file.selected>div{background:rgba(0,0,0,0)}.dark-mode .nk-files-view-list .nk-file.selected{background:#23364e}.dark-mode .nk-ibx-item:not(.no-hover):hover,.dark-mode .nk-ibx-item.active,.dark-mode .nk-ibx-item:hover .ibx-actions-hidden,.dark-mode .nk-ibx-item:hover .ibx-actions,.dark-mode .nk-ibx-label>li:hover,.dark-mode .nk-ibx-contact>li:hover,.dark-mode .nk-ibx-menu li.active,.dark-mode .nk-ibx-menu li:hover,.dark-mode .dot-label:after,.dark-mode .attach-foot,.dark-mode .nk-reply-from,.dark-mode .nk-reply-entry.note,.dark-mode .nk-msg-aside,.dark-mode .nk-msg-nav,.dark-mode .nk-files-view-list .nk-file>div{background:#101924}.dark-mode .is-unread .nk-ibx-context-text,.dark-mode .nk-upload-info{color:#dfe9fe}.dark-mode .nk-reply-msg-excerpt,.dark-mode .nk-ibx-context-text,.dark-mode .user-contacts li .icon,.dark-mode .nk-reply-tools .date{color:#8094ae}.dark-mode .is-unread .nk-msg-sender .name{color:#fff}.dark-mode .nk-reply-meta-info,.dark-mode .nk-reply-from{color:#7a8faa}.dark-mode .nk-reply-meta-info span,.dark-mode .nk-reply-meta-info strong,.dark-mode .nk-reply-meta-info .who,.dark-mode .channel-list a{color:#b6c6e3}.dark-mode .nk-reply-meta-info .whom{color:#0fac81}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button{color:#b6c6e3;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:disabled,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:disabled,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:disabled{color:#b6c6e3;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:hover,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:hover,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:hover,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{color:#fff;background:#101924;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(35,54,78,.5)}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn.active,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .active.dual-listbox__button,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .active.dual-listbox__button{color:#0fac81;border-color:#23364e;background:#101924;box-shadow:inset 0 0 4px -1px rgba(35,54,78,.25)}.dark-mode .fc-day{color:#b6c6e3}.dark-mode .fc-day-other{color:#8094ae}.dark-mode .fc-list-day,.dark-mode .fc-col-header-cell{color:#fff}.dark-mode .fc .fc-list-empty{background:#101924}.dark-mode .fc-timegrid-event-harness-inset .fc-timegrid-event,.dark-mode .fc-timegrid-event.fc-event-mirror{box-shadow:0px 0px 0px 1px #101924}.dark-mode a.fc-event-primary-dim{background-color:#17363a !important;border-color:#17363a !important}.dark-mode .modal-header.fc-event-primary-dim{background-color:#17363a !important;border-color:#102528 !important}.dark-mode span.fc-event-primary-dim .dot{background-color:#17363a !important}.dark-mode .fc-event-primary-dim:not(a) .fc-list-event-dot{background-color:#17363a !important}.dark-mode a.fc-event-success-dim{background-color:#193e40 !important;border-color:#193e40 !important}.dark-mode .modal-header.fc-event-success-dim{background-color:#193e40 !important;border-color:#122c2e !important}.dark-mode span.fc-event-success-dim .dot{background-color:#193e40 !important}.dark-mode .fc-event-success-dim:not(a) .fc-list-event-dot{background-color:#193e40 !important}.dark-mode a.fc-event-info-dim{background-color:#163948 !important;border-color:#163948 !important}.dark-mode .modal-header.fc-event-info-dim{background-color:#163948 !important;border-color:#102a34 !important}.dark-mode span.fc-event-info-dim .dot{background-color:#163948 !important}.dark-mode .fc-event-info-dim:not(a) .fc-list-event-dot{background-color:#163948 !important}.dark-mode a.fc-event-warning-dim{background-color:#393828 !important;border-color:#393828 !important}.dark-mode .modal-header.fc-event-warning-dim{background-color:#393828 !important;border-color:#2a291d !important}.dark-mode span.fc-event-warning-dim .dot{background-color:#393828 !important}.dark-mode .fc-event-warning-dim:not(a) .fc-list-event-dot{background-color:#393828 !important}.dark-mode a.fc-event-danger-dim{background-color:#372931 !important;border-color:#372931 !important}.dark-mode .modal-header.fc-event-danger-dim{background-color:#372931 !important;border-color:#281e24 !important}.dark-mode span.fc-event-danger-dim .dot{background-color:#372931 !important}.dark-mode .fc-event-danger-dim:not(a) .fc-list-event-dot{background-color:#372931 !important}.dark-mode a.fc-event-secondary-dim{background-color:#1e2938 !important;border-color:#1e2938 !important}.dark-mode .modal-header.fc-event-secondary-dim{background-color:#1e2938 !important;border-color:#151d27 !important}.dark-mode span.fc-event-secondary-dim .dot{background-color:#1e2938 !important}.dark-mode .fc-event-secondary-dim:not(a) .fc-list-event-dot{background-color:#1e2938 !important}.dark-mode a.fc-event-dark-dim{background-color:#19232f !important;border-color:#19232f !important}.dark-mode .modal-header.fc-event-dark-dim{background-color:#19232f !important;border-color:#10171e !important}.dark-mode span.fc-event-dark-dim .dot{background-color:#19232f !important}.dark-mode .fc-event-dark-dim:not(a) .fc-list-event-dot{background-color:#19232f !important}.dark-mode a.fc-event-blue-dim{background-color:#21334c !important;border-color:#21334c !important}.dark-mode .modal-header.fc-event-blue-dim{background-color:#21334c !important;border-color:#19273a !important}.dark-mode span.fc-event-blue-dim .dot{background-color:#21334c !important}.dark-mode .fc-event-blue-dim:not(a) .fc-list-event-dot{background-color:#21334c !important}.dark-mode a.fc-event-azure-dim{background-color:#182e4c !important;border-color:#182e4c !important}.dark-mode .modal-header.fc-event-azure-dim{background-color:#182e4c !important;border-color:#122239 !important}.dark-mode span.fc-event-azure-dim .dot{background-color:#182e4c !important}.dark-mode .fc-event-azure-dim:not(a) .fc-list-event-dot{background-color:#182e4c !important}.dark-mode a.fc-event-indigo-dim{background-color:#1d2742 !important;border-color:#1d2742 !important}.dark-mode .modal-header.fc-event-indigo-dim{background-color:#1d2742 !important;border-color:#151d30 !important}.dark-mode span.fc-event-indigo-dim .dot{background-color:#1d2742 !important}.dark-mode .fc-event-indigo-dim:not(a) .fc-list-event-dot{background-color:#1d2742 !important}.dark-mode a.fc-event-purple-dim{background-color:#282c4d !important;border-color:#282c4d !important}.dark-mode .modal-header.fc-event-purple-dim{background-color:#282c4d !important;border-color:#1f223c !important}.dark-mode span.fc-event-purple-dim .dot{background-color:#282c4d !important}.dark-mode .fc-event-purple-dim:not(a) .fc-list-event-dot{background-color:#282c4d !important}.dark-mode a.fc-event-pink-dim{background-color:#3b2b3f !important;border-color:#3b2b3f !important}.dark-mode .modal-header.fc-event-pink-dim{background-color:#3b2b3f !important;border-color:#2d2130 !important}.dark-mode span.fc-event-pink-dim .dot{background-color:#3b2b3f !important}.dark-mode .fc-event-pink-dim:not(a) .fc-list-event-dot{background-color:#3b2b3f !important}.dark-mode a.fc-event-orange-dim{background-color:#3b3533 !important;border-color:#3b3533 !important}.dark-mode .modal-header.fc-event-orange-dim{background-color:#3b3533 !important;border-color:#2d2927 !important}.dark-mode span.fc-event-orange-dim .dot{background-color:#3b3533 !important}.dark-mode .fc-event-orange-dim:not(a) .fc-list-event-dot{background-color:#3b3533 !important}.dark-mode a.fc-event-teal-dim{background-color:#193a3d !important;border-color:#193a3d !important}.dark-mode .modal-header.fc-event-teal-dim{background-color:#193a3d !important;border-color:#12292b !important}.dark-mode span.fc-event-teal-dim .dot{background-color:#193a3d !important}.dark-mode .fc-event-teal-dim:not(a) .fc-list-event-dot{background-color:#193a3d !important}.dark-mode .code-block,.dark-mode .card-preview,.dark-mode .card .card-inner+.table .tb-tnx-head,.dark-mode .card-bordered,.dark-mode .kanban-add-task,.dark-mode .kanban-board-header,.dark-mode .kanban-item,.dark-mode .kanban-board .kanban-drag:empty,.dark-mode .accordion-item:not(:last-child) .accordion-head,.dark-mode .accordion-item:not(:last-child) .accordion-inner,.dark-mode .accordion-item:last-child .accordion-inner,.dark-mode .nk-download{border-color:#23364e}.dark-mode .accordion:not(.accordion-s2):not(.accordion-s3){border-color:#23364e !important}.dark-mode .card.bg-light .card-header,.dark-mode .card.bg-lighter .card-header,.dark-mode .dual-listbox .card.dual-listbox__item:hover .card-header,.dual-listbox .dark-mode .card.dual-listbox__item:hover .card-header{background:rgba(0,0,0,.2)}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-top-color:#23364e;border-bottom-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-left-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-right-color:#23364e}.dark-mode .modal-footer.bg-light{background-color:#141c26 !important}.dark-mode .kanban-primary{border-top-color:#0fac81}.dark-mode .kanban-success{border-top-color:#1ee0ac}.dark-mode .kanban-info{border-top-color:#09c2de}.dark-mode .kanban-warning{border-top-color:#f4bd0e}.dark-mode .kanban-danger{border-top-color:#e85347}.dark-mode.ui-bordered .card,.dark-mode.ui-bordered .code-block,.dark-mode.ui-bordered .accordion:not(.accordion-s2):not(.accordion-s3),.dark-mode.ui-bordered .card .card-inner+.table .tb-tnx-head,.dark-mode.ui-bordered .card-bordered,.dark-mode.ui-bordered .nk-download{border-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-top-color:#23364e;border-bottom-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-left-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-right-color:#23364e}.dark-mode .nk-order-ovwg-data.buy{border-color:#1c9479}.dark-mode .nk-order-ovwg-data.sell{border-color:#13745f}.dark-mode .nk-sidebar-overlay{background:rgba(0,0,0,.6)}.dark-mode .toggle-overlay,.dark-mode .nk-chat-profile-overlay{background:rgba(7,10,15,.75)}.dark-mode .swal2-container.swal2-backdrop-show{background:rgba(0,0,0,.85)}.dark-mode .modal-backdrop{opacity:.9;background:rgba(0,0,0,.9)}.dark-mode .ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child,.dark-mode .ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-color:#23364e !important}.dark-mode .is-compact:not(:hover) .nk-menu-heading:not(:first-child):before{background-color:#23364e}.dark-mode .nk-add-product{background:#1f2b3a;box-shadow:-10px 15px 30px 5px rgba(0,0,0,.4)}.dark-mode .nk-download{background-color:#18212d}.dark-mode .nk-ecwg .amount,.dark-mode .nk-store-statistics .count,.dark-mode .nk-top-products .title,.dark-mode .nk-top-products .amount,.dark-mode .nk-tb-list .tb-product .title{color:#fff}.dark-mode .nk-ecwg8-legends .title,.dark-mode .nk-ecwg7-legends .title{color:#ecf2ff}.dark-mode .invoice-wrap{background-color:#18212d;border-color:#23364e}.dark-mode .invoice-bills .table tfoot{border-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col,.dark-mode .nk-tb-list.is-separate .nk-tb-item:hover .nk-tb-action-hidden{background-color:#18212d}.dark-mode .nk-tb-list .tb-product .title{color:#fff}.dark-mode .dual-listbox .dual-listbox__available,.dark-mode .dual-listbox .dual-listbox__selected{border-color:#3b526f}.dark-mode .dual-listbox .dual-listbox__title{border-left-color:#3b526f;border-right-color:#3b526f;border-top-color:#3b526f}.dark-mode .dual-listbox .dual-listbox__item{border-bottom-color:#3b526f}.dark-mode .input-group-addon{background-color:#1f2b3a;border-color:#3b526f}.dark-mode .border-light{border-color:#23364e !important}.dark-mode div.dt-button-info{background-color:#18212d}.dark-mode div.dt-button-info h2,.dark-mode div.dt-button-info .h2{background-color:#131a23}.dark-mode div.dt-button-info h2,.dark-mode div.dt-button-info .h2{border-color:#23364e}.dark-mode .dropzone{background:#101924}.dark-mode .image-control .custom-control-input:checked~.custom-control-label:before{border-color:#3b526f}.dark-mode .image-control .custom-control-label{background-color:#1f2b3a}.dark-mode .custom-control-pro .custom-control-label{background-color:#18212d;border-color:#3b526f}.dark-mode .custom-control.color-control .custom-control-label::before{background:rgba(0,0,0,0) !important}.dark-mode .slick-dots li button{background-color:#101924}.dark-mode .slick-dots li.slick-active button{background-color:#0fac81}.dark-mode .slick-next,.dark-mode .slick-prev{color:#fff;background:#18212d;border-color:#23364e}.dark-mode .slick-next:hover,.dark-mode .slick-prev:hover{color:#fff;background:#0fac81;border-color:#0fac81}.dark-mode .slick-disabled .slick-next,.dark-mode .slick-disabled .slick-prev{color:#dbdfea}.dark-mode .slick-disabled .slick-next:hover,.dark-mode .slick-disabled .slick-prev:hover{color:#dbdfea;background:#18212d;border-color:#23364e}.dark-mode .pricing-head{border-color:#23364e}.dark-mode .pricing-amount .amount{color:#fff}.dark-mode .product-title a{color:#fff}.dark-mode .product-gallery{border-color:#23364e}.dark-mode .product-gallery .slider-nav .slider-item .thumb{border-color:#23364e}.dark-mode .product-gallery .slider-nav .slider-item.slick-current .thumb{border-color:#0fac81}.dark-mode .invoice-wrap{background-color:#18212d;border-color:#23364e}.dark-mode .invoice-bills .table tfoot{border-color:#23364e}.dark-mode .nk-add-product{background:#101924;box-shadow:-10px 15px 30px 5px rgba(0,0,0,.4)}.dark-mode .noUi-target{background:#33465f}.dark-mode .noUi-handle:before,.dark-mode .noUi-handle:after{background:#688ebc}.dark-mode .noUi-handle{border-color:#688ebc;background:#080d12}.dark-mode .noUi-active{box-shadow:inset 0 0 1px #000,inset 0 1px 7px #000,0 3px 6px -3px #000}.dark-mode input:-webkit-autofill,.dark-mode input:-webkit-autofill:hover,.dark-mode input:-webkit-autofill:focus,.dark-mode textarea:-webkit-autofill,.dark-mode textarea:-webkit-autofill:hover,.dark-mode textarea:-webkit-autofill:focus,.dark-mode select:-webkit-autofill,.dark-mode select:-webkit-autofill:hover,.dark-mode select:-webkit-autofill:focus{-webkit-text-fill-color:#fff;transition:background-color 5000s ease-in-out 0s}@media(max-width: 576px){.dark-mode .nk-block-tools-toggle .toggle-expand-content{background-color:#243244}}.nk-sticky-toolbar{position:fixed;border:3px solid #fff;top:50%;background:#fff;z-index:600;right:0;border-radius:6px 0 0 6px;border-right:0;box-shadow:-2px 0 24px -2px rgba(43,55,72,.15)}.nk-sticky-toolbar li:not(:last-child){border-bottom:2px solid #fff}.nk-sticky-toolbar li a{display:flex;height:36px;width:36px;align-items:center;justify-content:center;font-size:18px;color:inherit}.demo-layout{background-color:rgba(85,155,251,.1);color:#559bfb}.demo-thumb{background-color:rgba(30,224,172,.1);color:#1ee0ac}.demo-settings{background-color:rgba(129,107,255,.1);color:#816bff}.demo-purchase{background-color:rgba(255,99,165,.1);color:#ff63a5}@media(min-width: 576px){.nk-sticky-toolbar{top:30%}.nk-sticky-toolbar li a{font-size:20px;height:44px;width:44px}.nk-sticky-toolbar li.demo-thumb a{font-size:22px}}.nk-demo-panel{position:fixed;right:0;top:0;width:320px;max-width:calc(100vw - 40px);max-height:100vh;height:100vh;z-index:9999;background-color:#fff;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);padding:0 0 1.5rem}.nk-demo-panel+.toggle-overlay{z-index:9000;background:rgba(16,25,36,.05)}.dark-mode .nk-demo-panel{box-shadow:0 0 35px 5px rgba(0,0,0,.5)}.nk-demo-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.5rem;text-transform:uppercase;border-bottom:1px solid #e5e9f2}.nk-demo-head h6,.nk-demo-head .h6{font-size:13px;letter-spacing:.1em}.nk-demo-list{overflow:auto;max-height:calc(100vh - 60px)}.nk-demo-title{display:block;font-size:.875rem;padding:.675rem 0;text-align:center;color:#526484;border-top:none;border-radius:0 0 4px 4px}.nk-demo-title .subtitle{display:block;color:#8094ae;font-size:11px}.nk-demo-item{padding:2rem 1.5rem 1rem;border-bottom:1px solid #e5e9f2}.nk-demo-item a{display:block}.nk-demo-item a:hover .nk-demo-title{color:#0fac81}.nk-demo-image{border:1px solid #e5e9f2;border-radius:4px 4px 0 0;padding:1rem 1rem 0 1rem}.nk-demo-image img{border-radius:inherit}.nk-demo-note{background:#f5f6fa;padding-bottom:2rem}@media(min-width: 576px){.nk-demo-item{padding:2rem 2rem 1rem}.nk-demo-head{padding:15px 2rem 13px}.nk-demo-note{padding-bottom:2rem}}@media(min-width: 768px){.nk-demo-panel-2x{width:640px}.nk-demo-panel-2x .nk-demo-list .simplebar-content{display:flex;flex-wrap:wrap}.nk-demo-panel-2x .nk-demo-list .simplebar-content .nk-demo-item{width:50%}.nk-demo-panel-2x .nk-demo-list .simplebar-content .nk-demo-item:not(:nth-child(2n)){border-right:1px solid #e5e9f2}}.nk-opt-panel{overflow:auto;max-height:calc(100vh - 84px)}.nk-opt-reset{padding:1.5rem 1.5rem 1.5rem}.nk-opt-set{padding:1.5rem 1.5rem 1.5rem}.nk-opt-set:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-opt-set-title{padding:0 0 .5rem;text-transform:uppercase;color:#8094ae;letter-spacing:2px;font-weight:500;font-size:11px}.nk-opt-list{padding:0;flex-wrap:wrap;margin:-0.5rem;display:flex}.nk-opt-list+.nk-opt-set-title{margin-top:1.25rem}.nk-opt-item{width:33%;text-align:center;padding:.5rem}.nk-opt-item:not(.active):not(.disabled){cursor:pointer}.nk-opt-item.active{cursor:default}.nk-opt-item.disabled{pointer-events:none}.nk-opt-item.disabled>.nk-opt-item-name{opacity:.5}.col-2x .nk-opt-item{width:50%}.col-4x .nk-opt-item{width:25%}.nk-opt-item-name{font-weight:400;color:#526484;font-size:12px;letter-spacing:.02em}.nk-opt-item-name small,.nk-opt-item-name .small{font-size:11px}.dark-mode .nk-opt-item-name{color:#8094ae}.nk-opt-item-bg{background:#fff;width:100%;height:32px;border:1px solid #dbdfea;padding:3px;margin-bottom:5px;position:relative;display:block;border-radius:2px;transition:all .3s}.dark-mode .nk-opt-item-bg{border-color:#3c4d62}.nk-opt-item-bg>span:not(.nk-opt-item-name){display:block;background:#526484;height:100%;border-radius:1px}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-theme{background:#07523d !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-light{background:#ebeef2 !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-lighter,.dual-listbox .nk-opt-item-bg>span.dual-listbox__item:not(.nk-opt-item-name):hover{background:#f5f6fa !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-dark{background:#101924 !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).theme-light{background:linear-gradient(90deg, #f5f6fa 0%, #f5f6fa 50%, #e5e9f2 50%, #e5e9f2 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).theme-dark{background:linear-gradient(90deg, #1f2b3a 0%, #1f2b3a 50%, #101924 50%, #101924 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-default{background:linear-gradient(90deg, #07523d 0%, #07523d 28%, #0fac81 28%, #0fac81 72%, #abe2d3 72%, #abe2d3 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-purple{background:linear-gradient(90deg, #4700e8 0%, #4700e8 28%, #854fff 28%, #854fff 72%, #e7dcff 72%, #e7dcff 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-green{background:linear-gradient(90deg, #074e3b 0%, #074e3b 28%, #0fac81 28%, #0fac81 72%, #cfeee6 72%, #cfeee6 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-blue{background:linear-gradient(90deg, #0144a0 0%, #0144a0 30%, #0971fe 30%, #0971fe 72%, #cee3ff 72%, #cee3ff 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-egyptian{background:linear-gradient(90deg, #1a3767 0%, #1a3767 30%, #2e62b9 30%, #2e62b9 72%, #d5e0f1 72%, #d5e0f1 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-red{background:linear-gradient(90deg, #ab0e21 0%, #ab0e21 30%, #ee3148 30%, #ee3148 72%, #fcd6da 72%, #fcd6da 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-bluelite{background:linear-gradient(90deg, #001cfe 0%, #001cfe 28%, #6576ff 28%, #6576ff 72%, #e0e4ff 72%, #e0e4ff 100%) !important}.nk-opt-item-bg:hover,.nk-opt-item-bg:focus{border-color:#b7c2d0}.active>.nk-opt-item-bg{border-color:#0fac81;box-shadow:0 0 0 2px rgba(15,172,129,.2)}.active>.nk-opt-item-bg:after{font-family:"Nioicon";content:"";position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);color:#fff;font-size:.875rem}.active>.nk-opt-item-bg.is-light:after{color:#101924}.only-text>.nk-opt-item-bg{margin-bottom:0;height:28px}.only-text>.nk-opt-item-bg:after{display:none}.disabled>.nk-opt-item-bg{border-color:#e5e9f2 !important}.dark-mode .disabled>.nk-opt-item-bg{border-color:#3c4d62 !important}.nk-opt-item-bg>.nk-opt-item-name{color:#364a63;font-size:10px;line-height:1;text-transform:uppercase;font-weight:500;letter-spacing:.12em;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%}.dark-mode .nk-opt-item-bg>.nk-opt-item-name{color:#b6c6e3}.active>.nk-opt-item-bg>.nk-opt-item-name{color:#0fac81;font-weight:700}@media(min-width: 576px){.nk-opt-set,.nk-opt-reset{padding-left:2rem;padding-right:2rem}}.pmo-lv{position:fixed;left:50%;bottom:-50px;max-width:90%;width:590px;transform:translate(-50%, 100%);transition:all .4s;background:#fff;border-radius:50px;box-shadow:0 0 40px -2px rgba(31,43,58,.25);z-index:9999}.pmo-lv.active{transform:translate(-50%, 0);bottom:20px;transition-delay:1s}.pmo-lv.pmo-dark{background:#0564e5}.pmo-close{color:#364a63;border-radius:50%;height:36px;width:36px;line-height:38px;background:rgba(183,194,208,.6);text-align:center;display:inline-block;position:absolute;top:50%;margin-top:-18px;right:8px;font-size:16px;z-index:99}.pmo-close:hover{color:#fff;background:#526484}.pmo-dark .pmo-close{background:rgba(31,43,58,.3);color:#fff}.pmo-dark .pmo-close:hover{background:rgba(31,43,58,.5)}.pmo-wrap{display:flex;padding:.875rem 3.5rem .875rem 1.5rem;align-items:center;border-radius:50px;transition:all 300ms}.pmo-wrap:hover{transform:translateX(5px)}.pmo-text{font-family:Roboto,sans-serif;font-size:14px;line-height:22px;font-weight:500;letter-spacing:.02em;color:#e85347;transition:color .4s}.pmo-text .ni{font-size:20px;display:inline-block;vertical-align:middle;margin-left:.125rem;margin-top:-3px}.pmo-dark .pmo-text{color:#fff}.pmo-st{position:fixed;right:25px;bottom:0;display:flex;align-items:center;transition:all .4s;border-radius:30px;transform:translateY(100%);box-shadow:0 5px 40px 0 rgba(16,25,36,.3);color:#fff;background:#e85347;z-index:99999}.pmo-st:active,.pmo-st:focus,.pmo-st:hover{color:#fff}.pmo-st.pmo-dark{background:#0564e5}.pmo-st.active{bottom:25px;transform:translateY(0);transition-delay:.4s}.pmo-st-img{width:60px;height:60px;border-radius:30px;padding:18px 18px;transition:all .4s}.pmo-st-text{padding:14px 0;height:60px;width:0;overflow:hidden;white-space:nowrap;text-transform:uppercase;letter-spacing:.1em;font-weight:600;transition:all .4s;visibility:hidden;font-size:12px;line-height:16px}.pmo-st:hover .pmo-st-text{width:220px;visibility:visible;padding:14px 14px 14px 0}@media(max-width: 575px){.promo-cov-st{display:none}}.dark-mode .nk-demo-panel{background-color:#18212d}.dark-mode .nk-opt-item-bg{background-color:#101924}.dark-mode .nk-demo-head,.dark-mode .nk-opt-set:not(:last-child),.dark-mode .nk-demo-item:not(:last-child){border-color:#23364e}.dark-mode .nk-demo-title{color:#dfe9fe}.dark-mode .nk-demo-image{border-color:#23364e}/*! END @iO */ \ No newline at end of file diff --git a/public/dgaAdmin/assets/css/editors/quill.css b/public/dgaAdmin/assets/css/editors/quill.css new file mode 100644 index 0000000..5f2d046 --- /dev/null +++ b/public/dgaAdmin/assets/css/editors/quill.css @@ -0,0 +1,1117 @@ +/*! Quill Editor */ + +.ql-container { + box-sizing: border-box; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; + min-height: 160px +} + +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden +} + +.ql-container.ql-disabled .ql-editor ul[data-checked]>li::before { + pointer-events: none +} + +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50% +} + +.ql-clipboard p { + margin: 0; + padding: 0 +} + +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word +} + +.ql-editor>* { + cursor: text +} + +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 +} + +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em +} + +.ql-editor ol>li, +.ql-editor ul>li { + list-style-type: none +} + +.ql-editor ul>li::before { + content: "•" +} + +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none +} + +.ql-editor ul[data-checked=true]>li *, +.ql-editor ul[data-checked=false]>li * { + pointer-events: all +} + +.ql-editor ul[data-checked=true]>li::before, +.ql-editor ul[data-checked=false]>li::before { + color: #777; + cursor: pointer; + pointer-events: all +} + +.ql-editor ul[data-checked=true]>li::before { + content: "☑" +} + +.ql-editor ul[data-checked=false]>li::before { + content: "☐" +} + +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em +} + +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: .3em; + text-align: right +} + +.ql-editor li.ql-direction-rtl::before { + margin-left: .3em; + margin-right: -1.5em +} + +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em +} + +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em +} + +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0 +} + +.ql-editor ol li:before { + content: counter(list-0, decimal) ". " +} + +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1 +} + +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) ". " +} + +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2 +} + +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) ". " +} + +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3 +} + +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) ". " +} + +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4 +} + +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) ". " +} + +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5 +} + +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) ". " +} + +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6 +} + +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) ". " +} + +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9 +} + +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7 +} + +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) ". " +} + +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9 +} + +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8 +} + +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) ". " +} + +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9 +} + +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9 +} + +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) ". " +} + +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em +} + +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em +} + +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em +} + +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em +} + +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em +} + +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em +} + +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em +} + +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em +} + +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em +} + +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em +} + +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em +} + +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em +} + +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em +} + +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em +} + +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em +} + +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em +} + +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em +} + +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em +} + +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em +} + +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em +} + +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em +} + +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em +} + +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em +} + +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em +} + +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em +} + +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em +} + +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em +} + +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em +} + +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em +} + +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em +} + +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em +} + +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em +} + +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em +} + +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em +} + +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em +} + +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em +} + +.ql-editor .ql-video { + display: block; + max-width: 100% +} + +.ql-editor .ql-video.ql-align-center { + margin: 0 auto +} + +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto +} + +.ql-editor .ql-bg-black { + background-color: #000 +} + +.ql-editor .ql-bg-red { + background-color: #e60000 +} + +.ql-editor .ql-bg-orange { + background-color: #f90 +} + +.ql-editor .ql-bg-yellow { + background-color: #ff0 +} + +.ql-editor .ql-bg-green { + background-color: #008a00 +} + +.ql-editor .ql-bg-blue { + background-color: #06c +} + +.ql-editor .ql-bg-purple { + background-color: #93f +} + +.ql-editor .ql-color-white { + color: #fff +} + +.ql-editor .ql-color-red { + color: #e60000 +} + +.ql-editor .ql-color-orange { + color: #f90 +} + +.ql-editor .ql-color-yellow { + color: #ff0 +} + +.ql-editor .ql-color-green { + color: #008a00 +} + +.ql-editor .ql-color-blue { + color: #06c +} + +.ql-editor .ql-color-purple { + color: #93f +} + +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif +} + +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace +} + +.ql-editor .ql-size-small { + font-size: .75em +} + +.ql-editor .ql-size-large { + font-size: 1.5em +} + +.ql-editor .ql-size-huge { + font-size: 2.5em +} + +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit +} + +.ql-editor .ql-align-center { + text-align: center +} + +.ql-editor .ql-align-justify { + text-align: justify +} + +.ql-editor .ql-align-right { + text-align: right +} + +.ql-editor.ql-blank::before { + color: rgba(0, 0, 0, .6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px +} + +.ql-toolbar:after { + clear: both; + content: ""; + display: table +} + +.ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px +} + +.ql-toolbar button svg { + float: left; + height: 100% +} + +.ql-toolbar button:active:hover { + outline: none +} + +.ql-toolbar input.ql-image[type=file] { + display: none +} + +.ql-toolbar button:hover, +.ql-toolbar button:focus, +.ql-toolbar button.ql-active, +.ql-toolbar .ql-picker-label:hover, +.ql-toolbar .ql-picker-label.ql-active, +.ql-toolbar .ql-picker-item:hover, +.ql-toolbar .ql-picker-item.ql-selected { + color: #0fac81 +} + +.ql-toolbar button:hover .ql-fill, +.ql-toolbar button:focus .ql-fill, +.ql-toolbar button.ql-active .ql-fill, +.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #0fac81 +} + +.ql-toolbar button:hover .ql-stroke, +.ql-toolbar button:focus .ql-stroke, +.ql-toolbar button.ql-active .ql-stroke, +.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-toolbar button:hover .ql-stroke-miter, +.ql-toolbar button:focus .ql-stroke-miter, +.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #0fac81 +} + +@media(pointer: coarse) { + .ql-toolbar button:hover:not(.ql-active) { + color: #526484 + } + .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #526484 + } + .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #526484 + } +} + +.ql-hidden { + display: none +} + +.ql-out-bottom, +.ql-out-top { + visibility: hidden +} + +.ql-tooltip { + position: absolute; + transform: translateY(10px) +} + +.ql-tooltip a { + cursor: pointer; + text-decoration: none +} + +.ql-tooltip.ql-flip { + transform: translateY(-10px) +} + +.ql-formats { + display: inline-block; + vertical-align: middle +} + +.ql-formats:after { + clear: both; + content: ""; + display: table +} + +.ql-stroke { + fill: none; + stroke: #526484; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2 +} + +.ql-stroke-miter { + fill: none; + stroke: #526484; + stroke-miterlimit: 10; + stroke-width: 2 +} + +.ql-fill, +.ql-stroke.ql-fill { + fill: #526484 +} + +.ql-empty { + fill: none +} + +.ql-even { + fill-rule: evenodd +} + +.ql-thin, +.ql-stroke.ql-thin { + stroke-width: 1 +} + +.ql-transparent { + opacity: .4 +} + +.ql-direction svg:last-child { + display: none +} + +.ql-direction.ql-active svg:last-child { + display: inline +} + +.ql-direction.ql-active svg:first-child { + display: none +} + +.ql-editor h1 { + font-size: 2em +} + +.ql-editor h2 { + font-size: 1.5em +} + +.ql-editor h3 { + font-size: 1.17em +} + +.ql-editor h4 { + font-size: 1em +} + +.ql-editor h5 { + font-size: .83em +} + +.ql-editor h6 { + font-size: .67em +} + +.ql-editor a { + text-decoration: underline +} + +.ql-editor blockquote { + margin-bottom: 5px; + margin-top: 5px; + border-left: 4px solid #dbdfea; + padding-left: 16px +} + +.ql-editor code, +.ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px +} + +.ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px +} + +.ql-editor code { + font-size: 85%; + padding: 2px 4px +} + +.ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible +} + +.ql-editor img { + max-width: 100% +} + +.ql-picker { + color: #526484; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle +} + +.ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100% +} + +.ql-picker-label:focus { + box-shadow: none; + border: none; + outline: none +} + +.ql-picker-label::before { + display: inline-block; + line-height: 22px +} + +.ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 16px; + position: absolute; + white-space: nowrap; + border-radius: 4px +} + +.ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px +} + +.ql-picker.ql-expanded .ql-picker-label { + color: #1c2b46; + z-index: 2 +} + +.ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #8094ae +} + +.ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #8094ae +} + +.ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1 +} + +.ql-color-picker, +.ql-icon-picker { + width: 28px +} + +.ql-color-picker .ql-picker-label, +.ql-icon-picker .ql-picker-label { + padding: 2px 4px +} + +.ql-color-picker .ql-picker-label svg, +.ql-icon-picker .ql-picker-label svg { + right: 4px +} + +.ql-icon-picker .ql-picker-options { + padding: 4px 0px +} + +.ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px +} + +.ql-color-picker .ql-picker-options { + padding: 8px; + width: 158px +} + +.ql-color-picker .ql-picker-item { + border: 1px solid rgba(0, 0, 0, 0); + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px +} + +.ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px +} + +.ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=""])::before, +.ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=""])::before, +.ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=""])::before, +.ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=""])::before { + content: attr(data-label) +} + +.ql-picker.ql-header { + width: 98px +} + +.ql-picker.ql-header .ql-picker-label::before, +.ql-picker.ql-header .ql-picker-item::before { + content: "Normal" +} + +.ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: "Heading 1" +} + +.ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: "Heading 2" +} + +.ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: "Heading 3" +} + +.ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: "Heading 4" +} + +.ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: "Heading 5" +} + +.ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: "Heading 6" +} + +.ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em +} + +.ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em +} + +.ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em +} + +.ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em +} + +.ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: .83em +} + +.ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: .67em +} + +.ql-picker.ql-font { + width: 108px +} + +.ql-picker.ql-font .ql-picker-label::before, +.ql-picker.ql-font .ql-picker-item::before { + content: "Sans Serif" +} + +.ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: "Serif" +} + +.ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: "Monospace" +} + +.ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif +} + +.ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace +} + +.ql-picker.ql-size { + width: 98px +} + +.ql-picker.ql-size .ql-picker-label::before, +.ql-picker.ql-size .ql-picker-item::before { + content: "Normal" +} + +.ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: "Small" +} + +.ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: "Large" +} + +.ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: "Huge" +} + +.ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px +} + +.ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px +} + +.ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px +} + +.ql-color-picker.ql-background .ql-picker-item { + background-color: #fff +} + +.ql-color-picker.ql-color .ql-picker-item { + background-color: #000 +} + +.ql-toolbar { + border: 1px solid #e5e9f2; + border-radius: 4px 4px 0 0; + box-sizing: border-box; + padding: 8px; + padding-bottom: 0 +} + +.ql-toolbar .ql-formats { + margin-right: 15px; + padding-bottom: 8px +} + +.ql-toolbar .ql-picker-label { + border: 1px solid rgba(0, 0, 0, 0) +} + +.ql-toolbar .ql-picker-options { + border: 1px solid rgba(0, 0, 0, 0); + box-shadow: 0 .125rem .25rem rgba(43, 55, 72, .15) +} + +.ql-toolbar .ql-picker.ql-expanded .ql-picker-options { + border-color: #e5e9f2 +} + +.ql-toolbar .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar .ql-color-picker .ql-picker-item:hover { + border-color: #3c4d62 +} + +.ql-toolbar+.ql-container { + border-top: 0px +} + +.ql-tooltip { + background-color: #fff; + border: 1px solid #e5e9f2; + box-shadow: 0px 0px 5px #ddd; + color: #526484; + padding: 5px 12px; + white-space: nowrap +} + +.ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px +} + +.ql-tooltip input[type=text] { + display: none; + border: 1px solid #e5e9f2; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px +} + +.ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top +} + +.ql-tooltip a.ql-action::after { + content: "Edit"; + border-right: 1px solid #e5e9f2; + margin-left: 16px; + padding-right: 8px +} + +.ql-tooltip a.ql-remove::before { + content: "Remove"; + margin-left: 8px +} + +.ql-tooltip a { + line-height: 26px +} + +.ql-tooltip.ql-editing a.ql-preview, +.ql-tooltip.ql-editing a.ql-remove { + display: none +} + +.ql-tooltip.ql-editing input[type=text] { + display: inline-block +} + +.ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: "Save"; + padding-right: 0px +} + +.ql-tooltip[data-mode=link]::before { + content: "Enter link:" +} + +.ql-tooltip[data-mode=formula]::before { + content: "Enter formula:" +} + +.ql-tooltip[data-mode=video]::before { + content: "Enter video:" +} + +a { + color: #0fac81 +} + +.ql-container { + border: 1px solid #e5e9f2; + border-radius: 0 0 4px 4px +} \ No newline at end of file diff --git a/public/dgaAdmin/assets/css/editors/summernote.css b/public/dgaAdmin/assets/css/editors/summernote.css new file mode 100644 index 0000000..253af34 --- /dev/null +++ b/public/dgaAdmin/assets/css/editors/summernote.css @@ -0,0 +1 @@ +/*! Summernote Editor */@font-face{font-family:"summernote";font-style:normal;font-weight:400;font-display:auto;src:url("../../fonts/summernote.eot?#iefix") format("embedded-opentype"),url("../../fonts/summernote.woff2") format("woff2"),url("../../fonts/summernote.woff") format("woff"),url("../../fonts/summernote.ttf") format("truetype")}[class^=note-icon]:before,[class*=" note-icon"]:before{display:inline-block;font-family:"summernote";font-style:normal;font-size:inherit;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align::before{content:""}.note-icon-align-center::before{content:""}.note-icon-align-indent::before{content:""}.note-icon-align-justify::before{content:""}.note-icon-align-left::before{content:""}.note-icon-align-outdent::before{content:""}.note-icon-align-right::before{content:""}.note-icon-arrow-circle-down::before{content:""}.note-icon-arrow-circle-left::before{content:""}.note-icon-arrow-circle-right::before{content:""}.note-icon-arrow-circle-up::before{content:""}.note-icon-arrows-alt::before{content:""}.note-icon-arrows-h::before{content:""}.note-icon-arrows-v::before{content:""}.note-icon-bold::before{content:""}.note-icon-caret::before{content:""}.note-icon-chain-broken::before{content:""}.note-icon-circle::before{content:""}.note-icon-close::before{content:""}.note-icon-code::before{content:""}.note-icon-col-after::before{content:""}.note-icon-col-before::before{content:""}.note-icon-col-remove::before{content:""}.note-icon-eraser::before{content:""}.note-icon-float-left::before{content:""}.note-icon-float-none::before{content:""}.note-icon-float-right::before{content:""}.note-icon-font::before{content:""}.note-icon-frame::before{content:""}.note-icon-italic::before{content:""}.note-icon-link::before{content:""}.note-icon-magic::before{content:""}.note-icon-menu-check::before{content:""}.note-icon-minus::before{content:""}.note-icon-orderedlist::before{content:""}.note-icon-pencil::before{content:""}.note-icon-picture::before{content:""}.note-icon-question::before{content:""}.note-icon-redo::before{content:""}.note-icon-rollback::before{content:""}.note-icon-row-above::before{content:""}.note-icon-row-below::before{content:""}.note-icon-row-remove::before{content:""}.note-icon-special-character::before{content:""}.note-icon-square::before{content:""}.note-icon-strikethrough::before{content:""}.note-icon-subscript::before{content:""}.note-icon-summernote::before{content:""}.note-icon-superscript::before{content:""}.note-icon-table::before{content:""}.note-icon-text-height::before{content:""}.note-icon-trash::before{content:""}.note-icon-underline::before{content:""}.note-icon-undo::before{content:""}.note-icon-unorderedlist::before{content:""}.note-icon-video::before{content:""}.note-frame{-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000;font-family:sans-serif;border-radius:4px}.note-toolbar{padding:0 .5rem;border-bottom:1px solid #dbdfea;color:#526484;background-color:#fff;border-color:#dbdfea;border-top-left-radius:4px;border-top-right-radius:4px}.note-btn-group{position:relative;display:inline-block;margin:5px}.note-btn-group>.note-btn-group{margin-right:0}.note-btn-group>.note-btn:first-child{margin-left:0}.note-btn-group .note-btn+.note-btn,.note-btn-group .note-btn+.note-btn-group,.note-btn-group .note-btn-group+.note-btn,.note-btn-group .note-btn-group+.note-btn-group{margin-left:-1px}.note-btn-group>.note-btn:not(:first-child),.note-btn-group>.note-btn-group:not(:first-child)>.note-btn{border-top-left-radius:0;border-bottom-left-radius:0}.note-btn-group>.note-btn:not(:last-child):not(.dropdown-toggle),.note-btn-group>.note-btn-group:not(:last-child)>.note-btn{border-top-right-radius:0;border-bottom-right-radius:0}.note-btn-group.open>.note-dropdown{display:block}.note-btn{display:inline-block;font-weight:400;margin-bottom:0;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #dbdfea;white-space:nowrap;outline:0;color:#333;background-color:#fff;border-color:#dbdfea;padding:5px 10px;font-size:14px;line-height:1.4;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.note-btn:focus,.note-btn.focus{color:#333;background-color:#ebebeb;border-color:#dbdfea}.note-btn:hover{color:#333;background-color:#ebebeb;border-color:#dbdfea}.note-btn.disabled:focus,.note-btn.disabled.focus,.note-btn[disabled]:focus,.note-btn[disabled].focus,fieldset[disabled] .note-btn:focus,fieldset[disabled] .note-btn.focus{background-color:#fff;border-color:#dbdfea}.note-btn:hover,.note-btn:focus,.note-btn.focus{color:#333;text-decoration:none;border:1px solid #dbdfea;background-color:#ebebeb;outline:0}.note-btn:active,.note-btn.active{outline:0;background-image:none;color:#526484;text-decoration:none;border:1px solid #dbdfea;background-color:#ebebeb;outline:0}.note-btn.disabled,.note-btn[disabled],fieldset[disabled] .note-btn{cursor:not-allowed;-webkit-opacity:.65;-khtml-opacity:.65;-moz-opacity:.65;opacity:.65;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=65);filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.note-btn>span.note-icon-caret:first-child{margin-left:-1px}.note-btn>span.note-icon-caret:nth-child(2){padding-left:3px;margin-right:-5px}.note-btn .note-recent-color{padding:.125rem .25rem;border-radius:2px}.note-btn-primary{background:#854fff;color:#fff}.note-btn-primary:hover,.note-btn-primary:focus,.note-btn-primary.focus{color:#fff;text-decoration:none;border:1px solid #dbdfea;background-color:#fa6362;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.note-btn-block{display:block;width:100%}.note-btn-block+.note-btn-block{margin-top:5px}input[type=submit].note-btn-block,input[type=reset].note-btn-block,input[type=button].note-btn-block{width:100%}button.close{padding:0;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none}.close{float:right;font-size:1rem;line-height:1;color:#526484;opacity:.5;transition:.3s;margin:.25rem 0}.close:hover{opacity:1}.note-dropdown{position:relative}.note-color .dropdown-toggle{width:30px;padding-left:5px}.note-dropdown-menu{display:none;min-width:250px;position:absolute;top:100%;left:0;z-index:1000;float:left;text-align:left;background:#fff;border:1px solid #e5e9f2;padding:.5rem 0;background-clip:padding-box;box-shadow:0 3px 12px 1px rgba(58,34,114,.15);border-radius:4px}.note-dropdown-menu>*:last-child{margin-right:0}.note-fontsize .note-dropdown-menu{min-width:70px}.note-dropdown-menu .note-btn-group{margin:5px !important}.note-btn-group.open .note-dropdown-menu{display:block}.note-dropdown-item{display:block;padding:.25rem 1rem}.note-fontsize .note-dropdown-item{padding:.25rem .5rem;font-size:13px}.note-dropdown-item[aria-label=pre]{border-bottom:1px solid #dbdfea;margin-bottom:.5rem;padding-bottom:.75rem}a.note-dropdown-item,a.note-dropdown-item:hover{color:#000;text-decoration:none}.note-modal{position:fixed;left:0;right:0;top:0;bottom:0;z-index:1050;-webkit-opacity:1;-khtml-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=100);filter:alpha(opacity=100);display:none}.note-modal.open{display:flex;align-items:center}.note-modal-content{position:relative;width:auto;margin:30px 20px;border:1px solid #dbdfea;background:#fff;background-clip:border-box;outline:0;border-radius:5px;box-shadow:0 3px 12px 1px rgba(43,55,72,.15)}.note-modal-header{padding:15px;border-bottom:1px solid #dbdfea}.note-modal-body{position:relative;padding:15px}.note-modal-body kbd{border-radius:2px;background-color:#000;color:#fff;padding:3px 5px;font-weight:700;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.note-modal-footer{display:flex;justify-content:flex-end;align-items:center;border-top:1px solid #dbdfea;padding:15px}@media(min-width: 576px){.note-modal-header{padding:1rem 1.5rem}.note-modal-body{padding:1.5rem 1.5rem}.note-modal-footer{padding:1rem 1.5rem}}.note-modal-footer a{color:#854fff;text-decoration:none}.note-modal-footer a:hover,.note-modal-footer a:focus{color:#3a2272;text-decoration:underline}.note-modal-title{font-size:20px;color:#1c2b46;margin:0;line-height:1.4}.note-modal-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:1040;background:#1f2b3a;-webkit-opacity:.5;-khtml-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);filter:alpha(opacity=50);display:none}.note-modal-backdrop.open{display:block}@media(min-width: 768px){.note-modal-content{width:600px;margin:30px auto}}@media(min-width: 992px){.note-modal-content-large{width:900px}}.note-modal .note-help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}.note-modal .note-nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.note-modal .note-nav-link{display:block;padding:.5rem 1rem;color:#007bff;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-text-decoration-skip:objects}.note-modal .note-nav-link:focus,.note-modal .note-nav-link:hover{color:#0056b3;text-decoration:none}.note-modal .note-nav-link.disabled{color:#868e96}.note-modal .note-nav-tabs{border-bottom:1px solid #ddd}.note-modal .note-nav-tabs .note-nav-item{margin-bottom:-1px}.note-modal .note-nav-tabs .note-nav-link{border:1px solid rgba(0,0,0,0);border-top-left-radius:.25rem;border-top-right-radius:.25rem}.note-modal .note-nav-tabs .note-nav-link:focus,.note-modal .note-nav-tabs .note-nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.note-modal .note-nav-tabs .note-nav-link.disabled{color:#868e96;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.note-modal .note-nav-tabs .note-nav-item.show .note-nav-link{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.note-modal .note-tab-content{margin:15px auto}.note-modal .note-tab-content>.note-tab-pane:target~.note-tab-pane:last-child,.note-modal .note-tab-content>.note-tab-pane{display:none}.note-modal .note-tab-content>:last-child,.note-modal .note-tab-content>.note-tab-pane:target{display:block}.note-form-group:last-child{padding-bottom:0}.note-form-label{display:block;width:100%;font-size:.785rem;color:#526484;margin-bottom:.75rem}.note-input{width:100%;display:block;outline:0;padding:.4375rem 1rem;font-size:14px;font-weight:400;line-height:1.25rem;color:#526484;background-color:#fff;background-clip:padding-box;border:1px solid #dbdfea}.note-input::-webkit-input-placeholder{color:#e5e9f2}.note-input:-moz-placeholder{color:#e5e9f2}.note-input::-moz-placeholder{color:#e5e9f2}.note-input:-ms-input-placeholder{color:#e5e9f2}.note-tooltip{position:absolute;z-index:1070;display:block;font-size:13px;transition:opacity .15s;-webkit-opacity:0;-khtml-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);filter:alpha(opacity=0)}.note-tooltip.in{-webkit-opacity:.9;-khtml-opacity:.9;-moz-opacity:.9;opacity:.9;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=90);filter:alpha(opacity=90)}.note-tooltip.top{margin-top:-3px;padding:5px 0}.note-tooltip.right{margin-left:3px;padding:0 5px}.note-tooltip.bottom{margin-top:3px;padding:5px 0}.note-tooltip.left{margin-left:-3px;padding:0 5px}.note-tooltip.bottom .note-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#1f2b3a}.note-tooltip.top .note-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#1f2b3a}.note-tooltip.right .note-tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#1f2b3a}.note-tooltip.left .note-tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#1f2b3a}.note-tooltip-arrow{position:absolute;width:0;height:0;border-color:rgba(0,0,0,0);border-style:solid}.note-tooltip-content{max-width:200px;font-family:sans-serif;padding:3px 8px;color:#fff;text-align:center;background-color:#1f2b3a;border-radius:4px}.note-popover{position:absolute;z-index:1060;display:block;font-size:13px;font-family:sans-serif;display:none;background:#fff;border:1px solid #dbdfea;border:1px solid #dbdfea}.note-popover.in{display:block}.note-popover.top{margin-top:-10px;padding:5px 0}.note-popover.right{margin-left:10px;padding:0 5px}.note-popover.bottom{margin-top:10px;padding:5px 0}.note-popover.left{margin-left:-10px;padding:0 5px}.note-popover.bottom .note-popover-arrow{top:-11px;left:20px;margin-left:-10px;border-top-width:0;border-bottom-color:#9ba6c4;border-bottom-color:#dbdfea}.note-popover.bottom .note-popover-arrow::after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.note-popover.top .note-popover-arrow{bottom:-11px;left:20px;margin-left:-10px;border-bottom-width:0;border-top-color:#9ba6c4;border-top-color:#dbdfea}.note-popover.top .note-popover-arrow::after{bottom:1px;margin-left:-10px;content:" ";border-bottom-width:0;border-top-color:#fff}.note-popover.right .note-popover-arrow{top:50%;left:-11px;margin-top:-10px;border-left-width:0;border-right-color:#9ba6c4;border-right-color:#dbdfea}.note-popover.right .note-popover-arrow::after{left:1px;margin-top:-10px;content:" ";border-left-width:0;border-right-color:#fff}.note-popover.left .note-popover-arrow{top:50%;right:-11px;margin-top:-10px;border-right-width:0;border-left-color:#9ba6c4;border-left-color:#dbdfea}.note-popover.left .note-popover-arrow::after{right:1px;margin-top:-10px;content:" ";border-right-width:0;border-left-color:#fff}.note-popover-arrow{position:absolute;width:0;height:0;border:11px solid rgba(0,0,0,0)}.note-popover-arrow::after{position:absolute;display:block;width:0;height:0;border-color:rgba(0,0,0,0);border-style:solid;content:" ";border-width:10px}.note-popover-content{padding:3px 8px;color:#526484;text-align:center;background-color:#fff;min-width:100px;min-height:30px}.note-editor{position:relative;background-color:#fff}.note-editor .note-dropzone{position:absolute;display:none;z-index:100;color:#09c2de;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;vertical-align:middle;text-align:center;font-size:28px;font-weight:700}.note-editor .note-dropzone.hover{color:#03424b}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-frame,.note-editor.note-airframe{border:1px solid #dbdfea}.note-editor.note-frame.codeview .note-editing-area .note-editable,.note-editor.note-airframe.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable,.note-editor.note-airframe.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area,.note-editor.note-airframe .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable,.note-editor.note-airframe .note-editing-area .note-editable{padding:10px;overflow:auto;word-wrap:break-word}.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false]{background-color:#ebeef2}.note-editor.note-frame .note-editing-area .note-codable,.note-editor.note-airframe .note-editing-area .note-codable{display:none;width:100%;padding:10px;border:none;box-shadow:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#1f2b3a;resize:none;outline:none;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin-bottom:0}.note-editor.note-frame.fullscreen,.note-editor.note-airframe.fullscreen{position:fixed;top:0;left:0;width:100% !important;z-index:1050}.note-editor.note-frame.fullscreen .note-resizebar,.note-editor.note-airframe.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output,.note-editor.note-airframe .note-status-output{display:block;width:100%;font-size:14px;line-height:1.42857143;height:20px;margin-bottom:0;color:#526484;border:0;border-top:1px solid #dbdfea}.note-editor.note-frame .note-status-output:empty,.note-editor.note-airframe .note-status-output:empty{height:0;border-top:0 solid rgba(0,0,0,0)}.note-editor.note-frame .note-status-output .pull-right,.note-editor.note-airframe .note-status-output .pull-right{float:right !important}.note-editor.note-frame .note-status-output .text-muted,.note-editor.note-airframe .note-status-output .text-muted{color:#526484}.note-editor.note-frame .note-status-output .text-primary,.note-editor.note-airframe .note-status-output .text-primary{color:#854fff}.note-editor.note-frame .note-status-output .text-success,.note-editor.note-airframe .note-status-output .text-success{color:#1ee0ac}.note-editor.note-frame .note-status-output .text-info,.note-editor.note-airframe .note-status-output .text-info{color:#09c2de}.note-editor.note-frame .note-status-output .text-warning,.note-editor.note-airframe .note-status-output .text-warning{color:#f4bd0e}.note-editor.note-frame .note-status-output .text-danger,.note-editor.note-airframe .note-status-output .text-danger{color:#e85347}.note-editor.note-frame .note-status-output .alert,.note-editor.note-airframe .note-status-output .alert{margin:-7px 0 0 0;padding:7px 10px 2px 10px;border-radius:0;color:#1c2b46;background-color:#f5f6fa}.note-editor.note-frame .note-status-output .alert .note-icon,.note-editor.note-airframe .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success,.note-editor.note-airframe .note-status-output .alert-success{color:#1ee0ac !important;background-color:rgba(30,224,172,.2) !important}.note-editor.note-frame .note-status-output .alert-info,.note-editor.note-airframe .note-status-output .alert-info{color:#09c2de !important;background-color:rgba(9,194,222,.2) !important}.note-editor.note-frame .note-status-output .alert-warning,.note-editor.note-airframe .note-status-output .alert-warning{color:#f4bd0e !important;background-color:rgba(244,189,14,.2) !important}.note-editor.note-frame .note-status-output .alert-danger,.note-editor.note-airframe .note-status-output .alert-danger{color:#e85347 !important;background-color:rgba(232,83,71,.2) !important}.note-editor.note-frame .note-statusbar,.note-editor.note-airframe .note-statusbar{background-color:#ebeef2;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #dbdfea}.note-editor.note-frame .note-statusbar .note-resizebar,.note-editor.note-airframe .note-statusbar .note-resizebar{padding-top:1px;height:9px;width:100%;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #dbdfea}.note-editor.note-frame .note-statusbar.locked .note-resizebar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder,.note-editor.note-airframe .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative}.note-popover .popover-content,.note-editor .note-toolbar{margin:0;padding:0 0 .5rem .5rem}.note-popover .popover-content .note-btn-group,.note-editor .note-toolbar .note-btn-group{margin:0}.note-popover .popover-content>.note-btn-group,.note-editor .note-toolbar>.note-btn-group{margin:.5rem .5rem 0 0}.note-popover .popover-content .note-btn-group .note-table,.note-editor .note-toolbar .note-btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre{margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p{margin:0;padding:0}.note-popover .popover-content .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h1{font-size:3rem}.note-popover .popover-content .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h2{font-size:2rem}.note-popover .popover-content .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h3{font-size:1.75rem}.note-popover .popover-content .note-style .dropdown-style>li,.note-editor .note-toolbar .note-style .dropdown-style>li{padding:.25rem 1rem}.note-popover .popover-content .note-style .dropdown-style>li[aria-label=pre],.note-editor .note-toolbar .note-style .dropdown-style>li[aria-label=pre]{border-bottom:1px solid #dbdfea;margin-bottom:.5rem;padding-bottom:.75rem}.note-popover .popover-content .note-color-all .note-dropdown-menu,.note-editor .note-toolbar .note-color-all .note-dropdown-menu{padding:.375rem;min-width:326px}.note-popover .popover-content .note-color .dropdown-toggle,.note-editor .note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:156px;padding:.375rem}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title{font-size:12px;margin:2px 0;font-weight:700}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select{font-size:11px;margin:6px 0;padding:.125rem .375rem;cursor:pointer;width:100%;justify-content:center}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row{height:18px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-popover .popover-content .note-para .note-dropdown-menu,.note-editor .note-toolbar .note-para .note-dropdown-menu{min-width:245px;padding:5px}.note-popover .popover-content .note-para .note-dropdown-menu>div+div,.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-popover .popover-content .note-dropdown-menu.right,.note-editor .note-toolbar .note-dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .note-dropdown-menu.right::before,.note-editor .note-toolbar .note-dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.right::after,.note-editor .note-toolbar .note-dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.note-check a i,.note-editor .note-toolbar .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-popover .popover-content .note-dropdown-menu.note-check a.checked i,.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.note-editor .note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.note-editor .note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.note-editor .note-toolbar .note-color-palette div .note-color-btn{width:18px;height:18px;padding:0;margin:0;border:0;border-radius:0}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{outline:0;border-radius:5px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);-moz-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{min-height:100px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3;margin-bottom:10px}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-sizing,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:none;border-bottom:none}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:none;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:none;border-right:none}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:none;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;color:#fff;background-color:#000;font-size:12px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{padding:3px;max-height:150px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;white-space:nowrap;text-decoration:none;background-color:#428bca;outline:0;cursor:pointer}html .note-fullscreen-body,body .note-fullscreen-body{overflow:hidden !important}.note-editor .note-editing-area .note-editable table{width:100%;border-collapse:collapse}.note-editor .note-editing-area .note-editable table td,.note-editor .note-editing-area .note-editable table th{border:1px solid #ececec;padding:5px 3px}.note-editor .note-editing-area .note-editable a{background-color:inherit;text-decoration:inherit;font-family:inherit;font-weight:inherit;color:#337ab7}.note-editor .note-editing-area .note-editable a:hover,.note-editor .note-editing-area .note-editable a:focus{color:#23527c;text-decoration:underline;outline:0}.note-editor .note-editing-area .note-editable figure{margin:0}.note-modal .note-modal-body label{margin-bottom:.75rem;display:inline-block}.note-modal .note-modal-body .checkbox{color:#526484}.note-modal .note-modal-body .checkbox label{display:inline-flex;align-items:center}.note-modal .note-modal-body .checkbox input[type=checkbox]{margin-right:.5rem}.note-modal .note-modal-body .help-list-item:hover{background-color:#e0e0e0}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.help-list-item label{margin-bottom:5px;display:inline-block} \ No newline at end of file diff --git a/public/dgaAdmin/assets/css/theme.css b/public/dgaAdmin/assets/css/theme.css new file mode 100644 index 0000000..8b7aa76 --- /dev/null +++ b/public/dgaAdmin/assets/css/theme.css @@ -0,0 +1,8 @@ +/*! + * Theme Name: Default + * Package : DashLite + * Author: Softnio + * Author URI: http://themeforest.net/user/softnio + * Version : 1.0.0 + * Updated : 07.08.2020 +**/ \ No newline at end of file diff --git a/public/dgaAdmin/assets/fonts/Nioicon.eot b/public/dgaAdmin/assets/fonts/Nioicon.eot new file mode 100644 index 0000000..4a38c3d Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nioicon.eot differ diff --git a/public/dgaAdmin/assets/fonts/Nioicon.svg b/public/dgaAdmin/assets/fonts/Nioicon.svg new file mode 100644 index 0000000..d4b9052 --- /dev/null +++ b/public/dgaAdmin/assets/fonts/Nioicon.svg @@ -0,0 +1,1041 @@ + + + + + + +{ + "fontFamily": "Nioicon", + "majorVersion": 1, + "minorVersion": 3.1, + "fontURL": "https://softnio.com", + "copyright": "Softnio", + "designer": "Softnio", + "designerURL": "https://softnio.com", + "license": "MIT", + "description": "Handcrafted custom icon set for websites\nFont generated by IcoMoon.", + "version": "Version 1.3", + "fontId": "Nioicon", + "psName": "Nioicon", + "subFamily": "Regular", + "fullName": "Nioicon" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/dgaAdmin/assets/fonts/Nioicon.ttf b/public/dgaAdmin/assets/fonts/Nioicon.ttf new file mode 100644 index 0000000..cf7c731 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nioicon.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Nioicon.woff b/public/dgaAdmin/assets/fonts/Nioicon.woff new file mode 100644 index 0000000..1863b6b Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nioicon.woff differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Bold.eot b/public/dgaAdmin/assets/fonts/Nunito-Bold.eot new file mode 100644 index 0000000..f60ded8 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Bold.eot differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Bold.ttf b/public/dgaAdmin/assets/fonts/Nunito-Bold.ttf new file mode 100644 index 0000000..3c7dbc4 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Bold.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Bold.woff b/public/dgaAdmin/assets/fonts/Nunito-Bold.woff new file mode 100644 index 0000000..27a2e58 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Bold.woff differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Bold.woff2 b/public/dgaAdmin/assets/fonts/Nunito-Bold.woff2 new file mode 100644 index 0000000..ff1bda2 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Bold.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Regular.eot b/public/dgaAdmin/assets/fonts/Nunito-Regular.eot new file mode 100644 index 0000000..7679155 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Regular.eot differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Regular.ttf b/public/dgaAdmin/assets/fonts/Nunito-Regular.ttf new file mode 100644 index 0000000..9cc3531 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Regular.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Regular.woff b/public/dgaAdmin/assets/fonts/Nunito-Regular.woff new file mode 100644 index 0000000..052b13c Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Regular.woff differ diff --git a/public/dgaAdmin/assets/fonts/Nunito-Regular.woff2 b/public/dgaAdmin/assets/fonts/Nunito-Regular.woff2 new file mode 100644 index 0000000..cd3fd9f Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Nunito-Regular.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Bold.eot b/public/dgaAdmin/assets/fonts/Roboto-Bold.eot new file mode 100644 index 0000000..14ad9ae Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Bold.eot differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Bold.ttf b/public/dgaAdmin/assets/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..0388c50 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Bold.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Bold.woff b/public/dgaAdmin/assets/fonts/Roboto-Bold.woff new file mode 100644 index 0000000..51f1e89 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Bold.woff differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Bold.woff2 b/public/dgaAdmin/assets/fonts/Roboto-Bold.woff2 new file mode 100644 index 0000000..8d1ec3a Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Bold.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Light.eot b/public/dgaAdmin/assets/fonts/Roboto-Light.eot new file mode 100644 index 0000000..3d50d57 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Light.eot differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Light.ttf b/public/dgaAdmin/assets/fonts/Roboto-Light.ttf new file mode 100644 index 0000000..3a9bdc6 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Light.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Light.woff b/public/dgaAdmin/assets/fonts/Roboto-Light.woff new file mode 100644 index 0000000..eec3617 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Light.woff differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Light.woff2 b/public/dgaAdmin/assets/fonts/Roboto-Light.woff2 new file mode 100644 index 0000000..0e0efd0 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Light.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Medium.eot b/public/dgaAdmin/assets/fonts/Roboto-Medium.eot new file mode 100644 index 0000000..0f60b5e Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Medium.eot differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Medium.ttf b/public/dgaAdmin/assets/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000..09f51e2 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Medium.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Medium.woff b/public/dgaAdmin/assets/fonts/Roboto-Medium.woff new file mode 100644 index 0000000..b4f0629 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Medium.woff differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Medium.woff2 b/public/dgaAdmin/assets/fonts/Roboto-Medium.woff2 new file mode 100644 index 0000000..02bf764 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Medium.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Regular.eot b/public/dgaAdmin/assets/fonts/Roboto-Regular.eot new file mode 100644 index 0000000..2f61547 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Regular.eot differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Regular.ttf b/public/dgaAdmin/assets/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..28e2c02 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Regular.ttf differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Regular.woff b/public/dgaAdmin/assets/fonts/Roboto-Regular.woff new file mode 100644 index 0000000..b070d8e Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Regular.woff differ diff --git a/public/dgaAdmin/assets/fonts/Roboto-Regular.woff2 b/public/dgaAdmin/assets/fonts/Roboto-Regular.woff2 new file mode 100644 index 0000000..30370cf Binary files /dev/null and b/public/dgaAdmin/assets/fonts/Roboto-Regular.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/bootstrap-icons.woff b/public/dgaAdmin/assets/fonts/bootstrap-icons.woff new file mode 100644 index 0000000..3dc1cde Binary files /dev/null and b/public/dgaAdmin/assets/fonts/bootstrap-icons.woff differ diff --git a/public/dgaAdmin/assets/fonts/bootstrap-icons.woff2 b/public/dgaAdmin/assets/fonts/bootstrap-icons.woff2 new file mode 100644 index 0000000..8f08da1 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/bootstrap-icons.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/fa-brands-400.eot b/public/dgaAdmin/assets/fonts/fa-brands-400.eot new file mode 100644 index 0000000..958684e Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-brands-400.eot differ diff --git a/public/dgaAdmin/assets/fonts/fa-brands-400.svg b/public/dgaAdmin/assets/fonts/fa-brands-400.svg new file mode 100644 index 0000000..2b7cf17 --- /dev/null +++ b/public/dgaAdmin/assets/fonts/fa-brands-400.svg @@ -0,0 +1,3717 @@ + + + + +Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/dgaAdmin/assets/fonts/fa-brands-400.ttf b/public/dgaAdmin/assets/fonts/fa-brands-400.ttf new file mode 100644 index 0000000..f071825 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-brands-400.ttf differ diff --git a/public/dgaAdmin/assets/fonts/fa-brands-400.woff b/public/dgaAdmin/assets/fonts/fa-brands-400.woff new file mode 100644 index 0000000..277ab65 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-brands-400.woff differ diff --git a/public/dgaAdmin/assets/fonts/fa-brands-400.woff2 b/public/dgaAdmin/assets/fonts/fa-brands-400.woff2 new file mode 100644 index 0000000..47805d4 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-brands-400.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/fa-regular-400.eot b/public/dgaAdmin/assets/fonts/fa-regular-400.eot new file mode 100644 index 0000000..bef9f72 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-regular-400.eot differ diff --git a/public/dgaAdmin/assets/fonts/fa-regular-400.svg b/public/dgaAdmin/assets/fonts/fa-regular-400.svg new file mode 100644 index 0000000..bccc256 --- /dev/null +++ b/public/dgaAdmin/assets/fonts/fa-regular-400.svg @@ -0,0 +1,801 @@ + + + + +Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/dgaAdmin/assets/fonts/fa-regular-400.ttf b/public/dgaAdmin/assets/fonts/fa-regular-400.ttf new file mode 100644 index 0000000..659527a Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-regular-400.ttf differ diff --git a/public/dgaAdmin/assets/fonts/fa-regular-400.woff b/public/dgaAdmin/assets/fonts/fa-regular-400.woff new file mode 100644 index 0000000..31f44b2 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-regular-400.woff differ diff --git a/public/dgaAdmin/assets/fonts/fa-regular-400.woff2 b/public/dgaAdmin/assets/fonts/fa-regular-400.woff2 new file mode 100644 index 0000000..0332a9b Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-regular-400.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/fa-solid-900.eot b/public/dgaAdmin/assets/fonts/fa-solid-900.eot new file mode 100644 index 0000000..5da4fa0 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-solid-900.eot differ diff --git a/public/dgaAdmin/assets/fonts/fa-solid-900.svg b/public/dgaAdmin/assets/fonts/fa-solid-900.svg new file mode 100644 index 0000000..313b311 --- /dev/null +++ b/public/dgaAdmin/assets/fonts/fa-solid-900.svg @@ -0,0 +1,5028 @@ + + + + +Created by FontForge 20200314 at Mon Oct 5 09:50:45 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/dgaAdmin/assets/fonts/fa-solid-900.ttf b/public/dgaAdmin/assets/fonts/fa-solid-900.ttf new file mode 100644 index 0000000..e074608 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-solid-900.ttf differ diff --git a/public/dgaAdmin/assets/fonts/fa-solid-900.woff b/public/dgaAdmin/assets/fonts/fa-solid-900.woff new file mode 100644 index 0000000..ef6b447 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-solid-900.woff differ diff --git a/public/dgaAdmin/assets/fonts/fa-solid-900.woff2 b/public/dgaAdmin/assets/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000..120b300 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/fa-solid-900.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/summernote.eot b/public/dgaAdmin/assets/fonts/summernote.eot new file mode 100644 index 0000000..4f047db Binary files /dev/null and b/public/dgaAdmin/assets/fonts/summernote.eot differ diff --git a/public/dgaAdmin/assets/fonts/summernote.ttf b/public/dgaAdmin/assets/fonts/summernote.ttf new file mode 100644 index 0000000..64ef84c Binary files /dev/null and b/public/dgaAdmin/assets/fonts/summernote.ttf differ diff --git a/public/dgaAdmin/assets/fonts/summernote.woff b/public/dgaAdmin/assets/fonts/summernote.woff new file mode 100644 index 0000000..dfd4f66 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/summernote.woff differ diff --git a/public/dgaAdmin/assets/fonts/summernote.woff2 b/public/dgaAdmin/assets/fonts/summernote.woff2 new file mode 100644 index 0000000..40b2030 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/summernote.woff2 differ diff --git a/public/dgaAdmin/assets/fonts/themify.eot b/public/dgaAdmin/assets/fonts/themify.eot new file mode 100644 index 0000000..9ec298b Binary files /dev/null and b/public/dgaAdmin/assets/fonts/themify.eot differ diff --git a/public/dgaAdmin/assets/fonts/themify.svg b/public/dgaAdmin/assets/fonts/themify.svg new file mode 100644 index 0000000..3d53854 --- /dev/null +++ b/public/dgaAdmin/assets/fonts/themify.svg @@ -0,0 +1,362 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/dgaAdmin/assets/fonts/themify.ttf b/public/dgaAdmin/assets/fonts/themify.ttf new file mode 100644 index 0000000..5d627e7 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/themify.ttf differ diff --git a/public/dgaAdmin/assets/fonts/themify.woff b/public/dgaAdmin/assets/fonts/themify.woff new file mode 100644 index 0000000..847ebd1 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/themify.woff differ diff --git a/public/dgaAdmin/assets/fonts/tinymce-mobile.woff b/public/dgaAdmin/assets/fonts/tinymce-mobile.woff new file mode 100644 index 0000000..1e3be03 Binary files /dev/null and b/public/dgaAdmin/assets/fonts/tinymce-mobile.woff differ diff --git a/public/dgaAdmin/assets/images/jsTree/32px-dark.png b/public/dgaAdmin/assets/images/jsTree/32px-dark.png new file mode 100644 index 0000000..3fb48ef Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/32px-dark.png differ diff --git a/public/dgaAdmin/assets/images/jsTree/32px.png b/public/dgaAdmin/assets/images/jsTree/32px.png new file mode 100644 index 0000000..3f31d50 Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/32px.png differ diff --git a/public/dgaAdmin/assets/images/jsTree/40px-dark.png b/public/dgaAdmin/assets/images/jsTree/40px-dark.png new file mode 100644 index 0000000..aae89ad Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/40px-dark.png differ diff --git a/public/dgaAdmin/assets/images/jsTree/40px.png b/public/dgaAdmin/assets/images/jsTree/40px.png new file mode 100644 index 0000000..2a3fcb9 Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/40px.png differ diff --git a/public/dgaAdmin/assets/images/jsTree/throbber-dark.gif b/public/dgaAdmin/assets/images/jsTree/throbber-dark.gif new file mode 100644 index 0000000..169062c Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/throbber-dark.gif differ diff --git a/public/dgaAdmin/assets/images/jsTree/throbber.gif b/public/dgaAdmin/assets/images/jsTree/throbber.gif new file mode 100644 index 0000000..cf06c1a Binary files /dev/null and b/public/dgaAdmin/assets/images/jsTree/throbber.gif differ diff --git a/public/dgaAdmin/assets/js/bundle.js b/public/dgaAdmin/assets/js/bundle.js new file mode 100644 index 0000000..ceeaa4a --- /dev/null +++ b/public/dgaAdmin/assets/js/bundle.js @@ -0,0 +1 @@ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,(function(e,t){"use strict";var n=[],i=Object.getPrototypeOf,r=n.slice,o=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},a=n.push,s=n.indexOf,l={},c=l.toString,u=l.hasOwnProperty,d=u.toString,h=d.call(Object),f={},p=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},g=function(e){return null!=e&&e===e.window},m=e.document,v={type:!0,src:!0,nonce:!0,noModule:!0};function y(e,t,n){var i,r,o=(n=n||m).createElement("script");if(o.text=e,t)for(i in v)(r=t[i]||t.getAttribute&&t.getAttribute(i))&&o.setAttribute(i,r);n.head.appendChild(o).parentNode.removeChild(o)}function b(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var w="3.6.0",x=function(e,t){return new x.fn.init(e,t)};function _(e){var t=!!e&&"length"in e&&e.length,n=b(e);return!p(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+F+")"+F+"*"),q=new RegExp(F+"|>"),V=new RegExp(z),Y=new RegExp("^"+R+"$"),X={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+$),PSEUDO:new RegExp("^"+z),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+F+"*(even|odd|(([+-]|)(\\d*)n|)"+F+"*(?:([+-]|)"+F+"*(\\d+)|))"+F+"*\\)|)","i"),bool:new RegExp("^(?:"+N+")$","i"),needsContext:new RegExp("^"+F+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+F+"*((?:-\\d)?\\d*)"+F+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,K=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+F+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,re=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){h()},ae=we((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{L.apply(O=P.call(x.childNodes),x.childNodes),O[x.childNodes.length].nodeType}catch(t){L={apply:O.length?function(e,t){I.apply(e,P.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function se(e,t,i,r){var o,s,c,u,d,p,v,y=t&&t.ownerDocument,x=t?t.nodeType:9;if(i=i||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return i;if(!r&&(h(t),t=t||f,g)){if(11!==x&&(d=J.exec(e)))if(o=d[1]){if(9===x){if(!(c=t.getElementById(o)))return i;if(c.id===o)return i.push(c),i}else if(y&&(c=y.getElementById(o))&&b(t,c)&&c.id===o)return i.push(c),i}else{if(d[2])return L.apply(i,t.getElementsByTagName(e)),i;if((o=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(i,t.getElementsByClassName(o)),i}if(n.qsa&&!A[e+" "]&&(!m||!m.test(e))&&(1!==x||"object"!==t.nodeName.toLowerCase())){if(v=e,y=t,1===x&&(q.test(e)||U.test(e))){for((y=ee.test(e)&&ve(t.parentNode)||t)===t&&n.scope||((u=t.getAttribute("id"))?u=u.replace(ie,re):t.setAttribute("id",u=w)),s=(p=a(e)).length;s--;)p[s]=(u?"#"+u:":scope")+" "+be(p[s]);v=p.join(",")}try{return L.apply(i,y.querySelectorAll(v)),i}catch(t){A(e,!0)}finally{u===w&&t.removeAttribute("id")}}}return l(e.replace(B,"$1"),t,i,r)}function le(){var e=[];return function t(n,r){return e.push(n+" ")>i.cacheLength&&delete t[e.shift()],t[n+" "]=r}}function ce(e){return e[w]=!0,e}function ue(e){var t=f.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),r=n.length;r--;)i.attrHandle[n[r]]=t}function he(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ge(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ae(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function me(e){return ce((function(t){return t=+t,ce((function(n,i){for(var r,o=e([],n.length,t),a=o.length;a--;)n[r=o[a]]&&(n[r]=!(i[r]=n[r]))}))}))}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=se.support={},o=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!G.test(t||n&&n.nodeName||"HTML")},h=se.setDocument=function(e){var t,r,a=e?e.ownerDocument||e:x;return a!=f&&9===a.nodeType&&a.documentElement&&(p=(f=a).documentElement,g=!o(f),x!=f&&(r=f.defaultView)&&r.top!==r&&(r.addEventListener?r.addEventListener("unload",oe,!1):r.attachEvent&&r.attachEvent("onunload",oe)),n.scope=ue((function(e){return p.appendChild(e).appendChild(f.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),n.attributes=ue((function(e){return e.className="i",!e.getAttribute("className")})),n.getElementsByTagName=ue((function(e){return e.appendChild(f.createComment("")),!e.getElementsByTagName("*").length})),n.getElementsByClassName=Z.test(f.getElementsByClassName),n.getById=ue((function(e){return p.appendChild(e).id=w,!f.getElementsByName||!f.getElementsByName(w).length})),n.getById?(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(i.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},i.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),i.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],r=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[r++];)1===n.nodeType&&i.push(n);return i}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],m=[],(n.qsa=Z.test(f.querySelectorAll))&&(ue((function(e){var t;p.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+F+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+F+"*(?:value|"+N+")"),e.querySelectorAll("[id~="+w+"-]").length||m.push("~="),(t=f.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+F+"*name"+F+"*="+F+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+w+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")})),ue((function(e){e.innerHTML="";var t=f.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+F+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),p.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")}))),(n.matchesSelector=Z.test(y=p.matches||p.webkitMatchesSelector||p.mozMatchesSelector||p.oMatchesSelector||p.msMatchesSelector))&&ue((function(e){n.disconnectedMatch=y.call(e,"*"),y.call(e,"[s!='']:x"),v.push("!=",z)})),m=m.length&&new RegExp(m.join("|")),v=v.length&&new RegExp(v.join("|")),t=Z.test(p.compareDocumentPosition),b=t||Z.test(p.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},E=t?function(e,t){if(e===t)return d=!0,0;var i=!e.compareDocumentPosition-!t.compareDocumentPosition;return i||(1&(i=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===i?e==f||e.ownerDocument==x&&b(x,e)?-1:t==f||t.ownerDocument==x&&b(x,t)?1:u?j(u,e)-j(u,t):0:4&i?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,i=0,r=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!r||!o)return e==f?-1:t==f?1:r?-1:o?1:u?j(u,e)-j(u,t):0;if(r===o)return he(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[i]===s[i];)i++;return i?he(a[i],s[i]):a[i]==x?-1:s[i]==x?1:0}),f},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(h(e),n.matchesSelector&&g&&!A[t+" "]&&(!v||!v.test(t))&&(!m||!m.test(t)))try{var i=y.call(e,t);if(i||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return i}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return X.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=new RegExp("(^|"+F+")"+e+"("+F+"|$)"))&&C(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(i){var r=se.attr(i,e);return null==r?"!="===t:!t||(r+="","="===t?r===n:"!="===t?r!==n:"^="===t?n&&0===r.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,t,n){return p(t)?x.grep(e,(function(e,i){return!!t.call(e,i,e)!==n})):t.nodeType?x.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?x.grep(e,(function(e){return-1)[^>]*|#([\w-]+))$/;(x.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||O,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:M.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),E.test(i[1])&&x.isPlainObject(t))for(i in t)p(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=m.getElementById(i[2]))&&(this[0]=r,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):p(e)?void 0!==n.ready?n.ready(e):e(x):x.makeArray(e,this)}).prototype=x.fn,O=x(m);var I=/^(?:parents|prev(?:Until|All))/,L={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}x.fn.extend({has:function(e){var t=x(e,this),n=t.length;return this.filter((function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;ue=m.createDocumentFragment().appendChild(m.createElement("div")),(de=m.createElement("input")).setAttribute("type","radio"),de.setAttribute("checked","checked"),de.setAttribute("name","t"),ue.appendChild(de),f.checkClone=ue.cloneNode(!0).cloneNode(!0).lastChild.checked,ue.innerHTML="",f.noCloneChecked=!!ue.cloneNode(!0).lastChild.defaultValue,ue.innerHTML="",f.option=!!ue.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function me(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?x.merge([e],n):n}function ve(e,t){for(var n=0,i=e.length;n",""]);var ye=/<|&#?\w+;/;function be(e,t,n,i,r){for(var o,a,s,l,c,u,d=t.createDocumentFragment(),h=[],f=0,p=e.length;f\s*$/g;function De(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&x(e).children("tbody")[0]||e}function Oe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Me(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ie(e,t){var n,i,r,o,a,s;if(1===t.nodeType){if(G.hasData(e)&&(s=G.get(e).events))for(r in G.remove(t,"handle events"),s)for(n=0,i=s[r].length;n").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&r("error"===e.type?404:200,e.type)}),m.head.appendChild(t[0])},abort:function(){n&&n()}}}));var Wt,Ut=[],qt=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Ut.pop()||x.expando+"_"+xt.guid++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",(function(t,n,i){var r,o,a,s=!1!==t.jsonp&&(qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return r=t.jsonpCallback=p(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(qt,"$1"+r):!1!==t.jsonp&&(t.url+=(_t.test(t.url)?"&":"?")+t.jsonp+"="+r),t.converters["script json"]=function(){return a||x.error(r+" was not called"),a[0]},t.dataTypes[0]="json",o=e[r],e[r]=function(){a=arguments},i.always((function(){void 0===o?x(e).removeProp(r):e[r]=o,t[r]&&(t.jsonpCallback=n.jsonpCallback,Ut.push(r)),a&&p(o)&&o(a[0]),a=o=void 0})),"script"})),f.createHTMLDocument=((Wt=m.implementation.createHTMLDocument("").body).innerHTML="
",2===Wt.childNodes.length),x.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(f.createHTMLDocument?((i=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(i)):t=m),o=!n&&[],(r=E.exec(e))?[t.createElement(r[1])]:(r=be([e],t,o),o&&o.length&&x(o).remove(),x.merge([],r.childNodes)));var i,r,o},x.fn.load=function(e,t,n){var i,r,o,a=this,s=e.indexOf(" ");return-1").append(x.parseHTML(e)).find(i):e)})).always(n&&function(e,t){a.each((function(){n.apply(this,o||[e.responseText,t,e])}))}),this},x.expr.pseudos.animated=function(e){return x.grep(x.timers,(function(t){return e===t.elem})).length},x.offset={setOffset:function(e,t,n){var i,r,o,a,s,l,c=x.css(e,"position"),u=x(e),d={};"static"===c&&(e.style.position="relative"),s=u.offset(),o=x.css(e,"top"),l=x.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(o+l).indexOf("auto")?(a=(i=u.position()).top,r=i.left):(a=parseFloat(o)||0,r=parseFloat(l)||0),p(t)&&(t=t.call(e,n,x.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+r),"using"in t?t.using.call(e,d):u.css(d)}},x.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each((function(t){x.offset.setOffset(this,e,t)}));var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],r={top:0,left:0};if("fixed"===x.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===x.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((r=x(e).offset()).top+=x.css(e,"borderTopWidth",!0),r.left+=x.css(e,"borderLeftWidth",!0))}return{top:t.top-r.top-x.css(i,"marginTop",!0),left:t.left-r.left-x.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map((function(){for(var e=this.offsetParent;e&&"static"===x.css(e,"position");)e=e.offsetParent;return e||ie}))}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},(function(e,t){var n="pageYOffset"===t;x.fn[e]=function(i){return B(this,(function(e,i,r){var o;if(g(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===r)return o?o[t]:e[i];o?o.scrollTo(n?o.pageXOffset:r,n?r:o.pageYOffset):e[i]=r}),e,i,arguments.length)}})),x.each(["top","left"],(function(e,t){x.cssHooks[t]=ze(f.pixelPosition,(function(e,n){if(n)return n=$e(e,t),je.test(n)?x(e).position()[t]+"px":n}))})),x.each({Height:"height",Width:"width"},(function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},(function(n,i){x.fn[i]=function(r,o){var a=arguments.length&&(n||"boolean"!=typeof r),s=n||(!0===r||!0===o?"margin":"border");return B(this,(function(t,n,r){var o;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===r?x.css(t,n,s):x.style(t,n,r,s)}),t,a?r:void 0,a)}}))})),x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],(function(e,t){x.fn[t]=function(e){return this.on(t,e)}})),x.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,i){return this.on(t,e,n,i)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),(function(e,t){x.fn[t]=function(e,n){return 0{let t=e.getAttribute("data-bs-target");if(!t||"#"===t){let n=e.getAttribute("href");if(!n||!n.includes("#")&&!n.startsWith("."))return null;n.includes("#")&&!n.startsWith("#")&&(n="#"+n.split("#")[1]),t=n&&"#"!==n?n.trim():null}return t},n=e=>{const n=t(e);return n&&document.querySelector(n)?n:null},i=e=>{const n=t(e);return n?document.querySelector(n):null},r=t=>{t.dispatchEvent(new Event(e))},o=e=>!(!e||"object"!=typeof e)&&(void 0!==e.jquery&&(e=e[0]),void 0!==e.nodeType),a=e=>o(e)?e.jquery?e[0]:e:"string"==typeof e&&e.length>0?document.querySelector(e):null,s=(e,t,n)=>{Object.keys(n).forEach(i=>{const r=n[i],a=t[i],s=a&&o(a)?"element":null==(l=a)?""+l:{}.toString.call(l).match(/\s([a-z]+)/i)[1].toLowerCase();var l;if(!new RegExp(r).test(s))throw new TypeError(`${e.toUpperCase()}: Option "${i}" provided type "${s}" but expected type "${r}".`)})},l=e=>!(!o(e)||0===e.getClientRects().length)&&"visible"===getComputedStyle(e).getPropertyValue("visibility"),c=e=>!e||e.nodeType!==Node.ELEMENT_NODE||!!e.classList.contains("disabled")||(void 0!==e.disabled?e.disabled:e.hasAttribute("disabled")&&"false"!==e.getAttribute("disabled")),u=e=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){const t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?u(e.parentNode):null},d=()=>{},h=e=>{e.offsetHeight},f=()=>{const{jQuery:e}=window;return e&&!document.body.hasAttribute("data-bs-no-jquery")?e:null},p=[],g=()=>"rtl"===document.documentElement.dir,m=e=>{var t;t=()=>{const t=f();if(t){const n=e.NAME,i=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=i,e.jQueryInterface)}},"loading"===document.readyState?(p.length||document.addEventListener("DOMContentLoaded",()=>{p.forEach(e=>e())}),p.push(t)):t()},v=e=>{"function"==typeof e&&e()},y=(t,n,i=!0)=>{if(!i)return void v(t);const o=(e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);const i=Number.parseFloat(t),r=Number.parseFloat(n);return i||r?(t=t.split(",")[0],n=n.split(",")[0],1e3*(Number.parseFloat(t)+Number.parseFloat(n))):0})(n)+5;let a=!1;const s=({target:i})=>{i===n&&(a=!0,n.removeEventListener(e,s),v(t))};n.addEventListener(e,s),setTimeout(()=>{a||r(n)},o)},b=(e,t,n,i)=>{let r=e.indexOf(t);if(-1===r)return e[!n&&i?e.length-1:0];const o=e.length;return r+=n?1:-1,i&&(r=(r+o)%o),e[Math.max(0,Math.min(r,o-1))]},w=/[^.]*(?=\..*)\.|.*/,x=/\..*/,_=/::\d+$/,S={};let C=1;const k={mouseenter:"mouseover",mouseleave:"mouseout"},T=/^(mouseenter|mouseleave)/i,A=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function E(e,t){return t&&`${t}::${C++}`||e.uidEvent||C++}function D(e){const t=E(e);return e.uidEvent=t,S[t]=S[t]||{},S[t]}function O(e,t,n=null){const i=Object.keys(e);for(let r=0,o=i.length;rfunction(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)};i?i=e(i):n=e(n)}const[o,a,s]=M(t,n,i),l=D(e),c=l[s]||(l[s]={}),u=O(c,a,o?n:null);if(u)return void(u.oneOff=u.oneOff&&r);const d=E(a,t.replace(w,"")),h=o?function(e,t,n){return function i(r){const o=e.querySelectorAll(t);for(let{target:a}=r;a&&a!==this;a=a.parentNode)for(let s=o.length;s--;)if(o[s]===a)return r.delegateTarget=a,i.oneOff&&j.off(e,r.type,t,n),n.apply(a,[r]);return null}}(e,n,i):function(e,t){return function n(i){return i.delegateTarget=e,n.oneOff&&j.off(e,i.type,t),t.apply(e,[i])}}(e,n);h.delegationSelector=o?n:null,h.originalHandler=a,h.oneOff=r,h.uidEvent=d,c[d]=h,e.addEventListener(s,h,o)}function L(e,t,n,i,r){const o=O(t[n],i,r);o&&(e.removeEventListener(n,o,Boolean(r)),delete t[n][o.uidEvent])}function P(e){return e=e.replace(x,""),k[e]||e}const j={on(e,t,n,i){I(e,t,n,i,!1)},one(e,t,n,i){I(e,t,n,i,!0)},off(e,t,n,i){if("string"!=typeof t||!e)return;const[r,o,a]=M(t,n,i),s=a!==t,l=D(e),c=t.startsWith(".");if(void 0!==o){if(!l||!l[a])return;return void L(e,l,a,o,r?n:null)}c&&Object.keys(l).forEach(n=>{!function(e,t,n,i){const r=t[n]||{};Object.keys(r).forEach(o=>{if(o.includes(i)){const i=r[o];L(e,t,n,i.originalHandler,i.delegationSelector)}})}(e,l,n,t.slice(1))});const u=l[a]||{};Object.keys(u).forEach(n=>{const i=n.replace(_,"");if(!s||t.includes(i)){const t=u[n];L(e,l,a,t.originalHandler,t.delegationSelector)}})},trigger(e,t,n){if("string"!=typeof t||!e)return null;const i=f(),r=P(t),o=t!==r,a=A.has(r);let s,l=!0,c=!0,u=!1,d=null;return o&&i&&(s=i.Event(t,n),i(e).trigger(s),l=!s.isPropagationStopped(),c=!s.isImmediatePropagationStopped(),u=s.isDefaultPrevented()),a?(d=document.createEvent("HTMLEvents"),d.initEvent(r,l,!0)):d=new CustomEvent(t,{bubbles:l,cancelable:!0}),void 0!==n&&Object.keys(n).forEach(e=>{Object.defineProperty(d,e,{get:()=>n[e]})}),u&&d.preventDefault(),c&&e.dispatchEvent(d),d.defaultPrevented&&void 0!==s&&s.preventDefault(),d}},N=new Map,F={set(e,t,n){N.has(e)||N.set(e,new Map);const i=N.get(e);i.has(t)||0===i.size?i.set(t,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(e,t)=>N.has(e)&&N.get(e).get(t)||null,remove(e,t){if(!N.has(e))return;const n=N.get(e);n.delete(t),0===n.size&&N.delete(e)}};class R{constructor(e){(e=a(e))&&(this._element=e,F.set(this._element,this.constructor.DATA_KEY,this))}dispose(){F.remove(this._element,this.constructor.DATA_KEY),j.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(e=>{this[e]=null})}_queueCallback(e,t,n=!0){y(e,t,n)}static getInstance(e){return F.get(a(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,"object"==typeof t?t:null)}static get VERSION(){return"5.1.3"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}const $=(e,t="hide")=>{const n="click.dismiss"+e.EVENT_KEY,r=e.NAME;j.on(document,n,`[data-bs-dismiss="${r}"]`,(function(n){if(["A","AREA"].includes(this.tagName)&&n.preventDefault(),c(this))return;const o=i(this)||this.closest("."+r);e.getOrCreateInstance(o)[t]()}))};class z extends R{static get NAME(){return"alert"}close(){if(j.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const e=this._element.classList.contains("fade");this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),j.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(e){return this.each((function(){const t=z.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}}))}}$(z,"close"),m(z);const H='[data-bs-toggle="button"]';class B extends R{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(e){return this.each((function(){const t=B.getOrCreateInstance(this);"toggle"===e&&t[e]()}))}}function W(e){return"true"===e||"false"!==e&&(e===Number(e).toString()?Number(e):""===e||"null"===e?null:e)}function U(e){return e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase())}j.on(document,"click.bs.button.data-api",H,e=>{e.preventDefault();const t=e.target.closest(H);B.getOrCreateInstance(t).toggle()}),m(B);const q={setDataAttribute(e,t,n){e.setAttribute("data-bs-"+U(t),n)},removeDataAttribute(e,t){e.removeAttribute("data-bs-"+U(t))},getDataAttributes(e){if(!e)return{};const t={};return Object.keys(e.dataset).filter(e=>e.startsWith("bs")).forEach(n=>{let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),t[i]=W(e.dataset[n])}),t},getDataAttribute:(e,t)=>W(e.getAttribute("data-bs-"+U(t))),offset(e){const t=e.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}},position:e=>({top:e.offsetTop,left:e.offsetLeft})},V={find:(e,t=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(t,e)),findOne:(e,t=document.documentElement)=>Element.prototype.querySelector.call(t,e),children:(e,t)=>[].concat(...e.children).filter(e=>e.matches(t)),parents(e,t){const n=[];let i=e.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(t)&&n.push(i),i=i.parentNode;return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){const t=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(e=>e+':not([tabindex^="-"])').join(", ");return this.find(t,e).filter(e=>!c(e)&&l(e))}},Y="carousel",X={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},G={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},K="next",Q="prev",Z="left",J="right",ee={ArrowLeft:J,ArrowRight:Z},te="slid.bs.carousel",ne="active",ie=".active.carousel-item";class re extends R{constructor(e,t){super(e),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(t),this._indicatorsElement=V.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return X}static get NAME(){return Y}next(){this._slide(K)}nextWhenVisible(){!document.hidden&&l(this._element)&&this.next()}prev(){this._slide(Q)}pause(e){e||(this._isPaused=!0),V.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(r(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(e){this._activeElement=V.findOne(ie,this._element);const t=this._getItemIndex(this._activeElement);if(e>this._items.length-1||e<0)return;if(this._isSliding)return void j.one(this._element,te,()=>this.to(e));if(t===e)return this.pause(),void this.cycle();const n=e>t?K:Q;this._slide(n,this._items[e])}_getConfig(e){return e={...X,...q.getDataAttributes(this._element),..."object"==typeof e?e:{}},s(Y,e,G),e}_handleSwipe(){const e=Math.abs(this.touchDeltaX);if(e<=40)return;const t=e/this.touchDeltaX;this.touchDeltaX=0,t&&this._slide(t>0?J:Z)}_addEventListeners(){this._config.keyboard&&j.on(this._element,"keydown.bs.carousel",e=>this._keydown(e)),"hover"===this._config.pause&&(j.on(this._element,"mouseenter.bs.carousel",e=>this.pause(e)),j.on(this._element,"mouseleave.bs.carousel",e=>this.cycle(e))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const e=e=>this._pointerEvent&&("pen"===e.pointerType||"touch"===e.pointerType),t=t=>{e(t)?this.touchStartX=t.clientX:this._pointerEvent||(this.touchStartX=t.touches[0].clientX)},n=e=>{this.touchDeltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this.touchStartX},i=t=>{e(t)&&(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(e=>this.cycle(e),500+this._config.interval))};V.find(".carousel-item img",this._element).forEach(e=>{j.on(e,"dragstart.bs.carousel",e=>e.preventDefault())}),this._pointerEvent?(j.on(this._element,"pointerdown.bs.carousel",e=>t(e)),j.on(this._element,"pointerup.bs.carousel",e=>i(e)),this._element.classList.add("pointer-event")):(j.on(this._element,"touchstart.bs.carousel",e=>t(e)),j.on(this._element,"touchmove.bs.carousel",e=>n(e)),j.on(this._element,"touchend.bs.carousel",e=>i(e)))}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;const t=ee[e.key];t&&(e.preventDefault(),this._slide(t))}_getItemIndex(e){return this._items=e&&e.parentNode?V.find(".carousel-item",e.parentNode):[],this._items.indexOf(e)}_getItemByOrder(e,t){const n=e===K;return b(this._items,t,n,this._config.wrap)}_triggerSlideEvent(e,t){const n=this._getItemIndex(e),i=this._getItemIndex(V.findOne(ie,this._element));return j.trigger(this._element,"slide.bs.carousel",{relatedTarget:e,direction:t,from:i,to:n})}_setActiveIndicatorElement(e){if(this._indicatorsElement){const t=V.findOne(".active",this._indicatorsElement);t.classList.remove(ne),t.removeAttribute("aria-current");const n=V.find("[data-bs-target]",this._indicatorsElement);for(let t=0;t{j.trigger(this._element,te,{relatedTarget:o,direction:d,from:r,to:a})};if(this._element.classList.contains("slide")){o.classList.add(u),h(o),i.classList.add(c),o.classList.add(c);const e=()=>{o.classList.remove(c,u),o.classList.add(ne),i.classList.remove(ne,u,c),this._isSliding=!1,setTimeout(f,0)};this._queueCallback(e,i,!0)}else i.classList.remove(ne),o.classList.add(ne),this._isSliding=!1,f();s&&this.cycle()}_directionToOrder(e){return[J,Z].includes(e)?g()?e===Z?Q:K:e===Z?K:Q:e}_orderToDirection(e){return[K,Q].includes(e)?g()?e===Q?Z:J:e===Q?J:Z:e}static carouselInterface(e,t){const n=re.getOrCreateInstance(e,t);let{_config:i}=n;"object"==typeof t&&(i={...i,...t});const r="string"==typeof t?t:i.slide;if("number"==typeof t)n.to(t);else if("string"==typeof r){if(void 0===n[r])throw new TypeError(`No method named "${r}"`);n[r]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}static jQueryInterface(e){return this.each((function(){re.carouselInterface(this,e)}))}static dataApiClickHandler(e){const t=i(this);if(!t||!t.classList.contains("carousel"))return;const n={...q.getDataAttributes(t),...q.getDataAttributes(this)},r=this.getAttribute("data-bs-slide-to");r&&(n.interval=!1),re.carouselInterface(t,n),r&&re.getInstance(t).to(r),e.preventDefault()}}j.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",re.dataApiClickHandler),j.on(window,"load.bs.carousel.data-api",()=>{const e=V.find('[data-bs-ride="carousel"]');for(let t=0,n=e.length;te===this._element);null!==r&&o.length&&(this._selector=r,this._triggerArray.push(t))}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return ae}static get NAME(){return oe}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e,t=[];if(this._config.parent){const e=V.find(he,this._config.parent);t=V.find(".collapse.show, .collapse.collapsing",this._config.parent).filter(t=>!e.includes(t))}const n=V.findOne(this._selector);if(t.length){const i=t.find(e=>n!==e);if(e=i?pe.getInstance(i):null,e&&e._isTransitioning)return}if(j.trigger(this._element,"show.bs.collapse").defaultPrevented)return;t.forEach(t=>{n!==t&&pe.getOrCreateInstance(t,{toggle:!1}).hide(),e||F.set(t,"bs.collapse",null)});const i=this._getDimension();this._element.classList.remove(ce),this._element.classList.add(ue),this._element.style[i]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const r="scroll"+(i[0].toUpperCase()+i.slice(1));this._queueCallback(()=>{this._isTransitioning=!1,this._element.classList.remove(ue),this._element.classList.add(ce,le),this._element.style[i]="",j.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[i]=this._element[r]+"px"}hide(){if(this._isTransitioning||!this._isShown())return;if(j.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const e=this._getDimension();this._element.style[e]=this._element.getBoundingClientRect()[e]+"px",h(this._element),this._element.classList.add(ue),this._element.classList.remove(ce,le);const t=this._triggerArray.length;for(let e=0;e{this._isTransitioning=!1,this._element.classList.remove(ue),this._element.classList.add(ce),j.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}_isShown(e=this._element){return e.classList.contains(le)}_getConfig(e){return(e={...ae,...q.getDataAttributes(this._element),...e}).toggle=Boolean(e.toggle),e.parent=a(e.parent),s(oe,e,se),e}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const e=V.find(he,this._config.parent);V.find(fe,this._config.parent).filter(t=>!e.includes(t)).forEach(e=>{const t=i(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))})}_addAriaAndCollapsedClass(e,t){e.length&&e.forEach(e=>{t?e.classList.remove(de):e.classList.add(de),e.setAttribute("aria-expanded",t)})}static jQueryInterface(e){return this.each((function(){const t={};"string"==typeof e&&/show|hide/.test(e)&&(t.toggle=!1);const n=pe.getOrCreateInstance(this,t);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e]()}}))}}j.on(document,"click.bs.collapse.data-api",fe,(function(e){("A"===e.target.tagName||e.delegateTarget&&"A"===e.delegateTarget.tagName)&&e.preventDefault();const t=n(this);V.find(t).forEach(e=>{pe.getOrCreateInstance(e,{toggle:!1}).toggle()})})),m(pe);var ge="top",me="bottom",ve="right",ye="left",be="auto",we=[ge,me,ve,ye],xe="start",_e="end",Se="clippingParents",Ce="viewport",ke="popper",Te="reference",Ae=we.reduce((function(e,t){return e.concat([t+"-"+xe,t+"-"+_e])}),[]),Ee=[].concat(we,[be]).reduce((function(e,t){return e.concat([t,t+"-"+xe,t+"-"+_e])}),[]),De="beforeRead",Oe="afterRead",Me="beforeMain",Ie="afterMain",Le="beforeWrite",Pe="afterWrite",je=[De,"read",Oe,Me,"main",Ie,Le,"write",Pe];function Ne(e){return e?(e.nodeName||"").toLowerCase():null}function Fe(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Re(e){return e instanceof Fe(e).Element||e instanceof Element}function $e(e){return e instanceof Fe(e).HTMLElement||e instanceof HTMLElement}function ze(e){return"undefined"!=typeof ShadowRoot&&(e instanceof Fe(e).ShadowRoot||e instanceof ShadowRoot)}const He={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},i=t.attributes[e]||{},r=t.elements[e];$e(r)&&Ne(r)&&(Object.assign(r.style,n),Object.keys(i).forEach((function(e){var t=i[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var i=t.elements[e],r=t.attributes[e]||{},o=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});$e(i)&&Ne(i)&&(Object.assign(i.style,o),Object.keys(r).forEach((function(e){i.removeAttribute(e)})))}))}},requires:["computeStyles"]};function Be(e){return e.split("-")[0]}function We(e,t){var n=e.getBoundingClientRect();return{width:n.width/1,height:n.height/1,top:n.top/1,right:n.right/1,bottom:n.bottom/1,left:n.left/1,x:n.left/1,y:n.top/1}}function Ue(e){var t=We(e),n=e.offsetWidth,i=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-i)<=1&&(i=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:i}}function qe(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&ze(n)){var i=t;do{if(i&&e.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function Ve(e){return Fe(e).getComputedStyle(e)}function Ye(e){return["table","td","th"].indexOf(Ne(e))>=0}function Xe(e){return((Re(e)?e.ownerDocument:e.document)||window.document).documentElement}function Ge(e){return"html"===Ne(e)?e:e.assignedSlot||e.parentNode||(ze(e)?e.host:null)||Xe(e)}function Ke(e){return $e(e)&&"fixed"!==Ve(e).position?e.offsetParent:null}function Qe(e){for(var t=Fe(e),n=Ke(e);n&&Ye(n)&&"static"===Ve(n).position;)n=Ke(n);return n&&("html"===Ne(n)||"body"===Ne(n)&&"static"===Ve(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&$e(e)&&"fixed"===Ve(e).position)return null;for(var n=Ge(e);$e(n)&&["html","body"].indexOf(Ne(n))<0;){var i=Ve(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||t}function Ze(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}var Je=Math.max,et=Math.min,tt=Math.round;function nt(e,t,n){return Je(e,et(t,n))}function it(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function rt(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}const ot={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,i=e.name,r=e.options,o=n.elements.arrow,a=n.modifiersData.popperOffsets,s=Be(n.placement),l=Ze(s),c=[ye,ve].indexOf(s)>=0?"height":"width";if(o&&a){var u=function(e,t){return it("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:rt(e,we))}(r.padding,n),d=Ue(o),h="y"===l?ge:ye,f="y"===l?me:ve,p=n.rects.reference[c]+n.rects.reference[l]-a[l]-n.rects.popper[c],g=a[l]-n.rects.reference[l],m=Qe(o),v=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,y=p/2-g/2,b=u[h],w=v-d[c]-u[f],x=v/2-d[c]/2+y,_=nt(b,x,w),S=l;n.modifiersData[i]=((t={})[S]=_,t.centerOffset=_-x,t)}},effect:function(e){var t=e.state,n=e.options.element,i=void 0===n?"[data-popper-arrow]":n;null!=i&&("string"!=typeof i||(i=t.elements.popper.querySelector(i)))&&qe(t.elements.popper,i)&&(t.elements.arrow=i)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function at(e){return e.split("-")[1]}var st={top:"auto",right:"auto",bottom:"auto",left:"auto"};function lt(e){var t,n=e.popper,i=e.popperRect,r=e.placement,o=e.variation,a=e.offsets,s=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=!0===u?function(e){var t=e.x,n=e.y,i=window.devicePixelRatio||1;return{x:tt(tt(t*i)/i)||0,y:tt(tt(n*i)/i)||0}}(a):"function"==typeof u?u(a):a,h=d.x,f=void 0===h?0:h,p=d.y,g=void 0===p?0:p,m=a.hasOwnProperty("x"),v=a.hasOwnProperty("y"),y=ye,b=ge,w=window;if(c){var x=Qe(n),_="clientHeight",S="clientWidth";x===Fe(n)&&"static"!==Ve(x=Xe(n)).position&&"absolute"===s&&(_="scrollHeight",S="scrollWidth"),x=x,r!==ge&&(r!==ye&&r!==ve||o!==_e)||(b=me,g-=x[_]-i.height,g*=l?1:-1),r!==ye&&(r!==ge&&r!==me||o!==_e)||(y=ve,f-=x[S]-i.width,f*=l?1:-1)}var C,k=Object.assign({position:s},c&&st);return l?Object.assign({},k,((C={})[b]=v?"0":"",C[y]=m?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+g+"px)":"translate3d("+f+"px, "+g+"px, 0)",C)):Object.assign({},k,((t={})[b]=v?g+"px":"",t[y]=m?f+"px":"",t.transform="",t))}const ct={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,i=n.gpuAcceleration,r=void 0===i||i,o=n.adaptive,a=void 0===o||o,s=n.roundOffsets,l=void 0===s||s,c={placement:Be(t.placement),variation:at(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,lt(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,lt(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};var ut={passive:!0};const dt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,i=e.options,r=i.scroll,o=void 0===r||r,a=i.resize,s=void 0===a||a,l=Fe(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&c.forEach((function(e){e.addEventListener("scroll",n.update,ut)})),s&&l.addEventListener("resize",n.update,ut),function(){o&&c.forEach((function(e){e.removeEventListener("scroll",n.update,ut)})),s&&l.removeEventListener("resize",n.update,ut)}},data:{}};var ht={left:"right",right:"left",bottom:"top",top:"bottom"};function ft(e){return e.replace(/left|right|bottom|top/g,(function(e){return ht[e]}))}var pt={start:"end",end:"start"};function gt(e){return e.replace(/start|end/g,(function(e){return pt[e]}))}function mt(e){var t=Fe(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function vt(e){return We(Xe(e)).left+mt(e).scrollLeft}function yt(e){var t=Ve(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+i)}function bt(e,t){var n;void 0===t&&(t=[]);var i=function e(t){return["html","body","#document"].indexOf(Ne(t))>=0?t.ownerDocument.body:$e(t)&&yt(t)?t:e(Ge(t))}(e),r=i===(null==(n=e.ownerDocument)?void 0:n.body),o=Fe(i),a=r?[o].concat(o.visualViewport||[],yt(i)?i:[]):i,s=t.concat(a);return r?s:s.concat(bt(Ge(a)))}function wt(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function xt(e,t){return t===Ce?wt(function(e){var t=Fe(e),n=Xe(e),i=t.visualViewport,r=n.clientWidth,o=n.clientHeight,a=0,s=0;return i&&(r=i.width,o=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=i.offsetLeft,s=i.offsetTop)),{width:r,height:o,x:a+vt(e),y:s}}(e)):$e(t)?function(e){var t=We(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):wt(function(e){var t,n=Xe(e),i=mt(e),r=null==(t=e.ownerDocument)?void 0:t.body,o=Je(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),a=Je(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),s=-i.scrollLeft+vt(e),l=-i.scrollTop;return"rtl"===Ve(r||n).direction&&(s+=Je(n.clientWidth,r?r.clientWidth:0)-o),{width:o,height:a,x:s,y:l}}(Xe(e)))}function _t(e){var t,n=e.reference,i=e.element,r=e.placement,o=r?Be(r):null,a=r?at(r):null,s=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(o){case ge:t={x:s,y:n.y-i.height};break;case me:t={x:s,y:n.y+n.height};break;case ve:t={x:n.x+n.width,y:l};break;case ye:t={x:n.x-i.width,y:l};break;default:t={x:n.x,y:n.y}}var c=o?Ze(o):null;if(null!=c){var u="y"===c?"height":"width";switch(a){case xe:t[c]=t[c]-(n[u]/2-i[u]/2);break;case _e:t[c]=t[c]+(n[u]/2-i[u]/2)}}return t}function St(e,t){void 0===t&&(t={});var n=t,i=n.placement,r=void 0===i?e.placement:i,o=n.boundary,a=void 0===o?Se:o,s=n.rootBoundary,l=void 0===s?Ce:s,c=n.elementContext,u=void 0===c?ke:c,d=n.altBoundary,h=void 0!==d&&d,f=n.padding,p=void 0===f?0:f,g=it("number"!=typeof p?p:rt(p,we)),m=u===ke?Te:ke,v=e.rects.popper,y=e.elements[h?m:u],b=function(e,t,n){var i="clippingParents"===t?function(e){var t=bt(Ge(e)),n=["absolute","fixed"].indexOf(Ve(e).position)>=0&&$e(e)?Qe(e):e;return Re(n)?t.filter((function(e){return Re(e)&&qe(e,n)&&"body"!==Ne(e)})):[]}(e):[].concat(t),r=[].concat(i,[n]),o=r[0],a=r.reduce((function(t,n){var i=xt(e,n);return t.top=Je(i.top,t.top),t.right=et(i.right,t.right),t.bottom=et(i.bottom,t.bottom),t.left=Je(i.left,t.left),t}),xt(e,o));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Re(y)?y:y.contextElement||Xe(e.elements.popper),a,l),w=We(e.elements.reference),x=_t({reference:w,element:v,strategy:"absolute",placement:r}),_=wt(Object.assign({},v,x)),S=u===ke?_:w,C={top:b.top-S.top+g.top,bottom:S.bottom-b.bottom+g.bottom,left:b.left-S.left+g.left,right:S.right-b.right+g.right},k=e.modifiersData.offset;if(u===ke&&k){var T=k[r];Object.keys(C).forEach((function(e){var t=[ve,me].indexOf(e)>=0?1:-1,n=[ge,me].indexOf(e)>=0?"y":"x";C[e]+=T[n]*t}))}return C}const Ct={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,i=e.name;if(!t.modifiersData[i]._skip){for(var r=n.mainAxis,o=void 0===r||r,a=n.altAxis,s=void 0===a||a,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,h=n.altBoundary,f=n.flipVariations,p=void 0===f||f,g=n.allowedAutoPlacements,m=t.options.placement,v=Be(m),y=l||(v!==m&&p?function(e){if(Be(e)===be)return[];var t=ft(e);return[gt(e),t,gt(t)]}(m):[ft(m)]),b=[m].concat(y).reduce((function(e,n){return e.concat(Be(n)===be?function(e,t){void 0===t&&(t={});var n=t,i=n.placement,r=n.boundary,o=n.rootBoundary,a=n.padding,s=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?Ee:l,u=at(i),d=u?s?Ae:Ae.filter((function(e){return at(e)===u})):we,h=d.filter((function(e){return c.indexOf(e)>=0}));0===h.length&&(h=d);var f=h.reduce((function(t,n){return t[n]=St(e,{placement:n,boundary:r,rootBoundary:o,padding:a})[Be(n)],t}),{});return Object.keys(f).sort((function(e,t){return f[e]-f[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),w=t.rects.reference,x=t.rects.popper,_=new Map,S=!0,C=b[0],k=0;k=0,O=D?"width":"height",M=St(t,{placement:T,boundary:u,rootBoundary:d,altBoundary:h,padding:c}),I=D?E?ve:ye:E?me:ge;w[O]>x[O]&&(I=ft(I));var L=ft(I),P=[];if(o&&P.push(M[A]<=0),s&&P.push(M[I]<=0,M[L]<=0),P.every((function(e){return e}))){C=T,S=!1;break}_.set(T,P)}if(S)for(var j=function(e){var t=b.find((function(t){var n=_.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return C=t,"break"},N=p?3:1;N>0&&"break"!==j(N);N--);t.placement!==C&&(t.modifiersData[i]._skip=!0,t.placement=C,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function kt(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Tt(e){return[ge,ve,me,ye].some((function(t){return e[t]>=0}))}const At={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,i=t.rects.reference,r=t.rects.popper,o=t.modifiersData.preventOverflow,a=St(t,{elementContext:"reference"}),s=St(t,{altBoundary:!0}),l=kt(a,i),c=kt(s,r,o),u=Tt(l),d=Tt(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,i=e.name,r=n.offset,o=void 0===r?[0,0]:r,a=Ee.reduce((function(e,n){return e[n]=function(e,t,n){var i=Be(e),r=[ye,ge].indexOf(i)>=0?-1:1,o="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=o[0],s=o[1];return a=a||0,s=(s||0)*r,[ye,ve].indexOf(i)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,o),e}),{}),s=a[t.placement],l=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[i]=a}},Dt={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=_t({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},Ot={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,i=e.name,r=n.mainAxis,o=void 0===r||r,a=n.altAxis,s=void 0!==a&&a,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,h=n.tether,f=void 0===h||h,p=n.tetherOffset,g=void 0===p?0:p,m=St(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),v=Be(t.placement),y=at(t.placement),b=!y,w=Ze(v),x="x"===w?"y":"x",_=t.modifiersData.popperOffsets,S=t.rects.reference,C=t.rects.popper,k="function"==typeof g?g(Object.assign({},t.rects,{placement:t.placement})):g,T={x:0,y:0};if(_){if(o||s){var A="y"===w?ge:ye,E="y"===w?me:ve,D="y"===w?"height":"width",O=_[w],M=_[w]+m[A],I=_[w]-m[E],L=f?-C[D]/2:0,P=y===xe?S[D]:C[D],j=y===xe?-C[D]:-S[D],N=t.elements.arrow,F=f&&N?Ue(N):{width:0,height:0},R=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},$=R[A],z=R[E],H=nt(0,S[D],F[D]),B=b?S[D]/2-L-H-$-k:P-H-$-k,W=b?-S[D]/2+L+H+z+k:j+H+z+k,U=t.elements.arrow&&Qe(t.elements.arrow),q=U?"y"===w?U.clientTop||0:U.clientLeft||0:0,V=t.modifiersData.offset?t.modifiersData.offset[t.placement][w]:0,Y=_[w]+B-V-q,X=_[w]+W-V;if(o){var G=nt(f?et(M,Y):M,O,f?Je(I,X):I);_[w]=G,T[w]=G-O}if(s){var K="x"===w?ge:ye,Q="x"===w?me:ve,Z=_[x],J=Z+m[K],ee=Z-m[Q],te=nt(f?et(J,Y):J,Z,f?Je(ee,X):ee);_[x]=te,T[x]=te-Z}}t.modifiersData[i]=T}},requiresIfExists:["offset"]};function Mt(e,t,n){void 0===n&&(n=!1);var i=$e(t);$e(t)&&function(e){var t=e.getBoundingClientRect();t.width,e.offsetWidth,t.height,e.offsetHeight}(t);var r,o,a=Xe(t),s=We(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(i||!i&&!n)&&(("body"!==Ne(t)||yt(a))&&(l=(r=t)!==Fe(r)&&$e(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:mt(r)),$e(t)?((c=We(t)).x+=t.clientLeft,c.y+=t.clientTop):a&&(c.x=vt(a))),{x:s.left+l.scrollLeft-c.x,y:s.top+l.scrollTop-c.y,width:s.width,height:s.height}}function It(e){var t=new Map,n=new Set,i=[];return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||function e(r){n.add(r.name),[].concat(r.requires||[],r.requiresIfExists||[]).forEach((function(i){if(!n.has(i)){var r=t.get(i);r&&e(r)}})),i.push(r)}(e)})),i}var Lt={placement:"bottom",modifiers:[],strategy:"absolute"};function Pt(){for(var e=arguments.length,t=new Array(e),n=0;nj.on(e,"mouseover",d)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Yt),this._element.classList.add(Yt),j.trigger(this._element,"shown.bs.dropdown",e)}hide(){if(c(this._element)||!this._isShown(this._menu))return;const e={relatedTarget:this._element};this._completeHide(e)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(e){j.trigger(this._element,"hide.bs.dropdown",e).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>j.off(e,"mouseover",d)),this._popper&&this._popper.destroy(),this._menu.classList.remove(Yt),this._element.classList.remove(Yt),this._element.setAttribute("aria-expanded","false"),q.removeDataAttribute(this._menu,"popper"),j.trigger(this._element,"hidden.bs.dropdown",e))}_getConfig(e){if(e={...this.constructor.Default,...q.getDataAttributes(this._element),...e},s(zt,e,this.constructor.DefaultType),"object"==typeof e.reference&&!o(e.reference)&&"function"!=typeof e.reference.getBoundingClientRect)throw new TypeError(zt.toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return e}_createPopper(e){if(void 0===$t)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=e:o(this._config.reference)?t=a(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const n=this._getPopperConfig(),i=n.modifiers.find(e=>"applyStyles"===e.name&&!1===e.enabled);this._popper=Rt(t,this._menu,n),i&&q.setDataAttribute(this._menu,"popper","static")}_isShown(e=this._element){return e.classList.contains(Yt)}_getMenuElement(){return V.next(this._element,Gt)[0]}_getPlacement(){const e=this._element.parentNode;if(e.classList.contains("dropend"))return en;if(e.classList.contains("dropstart"))return tn;const t="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return e.classList.contains("dropup")?t?Qt:Kt:t?Jt:Zt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_getPopperConfig(){const e={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(e.modifiers=[{name:"applyStyles",enabled:!1}]),{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_selectMenuItem({key:e,target:t}){const n=V.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(l);n.length&&b(n,t,e===Wt,!n.includes(t)).focus()}static jQueryInterface(e){return this.each((function(){const t=on.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}}))}static clearMenus(e){if(e&&(2===e.button||"keyup"===e.type&&"Tab"!==e.key))return;const t=V.find(Xt);for(let n=0,i=t.length;nt+e),this._setElementAttributes(an,"paddingRight",t=>t+e),this._setElementAttributes(sn,"marginRight",t=>t-e)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(e,t,n){const i=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+i)return;this._saveInitialAttribute(e,t);const r=window.getComputedStyle(e)[t];e.style[t]=n(Number.parseFloat(r))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(an,"paddingRight"),this._resetElementAttributes(sn,"marginRight")}_saveInitialAttribute(e,t){const n=e.style[t];n&&q.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{const n=q.getDataAttribute(e,t);void 0===n?e.style.removeProperty(t):(q.removeDataAttribute(e,t),e.style[t]=n)})}_applyManipulationCallback(e,t){o(e)?t(e):V.find(e,this._element).forEach(t)}isOverflowing(){return this.getWidth()>0}}const cn={className:"modal-backdrop",isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},un={className:"string",isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"},dn="mousedown.bs.backdrop";class hn{constructor(e){this._config=this._getConfig(e),this._isAppended=!1,this._element=null}show(e){this._config.isVisible?(this._append(),this._config.isAnimated&&h(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{v(e)})):v(e)}hide(e){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),v(e)})):v(e)}_getElement(){if(!this._element){const e=document.createElement("div");e.className=this._config.className,this._config.isAnimated&&e.classList.add("fade"),this._element=e}return this._element}_getConfig(e){return(e={...cn,..."object"==typeof e?e:{}}).rootElement=a(e.rootElement),s("backdrop",e,un),e}_append(){this._isAppended||(this._config.rootElement.append(this._getElement()),j.on(this._getElement(),dn,()=>{v(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(j.off(this._element,dn),this._element.remove(),this._isAppended=!1)}_emulateAnimation(e){y(e,this._getElement(),this._config.isAnimated)}}const fn={trapElement:null,autofocus:!0},pn={trapElement:"element",autofocus:"boolean"},gn=".bs.focustrap",mn="backward";class vn{constructor(e){this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}activate(){const{trapElement:e,autofocus:t}=this._config;this._isActive||(t&&e.focus(),j.off(document,gn),j.on(document,"focusin.bs.focustrap",e=>this._handleFocusin(e)),j.on(document,"keydown.tab.bs.focustrap",e=>this._handleKeydown(e)),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,j.off(document,gn))}_handleFocusin(e){const{target:t}=e,{trapElement:n}=this._config;if(t===document||t===n||n.contains(t))return;const i=V.focusableChildren(n);0===i.length?n.focus():this._lastTabNavDirection===mn?i[i.length-1].focus():i[0].focus()}_handleKeydown(e){"Tab"===e.key&&(this._lastTabNavDirection=e.shiftKey?mn:"forward")}_getConfig(e){return e={...fn,..."object"==typeof e?e:{}},s("focustrap",e,pn),e}}const yn={backdrop:!0,keyboard:!0,focus:!0},bn={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"},wn="hidden.bs.modal",xn="show.bs.modal",_n="resize.bs.modal",Sn="click.dismiss.bs.modal",Cn="keydown.dismiss.bs.modal",kn="mousedown.dismiss.bs.modal",Tn="modal-open",An="modal-static";class En extends R{constructor(e,t){super(e),this._config=this._getConfig(t),this._dialog=V.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new ln}static get Default(){return yn}static get NAME(){return"modal"}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||j.trigger(this._element,xn,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),j.on(this._dialog,kn,()=>{j.one(this._element,"mouseup.dismiss.bs.modal",e=>{e.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(e)))}hide(){if(!this._isShown||this._isTransitioning)return;if(j.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),this._focustrap.deactivate(),this._element.classList.remove("show"),j.off(this._element,Sn),j.off(this._dialog,kn),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(e=>j.off(e,".bs.modal")),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new hn({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new vn({trapElement:this._element})}_getConfig(e){return e={...yn,...q.getDataAttributes(this._element),..."object"==typeof e?e:{}},s("modal",e,bn),e}_showElement(e){const t=this._isAnimated(),n=V.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,n&&(n.scrollTop=0),t&&h(this._element),this._element.classList.add("show"),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,j.trigger(this._element,"shown.bs.modal",{relatedTarget:e})},this._dialog,t)}_setEscapeEvent(){this._isShown?j.on(this._element,Cn,e=>{this._config.keyboard&&"Escape"===e.key?(e.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==e.key||this._triggerBackdropTransition()}):j.off(this._element,Cn)}_setResizeEvent(){this._isShown?j.on(window,_n,()=>this._adjustDialog()):j.off(window,_n)}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),j.trigger(this._element,wn)})}_showBackdrop(e){j.on(this._element,Sn,e=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:e.target===e.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(e)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(j.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:e,scrollHeight:t,style:n}=this._element,i=t>document.documentElement.clientHeight;!i&&"hidden"===n.overflowY||e.contains(An)||(i||(n.overflowY="hidden"),e.add(An),this._queueCallback(()=>{e.remove(An),i||this._queueCallback(()=>{n.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;(!n&&e&&!g()||n&&!e&&g())&&(this._element.style.paddingLeft=t+"px"),(n&&!e&&!g()||!n&&e&&g())&&(this._element.style.paddingRight=t+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(e,t){return this.each((function(){const n=En.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===n[e])throw new TypeError(`No method named "${e}"`);n[e](t)}}))}}j.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(e){const t=i(this);["A","AREA"].includes(this.tagName)&&e.preventDefault(),j.one(t,xn,e=>{e.defaultPrevented||j.one(t,wn,()=>{l(this)&&this.focus()})});const n=V.findOne(".modal.show");n&&En.getInstance(n).hide(),En.getOrCreateInstance(t).toggle(this)})),$(En),m(En);const Dn="offcanvas",On={backdrop:!0,keyboard:!0,scroll:!1},Mn={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"},In=".offcanvas.show",Ln="hidden.bs.offcanvas";class Pn extends R{constructor(e,t){super(e),this._config=this._getConfig(t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get NAME(){return Dn}static get Default(){return On}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||j.trigger(this._element,"show.bs.offcanvas",{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||(new ln).hide(),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{this._config.scroll||this._focustrap.activate(),j.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:e})},this._element,!0))}hide(){this._isShown&&(j.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new ln).reset(),j.trigger(this._element,Ln)},this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_getConfig(e){return e={...On,...q.getDataAttributes(this._element),..."object"==typeof e?e:{}},s(Dn,e,Mn),e}_initializeBackDrop(){return new hn({className:"offcanvas-backdrop",isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_initializeFocusTrap(){return new vn({trapElement:this._element})}_addEventListeners(){j.on(this._element,"keydown.dismiss.bs.offcanvas",e=>{this._config.keyboard&&"Escape"===e.key&&this.hide()})}static jQueryInterface(e){return this.each((function(){const t=Pn.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e]||e.startsWith("_")||"constructor"===e)throw new TypeError(`No method named "${e}"`);t[e](this)}}))}}j.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(e){const t=i(this);if(["A","AREA"].includes(this.tagName)&&e.preventDefault(),c(this))return;j.one(t,Ln,()=>{l(this)&&this.focus()});const n=V.findOne(In);n&&n!==t&&Pn.getInstance(n).hide(),Pn.getOrCreateInstance(t).toggle(this)})),j.on(window,"load.bs.offcanvas.data-api",()=>V.find(In).forEach(e=>Pn.getOrCreateInstance(e).show())),$(Pn),m(Pn);const jn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Nn=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Fn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Rn=(e,t)=>{const n=e.nodeName.toLowerCase();if(t.includes(n))return!jn.has(n)||Boolean(Nn.test(e.nodeValue)||Fn.test(e.nodeValue));const i=t.filter(e=>e instanceof RegExp);for(let e=0,t=i.length;e{Rn(e,a)||n.removeAttribute(e.nodeName)})}return i.body.innerHTML}const zn="tooltip",Hn=new Set(["sanitize","allowList","sanitizeFn"]),Bn={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},Wn={AUTO:"auto",TOP:"top",RIGHT:g()?"left":"right",BOTTOM:"bottom",LEFT:g()?"right":"left"},Un={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},qn={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Vn="fade",Yn="show",Xn="show",Gn=".tooltip-inner",Kn="hide.bs.modal",Qn="hover";class Zn extends R{constructor(e,t){if(void 0===$t)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(e),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(t),this.tip=null,this._setListeners()}static get Default(){return Un}static get NAME(){return zn}static get Event(){return qn}static get DefaultType(){return Bn}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(e){if(this._isEnabled)if(e){const t=this._initializeOnDelegatedTarget(e);t._activeTrigger.click=!t._activeTrigger.click,t._isWithActiveTrigger()?t._enter(null,t):t._leave(null,t)}else{if(this.getTipElement().classList.contains(Yn))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),j.off(this._element.closest(".modal"),Kn,this._hideModalHandler),this.tip&&this.tip.remove(),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const e=j.trigger(this._element,this.constructor.Event.SHOW),t=u(this._element),n=null===t?this._element.ownerDocument.documentElement.contains(this._element):t.contains(this._element);if(e.defaultPrevented||!n)return;"tooltip"===this.constructor.NAME&&this.tip&&this.getTitle()!==this.tip.querySelector(Gn).innerHTML&&(this._disposePopper(),this.tip.remove(),this.tip=null);const i=this.getTipElement(),r=(e=>{do{e+=Math.floor(1e6*Math.random())}while(document.getElementById(e));return e})(this.constructor.NAME);i.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this._config.animation&&i.classList.add(Vn);const o="function"==typeof this._config.placement?this._config.placement.call(this,i,this._element):this._config.placement,a=this._getAttachment(o);this._addAttachmentClass(a);const{container:s}=this._config;F.set(i,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(s.append(i),j.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=Rt(this._element,i,this._getPopperConfig(a)),i.classList.add(Yn);const l=this._resolvePossibleFunction(this._config.customClass);l&&i.classList.add(...l.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>{j.on(e,"mouseover",d)});const c=this.tip.classList.contains(Vn);this._queueCallback(()=>{const e=this._hoverState;this._hoverState=null,j.trigger(this._element,this.constructor.Event.SHOWN),"out"===e&&this._leave(null,this)},this.tip,c)}hide(){if(!this._popper)return;const e=this.getTipElement();if(j.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;e.classList.remove(Yn),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(e=>j.off(e,"mouseover",d)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const t=this.tip.classList.contains(Vn);this._queueCallback(()=>{this._isWithActiveTrigger()||(this._hoverState!==Xn&&e.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),j.trigger(this._element,this.constructor.Event.HIDDEN),this._disposePopper())},this.tip,t),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const e=document.createElement("div");e.innerHTML=this._config.template;const t=e.children[0];return this.setContent(t),t.classList.remove(Vn,Yn),this.tip=t,this.tip}setContent(e){this._sanitizeAndSetContent(e,this.getTitle(),Gn)}_sanitizeAndSetContent(e,t,n){const i=V.findOne(n,e);t||!i?this.setElementContent(i,t):i.remove()}setElementContent(e,t){if(null!==e)return o(t)?(t=a(t),void(this._config.html?t.parentNode!==e&&(e.innerHTML="",e.append(t)):e.textContent=t.textContent)):void(this._config.html?(this._config.sanitize&&(t=$n(t,this._config.allowList,this._config.sanitizeFn)),e.innerHTML=t):e.textContent=t)}getTitle(){const e=this._element.getAttribute("data-bs-original-title")||this._config.title;return this._resolvePossibleFunction(e)}updateAttachment(e){return"right"===e?"end":"left"===e?"start":e}_initializeOnDelegatedTarget(e,t){return t||this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_getOffset(){const{offset:e}=this._config;return"string"==typeof e?e.split(",").map(e=>Number.parseInt(e,10)):"function"==typeof e?t=>e(t,this._element):e}_resolvePossibleFunction(e){return"function"==typeof e?e.call(this._element):e}_getPopperConfig(e){const t={placement:e,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:e=>this._handlePopperPlacementChange(e)}],onFirstUpdate:e=>{e.options.placement!==e.placement&&this._handlePopperPlacementChange(e)}};return{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_addAttachmentClass(e){this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(e)}`)}_getAttachment(e){return Wn[e.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(e=>{if("click"===e)j.on(this._element,this.constructor.Event.CLICK,this._config.selector,e=>this.toggle(e));else if("manual"!==e){const t=e===Qn?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,n=e===Qn?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;j.on(this._element,t,this._config.selector,e=>this._enter(e)),j.on(this._element,n,this._config.selector,e=>this._leave(e))}}),this._hideModalHandler=()=>{this._element&&this.hide()},j.on(this._element.closest(".modal"),Kn,this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const e=this._element.getAttribute("title"),t=typeof this._element.getAttribute("data-bs-original-title");(e||"string"!==t)&&(this._element.setAttribute("data-bs-original-title",e||""),!e||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",e),this._element.setAttribute("title",""))}_enter(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusin"===e.type?"focus":Qn]=!0),t.getTipElement().classList.contains(Yn)||t._hoverState===Xn?t._hoverState=Xn:(clearTimeout(t._timeout),t._hoverState=Xn,t._config.delay&&t._config.delay.show?t._timeout=setTimeout(()=>{t._hoverState===Xn&&t.show()},t._config.delay.show):t.show())}_leave(e,t){t=this._initializeOnDelegatedTarget(e,t),e&&(t._activeTrigger["focusout"===e.type?"focus":Qn]=t._element.contains(e.relatedTarget)),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState="out",t._config.delay&&t._config.delay.hide?t._timeout=setTimeout(()=>{"out"===t._hoverState&&t.hide()},t._config.delay.hide):t.hide())}_isWithActiveTrigger(){for(const e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1}_getConfig(e){const t=q.getDataAttributes(this._element);return Object.keys(t).forEach(e=>{Hn.has(e)&&delete t[e]}),(e={...this.constructor.Default,...t,..."object"==typeof e&&e?e:{}}).container=!1===e.container?document.body:a(e.container),"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),s(zn,e,this.constructor.DefaultType),e.sanitize&&(e.template=$n(e.template,e.allowList,e.sanitizeFn)),e}_getDelegateConfig(){const e={};for(const t in this._config)this.constructor.Default[t]!==this._config[t]&&(e[t]=this._config[t]);return e}_cleanTipClass(){const e=this.getTipElement(),t=new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`,"g"),n=e.getAttribute("class").match(t);null!==n&&n.length>0&&n.map(e=>e.trim()).forEach(t=>e.classList.remove(t))}_getBasicClassPrefix(){return"bs-tooltip"}_handlePopperPlacementChange(e){const{state:t}=e;t&&(this.tip=t.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(t.placement)))}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null)}static jQueryInterface(e){return this.each((function(){const t=Zn.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}}))}}m(Zn);const Jn={...Zn.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},ei={...Zn.DefaultType,content:"(string|element|function)"},ti={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class ni extends Zn{static get Default(){return Jn}static get NAME(){return"popover"}static get Event(){return ti}static get DefaultType(){return ei}isWithContent(){return this.getTitle()||this._getContent()}setContent(e){this._sanitizeAndSetContent(e,this.getTitle(),".popover-header"),this._sanitizeAndSetContent(e,this._getContent(),".popover-body")}_getContent(){return this._resolvePossibleFunction(this._config.content)}_getBasicClassPrefix(){return"bs-popover"}static jQueryInterface(e){return this.each((function(){const t=ni.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}}))}}m(ni);const ii="scrollspy",ri={offset:10,method:"auto",target:""},oi={offset:"number",method:"string",target:"(string|element)"},ai="active",si=".nav-link, .list-group-item, .dropdown-item",li="position";class ci extends R{constructor(e,t){super(e),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(t),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,j.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return ri}static get NAME(){return ii}refresh(){const e=this._scrollElement===this._scrollElement.window?"offset":li,t="auto"===this._config.method?e:this._config.method,i=t===li?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),V.find(si,this._config.target).map(e=>{const r=n(e),o=r?V.findOne(r):null;if(o){const e=o.getBoundingClientRect();if(e.width||e.height)return[q[t](o).top+i,r]}return null}).filter(e=>e).sort((e,t)=>e[0]-t[0]).forEach(e=>{this._offsets.push(e[0]),this._targets.push(e[1])})}dispose(){j.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(e){return(e={...ri,...q.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}}).target=a(e.target)||document.documentElement,s(ii,e,oi),e}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){const e=this._targets[this._targets.length-1];this._activeTarget!==e&&this._activate(e)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(let t=this._offsets.length;t--;)this._activeTarget!==this._targets[t]&&e>=this._offsets[t]&&(void 0===this._offsets[t+1]||e`${t}[data-bs-target="${e}"],${t}[href="${e}"]`),n=V.findOne(t.join(","),this._config.target);n.classList.add(ai),n.classList.contains("dropdown-item")?V.findOne(".dropdown-toggle",n.closest(".dropdown")).classList.add(ai):V.parents(n,".nav, .list-group").forEach(e=>{V.prev(e,".nav-link, .list-group-item").forEach(e=>e.classList.add(ai)),V.prev(e,".nav-item").forEach(e=>{V.children(e,".nav-link").forEach(e=>e.classList.add(ai))})}),j.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:e})}_clear(){V.find(si,this._config.target).filter(e=>e.classList.contains(ai)).forEach(e=>e.classList.remove(ai))}static jQueryInterface(e){return this.each((function(){const t=ci.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}}))}}j.on(window,"load.bs.scrollspy.data-api",()=>{V.find('[data-bs-spy="scroll"]').forEach(e=>new ci(e))}),m(ci);const ui="active",di=".active",hi=":scope > li > .active";class fi extends R{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains(ui))return;let e;const t=i(this._element),n=this._element.closest(".nav, .list-group");if(n){const t="UL"===n.nodeName||"OL"===n.nodeName?hi:di;e=V.find(t,n),e=e[e.length-1]}const r=e?j.trigger(e,"hide.bs.tab",{relatedTarget:this._element}):null;if(j.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==r&&r.defaultPrevented)return;this._activate(this._element,n);const o=()=>{j.trigger(e,"hidden.bs.tab",{relatedTarget:this._element}),j.trigger(this._element,"shown.bs.tab",{relatedTarget:e})};t?this._activate(t,t.parentNode,o):o()}_activate(e,t,n){const i=(!t||"UL"!==t.nodeName&&"OL"!==t.nodeName?V.children(t,di):V.find(hi,t))[0],r=n&&i&&i.classList.contains("fade"),o=()=>this._transitionComplete(e,i,n);i&&r?(i.classList.remove("show"),this._queueCallback(o,e,!0)):o()}_transitionComplete(e,t,n){if(t){t.classList.remove(ui);const e=V.findOne(":scope > .dropdown-menu .active",t.parentNode);e&&e.classList.remove(ui),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!1)}e.classList.add(ui),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),h(e),e.classList.contains("fade")&&e.classList.add("show");let i=e.parentNode;if(i&&"LI"===i.nodeName&&(i=i.parentNode),i&&i.classList.contains("dropdown-menu")){const t=e.closest(".dropdown");t&&V.find(".dropdown-toggle",t).forEach(e=>e.classList.add(ui)),e.setAttribute("aria-expanded",!0)}n&&n()}static jQueryInterface(e){return this.each((function(){const t=fi.getOrCreateInstance(this);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e]()}}))}}j.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(e){["A","AREA"].includes(this.tagName)&&e.preventDefault(),c(this)||fi.getOrCreateInstance(this).show()})),m(fi);const pi="show",gi="showing",mi={animation:"boolean",autohide:"boolean",delay:"number"},vi={animation:!0,autohide:!0,delay:5e3};class yi extends R{constructor(e,t){super(e),this._config=this._getConfig(t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return mi}static get Default(){return vi}static get NAME(){return"toast"}show(){j.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),h(this._element),this._element.classList.add(pi),this._element.classList.add(gi),this._queueCallback(()=>{this._element.classList.remove(gi),j.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains(pi)&&(j.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(gi),this._queueCallback(()=>{this._element.classList.add("hide"),this._element.classList.remove(gi),this._element.classList.remove(pi),j.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains(pi)&&this._element.classList.remove(pi),super.dispose()}_getConfig(e){return e={...vi,...q.getDataAttributes(this._element),..."object"==typeof e&&e?e:{}},s("toast",e,this.constructor.DefaultType),e}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case"mouseover":case"mouseout":this._hasMouseInteraction=t;break;case"focusin":case"focusout":this._hasKeyboardInteraction=t}if(t)return void this._clearTimeout();const n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){j.on(this._element,"mouseover.bs.toast",e=>this._onInteraction(e,!0)),j.on(this._element,"mouseout.bs.toast",e=>this._onInteraction(e,!1)),j.on(this._element,"focusin.bs.toast",e=>this._onInteraction(e,!0)),j.on(this._element,"focusout.bs.toast",e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each((function(){const t=yi.getOrCreateInstance(this,e);if("string"==typeof e){if(void 0===t[e])throw new TypeError(`No method named "${e}"`);t[e](this)}}))}}return $(yi),m(yi),{Alert:z,Button:B,Carousel:re,Collapse:pe,Dropdown:on,Modal:En,Offcanvas:Pn,Popover:ni,ScrollSpy:ci,Tab:fi,Toast:yi,Tooltip:Zn}}));var NioApp=function(e,t){"use strict";var n=t(window),i=t("body"),r="lite-dash";function o(e,t){return Object.keys(t).forEach((function(n){e[n]=t[n]})),e}return t.fn.exists=function(){return 0>16&255,e>>8&255,255&e].join(","),1<=t?"rgba("+e+")":"rgba("+e+","+t+")";throw new Error("bad hex")},e.StateUpdate=function(){e.Win={height:n.height(),width:n.outerWidth()},e.State.asMobile=e.Win.width'):this.overlayRemove(i)},overlayRemove:function(e){t("."+e).fadeOut(300).remove()},dropMenu:function(e,n){var i={active:"active",self:"link-toggle",child:"menu-sub",speed:400};n=n?o(i,n):i,e=(i=t(e).parent()).children("."+n.child);n.speed=50?ie:ne)(e)},oe=Math.min,ae=function(e){return e>0?oe(re(e),9007199254740991):0},se=Math.max,le=Math.min,ce=function(e){return function(t,n,i){var r,o=b(t),a=ae(o.length),s=function(e,t){var n=re(e);return n<0?se(n+t,0):le(n,t)}(i,a);if(e&&n!=n){for(;a>s;)if((r=o[s++])!=r)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},ue=(ce(!0),ce(!1)),de=function(e,t){var n,i=b(e),r=0,o=[];for(n in i)!S(U,n)&&S(i,n)&&o.push(n);for(;t.length>r;)S(i,n=t[r++])&&(~ue(o,n)||o.push(n));return o},he=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],fe=he.concat("length","prototype"),pe={f:Object.getOwnPropertyNames||function(e){return de(e,fe)}},ge={f:Object.getOwnPropertySymbols},me=te("Reflect","ownKeys")||function(e){var t=pe.f(O(e)),n=ge.f;return n?t.concat(n(e)):t},ve=function(e,t){for(var n=me(t),i=I.f,r=D.f,o=0;oy;y++)if((a||y in p)&&(h=g(d=p[y],y,f),e))if(t)w[y]=h;else if(h)switch(e){case 3:return!0;case 5:return d;case 6:return y;case 2:Fe.call(w,d)}else if(r)return!1;return o?-1:i||r?r:w}},$e={forEach:Re(0),map:Re(1),filter:Re(2),some:Re(3),every:Re(4),find:Re(5),findIndex:Re(6)},ze=function(e,t){var n=[][e];return!n||!l((function(){n.call(null,t||function(){throw 1},1)}))},He=$e.forEach,Be=ze("forEach")?function(e){return He(this,e,arguments.length>1?arguments[1]:void 0)}:[].forEach;Te({target:"Array",proto:!0,forced:[].forEach!=Be},{forEach:Be});var We={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var Ue in We){var qe=s[Ue],Ve=qe&&qe.prototype;if(Ve&&Ve.forEach!==Be)try{L(Ve,"forEach",Be)}catch(e){Ve.forEach=Be}}var Ye=!("undefined"==typeof window||!window.document||!window.document.createElement),Xe=Pe("species"),Ge=$e.filter;Te({target:"Array",proto:!0,forced:!!l((function(){var e=[];return(e.constructor={})[Xe]=function(){return{foo:1}},1!==e.filter(Boolean).foo}))},{filter:function(e){return Ge(this,e,arguments.length>1?arguments[1]:void 0)}});var Ke=Object.keys||function(e){return de(e,he)},Qe=c?Object.defineProperties:function(e,t){O(e);for(var n,i=Ke(t),r=i.length,o=0;r>o;)I.f(e,n=i[o++],t[n]);return e},Ze=te("document","documentElement"),Je=W("IE_PROTO"),et=function(){},tt=function(){var e,t=T("iframe"),n=he.length;for(t.style.display="none",Ze.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(" +@endsection diff --git a/resources/views/dgaAdmin/app.blade.php b/resources/views/dgaAdmin/app.blade.php new file mode 100644 index 0000000..baa2404 --- /dev/null +++ b/resources/views/dgaAdmin/app.blade.php @@ -0,0 +1,344 @@ + + + + + + + + + + + Dashboard - Hospital Manegment | DashLite Admin Template + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +
+
{{ $setting->name }}
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + +
+
    + + +
+
+
+
+
+ @yield('main') +
+
+
+ + + + + + + + + @yield('script') + + + diff --git a/resources/views/dgaAdmin/history.blade.php b/resources/views/dgaAdmin/history.blade.php new file mode 100644 index 0000000..5c6019b --- /dev/null +++ b/resources/views/dgaAdmin/history.blade.php @@ -0,0 +1,89 @@ +@extends('dgaAdmin.app') @section('main') +
+
+
+
+
+
+
+

Lịch sử chơi game

+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + @foreach($history as $row) + + + + + + + + + + + + + @endforeach + + +
+
+
+
+
+
+
+@endsection diff --git a/resources/views/dgaAdmin/home.blade.php b/resources/views/dgaAdmin/home.blade.php new file mode 100644 index 0000000..8e055d4 --- /dev/null +++ b/resources/views/dgaAdmin/home.blade.php @@ -0,0 +1,1249 @@ +@extends('dgaAdmin.app') @section('main') +
+
+
+
+
+
+
+

Trang quản trị

+
+

Đây là trang quản trị - hệ thống được làm bới DUNGA.

+
+
+
+
+
+
+
+
+
+
+
+
+
Tổng số tiền chơi
+
+
+
+
+
+ {{ number_format($total['amount']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Số tiền thắng
+
+
+
+
+
+ {{ number_format($total['amountWin']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Số tiền thua
+
+
+
+
+
+ {{ number_format($total['amountLose']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Số tiền đã trả
+
+
+
+
+
+ {{ number_format($total['amountSend']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Số lượt thắng
+
+
+
+
+
+ {{ number_format($total['turnWin']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Số lượt thua
+
+
+
+
+
+ {{ number_format($total['turnLose']) }} +
+
+
+
+
+
+
+
+
+
+
+
+
+

Thông số

+
+
+ +
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCLDay']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCLDay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCLDay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCLDay']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCLWeek']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCLWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCLWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCLWeek']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCLMonth']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCLMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCLMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCLMonth']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCL2Day']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCL2Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCL2Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCL2Day']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCL2Week']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCL2Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCL2Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCL2Week']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendCL2Month']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountCL2Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseCL2Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinCL2Month']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTXDay']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTXDay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTXDay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTXDay']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTXWeek']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTXWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTXWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTXWeek']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTXMonth']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTXMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTXMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTXMonth']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTX2Day']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTX2Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTX2Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTX2Day']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTX2Week']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTX2Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTX2Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTX2Week']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendTX2Month']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountTX2Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseTX2Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinTX2Month']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSend1P3Day']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amount1P3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLose1P3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWin1P3Day']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSend1P3Week']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amount1P3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLose1P3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWin1P3Week']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSend1P3Month']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amount1P3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLose1P3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWin1P3Month']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendG3Day']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountG3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseG3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinG3Day']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendG3Week']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountG3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseG3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinG3Week']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendG3Month']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountG3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseG3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinG3Month']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendH3Day']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountH3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseH3Day']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinH3Day']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendH3Week']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountH3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseH3Week']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinH3Week']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendH3Month']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountH3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseH3Month']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinH3Month']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
Thông số ngày
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendLODay']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountLODay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseLODay']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinLODay']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tuần
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendLOWeek']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountLOWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseLOWeek']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinLOWeek']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
Thông số tháng
+
+
    +
  • +
    +
    Tiền chuyển
    +
    {{ number_format($total['amountSendLOMonth']) }}
    +
    + +
  • +
  • +
    +
    Tiền nhận
    +
    {{ number_format($total['amountLOMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thua
    +
    {{ number_format($total['turnLoseLOMonth']) }}
    +
    + +
  • +
  • +
    +
    Lượt thắng
    +
    {{ number_format($total['turnWinLOMonth']) }}
    +
    + +
  • +
+
+
+
+
+
+
+
+
+
+
+
+
+
Thông số Tiền chuyển - Tiền nhận 7 ngày gần nhất
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+@endsection +@section('script') + +@endsection \ No newline at end of file diff --git a/resources/views/dgaAdmin/setting.blade.php b/resources/views/dgaAdmin/setting.blade.php new file mode 100644 index 0000000..d3022a8 --- /dev/null +++ b/resources/views/dgaAdmin/setting.blade.php @@ -0,0 +1,366 @@ +@extends('dgaAdmin.app') +@section('main') +
+
+
+
+
+
+
+

Cài đặt hệ thống

+
+
+
+
+
+
+
+
+
+
+
Thông tin
+
+
+
+
+ @csrf +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
Trò chơi
+
+
+
+
+ @if ($setting->only_win == 1) +
+
+ +
+ +
+
+
+ @else +
+
+ +
+ +
+
+
+ @endif + @if ($setting->day_mission == 1) +
+
+ +
+ +
+
+
+ @else +
+
+ +
+ +
+
+
+ @endif + @if ($setting->week_top == 1) +
+
+ +
+ +
+
+
+ @else +
+
+ +
+ +
+
+
+ @endif +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ @if ($setting->hu == 1) +
+
+ +
+ +
+
+
+ @else +
+
+ +
+ +
+
+
+ @endif +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection diff --git a/resources/views/game.blade.php b/resources/views/game.blade.php index 5843d78..afba25d 100644 --- a/resources/views/game.blade.php +++ b/resources/views/game.blade.php @@ -10,66 +10,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/ + 50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach @@ -77,8 +41,11 @@ Làm mới sau 0 s

- - Nội dung chuyển: 2 hoặc - 1 (nếu đuôi mã giao dịch có các số sau) + - Nội dung chuyển: 2 hoặc + 1 (nếu đuôi mã giao dịch có các số sau)

@@ -90,24 +57,24 @@ - + - +
- 2 + 2 0 - 2 - 4 - 6 - 81.95{{ $setting->ratioCL2 }}
- 1 + 1 1 - 3 - 5 - 7 - 91.95{{ $setting->ratioCL2 }}
- - Lưu ý:
- -Số tiền nhỏ nhất của 2 và - 11,000 VND và lớn nhất 500,000 VND . Tiền thắng sẽ = tiền đặt * 1.95 + - Tiền thắng sẽ = Tiền cược*{{ $setting->ratioCL2 }}
- Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- Chẵn lẻ là một game tính kết quả bằng 1 số cuối mã giao dịch.

@@ -121,66 +88,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -188,8 +119,11 @@ Làm mới sau 0 s

- - Nội dung chuyển: C hoặc - L (nếu đuôi mã giao dịch có các số sau) + - Nội dung chuyển: C hoặc + L (nếu đuôi mã giao dịch có các số sau)

@@ -201,24 +135,24 @@ - + - +
- C + C 2 - 4 - 6 - 82.4{{ $setting->ratioCL }}
- L + L 1 - 3 - 5 - 72.4{{ $setting->ratioCL }}
- - Lưu ý:
- -Số tiền nhỏ nhất của C và - L1,000 VND và lớn nhất 500,000 VND . Tiền thắng sẽ = tiền đặt * 2.4 + - Tiền thắng sẽ = Tiền cược*{{ $setting->ratioCL }}
- Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- Tài Xỉu 2 là một game tính kết quả bằng 1 số cuối mã giao dịch.

@@ -232,66 +166,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -299,8 +197,10 @@ Làm mới sau 0 s

- - Nội dung chuyển: 4 hoặc - 3 (nếu đuôi mã giao dịch có các số sau) + - Nội dung chuyển: 4 hoặc + 3 (nếu đuôi mã giao dịch có các số sau)

@@ -312,24 +212,24 @@ - + - +
- 4 + + 4 5 - 6 - 7 - 8 - 91.95{{ $setting->ratioTX2 }}
- 3 + 3 0 - 1 - 2 - 3 - 41.95{{ $setting->ratioTX2 }}
- - Lưu ý:
- -Số tiền nhỏ nhất của 4 và - 31,000 VND và lớn nhất 1,000,000 VND . Tiền thắng sẽ = tiền đặt * 1.95 + - Tiền thắng sẽ = Tiền cược*{{ $setting->ratioTX2 }}
- Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- Tài Xỉu là một game tính kết quả bằng 1 số cuối mã giao dịch.

@@ -343,66 +243,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 500,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -410,8 +274,11 @@ Làm mới sau 0 s

- - Nội dung chuyển: T hoặc - X (nếu đuôi mã giao dịch có các số sau) + - Nội dung chuyển: T hoặc + X (nếu đuôi mã giao dịch có các số sau)

@@ -423,24 +290,24 @@ - + - +
- T + + T 5 - 6 - 7 - 82.4{{ $setting->ratioTX }}
- X + X 1 - 2 - 3 - 42.4{{ $setting->ratioTX }}
- - Lưu ý:
- -Số tiền nhỏ nhất của T và - X1,000 VND và lớn nhất 500,000 VND . Tiền thắng sẽ = tiền đặt * 2.4 + - Tiền thắng sẽ = Tiền cược*{{ $setting->ratioTX }}
- Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- 1 phần 3 là một game tính kết quả bằng 1 số cuối mã giao dịch.

@@ -454,66 +321,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -521,10 +352,15 @@ Làm mới sau 0 s

- - Nội dung chuyển: N1 hoặc - N2 hoặc - N3 hoặc - N0 (nếu đuôi mã giao dịch có các số sau) + - Nội dung chuyển: N1 hoặc + N2 hoặc + N3 hoặc + N0 (nếu đuôi mã giao dịch có các số sau)

@@ -538,40 +374,45 @@ - + - + - + - +
- N1 + + N1 1 - 2 - 33.2{{ explode('|', $setting->ratio1P3)[0] }}
- N2 + N2 4 - 5 - 63.2{{ explode('|', $setting->ratio1P3)[0] }}
- N3 + N3 7 - 8 - 93.2{{ explode('|', $setting->ratio1P3)[0] }}
- N0 + N0 07{{ explode('|', $setting->ratio1P3)[1] }}

- Nếu mã giao dịch có số cuối trùng với 1 trong 3 số trên, bạn sẽ chiến thắng.

-

-Lưu ý: Số tiền nhỏ nhất là 1,000 VND và lớn nhất 1,000,000 VND

+ - Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.
-

- H3 là một game tính kết quả bằng hiệu 2 số cuối mã giao dịch (Số trước trừ số sau). Ví dụ: xxx94 => 9 - 4 = 5.

+

- H3 là một game tính kết quả bằng hiệu 2 số cuối mã giao dịch (Số trước trừ số sau). Ví dụ: xxx94 => 9 + - 4 = 5.

- Cách chơi vô cùng đơn giản:

- Chuyển tiền vào một trong các tài khoản:

@@ -582,66 +423,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -649,7 +454,9 @@ Làm mới sau 0 s

- - Nội dung chuyển : H3 + - Nội dung chuyển : H3

@@ -663,37 +470,41 @@ - + - + - + - +
- H3 + + H3 911{{ explode('|', $setting->ratioH3)[3] }}
- H3 + + H3 77.7{{ explode('|', $setting->ratioH3)[2] }}
- H3 + + H3 55.5{{ explode('|', $setting->ratioH3)[1] }}
- H3 + + H3 33.3{{ explode('|', $setting->ratioH3)[0] }}

- Nếu mã giao dịch có hiệu của 2 số (số trước trừ số sau) trùng 1 trong những số trên bạn sẽ chiến thắng.

-

-Lưu ý: Số tiền nhỏ nhất là 1,000 VND và lớn nhất 1,000,000 VND

+ - Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- là một game tính kết quả bằng 2 số cuối mã giao dịch.

@@ -707,66 +518,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -774,7 +549,9 @@ Làm mới sau 0 s

- - Nội dung chuyển : LO + - Nội dung chuyển : LO

@@ -788,20 +565,25 @@ - +
- LO + + LO - 01 - 03 - 12 - 19 - 23 - 24 - 30 - 33 - 39 - 48 - 54 - 55 - - 60 - 61 - 71 - 77 - 81 - 82 - 83 - 67 - 88 - 76 - 64 - 79 - + 01 - 03 - 12 - 19 - 23 - + 24 - 30 - 33 - 39 - 48 - + 54 - 55 - + 60 - 61 - 71 - 77 - 81 - + 82 - 83 - 67 - 88 - 76 - + 64 - 79 - 29 - 99 3.7{{ $setting->ratioLO }}

- Nếu mã giao dịch có 2 số cuối trùng với 1 trong các số trên, bạn sẽ chiến thắng.

-

-Lưu ý: Số tiền nhỏ nhất là 1,000 VND và lớn nhất 1,000,000 VND

+ - Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền.

- Gấp 3 là một game tính kết quả bằng nhiều số cuối mã giao dịch.

@@ -815,66 +597,30 @@ Tối đa - - - - 0528192535 11,576,070/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192536 9,018,973/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192537 33,969,783/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0528192538 3,697,136/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - - - - - 0563658041 36,730,599/50M - - - - - - 1,000 VNĐ - 1,000,000 VNĐ - + @foreach ($momo as $row) + + + + {{ $row->phone }} + {{ number_format($row->amount) }}/50M + + + + + + + {{ number_format($row->min) }} VNĐ + {{ number_format($row->max) }} VNĐ + + @endforeach
@@ -895,23 +641,27 @@ G3 - 02 - 13 - 17 - 19 - 21 - 29 - 35 - 37 - 47 - 49 - 51 - 54 - - 57 - 63 - 64 - 74 - 83 - 91 - 95 - 96 + 02 - 13 - 17 - 19 - 21 - + 29 - 35 - 37 - 47 - 49 - + 51 - 54 - + 57 - 63 - 64 - 74 - 83 - + 91 - 95 - 96 - 3.3 + {{ explode('|', $setting->ratioG3)[0] }} G3 66 - 99 - 4.4 + {{ explode('|', $setting->ratioG3)[1] }} G3 - 123 - 234 - 456 - 678 - 789 - 5.5 + 123 - 234 - 456 - 678 - 789 + + {{ explode('|', $setting->ratioG3)[2] }} -

-Lưu ý: Số tiền nhỏ nhất là 1,000 VND và lớn nhất 1,000,000 VND

+ - Lưu ý : Mức cược mỗi số khác nhau, nếu chuyển sai hạn mức hoặc sai nội dung vui lòng vào phần "kiểm tra mã giao dịch" để hoàn tiền. diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index e7cd823..2a651c9 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -65,30 +65,30 @@ } .panel-heading { - background-color: #055FB3 !important; - border-color: #055FB3 !important; + background-color: {{ $setting->color }} !important; + border-color: {{ $setting->color }} !important; } .panel-primary { - /*background-color: #055FB3 !important;*/ - border-color: #055FB3 !important; + /*background-color: {{ $setting->color }} !important;*/ + border-color: {{ $setting->color }} !important; } .navbar { - background-color: #055FB3 !important; + background-color: {{ $setting->color }} !important; } .navbar .navbar-collapse { - background-color: #055FB3 !important; + background-color: {{ $setting->color }} !important; } .table .bg-primary { - background-color: #055FB3 !important; + background-color: {{ $setting->color }} !important; } .footer { - background-color: #055FB3 !important; + background-color: {{ $setting->color }} !important; } .mainbar { @@ -343,7 +343,7 @@ Trạng thái
-Copyright 2021 © trummomo.me | All rights reserved | AAAAAA +Copyright 2021 © {{ $setting->name }} | All rights reserved | DDDD
diff --git a/routes/admin.php b/routes/admin.php new file mode 100644 index 0000000..46e8c76 --- /dev/null +++ b/routes/admin.php @@ -0,0 +1,37 @@ + 'admin.'], function () { + Route::get('/home', [App\Http\Controllers\dgaAdmin\HomeController::class, 'home'])->name('home'); + Route::get('/setting', [App\Http\Controllers\dgaAdmin\HomeController::class, 'setting'])->name('setting'); + Route::post('/setting', [App\Http\Controllers\dgaAdmin\HomeController::class, 'settingEdit'])->name('settingEdit'); + Route::get('/add-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'addMomo'])->name('addMomo'); + Route::post('/get-otp', [App\Http\Controllers\dgaAdmin\MomoController::class, 'getOTP'])->name('getOTP'); + Route::post('/verify-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'verifyMomo'])->name('verifyMomo'); + Route::get('/login-momo/{phone}', [App\Http\Controllers\dgaAdmin\MomoController::class, 'loginMomo'])->name('loginMomo'); + Route::get('/history-momo/{phone}', [App\Http\Controllers\dgaAdmin\MomoController::class, 'historyMomo'])->name('historyMomo'); + Route::get('/check-momo/{phone}/{receiver}', [App\Http\Controllers\dgaAdmin\MomoController::class, 'checkMomo'])->name('checkMomo'); + Route::get('/send-money-momo/{phone}/{amount}/{comment}/{receiver}', [App\Http\Controllers\dgaAdmin\MomoController::class, 'sendMoneyMomo'])->name('sendMoneyMomo'); + Route::get('/xu-ly-minigame', [App\Http\Controllers\dgaAdmin\MiniGame::class, 'XuLiMiniGame'])->name('XuLiMiniGame'); + Route::get('/xu-ly-pay', [App\Http\Controllers\dgaAdmin\MiniGame::class, 'payMoneyMiniGame'])->name('payMoneyMiniGame'); + Route::get('/xu-ly-day-mission', [App\Http\Controllers\dgaAdmin\MiniGame::class, 'payDayMission'])->name('payMoneyMiniGame'); + Route::post('/delete-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'deleteMomo'])->name('deleteMomo'); + Route::post('/active-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'activeMomo'])->name('activeMomo'); + Route::post('/hide-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'hideMomo'])->name('hideMomo'); + Route::post('/maintenance-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'maintenanceMomo'])->name('maintenanceMomo'); + Route::post('/info-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'infoMomo'])->name('infoMomo'); + Route::post('/edit-momo', [App\Http\Controllers\dgaAdmin\MomoController::class, 'editMomo'])->name('editMomo'); + Route::get('/history-play/{game}', [App\Http\Controllers\dgaAdmin\HistoryController::class, 'historyPlay'])->name('historyPlay'); +}); diff --git a/routes/api.php b/routes/api.php index 026ea2e..00edb35 100644 --- a/routes/api.php +++ b/routes/api.php @@ -20,4 +20,7 @@ Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::post('/settings', [App\Http\Controllers\DUNGA::class, 'settings']); Route::post('/momo', [App\Http\Controllers\DUNGA::class, 'momo']); +Route::post('/history', [App\Http\Controllers\DUNGA::class, 'history']); Route::post('/render_minigame', [App\Http\Controllers\DUNGA::class, 'minigame']); +Route::post('/balance-hu', [App\Http\Controllers\DUNGA::class, 'hu']); +Route::post('/check-day-mission', [App\Http\Controllers\DUNGA::class, 'checkDayMission']); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 326956d..60bc4a8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,6 +1,7 @@