Попытка cookie-логина
172728
function check_cookies()
	{
		if (!$this->user['auth'] && isset($_COOKIE['eresus_login']))
		{
			if (!$this->login($_COOKIE['eresus_login'], $_COOKIE['eresus_key'], true, true))
			{
				$this->clear_login_cookies();
			}
		}
	}
870112
public function actionRegisterByEmail()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $rr = new RequestResponse();
        $model = new SignupForm();

        $model->scenario = SignupForm::SCENARION_ONLYEMAIL;


        //Запрос на валидацию ajax формы
        if ($rr->isRequestOnValidateAjaxForm()) {
            return $rr->ajaxValidateForm($model);
        }
        //Запрос ajax post
        if ($rr->isRequestAjaxPost()) {

            $t = \Yii::$app->db->beginTransaction();

            try {

                if ($model->load(\Yii::$app->request->post()) && $registeredUser = $model->signup()) {

                    $t->commit();

                    $rr->success = true;
                    $rr->message = 'Для дальнейших действий, проверьте вашу почту.';

                    return $rr;

                } else {
                    $rr->message = 'Не удалось зарегистрироваться';
                }

            } catch (\Exception $e) {
                $t->rollBack();
                throw $e;
            }


            return (array)$rr;

        }

        return $this->render('register', [
            'model' => $model,
        ]);
    }
49911
public function save()
    {
        $this->_slug = trim(trim($this->_slug), '/');
        if (is_null($this->_slugModel) || $this->_slugModel->slug !== $this->_slug) {
            //Если уже есть запись с таким slug то обновим её присвоев её максимальный id + 1
            $model = SeoSlug::find()
                ->where([
                    'AND',
                    ['=', 'model', $this->owner->className()],
                    ['=', 'model_id', $this->owner->getPrimaryKey()],
                    ['=', 'slug', $this->_slug],
                ])
                ->one();
            if ($model) {
                $maxId = SeoSlug::find()
                    ->max('id');
                $oldId = $model->id;
                $model->id = ++$maxId;
                $model->save();
                SeoSlug::updateAllCounters(['id' => -1], [
                    'AND',
                    ['>', SeoSlug::tableName() . '.id', $oldId],
                ]);
            } else {
                $model = new SeoSlug();
                $model->model = $this->owner->className();
                $model->model_id = $this->owner->getPrimaryKey();
            }
            $model->slug = $this->_slug;
            $model->save();
            if (is_callable($this->afterSave)) {
                call_user_func($this->afterSave, $this);
            }
        }
    }
64955
final protected function _execute() {
		$s = df_customer_session(); /** @var Session|DfSession $s */
		if (!$this->mc()) {
			/**
			 * 2016-12-01
			 * Учётная запись покупателя отсутствует в Magento,
			 * и в то же время информации провайдера SSO недостаточно
			 * для автоматической регистрации покупателя в Magento
			 * (случай Blackbaud NetCommunity).
			 * Перенаправляем покупателя на стандартную страницу регистрации Magento,
			 * где часть полей будет уже заполнена данными от провайдера SSO,
			 * а пароль будет либо скрытым, либо необязательным полем.
			 * После регистрации свежесозданная учётная запись будет привязана
			 * к учётной записи покупателя в провайдере SSO.
			 */
			$this->_redirectToRegistration = true;
			$s->setDfSsoId($this->c()->id());
			$s->setDfSsoRegistrationData($this->registrationData());
			$s->setDfSsoProvider(df_module_name($this));
			$settings = dfs($this); /** @var Settings $settings */
			df_message_success($settings->regCompletionMessage());
		}
		else {
			/**
			 * 2015-10-08
			 * By analogy with @see \Magento\Customer\Controller\Account\LoginPost::execute()
			 * https://github.com/magento/magento2/blob/1.0.0-beta4/app/code/Magento/Customer/Controller/Account/LoginPost.php#L84-L85
			 */
			$s->setCustomerDataAsLoggedIn($this->mc()->getDataModel());
			$s->regenerateId();
			/**
			 * By analogy with @see \Magento\Customer\Model\Account\Redirect::updateLastCustomerId()
			 * Напрямую тот метод вызвать не можем, потому что он protected,
			 * а использовать весь класс @see \Magento\Customer\Model\Account\Redirect пробовал,
			 * но оказалось неудобно из-за слишком сложной процедуры перенаправлений.
			 */
			if ($s->getLastCustomerId() != $s->getId()) {
				$s->unsBeforeAuthUrl()->setLastCustomerId($s->getId());
			}
		}
	}
144183
def cookies(self):
        ''''''
        return {
            key: self.raw_cookies[key].value
            for key in self.raw_cookies.keys()
        }
630770
public function log()
	{
		$this->ip 	= $this->getIP();
		$this->ips 	= $this->getIPs();
		$this->url 	= $this->getURL();
		$file 			= file($this->dataWrite);
		$txt 				= $this->url.";";
		$dtime 			= date("d.m.y_G:i");
		$txt 				.= $dtime.";";
		$txt 				.= $this->name.";";
		$txt 				.= $this->tel.";";
		foreach ($this->ips as $key => $value) {
			$txt 			.= $value.";";
		}
		$txt 				.= "\n";
		if (isset($file[0]) && !empty($file[0])) {
			$firstLine 	=	explode(";", $file[0]); // Вытягиваем первую строку файла log.ini
			$date = explode(".", str_replace('_', '.', $firstLine[1])); // Вытягиваем дату. Преобразуем к удобному формату. Разбиваем на отдельные части (год, месяц ...)
			$time = explode(":", $date[3]); // Разбиваем врем на отдельные части
			$unixTime = mktime($time[0], $time[1], 0, $date[1], $date[0], $date[2]); // Переводим в UNIXTIME
			$period = $this->timeCleanLog * 24  * 60 * 60; // Период за через который будем очищать log файл
			$timeNow = time(); // Текущее время
			if($timeNow > ($unixTime + $period)){ // Очищаем log файл если прошло больше чем $timeCleanLog суток
				// Отправляем письмо с содержанием log файла перед его очисткой.
				$subject = $dtime." - Log файл  - ".$_SERVER['HTTP_HOST'];
				$message = "Log файл очистился за период: ".$this->timeCleanLog." суток \n\n";
				$message .= "Содержимое файла:\n\n";
				foreach ($file as $key => $value) {
					$message .= "\t$value \n";
				}
				$mail = new MailHelper;
				$mail->config->fromMail = 'log@gslots.net';
				$mail->config->fromName = 'log';
				//$mail->addMail('1@gslots.net');
				$mail->addMail('dellirom@gmail.com');
				$mail->sendMail($subject, $message, false);
				file_put_contents($this->dataWrite, ""); // Очищаем файл dataWrite (log.ini) после отправки информации на email.
			}
		}
		file_put_contents($this->dataWrite, $txt, FILE_APPEND); // Записываем информацию в файл dataWrite (log.ini)
		return true;
	}
542447
function insert()
    {
        # Получение данных
        $item = array(
            'name' => arg('name', 'dbsafe'),
            'login' => arg('login', '/[^a-z0-9_]/'),
            'access' => arg('access', 'int'),
            'hash' => Eresus_CMS::getLegacyKernel()->password_hash(arg('pswd1')),
            'mail' => arg('mail', 'dbsafe'),
        );
        # Проверка входных данных
        $error = false;
        if (empty($item['name']))
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage(admUsersNameInvalid);
            $error = true;
        }
        if (empty($item['login']))
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage(admUsersLoginInvalid);
            $error = true;
        }
        if ($item['access'] <= ROOT)
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage('Invalid access level!');
            $error = true;
        }
        if ($item['hash'] != Eresus_CMS::getLegacyKernel()->password_hash(arg('pswd2')))
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage(admUsersConfirmInvalid);
            $error = true;
        }
        # Проверка данных на уникальность
        $check = $this->accounts->get("`login` = '{$item['login']}'");
        if ($check)
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage(admUsersLoginExists);
            $error = true;
        }
        if ($error)
        {
            saveRequest();
            HTTP::redirect(Eresus_CMS::getLegacyKernel()->request['referer']);
        }
        if (!$this->accounts->add($item))
        {
            Eresus_Kernel::app()->getPage()->addErrorMessage('Error creating user account');
        }
        HTTP::redirect(arg('submitURL'));
    }
1361899
protected function fileOlderTokens()
    {
        // Выполняем задачу каждые 5 минут
        try {
            $this->jobby->add(SettingsCron::NAME_PREFIX . 'FileOlderTokens', [
                'enabled'  => true,
                'schedule' => '*/5 * * * *', // Каждые 5 минут
                'closure'  => function () {
                    new Cron();

                    (new FileOlderTokens)->clear();

                    return true;
                },
            ]);
        } catch (Exception $e) {
            file_put_contents(SettingsCron::LOG_FILE, $e->getMessage());
        }
    }
227666
public function output()
    {
        if (strlen($this->redirect) > 0) {
            header("Location: " . $this->redirect);
            // echo "<script>window.location='{$this->redirect}'</script>";
            die;
        }
        if (WebApplication::$app->getRequest()->isBinaryRequest() == true) {
            // вывод  осуществляет  адресуемый   компонент
            return;
        }

        Header("Content-Type: text/html;charset=UTF-8");
        Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
        Header("Cache-Control: no-store,no-cache, must-revalidate");
        Header("Pragma: no-cache");
        Header("Last-Modified: Mon, 26 Jul 2100 05:00:00 GMT");

        if (WebApplication::$app->getRequest()->isAjaxRequest() == true) {
            echo $this->content;
            return;
        }

        if (strpos($this->content, "</head>") > 0) {
            $this->content = str_replace("</head>", $this->getJS() . "</head>", $this->content);
        } else {
            $this->content = $this->content . $this->getJS();
        }

        if (WebApplication::$app->getRequest()->isAjaxRequest() == false && $this->gzip === true && strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false) {
            Header("Content-Encoding: gzip");
            echo gzencode($this->content . $this->getJS());
            return;
        }
        echo $this->content;
    }
1123536
public static function getCatalogByTerm($term_current, $limit = 4) {
    $build = [];
    $pids = [];
    $site_commerces = [];

    $user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

    $db = \Drupal::database();

    // Дочерние термины для которого получаем перечень товаров.
    $terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($term_current->getVocabularyId(), $term_current->id(), NULL, TRUE);
    if (count($terms)) {
      foreach ($terms as $term) {
        $pids = [];
        if ($term->field_view->value) {
          $query = $db->select('site_commerce_field_data', 'n');

          if (!$user->hasRole('site commerce administer online store')) {
            $query->condition('n.status', 1);
            $query->condition('n.status_catalog', 1);
          }

          $query->fields('n', array('pid'));
          $query->innerJoin('site_commerce__field_category', 't', 't.entity_id=n.pid');
          $query->condition('t.field_category_target_id', $term->id());
          $query->range(0, $limit);
          $query->orderBy('weight');
          $result = $query->execute();

          foreach ($result as $row) {
            $pids[] = $row->pid;
          }

          if ($pids) {
            $count_term_products = \Drupal::service('site_commerce.database')->countProducts(1, $term->id());
            $site_commerces[$term->id()]['view_all'] = FALSE;
            $site_commerces[$term->id()]['count_term_products'] = $count_term_products;
            if ($count_term_products > $limit) {
              $site_commerces[$term->id()]['view_all'] = TRUE;
            }
            $site_commerces[$term->id()]['name'] = $term->getName();

            $site_commerces[$term->id()]['summary'] = "";
            $site_commerces[$term->id()]['summary'] = $term->get('field_category_summary')->value;
            $site_commerces[$term->id()]['tid'] = $term->id();
            $site_commerces[$term->id()]['site_commerce'] = \Drupal::entityTypeManager()->getStorage('site_commerce')->loadMultiple($pids);
          }
        }
      }
    }

    // Товары в текущей категории.
    $pids = [];
    $query = $db->select('site_commerce_field_data', 'n');
    if (!$user->hasRole('site commerce administer online store')) {
      $query->condition('n.status', 1);
      $query->condition('n.status_catalog', 1);
    }
    $query->fields('n', array('pid'));
    $query->innerJoin('site_commerce__field_category', 't', 't.entity_id=n.pid');
    $query->condition('t.field_category_target_id', $term_current->id());
    $query->orderBy('weight');
    $pager = $query->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(80);
    $result = $pager->execute();

    foreach ($result as $row) {
      $pids[] = $row->pid;
    }

    if ($pids) {
      $count_term_products = \Drupal::service('site_commerce.database')->countProducts(1, $term_current->id());
      $site_commerces[$term_current->id()]['view_all'] = FALSE;
      $site_commerces[$term_current->id()]['count_term_products'] = $count_term_products;

      // Заголовок для дополнительных товаров или услуг.
      $site_commerces[$term_current->id()]['name'] = "";
      if (count($terms)) {
        $site_commerces[$term_current->id()]['name'] = t('Additional products (services) in the category «@category»', ['@category' => $term_current->getName()]);
      }

      $site_commerces[$term_current->id()]['summary'] = "";
      $site_commerces[$term_current->id()]['view_all'] = FALSE;
      $site_commerces[$term_current->id()]['tid'] = "";
      $site_commerces[$term_current->id()]['site_commerce'] = \Drupal::entityTypeManager()->getStorage('site_commerce')->loadMultiple($pids);
    }

    if (count($site_commerces)) {
      $build['products'] = array(
        '#theme' => 'site_commerce_catalog_products',
        '#site_commerces' => $site_commerces,
        '#attached' => array(
          'library' => array(
            'site_commerce/card',
          ),
        ),
        '#cache' => [
          'tags' => ['taxonomy_term:' . $term_current->id()],
          'contexts' => ['languages'],
          'max-age' => Cache::PERMANENT,
        ],
      );

      // Добавляет пейджер на страницу.
      if (!count($terms)) {
        $build['pager'] = array(
          '#type' => 'pager',
          '#quantity' => 2,
        );
      }
    }

    return $build;
  }
618327
public function postChangeData()
	{
		$data = Input::all();

		//проверяем данные
		$errors = $this->getErrorFromChangeData($data);
		if ($errors) {
			return $errors;
		}

		//Проверяем текущий пароль
		$user_id = Config::get('ff-qiwi-gate::user_id');
		$currentMerchant = Merchant::find($user_id);
		if ($data['oldPassword'] != $currentMerchant->password) {
			$result['errors'] = array(
				'username'        => '',
				'callback'        => '',
				'email'           => '',
				'key'             => '',
				'password'        => '',
				'confirmPassword' => '',
				'oldPassword'     => 'Неверный пароль',
			);

			return $result;
		}

		//Изменяем данные
		$merchant = Merchants::ChangeMerchant($currentMerchant, $data);
		if ($merchant) {
			$message = 'Данные изменены';

			return array('message' => $message);
		}
		$result['errors'] = array(
			'oldPassword' => 'Ошибка, попробуйте ещё раз.',
		);

		return $result;

	}
299664
final function action() {return $this->_m->action(function() {
		$m = $this->_m; /** @var M $m */
		$this->preorder();
		$p = $this->redirectParams(); /** @var array(string => mixed) $p */
		if ($url = dfp_url_api($m, $this->redirectUrl())) { /** @var string|null $url */
			PO::setRedirectData($m, $url, $p, $this->forceGet());
			// 2016-12-20
			if ($this->s()->log()) {
				dfp_report($m, ['Redirect Params' => $p, 'Redirect URL' => $url], 'request');
			}
			// 2016-05-06
			// Postpone sending an order confirmation email to the customer,
			// because the customer should pass 3D Secure validation first.
			// «How is a confirmation email sent on an order placement?» https://mage2.pro/t/1542
			$this->oq()->setCanSendNewEmailFlag(false);
		}
		/**
		 * 2017-03-26
		 * Stripe-подобные платёжные модули типа Omise
		 * (и в перспективе, после надлежащего рефакторинга — Checkout.com),
		 * осуществляют проверку 3D Secure с перенаправлением браузера.
		 * Они записывают первичную транзакцию в методе @see \Df\StripeClone\Method::chargeNew()
		 * https://github.com/mage2pro/core/blob/2.4.0/StripeClone/Method.php#L117-L164
		 * В этом случае мы не попадаем в расположенную ниже ветку,
		 * потому что @uses transId() по умолчанию возвращает null,
		 * а указанные модули этот метод намеренно не перекрывают.
		 * 2017-03-29
		 * Транзакция может записываться и без перенаправления:
		 * например, при выборе опции Bank Transfer модуля Kassa Compleet.
		 */
		if ($id = $this->transId() /** @var string|null $id */) {
			$result = null;
			$m->ii()->setTransactionId($id); // 2016-07-10 Сохраняем информацию о транзакции.
			if (!$this->forceGet()) {
				/**
				 * 2017-03-26
				 * Некоторые модули (Ginger Payments, Kassa Compleet, QIWI Wallet) перенаправляют покупателя
				 * на платёжную страницу ПС без параметров POST: они передают параметры через URL.
				 * В этом случае данный вызов @uses \Df\Payment\Method::iiaSetTRR()
				 * безвреден (он ничего не сделает), а параметры запроса сохраняются в транзакции
				 * каким-то другим методом, например:
				 * @see \Df\GingerPaymentsBase\Init\Action::req()
				 * @see \Df\GingerPaymentsBase\Init\Action::res()
				 * @see \Dfe\Qiwi\Init\Action::preorder()
				 */
				$m->iiaSetTRR($p);
			}
			/**
			 * 2016-07-10
			 * @uses \Magento\Sales\Model\Order\Payment\Transaction::TYPE_PAYMENT —
			 * это единственный транзакция без специального назначения,
			 * и поэтому мы можем безопасно его использовать
			 * для сохранения информации о нашем запросе к платёжной системе.
			 */
			$m->ii()->addTransaction(T::TYPE_PAYMENT);
		}
		/**
		 * 2017-11-11
		 * We return `null` in the redirection case.
		 * The result of this method will be returned
		 * by the @used-by \Df\Payment\Method::getConfigPaymentAction() method
		 * to the @used-by \Magento\Sales\Model\Order\Payment::place() method:
		 *		$orderState = Order::STATE_NEW;
		 *		$orderStatus = $methodInstance->getConfigData('order_status');
		 *		<...>
		 *		$action = $methodInstance->getConfigPaymentAction();
		 *		if ($action) {
		 *			if ($methodInstance->isInitializeNeeded()) {
		 *				$stateObject = new \Magento\Framework\DataObject();
		 *				// For method initialization we have to use original config value for payment action
		 *				$methodInstance->initialize(
		 * 					$methodInstance->getConfigData('payment_action'), $stateObject
		 * 				);
		 *				$orderState = $stateObject->getData('state') ?: $orderState;
		 *				$orderStatus = $stateObject->getData('status') ?: $orderStatus;
		 *				$isCustomerNotified = $stateObject->hasData('is_notified')
		 *					? $stateObject->getData('is_notified')
		 *					: $isCustomerNotified;
		 *			} else {
		 *				$orderState = Order::STATE_PROCESSING;
		 *				$this->processAction($action, $order);
		 *				$orderState = $order->getState() ? $order->getState() : $orderState;
		 *				$orderStatus = $order->getStatus() ? $order->getStatus() : $orderStatus;
		 *			}
		 *		} else {
		 *			$order->setState($orderState)
		 *				->setStatus($orderStatus);
		 *		}
		 * This code is the same in Magento 2.0.0 - 2.2.1:
		 * https://github.com/magento/magento2/blob/2.0.0/app/code/Magento/Sales/Model/Order/Payment.php#L316-L343
		 * https://github.com/magento/magento2/blob/2.2.1/app/code/Magento/Sales/Model/Order/Payment.php#L348-L375
		 * As you can see, if $action is `null`,
		 * then the current order will have the @see \Magento\Sales\Model\Order::STATE_NEW state:
		 * it is what we need in the redirection case.
		 */
		return $url || $id ? null : $this->preconfigured();
	}, false);}
1156959
function () {
            // все аргументы, кроме последнего считаются необходимыми зависимостями
            var depsList = franky.toArray(arguments).slice(0, arguments.length - 1),
            // последний аргумент - функция в которую уйдут удовлетворенные зависимости
                callback = arguments[arguments.length - 1];
            // обработка зависимостей
            depsList = franky.map(depsList, function (depsItem) {
                if (!libs[depsItem]) {
                    throw new Error('Unmet dependency:' + depsItem);
                }
                // если модуль представляет из себя синглтон - кешируем его
                if (cached[depsItem]) {
                    libs[depsItem] = franky.isFunction(libs[depsItem]) ? libs[depsItem]() : libs[depsItem];
                    return libs[depsItem];
                } else {
                    return libs[depsItem]();
                }
            });

            // пробрасываем удовлетворенные зависимости
            callback.apply(this, depsList);

            return this;
        }
1180329
public function boot()
    {
        Route::pattern('id', '^[0-9]*$');
        Route::pattern('article', '^[\w\-0-9]+$');
        Route::pattern('tag', '^[\w\-0-9\+\%\s]+$');
        Route::pattern('category', '^[\w\-0-9\/]+$');
        Route::pattern('commentable_id', '^[0-9]*$');
        Route::pattern('commentable_type', '^[a-zA-Z_]+$');

        /*Для новостей , статей не надо этого. Для пользователей не знаю
        Route::model('article', \BBCMS\Models\Article::class);
        Route::model('category', \BBCMS\Models\Category::class);
        Route::model('users', BBCMS\Models\User::class);*/

        // Backend
        Route::pattern('module', '^[a-z_]+$');
        Route::pattern('module_id', '^[0-9]*$');
        Route::pattern('setting_id', '^[0-9]*$');

        // Common
        Route::pattern('model', '^[a-zA-Z_]+$');
        Route::pattern('attribute', '^[a-zA-Z_]+$');

        // $router->bind('articles', function($id) {
        //     return \BBCMS\Models\Article::active()->findOrFail($id);
        // });

        parent::boot();
    }
693676
function setCookie(pr_name, exdays) {
        var d = new Date();
        d = (d.getTime() + (exdays*24*60*60*1000));
        document.cookie = pr_name+"="+d + ";" + ";path=/";
    }
1225223
static function get_cached($url, $ttl = 86400, $raw = false, $force = false, $max_length = 1000000)
	{
		//FIXME: Придумать более изящный способ
		$cache_status_save = config('cache_disabled');
		config_set('cache_disabled', false);
		debug_count_inc('bors_lib_url: get_cached('.$url.')');
		$cache = new bors_cache();
		if($cache->get('bors_lib_http.get_cached-v2', $url) && !$force)
		{
			debug_count_inc('bors_lib_url: get_cached('.$url.'):found');
			$res = $cache->last();
			config_set('cache_disabled', $cache_status_save);
			return $res;
		}

		$x = self::get_ex($url, array('is_raw' => $raw));
		$content = $x['content'];

		// Запоминаем не более одного мегабайта, а то по max_allowed_packet можно влететь.
		if(strlen($content) > $max_length)
			$content = substr($content, 0, $max_length);

		debug_count_inc('bors_lib_url: get_cached('.$url.'):store');
		$cache->set($content, $ttl);
		config_set('cache_disabled', $cache_status_save);
		return $content;
	}
18910
function getData (css, opts) {
	var helper = {};

	// удаляем комментарии
	css.walkComments(function (comment) {
		comment.remove();
	});

	// удаляем свойства и правила без данных
	css.walkRules(function (rule, i) {
		rule.walkDecls(function (decl, j) {
			if (!decl.value.match(dataRegexp)) {
				decl.remove();
			};

			if (rule.nodes.length === 0) {
				rule.remove();
			};
		});
	});
	css.walkAtRules(function (atRule) {
		if (atRule.nodes && atRule.nodes.length === 0) {
			atRule.remove();
		};

		if (atRule.name === 'font-face') {
			atRule.walkDecls(function (decl, j) {
				if (decl.prop === 'src') {
					if (!decl.value.match(dataRegexp)) {
						atRule.remove();
					};
				};
			});
		};
	});

	if (opts.pure) {

		// очищаем итоговый файл от дубликатов данных
		css.walkRules(function (rule, i) {
			rule.walkDecls(function (decl, j) {

				var arr;

				if (!helper.hasOwnProperty(decl.prop)) {
					helper[decl.prop] = [];
				};

				// запоминаем массив положений нужного свойства
				arr = helper[decl.prop];

				// получили индекс правила с нужными данными
				// если он есть
				var index = findValue(arr, decl.value);

				if ((arr.length === 0) || (index < 0)) {

					// запоминаем уникальные данные
					arr.push({
						pos: i,
						val: purifyValue(decl.value)
					});
				}
				else if (index >= 0) {

					// собираем селекторы с одинаковыми данными
					css.nodes[index].selector += ','+ rule.selector;
					css.nodes[index].selector = cleanSelector(css.nodes[index].selector);

					decl.remove();
				};

				// сохраняем нужный массив положений свойства
				helper[decl.prop] = arr;

			});

			if (rule.nodes.length === 0) {
				rule.remove();
			};
		});

		// после слияния правил могут остаться пустые медиавыражения
		css.walkAtRules(function (atRule) {
			if (atRule.nodes && atRule.nodes.length === 0) {
				atRule.remove();
			};
		});
	};
}