(function(){this._ycssjs||(this._ycssjs=function(k, f){return !(k in _ycssjs||_ycssjs[k]++)})})();
if(_ycssjs('OaPBIFMSEGPmFTJJNAh9doexhGo')){
/* pages/yaca/yaca.js: begin */ /**/
    if(_ycssjs('NUcGnjmospKsU1f1hKcSk2EBaP4')){
    /* lego/blocks/i-common/border-radius/i-common__border-radius.js: begin */ /**/
        if(_ycssjs('rc8za4c5JC6qZqe9F2/oITh9RlU')){
        (function () {
        
            /**
             * Проверяет, поддерживает ли браузер CSS-свойство border-radius.
             */
            var isBorderRadiusSupported = function () {
                var s = document.documentElement.style;
                return typeof s.borderRadius === "string" ||
                       typeof s.WebkitBorderRadius === "string" ||
                       typeof s.KhtmlBorderRadius === "string" ||
                       typeof s.MozBorderRadius === "string";
            };
        
            document.documentElement.className += isBorderRadiusSupported() ? " m-border-radius" : " m-no-border-radius";
        
        }());
        
        }
    /* lego/blocks/i-common/border-radius/i-common__border-radius.js: end */ /**/
    
    /* lego/blocks/i-counter/i-counter.js: begin */ /**/
        if(_ycssjs('sB8Ufwdf2USNYgDhbYGLxUphZvA')){
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        
        !Lego.params && (Lego.params = {});
        
        
        /**
         * Хелпер удаляющий протокол из переданного хоста, для приведения
         * к каноническому виду.
         *
         * @param h {String}
         * @returns {String}
         */
        function preparseHost(h) {
            return h.replace(/^(?:https?:)?\/\//, '');
        }
        
        /**
         * Счётчик клика на ссылку или просто показа.
         *
         * В случае клика подменяет href на redir'овский, потом по таймауту возвращает его обратно.
         *
         * В случае учёта показа динамически создаёт скрипт с URL системы учёта.
         *
         * Пример использования:
         *
         * <a href="http://meteoinfo.ru" onmousedown="Lego.c('stred/pid=7/cid=433',this)">Гидрометцентр</a>
         *
         * или
         *
         * < script type="text/javascript">Lego.c('stred/pid=7/cid=433')< /script>
         *
         * @param w     параметры счётчика
         * @param a     (optional) ссылка, клик на которую надо учитывать
         * @param opts  (optional) opts.noRedirect = true обрабатывает клик по обычной ссылке, как по b-pseudo-link
         */ /**/
        Lego.c = function(w, a, opts) {
        /*
            new Image().src = location.protocol + '//clck.yandex.ru/click/dtype=' + w +
                '/rnd=' + ((new Date()).getTime() + Math.round(Math.random()*100)) +
                '/*' + (a ? (a.href || location.href) : '');
        */
        
            var host = preparseHost((opts && opts.host) || Lego.params['click-host'] || 'clck.yandex.ru'),
                url = function(w, h, t, a) {
                    return h.indexOf('/dtype=') > -1?
                        h :
                        location.protocol + '//' + host + '/' + t + '/dtype=' + w +
                            '/rnd=' + ((new Date()).getTime() + Math.round(Math.random()*100)) +
                            (a?
                                '/*' + (h.match(/^http/) ? h : location.protocol + '//' + location.host + (h.match('^/') ? h : '/' + h)) :
                                '/*data=' + encodeURIComponent('url='+ encodeURIComponent((h.match(/^http/) ? h : location.protocol + '//' + location.host + (h.match('^/') ? h : '/' + h)))));
                },
                click = function() {
                    var head = document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0];
                    var script = document.createElement('script');
                    script.setAttribute('src', url(w, location.href, 'jclck'));
                    head.insertBefore(script, head.firstChild);
                };
        
            if (a) {
                // для псевдоссылки и ссылки mailto просто считаем click, создавая iframe и в него грузим счётчик
                if (a.className.match(/b-pseudo-link/) || (a.href && a.href.match(/^mailto:/)) || (opts && opts.noRedirect === true)) {
                    click();
                } else if (a.href) { // клик на ссылку, подменяем href на redir'овский, потом по таймауту обратно
                    var h = a.href;
                    a.href = url(w, h, "redir");
                    setTimeout(function() { a.href = h }, 500);
                } else if (a.form) { // клик на элемент формы
                    if (a.type.match(/submit|button|image/)) { // клик на кнопку, подменяем action на redir'овский, потом по таймауту обратно
                        var h = a.form.action;
                        a.form.action = url(w, h, "redir", true);
                        setTimeout(function() { a.form.action = h }, 500);
                    } else { // просто считаем click, создавая iframe и в него грузим счётчик
                        click();
                    }
                } else if (a.action) { //случай сабмита формы - подменяем его action на redir'овский, назад нам его менять не нужно
                    a.action = url(w, a.action, "redir", true);
                } else {
                    throw "counter.js: not link and not form!";
                }
            } else { // ссылки нет, просто учёт показа, создаём iframe и в него грузим счётчик
                click();
            }
        }
        
        })(window.Lego);
        
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        
        /**
         * Параметризованный счётчик клика на ссылку или просто показа.
         * Перевызывает Lego.c(w, a) из counter.js
         *
         * В случае клика подменяет href на redir'овский, потом по таймауту возвращает его обратно.
         *
         * В случае учёта показа динамически создаёт iframe с URL системы учёта.
         *
         * Пример использования:
         *
         * <a href="http://meteoinfo.ru" onclick="Lego.cp(0,1917,'weather.tabs.fotki',this)">Гидрометцентр</a>
         *
         * или
         *
         * < script type="text/javascript">Lego.cp(0,1917,'weather.tabs.fotki')< /script>
         *
         * @param pi    номер проекта (pid)
         * @param ci    номер счётчика (cid)
         * @param p     (optional) parameter
         * @param a     (optional) ссылка, клик на которую надо учитывать
         * @param opts  (optional) opts.noRedirect = true обрабатывает клик по обычной ссылке, как по b-pseudo-link
         */
        Lego.cp = function(pi, ci, p, a, opts) {
            Lego.c('stred/pid=' + pi + '/cid=' + ci + (p ? '/path=' + p : ''), a, opts);
        }
        
        })(window.Lego);
        
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        
        !Lego.params && (Lego.params = {});
        
        /**
         * Параметризованный счётчик клика на ссылку в шапке. Перевызывает cp(w, a) из counter-cp.js
         * Используется для уменьшения веса страницы.
         *
         * Пример использования:
         *
         * <a href="http://meteoinfo.ru" onclick="ch('weather.tabs.fotki',this)">Гидрометцентр</a>
         *
         * или
         *
         * < script type="text/javascript">ch('weather')< /script>
         *
         * @param p     parameter
         * @param a     (optional) ссылка, клик на которую надо учитывать
         */
        Lego.ch = function(p, a) {
            if (Lego.params['show-counters']) Lego.cp(0, 2219, p, a);
        }
        
        })(window.Lego);
        
        }
    /* lego/blocks/i-counter/i-counter.js: end */ /**/
    
    /* lego/blocks/i-common/cookie/i-common__cookie.js: begin */ /**/
        if(_ycssjs('cXnDO14Y5A+NxW1rFFI6qOjFo1E')){
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        
        Lego.getCookie = function(n) {
            var c = document.cookie;
            if (c.length < 1) return false;
        
            var b = c.indexOf(n + '=');
            if (b == -1) return false;
        
            b += (n.length + 1);
            var e = c.indexOf(';', b);
        
            return decodeURIComponent((e == -1) ? c.substring(b) : c.substring(b, e));
        }
        
        })(window.Lego);
        
        }
    /* lego/blocks/i-common/cookie/i-common__cookie.js: end */ /**/
    
    /* lego/blocks/i-common/check-session/i-common__check-session.js: begin */ /**/
        if(_ycssjs('aIsupGFtZhGfKbXxiPQIrAPBfBk')){
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        /**
         * Проверяет жива ли сессия пользователя (наличие куки yandex_login).
         *
         * @return  true, если сессия пользователя живая.
         */
        Lego.isSessionValid = function() {
            return !!Lego.getCookie('yandex_login');
        }
        })(window.Lego);
        
        }
    /* lego/blocks/i-common/check-session/i-common__check-session.js: end */ /**/
    
    /* lego/blocks/i-common/init/i-common__init.js: begin */ /**/
        if(_ycssjs('+IoN5Ztbl/A8THYownGkak1R/mU')){
        (function($, Lego){
        if (!Lego) Lego = window.Lego = {};
        // Использует cookie.js и check-session.js. Без них не работает.
        
        /**
         * Инициализирует Лего некоторыми параметрами (для вариативности в пределах разных страниц).
         *
         * @param params объект Лего-параметров, необходимые параметры инициализируются умолчательными значениями
         *        params.login логин текущего пользователя ('' для неавторизованного)
         *        params.locale двухбуквенный код локали в нижнем регистре
         *        params.id идентификатор сервиса
         *        params['show-counters-percent'] процент срабатывания счётчиков Lego.ch() (по умолчанию 100)
         *
         * @return возвращает установленные параметры с учетом умолчательных значений
         */
        Lego.init || (Lego.init = function(params) {
            (params = Lego.params = $.extend(
                {
                    id : '',
                    login : Lego.isSessionValid() ? Lego.getCookie('yandex_login') || '' : '',
                    yandexuid : Lego.getCookie('yandexuid'),
                    locale : 'ru',
                    retpath : window.location.toString(),
                    'passport-host' : '//passport.yandex.ru',
                    'pass-host' : '//pass.yandex.ru',
                    'passport-msg' : params.id,
                    'social-host' : '//social.yandex.ru',
                    'lego-path' : '/lego',
                    'show-counters-percent' : 100
                },
                params,
                Lego.params))
                ['show-counters'] = Math.round(Math.random() * 100) <= params['show-counters-percent'];
        
            $(function(){
                params.oframebust && Lego.oframebust(params.oframebust);
            });
        
            return params;
        });
        
        Lego.block || (Lego.block = {});
        
        Lego.blockInit || (Lego.blockInit = function(context, blockSelector) {
            context = context || document;
            blockSelector = blockSelector || '.g-js';
            $(context).find(blockSelector).each(function(){
                var block = $(this),
                    params = this.onclick ? this.onclick() : {},
                    name = params.name || '',
                    init = Lego.block[name];
                if (init && !block.data(name)) {
                    init.call(block, params);
                    block
                        .data(name, true)
                        .addClass(name + '_js_inited');
                }
            });
        });
        
        Lego.blockInitBinded || (Lego.blockInitBinded = !!$(document).ready(function(){ Lego.blockInit() }));
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/i-common/init/i-common__init.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__inherit/i-jquery__inherit.js: begin */ /**/
        if(_ycssjs('RodIztVGat7t60ysl61NYZhp+d4')){
        /**
         * Inheritance plugin
         *
         * Copyright (c) 2010 Filatov Dmitry (alpha@zforms.ru)
         * Dual licensed under the MIT and GPL licenses:
         * http://www.opensource.org/licenses/mit-license.php
         * http://www.gnu.org/licenses/gpl.html
         *
         * @version 1.3.2
         */
        
        (function($) {
        
        var hasIntrospection = (function(){_}).toString().indexOf('_') > -1,
            needCheckProps = $.browser.msie, // fucking ie hasn't toString, valueOf in for
            specProps = needCheckProps? ['toString', 'valueOf'] : null,
            emptyBase = function() {};
        
        function override(base, result, add) {
        
            var hasSpecProps = false;
            if(needCheckProps) {
                var addList = [];
                $.each(specProps, function() {
                    add.hasOwnProperty(this) && (hasSpecProps = true) && addList.push({
                        name : this,
                        val  : add[this]
                    });
                });
                if(hasSpecProps) {
                    $.each(add, function(name) {
                        addList.push({
                            name : name,
                            val  : this
                        });
                    });
                    add = addList;
                }
            }
        
            $.each(add, function(name, prop) {
                if(hasSpecProps) {
                    name = prop.name;
                    prop = prop.val;
                }
                if($.isFunction(prop) &&
                   (!hasIntrospection || prop.toString().indexOf('.__base') > -1)) {
        
                    var baseMethod = base[name] || function() {};
                    result[name] = function() {
                        var baseSaved = this.__base;
                        this.__base = baseMethod;
                        var result = prop.apply(this, arguments);
                        this.__base = baseSaved;
                        return result;
                    };
        
                }
                else {
                    result[name] = prop;
                }
        
            });
        
        }
        
        $.inherit = function() {
        
            var hasBase = $.isFunction(arguments[0]),
                base = hasBase? arguments[0] : emptyBase,
                props = arguments[hasBase? 1 : 0] || {},
                staticProps = arguments[hasBase? 2 : 1],
                result = props.__constructor || (hasBase && base.prototype.__constructor)?
                    function() {
                        this.__constructor.apply(this, arguments);
                    } : function() {};
        
            if(!hasBase) {
                result.prototype = props;
                result.prototype.__self = result.prototype.constructor = result;
                return $.extend(result, staticProps);
            }
        
            $.extend(result, base);
        
            var inheritance = function() {},
                basePtp = inheritance.prototype = base.prototype,
                resultPtp = result.prototype = new inheritance();
        
            resultPtp.__self = resultPtp.constructor = result;
        
            override(basePtp, resultPtp, props);
            staticProps && override(base, result, staticProps);
        
            return result;
        
        };
        
        $.inheritSelf = function(base, props, staticProps) {
        
            var basePtp = base.prototype;
        
            override(basePtp, basePtp, props);
            staticProps && override(base, base, staticProps);
        
            return base;
        
        };
        
        })(jQuery);
        }
    /* lego/bem-bl/blocks-common/i-jquery/__inherit/i-jquery__inherit.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__identify/i-jquery__identify.js: begin */ /**/
        if(_ycssjs('me/0OccXjp6tpD2MvHOgRzlwjoE')){
        /**
         * Identify plugin
         *
         * @version 1.0.0
         */
        
        (function($) {
        
        var counter = 0,
            expando = '__' + (+new Date),
            get = function() {
                return 'uniq' + ++counter;
            };
        
        /**
         * Уникализатор
         * @param {Object} [obj] объект, который нужно идентифицировать
         * @param {Boolean} [onlyGet=false] возвращать уникальное значение, только если оно уже до этого было присвоено
         * @returns {String} идентификатор
         */
        $.identify = function(obj, onlyGet) {
        
            if(!obj) return get();
        
            var key = 'uniqueID' in obj? 'uniqueID' : expando; // используем, по возможности. нативный uniqueID для элементов в IE
        
            return onlyGet || key in obj?
                obj[key] :
                obj[key] = get();
        
        };
        
        })(jQuery);
        }
    /* lego/bem-bl/blocks-common/i-jquery/__identify/i-jquery__identify.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__is-empty-object/i-jquery__is-empty-object.js: begin */ /**/
        if(_ycssjs('gOR9FuNtxxFTRUHpBJCppIiGQD8')){
        (function($) {
        
        $.isEmptyObject || ($.isEmptyObject = function(obj) {
                for(var i in obj) return false;
                return true;
            });
        
        })(jQuery);
        
        }
    /* lego/bem-bl/blocks-common/i-jquery/__is-empty-object/i-jquery__is-empty-object.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__debounce/i-jquery__debounce.js: begin */ /**/
        if(_ycssjs('AW47RAjsjOlefg/2L/CsT2aXktI')){
        /**
         * Debounce and throttle function's decorator plugin 1.0.6
         *
         * Copyright (c) 2009 Filatov Dmitry (alpha@zforms.ru)
         * Dual licensed under the MIT and GPL licenses:
         * http://www.opensource.org/licenses/mit-license.php
         * http://www.gnu.org/licenses/gpl.html
         *
         */
        
        (function($) {
        
        $.extend({
        
            debounce : function(fn, timeout, invokeAsap, ctx) {
        
                if(arguments.length == 3 && typeof invokeAsap != 'boolean') {
                    ctx = invokeAsap;
                    invokeAsap = false;
                }
        
                var timer;
        
                return function() {
        
                    var args = arguments;
                    ctx = ctx || this;
        
                    invokeAsap && !timer && fn.apply(ctx, args);
        
                    clearTimeout(timer);
        
                    timer = setTimeout(function() {
                        invokeAsap || fn.apply(ctx, args);
                        timer = null;
                    }, timeout);
        
                };
        
            },
        
            throttle : function(fn, timeout, ctx) {
        
                var timer, args, needInvoke;
        
                return function() {
        
                    args = arguments;
                    needInvoke = true;
                    ctx = ctx || this;
        
                    timer || (function() {
                        if(needInvoke) {
                            fn.apply(ctx, args);
                            needInvoke = false;
                            timer = setTimeout(arguments.callee, timeout);
                        }
                        else {
                            timer = null;
                        }
                    })();
        
                };
        
            }
        
        });
        
        })(jQuery);
        }
    /* lego/bem-bl/blocks-common/i-jquery/__debounce/i-jquery__debounce.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__observable/i-jquery__observable.js: begin */ /**/
        if(_ycssjs('YB77wAPEhrLyKHXtnaxlOgv3K4A')){
        /**
         * Observable plugin
         *
         * Copyright (c) 2010 Filatov Dmitry (alpha@zforms.ru)
         * Dual licensed under the MIT and GPL licenses:
         * http://www.opensource.org/licenses/mit-license.php
         * http://www.gnu.org/licenses/gpl.html
         *
         * @version 1.0.0
         * @requires $.identify
         */
        
        (function($) {
        
        var storageExpando = '__' + +new Date + 'storage',
            getFnId = function(fn, ctx) {
                return $.identify(fn) + (ctx? $.identify(ctx) : '');
            },
            Observable = /** @lends $.observable.prototype */{
        
                /**
                 * Строит полное имя события
                 * @protected
                 * @param {String} e тип события
                 * @returns {String}
                 */
                buildEventName : function(e) {
        
                    return e;
        
                },
        
                /**
                 * Добавление обработчика события
                 * @param {String} e тип события
                 * @param {Object} [data] дополнительные данные, приходящие в обработчик как e.data
                 * @param {Function} fn обработчик
                 * @param {Object} [ctx] контекст обработчика
                 * @returns {$.observable}
                 */
                on : function(e, data, fn, ctx, _special) {
        
                    if(typeof e == 'string') {
                        if($.isFunction(data)) {
                            ctx = fn;
                            fn = data;
                            data = undefined;
                        }
        
                        var id = getFnId(fn, ctx),
                            storage = this[storageExpando] || (this[storageExpando] = {}),
                            eList = e.split(' '),
                            i = 0,
                            eStorage;
        
                        while(e = eList[i++]) {
                            e = this.buildEventName(e);
                            eStorage = storage[e] || (storage[e] = { ids : {}, list : {} });
        
                            if(!(id in eStorage.ids)) {
                                var list = eStorage.list,
                                    item = { fn : fn, data : data, ctx : ctx, special : _special };
                                if(list.last) {
                                    list.last.next = item;
                                    item.prev = list.last;
                                } else {
                                    list.first = item;
                                }
        
                                eStorage.ids[id] = list.last = item;
                            }
                        }
                    } else {
                        var _this = this;
                        $.each(e, function(e, fn) {
                            _this.on(e, fn, data, _special);
                        });
                    }
        
                    return this;
        
                },
        
                onFirst : function(e, data, fn, ctx) {
        
                    return this.on(e, data, fn, ctx, { one : true });
        
                },
        
                /**
                 * Удаление обработчика/обработчиков события
                 * @param {String} [e] тип события
                 * @param {Function} [fn] обработчик
                 * @param {Object} [ctx] контекст обработчика
                 * @returns {$.observable}
                 */
                un : function(e, fn, ctx) {
        
                    if(typeof e == 'string' || typeof e == 'undefined') {
                        var storage = this[storageExpando];
                        if(storage) {
                            if(e) { // если передан тип события
                                var eList = e.split(' '),
                                    i = 0,
                                    eStorage;
                                while(e = eList[i++]) {
                                    e = this.buildEventName(e);
                                    if(eStorage = storage[e]) {
                                        if(fn) {  // если передан конкретный обработчик
                                            var id = getFnId(fn, ctx),
                                                ids = eStorage.ids;
                                            if(id in ids) {
                                                var list = eStorage.list,
                                                    item = ids[id],
                                                    prev = item.prev,
                                                    next = item.next;
        
                                                if(prev) {
                                                    prev.next = next;
                                                }
                                                else if(item === list.first) {
                                                    list.first = next;
                                                }
        
                                                if(next) {
                                                    next.prev = prev;
                                                }
                                                else if(item === list.last) {
                                                    list.last = prev;
                                                }
        
                                                delete ids[id];
                                            }
                                        } else {
                                            delete this[storageExpando][e];
                                        }
                                    }
                                }
                            } else {
                                delete this[storageExpando];
                            }
                        }
                    } else {
                        var _this = this;
                        $.each(e, function(e, fn) {
                            _this.un(e, fn, ctx);
                        });
                    }
        
                    return this;
        
                },
        
                /**
                 * Запускает обработчики события
                 * @param {String|$.Event} e событие
                 * @param {Object} [data] дополнительные данные
                 * @returns {$.observable}
                 */
                trigger : function(e, data) {
        
                    var _this = this,
                        storage = _this[storageExpando],
                        rawType;
        
                    typeof e === 'string'?
                        e = $.Event(_this.buildEventName(rawType = e)) :
                        e.type = _this.buildEventName(rawType = e.type);
        
                    if(storage && (storage = storage[e.type])) {
                        var item = storage.list.first,
                            ret;
                        while(item) {
                            e.data = item.data;
                            ret = item.fn.call(item.ctx || _this, e, data);
                            if(typeof ret !== 'undefined') {
                                e.result = ret;
                                if(ret === false) {
                                    e.preventDefault();
                                    e.stopPropagation();
                                }
                            }
        
                            item.special && item.special.one &&
                                _this.un(rawType, item.fn, item.ctx);
                            item = item.next;
                        }
                    }
        
                    return this;
        
                }
        
            };
        
        $.observable = $.inherit(Observable, Observable);
        
        })(jQuery);
        }
    /* lego/bem-bl/blocks-common/i-jquery/__observable/i-jquery__observable.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-bem/i-bem.js: begin */ /**/
        if(_ycssjs('jJ++ZQbCRuGES4cCMIisQY4VRFA')){
        /** @requires jquery.inherit */
        /** @requires jquery.isEmptyObject */
        /** @requires jquery.identify */
        /** @requires jquery.observable */
        
        (function($, undefined) {
        
        /**
         * Хранилище для отложенных функций
         * @private
         * @type Array
         */
        var afterCurrentEventFns = [],
        
        /**
         * Хранилище деклараций блоков (хэш по имени блока)
         * @private
         * @type Object
         */
            blocks = {},
        
        /**
         * Каналы сообщений
         * @static
         * @private
         * @type Object
         */
            channels = {};
        
        /**
         * Строит имя метода-обработчика установки модификатора
         * @static
         * @private
         * @param {String} elemName имя элемента
         * @param {String} modName имя модификатора
         * @param {String} modVal значение модификатора
         * @returns {String}
         */
        function buildModFnName(elemName, modName, modVal) {
        
            return (elemName? '__elem_' + elemName : '') +
                   '__mod' +
                   (modName? '_' + modName : '') +
                   (modVal? '_' + modVal : '');
        
        }
        
        /**
         * Преобразует хэш обработчиков модификаторов в методы
         * @static
         * @private
         * @param {Object} modFns
         * @param {Object} props
         * @param {String} [elemName]
         */
        function modFnsToProps(modFns, props, elemName) {
        
            $.isFunction(modFns)?
                (props[buildModFnName(elemName, '*', '*')] = modFns) :
                $.each(modFns, function(modName, modFn) {
                    $.isFunction(modFn)?
                        (props[buildModFnName(elemName, modName, '*')] = modFn) :
                        $.each(modFn, function(modVal, modFn) {
                            props[buildModFnName(elemName, modName, modVal)] = modFn;
                        });
                });
        
        }
        
        /** @namespace */
        this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
        
            /**
             * @class Базовый блок для создания bem-блоков
             * @constructs
             * @private
             * @param {Object} mods модификаторы блока
             * @param {Object} params параметры блока
             * @param {Boolean} [initImmediately=true]
             */
            __constructor : function(mods, params, initImmediately) {
        
                var _this = this;
        
                /**
                 * кэш модификаторов блока
                 * @private
                 * @type Object
                 */
                _this._modCache = mods || {};
        
                /**
                 * текущие модификаторы в стэке установки
                 * @private
                 * @type Object
                 */
                _this._processingMods = {};
        
                /**
                 * параметры блока с учетом дефолтных
                 * @protected
                 * @type Object
                 */
                _this.params = $.extend(_this.getDefaultParams(), params);
        
                initImmediately !== false?
                    _this._init() :
                    _this.afterCurrentEvent(_this._init);
        
            },
        
            /**
             * Инициализирует блок
             * @private
             */
            _init : function() {
        
                return this
                    .setMod('js', 'inited')
                    .trigger('init');
        
            },
        
            /**
             * Изменяет контекст передаваемой функции
             * @protected
             * @param {Function} fn
             * @param {Object} [ctx=this] контекст
             * @returns {Function} функция с измененным контекстом
             */
            changeThis : function(fn, ctx) {
        
                var _this = this;
                return function() {
                    return fn.apply(ctx || _this, arguments);
                };
        
            },
        
            /**
             * Выполняет функцию в контексте блока после "текущего события"
             * @protected
             * @param {Function} fn
             * @param {Object} [ctx] контекст
             */
            afterCurrentEvent : function(fn, ctx) {
        
                this.__self.afterCurrentEvent(this.changeThis(fn, ctx));
        
            },
        
            /**
             * Запускает обработчики события у блока и обработчики live-событий
             * @protected
             * @param {String} e имя события
             * @param {Object} [data] дополнительные данные
             * @returns {BEM}
             */
            trigger : function(e, data) {
        
                this
                    .__base(e = this.buildEvent(e), data)
                    .__self.trigger(e, data);
        
                return this;
        
            },
        
            buildEvent : function(e) {
        
                typeof e == 'string' && (e = $.Event(e));
                e.block = this;
        
                return e;
        
            },
        
            /**
             * Проверят наличие модификатора у блока/вложенного элемента
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @returns {Boolean}
             */
            hasMod : function(elem, modName, modVal) {
        
                var len = arguments.length,
                    invert = false;
        
                if(len == 1) {
                    modVal = '';
                    modName = elem;
                    elem = undefined;
                    invert = true;
                }
                else if(len == 2) {
                    if(typeof elem == 'string') {
                        modVal = modName;
                        modName = elem;
                        elem = undefined;
                    }
                    else {
                        modVal = '';
                        invert = true;
                    }
                }
        
                var res = this.getMod(elem, modName) === modVal;
                return invert? !res : res;
        
            },
        
            /**
             * Возвращает значение модификатора блока/вложенного элемента
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @returns {String} значение модификатора
             */
            getMod : function(elem, modName) {
        
                var type = typeof elem;
                if(type === 'string' || type === 'undefined') { // elem либо отсутствует, либо undefined
                    modName = elem || modName;
                    var modCache = this._modCache;
                    return modName in modCache?
                        modCache[modName] :
                        modCache[modName] = this._extractModVal(modName);
                }
        
                return this._getElemMod(modName, elem);
        
            },
        
            /**
             * Возвращает значение модификатора вложенного элемента
             * @private
             * @param {String} modName имя модификатора
             * @param {Object} elem вложенный элемент
             * @param {Object} [elem] имя вложенного элемента
             * @returns {String} значение модификатора
             */
            _getElemMod : function(modName, elem, elemName) {
        
                return this._extractModVal(modName, elem, elemName);
        
            },
        
            /**
             * Возвращает значения модификаторов блока/вложенного элемента
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} [modName1, ..., modNameN] имена модификаторов
             * @returns {Object} значения модификаторов в виде хэша
             */
            getMods : function(elem) {
        
                var hasElem = elem && typeof elem != 'string',
                    _this = this,
                    modNames = [].slice.call(arguments, hasElem? 1 : 0),
                    res = _this._extractMods(modNames, hasElem? elem : undefined);
        
                if(!hasElem) { // кэшируем
                    modNames.length?
                        $.each(modNames, function(i, name) {
                            _this._modCache[name] = res[name];
                        }):
                        _this._modCache = res;
                }
        
                return res;
        
            },
        
            /**
             * Устанавливает модификатор у блока/вложенного элемента
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @returns {BEM}
             */
            setMod : function(elem, modName, modVal) {
        
                if(typeof modVal == 'undefined') {
                    modVal = modName;
                    modName = elem;
                    elem = undefined;
                }
        
                var _this = this;
        
                if(!elem || elem[0]) {
        
                    var modId = (elem && elem[0]? $.identify(elem[0]) : '') + '_' + modName;
        
                    if(this._processingMods[modId]) return _this;
        
                    var elemName,
                        currentModVal = elem?
                            _this._getElemMod(modName, elem, elemName = _this.__self._extractElemNameFrom(elem)) :
                            _this.getMod(modName);
        
                    if(currentModVal === modVal) return _this;
        
                    this._processingMods[modId] = true;
        
                    var needSetMod = true,
                        modFnParams = [modName, modVal, currentModVal];
        
                    elem && modFnParams.unshift(elem);
        
                    $.each([['*', '*'], [modName, '*'], [modName, modVal]], function(){
                        needSetMod = _this._callModFn(elemName, this[0], this[1], modFnParams) !== false && needSetMod;
                    });
        
                    !elem && needSetMod && (_this._modCache[modName] = modVal);
        
                    needSetMod && _this._afterSetMod(modName, modVal, elem, elemName);
        
                    delete this._processingMods[modId];
                }
        
                return _this;
        
            },
        
            /**
             * Функция после успешного изменения модификатора у блока/вложенного элемента
             * @protected
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @param {Object} [elem] вложенный элемент
             */
            _afterSetMod : function(modName, modVal, elem) {},
        
            /**
             * Устанавливает модификатор у блока/вложенного элемента в зависимости от условия.
             * Если передан параметр condition, то при true устанавливается modVal1, при false - modVal2,
             * если же condition не передан, то устанавливается modVal1, если установлен modVal2, и наоборот
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @param {String} modVal1 первое значение модификатора
             * @param {String} [modVal2] второе значение модификатора
             * @param {Boolean} [condition] условие
             * @returns {BEM}
             */
            toggleMod : function(elem, modName, modVal1, modVal2, condition) {
        
                if(typeof elem == 'string') { // если это блок
                    condition = modVal2;
                    modVal2 = modVal1;
                    modVal1 = modName;
                    modName = elem;
                    elem = undefined;
                }
                if(typeof modVal2 == 'undefined') {
                    modVal2 = '';
                } else if(typeof modVal2 == 'boolean') {
                    condition = modVal2;
                    modVal2 = '';
                }
        
                var modVal = this.getMod(elem, modName);
                (modVal == modVal1 || modVal == modVal2) &&
                    this.setMod(
                        elem,
                        modName,
                        typeof condition === 'boolean'?
                            (condition? modVal1 : modVal2) :
                            this.hasMod(elem, modName, modVal1)? modVal2 : modVal1);
        
                return this;
        
            },
        
            /**
             * Удаляет модификатор у блока/вложенного элемента
             * @protected
             * @param {Object} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @returns {BEM}
             */
            delMod : function(elem, modName) {
        
                if(!modName) {
                    modName = elem;
                    elem = undefined;
                }
        
                return this.setMod(elem, modName, '');
        
            },
        
            /**
             * Выполняет обработчики установки модификаторов
             * @private
             * @param {String} elemName имя элемента
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @param {Array} modFnParams параметры обработчика
             */
            _callModFn : function(elemName, modName, modVal, modFnParams) {
        
                var modFnName = buildModFnName(elemName, modName, modVal);
                return this[modFnName]?
                   this[modFnName].apply(this, modFnParams) :
                   undefined;
        
            },
        
            /**
             * Извлекает значение модификатора
             * @private
             * @param {String} modName имя модификатора
             * @param {Object} [elem] элемент
             * @returns {String} значение модификатора
             */
            _extractModVal : function(modName, elem) {
        
                return '';
        
            },
        
            /**
             * Извлекает имя/значение списка модификаторов
             * @private
             * @param {Array} modNames имена модификаторов
             * @param {Object} [elem] элемент
             * @returns {Object} хэш значений модификаторов по имени
             */
            _extractMods : function(modNames, elem) {
        
                return {};
        
            },
        
            /**
             * Возвращает именованный канал сообщений
             * @param {String} [id='default'] идентификатор канала
             * @param {Boolean} [drop=false] уничтожить канал
             * @returns {$.observable|undefined} канал сообщений
             */
            channel : function(id, drop) {
        
                return this.__self.channel(id, drop);
        
            },
        
            /**
             * Возвращает дефолтные параметры блока
             * @returns {Object}
             */
            getDefaultParams : function() {
        
                return {};
        
            },
        
            /**
             * Хелпер для очистки свойств блока
             * @param {Object} [obj=this]
             */
            del : function(obj) {
        
                var args = [].slice.call(arguments);
                typeof obj == 'string' && args.unshift(this);
                this.__self.del.apply(this.__self, args);
                return this;
        
        	},
        
            /**
             * Удаляет блок
             */
            destruct : function() {}
        
        }, /** @lends BEM */{
        
            _name : 'i-bem',
        
            /**
             * Хранилище деклараций блоков (хэш по имени блока)
             * @static
             * @protected
             * @type Object
             */
            blocks : blocks,
        
            /**
             * Декларатор блоков, создает класс блока
             * @static
             * @protected
             * @param {String|Object} decl имя блока (простой синтаксис) или описание
             * @param {String} decl.block|decl.name имя блока
             * @param {String} [decl.baseBlock] имя родительского блока
             * @param {String} [decl.modName] имя модификатора
             * @param {String} [decl.modVal] значение модификатора
             * @param {Object} props методы
             * @param {Object} [staticProps] статические методы
             */
            decl : function(decl, props, staticProps) {
        
                if(typeof decl == 'string')
                    decl = { block : decl };
                else if(decl.name) {
                    decl.block = decl.name;
                }
        
                if(decl.baseBlock && !blocks[decl.baseBlock])
                    throw('baseBlock "' + decl.baseBlock + '" for "' + decl.block + '" is undefined');
        
                if(props.onSetMod) {
                    modFnsToProps(props.onSetMod, props);
                    delete props.onSetMod;
                }
        
                if(props.onElemSetMod) {
                    $.each(props.onElemSetMod, function(elemName, modFns) {
                        modFnsToProps(modFns, props, elemName);
                    });
                    delete props.onElemSetMod;
                }
        
                var baseBlock = blocks[decl.baseBlock || decl.block] || this;
        
                if(decl.modName) {
                    $.each(props, function(name, prop) {
                        $.isFunction(prop) &&
                            (props[name] = function() {
                                var method;
                                if(this.hasMod(decl.modName, decl.modVal)) {
                                    method = prop;
                                } else {
                                    var baseMethod = baseBlock.prototype[name];
                                    baseMethod && baseMethod !== props[name] &&
                                        (method = this.__base);
                                }
                                return method?
                                    method.apply(this, arguments) :
                                    undefined;
                            });
                    });
                }
        
                var block;
                decl.block == baseBlock._name?
                    // делаем новый live в том случае, если уже запускался старый
                    (block = $.inheritSelf(baseBlock, props, staticProps))._processLive(true) :
                    (block = blocks[decl.block] = $.inherit(baseBlock, props, staticProps))._name = decl.block;
        
                return block;
        
            },
        
            /**
             * Осуществляет обработку live-свойств блока
             * @private
             * @param {Boolean} [heedLive=false] нужно ли учитывать то, что блок обрабатывал уже свои live-свойства
             * @returns {Boolean} является ли блок live-блоком
             */
            _processLive : function(heedLive) {
        
                return false;
        
            },
        
            /**
             * Фабричный метод для создания экземпляра блока по имени
             * @static
             * @param {String|Object} block имя блока или описание
             * @param {Object} [params] параметры блока
             * @returns {BEM}
             */
            create : function(block, params) {
        
                typeof block == 'string' && (block = { block : block });
        
                return new blocks[block.block](block.mods, params);
        
            },
        
            /**
             * Возвращает имя текущего блока
             * @static
             * @protected
             * @returns {String}
             */
            getName : function() {
        
                return this._name;
        
            },
        
            /**
             * Извлекает имя вложенного в блок элемента
             * @static
             * @private
             * @param {Object} elem вложенный элемент
             * @returns {String|undefined}
             */
            _extractElemNameFrom : function(elem) {},
        
            /**
             * Добавляет функцию в очередь для запуска после "текущего события"
             * @static
             * @protected
             * @param {Function} fn
             * @param {Object} ctx
             */
            afterCurrentEvent : function(fn, ctx) {
        
                afterCurrentEventFns.push({ fn : fn, ctx : ctx }) == 1 &&
                    setTimeout(this._runAfterCurrentEventFns, 0);
        
            },
        
            /**
             * Запускает очерель
             * @private
             */
            _runAfterCurrentEventFns : function() {
        
                var fnsLen = afterCurrentEventFns.length;
                if(fnsLen) {
                    var fnObj,
                        fnsCopy = afterCurrentEventFns.splice(0, fnsLen);
        
                    while(fnObj = fnsCopy.shift()) fnObj.fn.call(fnObj.ctx || this);
                }
        
            },
        
            /**
             * Изменяет контекст передаваемой функции
             * @protected
             * @param {Function} fn
             * @param {Object} ctx контекст
             * @returns {Function} функция с измененным контекстом
             */
            changeThis : function(fn, ctx) {
        
                return function() {
                    return fn.apply(ctx || this, arguments);
                };
        
            },
        
            /**
             * Хелпер для очистки свойств
             * @param {Object} [obj=this]
             */
            del : function(obj) {
        
                var delInThis = typeof obj == 'string',
                    i = delInThis? 0 : 1,
                    len = arguments.length;
                delInThis && (obj = this);
        
                while(i < len) delete obj[arguments[i++]];
        
                return this;
        
        	},
        
            /**
             * Возвращает/уничтожает именованный канал сообщений
             * @param {String} [id='default'] идентификатор канала
             * @param {Boolean} [drop=false] уничтожить канал
             * @returns {$.observable|undefined} канал сообщений
             */
            channel : function(id, drop) {
        
                if(typeof id == 'boolean') {
                    drop = id;
                    id = undefined;
                }
        
                id || (id = 'default');
        
                if(drop) {
                    if(channels[id]) {
                        channels[id].un();
                        delete channels[id];
                    }
                    return;
                }
        
                return channels[id] || (channels[id] = new $.observable());
        
            }
        
        });
        
        })(jQuery);
        
        }
    /* lego/bem-bl/blocks-common/i-bem/i-bem.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-bem/__internal/i-bem__internal.js: begin */ /**/
        if(_ycssjs('MTlVEeNzLvgreRn2v0jtqXJR/2c')){
        /** @fileOverview модуль для внутренних BEM-хелперов */
        /** @requires BEM */
        
        (function(BEM, $, undefined) {
        
        /**
         * Разделитель для модификаторов и их значений
         * @const
         * @type String
         */
        var MOD_DELIM = '_',
        
        /**
         * Разделитель между именами блока и вложенного элемента
         * @const
         * @type String
         */
            ELEM_DELIM = '__',
        
        /**
         * Паттерн для допустимых имен элементов и модификаторов
         * @const
         * @type String
         */
            NAME_PATTERN = '[a-zA-Z0-9-]+';
        
        function buildModPostfix(modName, modVal, buffer) {
        
            buffer.push(MOD_DELIM, modName, MOD_DELIM, modVal);
        
        }
        
        function buildBlockClass(name, modName, modVal, buffer) {
        
            buffer.push(name);
            modVal && buildModPostfix(modName, modVal, buffer);
        
        }
        
        function buildElemClass(block, name, modName, modVal, buffer) {
        
            buildBlockClass(block, undefined, undefined, buffer);
            buffer.push(ELEM_DELIM, name);
            modVal && buildModPostfix(modName, modVal, buffer);
        
        }
        
        BEM.INTERNAL = {
        
            NAME_PATTERN : NAME_PATTERN,
        
            MOD_DELIM : MOD_DELIM,
            ELEM_DELIM : ELEM_DELIM,
        
            buildModPostfix : function(modName, modVal, buffer) {
        
                var res = buffer || [];
                buildModPostfix(modName, modVal, res);
                return buffer? res : res.join('');
        
            },
        
            /**
             * Строит класс блока или элемента с учетом модификатора
             * @private
             * @param {String} block имя блока
             * @param {String} [elem] имя элемента
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @param {Array} [buffer] буфер
             * @returns {String|Array} строка класса или буфер (в зависимости от наличия параметра buffer)
             */
            buildClass : function(block, elem, modName, modVal, buffer) {
        
                var typeOf = typeof modName;
                if(typeOf == 'string') {
                    if(typeof modVal != 'string') {
                        buffer = modVal;
                        modVal = modName;
                        modName = elem;
                        elem = undefined;
                    }
                } else if(typeOf != 'undefined') {
                    buffer = modName;
                    modName = undefined;
                } else if(elem && typeof elem != 'string') {
                    buffer = elem;
                    elem = undefined;
                }
        
                if(!(elem || modName || buffer)) { // оптимизация для самого простого случая
                    return block;
                }
        
                var res = buffer || [];
        
                elem?
                    buildElemClass(block, elem, modName, modVal, res) :
                    buildBlockClass(block, modName, modVal, res);
        
                return buffer? res : res.join('');
        
            },
        
            /**
             * Строит полные классы блока или элемента с учетом модификаторов
             * @private
             * @param {String} block имя блока
             * @param {String} [elem] имя элемента
             * @param {Object} [mods] модификаторы
             * @param {Array} [buffer] буфер
             * @returns {String|Array} строка класса или буфер (в зависимости от наличия параметра buffer)
             */
            buildClasses : function(block, elem, mods, buffer) {
        
                var res = buffer || [];
        
                elem?
                    buildElemClass(block, elem, undefined, undefined, res) :
                    buildBlockClass(block, undefined, undefined, res);
        
                mods && $.each(mods, function(modName, modVal) {
                    if(modVal) {
                        res.push(' ');
                        elem?
                            buildElemClass(block, elem, modName, modVal, res) :
                            buildBlockClass(block, modName, modVal, res);
                    }
                });
        
                return buffer? res : res.join('');
        
                /*var typeOf = typeof elem;
                if(typeOf != 'string' && typeOf != 'undefined') {
                    buffer = mods;
                    mods = elem;
                    elem = undefined;
                }
                if($.isArray(mods)) {
                    buffer = mods;
                    mods = undefined;
                }
        
                var res = buffer || [];
                buildClasses(block, elem, mods, res);
                return buffer? res : res.join('');*/
        
            }
        
        }
        
        })(BEM, jQuery);
        }
    /* lego/bem-bl/blocks-common/i-bem/__internal/i-bem__internal.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__stringify/i-jquery__stringify.js: begin */ /**/
        if(_ycssjs('DvoRZovxguSW2moxWkLcWrZjXOQ')){
        /**
         * Stringify plugin 1.0.1
         *
         * Copyright (c) 2010 Filatov Dmitry (alpha@zforms.ru)
         * Dual licensed under the MIT and GPL licenses:
         * http://www.opensource.org/licenses/mit-license.php
         * http://www.gnu.org/licenses/gpl.html
         *
         */
        
        (function($, undefined) {
            if(typeof JSON != 'undefined') {
                return $.stringify = JSON.stringify;
            }
        
            var _toString = Object.prototype.toString,
                escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
                meta = {
                    '\b' : '\\b',
                    '\t' : '\\t',
                    '\n' : '\\n',
                    '\f' : '\\f',
                    '\r' : '\\r',
                    '"'  : '\\"',
                    '\\' : '\\\\'
                };
        
            $.stringify = function(val) {
                if(val === null) {
                    return 'null';
                }
                if(typeof val === 'undefined') {
                    return undefined;
                }
                switch(_toString.call(val)) {
                    case '[object String]':
                        return '"' +
                            (escapable.test(val)?
                                val.replace(escapable, function(a) {
                                    var c = meta[a];
                                    return typeof c === 'string'? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                                }) :
                                val) +
                            '"';
                    case '[object Number]':
                    case '[object Boolean]':
                        return '' + val;
                    case '[object Array]':
                        var res = '[', i = 0, len = val.length, strVal;
                        while(i < len) {
                            strVal = $.stringify(val[i]);
                            res += (i++? ',' : '') + (typeof strVal == 'undefined'? 'null' : strVal);
                        }
                        return res + ']';
                    case '[object Object]':
                        var res = '{', i = 0, strVal;
                        for(var key in val) {
                            if(val.hasOwnProperty(key)) {
                                strVal = $.stringify(val[key]);
                                typeof strVal != 'undefined' && (res += (i++? ',' : '') + '"' + key + '":' + strVal);
                            }
                        }
                        return res + '}';
                    default:
                        return undefined;
                }
            };
        })(jQuery);
        
        }
    /* lego/bem-bl/blocks-common/i-jquery/__stringify/i-jquery__stringify.js: end */ /**/
    
    /* lego/bem-bl/blocks-desktop/i-jquery/__stringify/i-jquery__stringify.js: begin */ /**/
        if(_ycssjs('TvFQBe0KrIoSQWo0dor37UmJcgw')){
        if (!window.JSON) {
            window.JSON = {
                stringify: $.stringify
            }
        }
        
        }
    /* lego/bem-bl/blocks-desktop/i-jquery/__stringify/i-jquery__stringify.js: end */ /**/
    
    /* lego/blocks/i-bem/html/i-bem__html.js: begin */ /**/
        if(_ycssjs('Aa0BmP6kHrXc44zAPbLKgxZFif0')){
        /** @requires BEM */
        /** @requires BEM.INTERNAL */
        /** @requires jquery.stringify */
        
        (function(BEM, $, undefined) {
        
        var INTERNAL = BEM.INTERNAL,
            ELEM_DELIM = INTERNAL.ELEM_DELIM,
            SHORT_TAGS = { // хэш для быстрого определения, является ли тэг коротким
                area : 1, base : 1, br : 1, col : 1, command : 1, embed : 1, hr : 1, img : 1,
                input : 1, keygen : 1, link : 1, meta : 1, param : 1, source : 1, wbr : 1 },
            buildClass = INTERNAL.buildClass,
            buildClasses = INTERNAL.buildClasses,
            decls = {};
        
        function addPropToDecl(decl, name, fn) {
        
            (decl[name] || (decl[name] = [])).unshift(fn);
        
        }
        
        function buildDeclFn(fn, desc) {
        
            return desc.modName?
                function(ctx) {
                    (ctx._curBlock.mods || {})[desc.modName] === desc.modVal && fn(ctx);
                } :
                fn;
        
        }
        
        function join(a, b) {
        
            var isArrayB = $.isArray(b),
                res;
        
            $.isArray(a)?
                isArrayB? res = a.concat(b) : (res = a).push(b) :
                isArrayB? (res = b).unshift(a) : res = [a, b];
        
            return res;
        
        }
        
        /**
         * @namespace
         * @name BEM.HTML
         */
        BEM.HTML = {
        
            /**
             * Декларация
             * @protected
             * @param {String|Object} decl имя блока (простой синтаксис) или описание
             * @param {String} decl.name имя блока
             * @param {String} [decl.modName] имя модификатора
             * @param {String} [decl.modVal] значение модификатора
             * @param {Object} props свойства
             */
            decl : function(desc, props) {
        
                typeof desc == 'string' && (desc = { name : desc });
        
                var decl = decls[desc.name] || (decls[desc.name] = {});
        
                props.onBlock && addPropToDecl(decl, '_block', buildDeclFn(props.onBlock, desc));
        
                if(props.onElem) {
                    $.isFunction(props.onElem)?
                        addPropToDecl(decl, '_elem', buildDeclFn(props.onElem, desc)) :
                        $.each(props.onElem, function(elem, fn) {
                            addPropToDecl(decl, '_elem' + (elem === '*'? '' : ELEM_DELIM + elem), buildDeclFn(fn, desc));
                        });
                }
        
            },
        
            /**
             * Строит HTML-представление
             * @param {Object|Array} params JSON-описание
             */
            build : function(params) {
        
                var builder = new this.Ctx(params);
                builder._buildAll();
                return builder._flush();
        
            },
        
            Ctx : $.inherit(/** @lends BEM.HTML.Ctx.prototype */{
                /**
                 * @class Внутренний класс контекста билдера HTML-представления
                 * @constructs
                 * @param {Object|Array|String} params параметры
                 */
                __constructor : function(params) {
        
                    /**
                     * буфер
                     * @private
                     * @type Array
                     */
                    this._buffer = [];
        
                    /**
                     * текущие параметры
                     * @private
                     * @type Object
                     */
                    this._params = params;
        
                    /**
                     * туннелированные параметры
                     * @private
                     * @type Object
                     */
                    this._tParams = null;
        
                    this._tParamsChanges = null;
        
                    /**
                     * имя текущего блока
                     * @private
                     * @type String
                     */
                    this._curBlock = undefined;
        
                },
        
                /**
                 * Возвращает позицию контекста
                 * @returns {Number}
                 */
                pos : function() {
        
                    return this._params._pos;
        
                },
        
                /**
                 * Проверяет, является ли текущий контекст первым
                 * @returns {Boolean}
                 */
                isFirst : function() {
        
                    return this._params._pos === 1;
        
                },
        
                /**
                 * Проверяет, является ли текущий контекст последним
                 * @returns {Boolean}
                 */
                isLast : function() {
        
                    var params = this._params;
                    return params._pos === params._siblingsCount;
        
                },
        
                /**
                 * Возвращает/устанавливает параметры контекста
                 * @param {Object} [params] параметры
                 */
                params : function(params) {
        
                    var _this = this;
                    if(typeof params == 'undefined') return _this._params;
        
                    _this._params = params;
                    return _this;
        
                },
        
                /**
                 * Возвращает/устанавливает один параметр контекста
                 * @param {String} name имя параметра
                 * @param {String} [val] значение параметра
                 * @param {Boolean} [force=false] установить параметр независимо от его наличия в контексте
                 * @param {Boolean} [needExtend=false] расширять параметр
                 */
                param : function(name, val, force, needExtend) {
        
                    var _this = this,
                        params = _this._params;
        
                    if(typeof val == 'undefined') return params[name];
        
                    if(force || !(name in params)) {
                        params[name] = val;
                    } else if(needExtend) {
                        params[name] = $.extend(val, params[name]);
                    }
        
                    return _this;
        
                },
        
                /**
                 * Возвращает/устанавливает html-атрибуты контекста (шорткат к params('attrs', val))
                 * @param {Object} [val] хэш атрибутов
                 * @param {Boolean} [force=false]
                 */
                attrs : function(val, force) {
        
                    return this.param('attrs', val, force, true);
        
                },
        
                /**
                 * Возвращает/устанавливает один html-атрибут контекста
                 * @param {String} name имя атрибута
                 * @param {String} [val] значение атрибута
                 * @param {Boolean} [force=false]
                 */
                attr : function(name, val, force) {
        
                    var _this = this;
                    if(typeof val == 'undefined') return (_this._params.attrs || {})[name];
        
                    var attrs = _this._params.attrs;
                    attrs?
                        (force || !(name in attrs)) && (attrs[name] = val) :
                        (_this._params.attrs = {})[name] = val;
        
                    return _this;
        
                },
        
                /**
                 * Возвращает/устанавливает имя html-тэга контекста (шорткат к params('tag', val))
                 * @param {String} [val] тэг
                 * @param {Boolean} [force=false]
                 */
                tag : function(val, force) {
        
                    return this.param('tag', val, force);
        
                },
        
                /**
                 * Возвращает/устанавливает дополнительные CSS-классы контекста (шорткат к params('cls', val))
                 * @param {String} [val] CSS-класс
                 * @param {Boolean} [force=false]
                 */
                cls : function(val, force) {
        
                    return this.param('cls', val, force);
        
                },
        
                /**
                 * Возвращает/устанавливает модификаторы контекста (шорткат к params('mods', val))
                 * @param {Object} [val] хэш модификаторов
                 * @param {Boolean} [force=false]
                 */
                mods : function(val, force) {
        
                    return this.param('mods', val, force, true);
        
                },
        
                /**
                 * Возвращает/устанавливает один модификатор контекста
                 * @param {String} name имя модификатора
                 * @param {String} [val] значение модификатора
                 * @param {Boolean} [force=false]
                 */
                mod : function(name, val, force) {
        
                    var _this = this;
                    if(typeof val == 'undefined') return (_this._params.mods || {})[name];
        
                    var mods = _this._params.mods;
                    mods?
                        (force || !(name in mods)) && (mods[name] = val) :
                        (_this._params.mods = {})[name] = val;
        
                    return _this;
        
                },
        
                /**
                 * Возвращает/добавляет/устанавливает миксы
                 * @param {Array} [val] миксы
                 * @param {Boolean} [force=false]
                 */
                mix : function(val, force) {
        
                    var _this = this,
                        params = _this._params;
        
                    if(typeof val == 'undefined') return params.mix;
        
                    if(force || !('mix' in params)) {
                        params.mix = val;
                    } else {
                        params.mix = params.mix.concat(val);
                    }
        
                    return _this;
        
                },
        
                /**
                 * Возвращает/устанавливает js-параметры контекста (шорткат к params('js', val))
                 * @param {Boolean|Object} [val] параметры
                 */
                js : function(val) {
        
                    return this.param('js', val);
        
                },
        
                /**
                 * Возвращает/устанавливает контент контекста (шорткат к params('content', val))
                 * @param {String|Object|Array} [val] контент
                 * @param {Boolean} [force=false] установить контент независимо от его наличия
                 */
                content : function(val, force) {
        
                    return this.param('content', val, force);
        
                },
        
                /**
                 * Оборачивает контент контекста (например, другим элементом)
                 * @param {Object} obj
                 */
                wrapContent : function(obj) {
        
                    var _this = this,
                        params = _this._params;
        
                    obj.content = params.content;
                    params.content = obj;
        
                    return _this;
        
                },
        
                /**
                 * Добавляет контент перед контентом контекста (например, еще один элемент)
                 * @param {Object|Array} obj
                 */
                beforeContent : function(obj) {
        
                    var _this = this,
                        params = _this._params;
        
                    params.content = join(obj, params.content);
        
                    return _this;
        
                },
        
                /**
                 * Добавляет контент после контента контекста (например, еще один элемент)
                 * @param {Object|Array} obj
                 */
                afterContent : function(obj) {
        
                    var _this = this,
                        params = _this._params;
        
                    params.content = join(params.content, obj);
        
                    return _this;
        
                },
        
                /**
                 * Оборачивает контекста (например, другим элементом или блоком)
                 * @param {Object} obj
                 */
                wrap : function(obj) {
        
                    var _this = this,
                        params = _this._params;
        
                    obj.block || (obj._curBlock = _this._curBlock);
                    obj.content = params._wrapper? params._wrapper : params;
                    params._wrapper = obj;
        
                    return _this;
        
                },
        
                /**
                 * Возвращает/устанавливает один туннелированный параметр контекста
                 * @param {String} name имя параметра
                 * @param {String} [val] значение параметра
                 */
                tParam : function(name, val) {
        
                    var _this = this,
                        tParams = _this._tParams || (_this._tParams = {});
        
                    if(typeof val == 'undefined') return tParams[name];
        
                    var tParamsChanges = _this._tParamsChanges || (_this._tParamsChanges = {});
        
                    name in tParamsChanges || (tParamsChanges[name] = tParams[name]);
        
                    tParams[name] = val;
        
                    return _this;
        
                },
        
                /**
                 * Генерирует уникальный идентификатор
                 * returns {String}
                 */
                generateId : function() {
        
                    return $.identify();
        
                },
        
                /**
                 * Останавливает применение более базовых шаблонов
                 */
                stop : function() {
        
                    this._params._isStopped = true;
        
                },
        
                /**
                 * Выполняет одну итерацию билда в зависимости от типа контекста
                 * @private
                 */
                _buildAll : function() {
        
                    var _this = this,
                        buffer = _this._buffer,
                        params = _this._params,
                        paramsType = typeof params;
        
                    if(paramsType == 'string' || paramsType == 'number') {
                        buffer.push(params);
                    } else if($.isArray(params)) {
                        var i = 0, len = params.length, currParams, currParamsType;
                        while(i < len) {
                             _this._params = currParams = params[i++];
                            currParamsType = typeof currParams;
                            if(currParamsType == 'string' || currParamsType == 'number') {
                                buffer.push(currParams);
                            } else if(currParams) {
                                currParams._pos = i;
                                currParams._siblingsCount = len;
                                _this._buildByDecl();
                            }
                        }
                    } else if(params) {
                        _this._params._pos = _this._params._siblingsCount = 1;
                        _this._buildByDecl();
                    }
        
                },
        
                /**
                 * Дефолтный билд
                 * @private
                 */
                _build : function() {
        
                    var _this = this,
                        buffer = _this._buffer,
                        params = _this._params,
                        tag = params.tag || 'div',
                        jsParams,
                        isBEM = params.block || params.elem,
                        curBlock = isBEM && (params.block || _this._curBlock.block),
                        addInitingCls = false;
        
                    if(params.js) {
                        (jsParams = {})[buildClass(curBlock, params.elem)] = params.js === true? {} : params.js;
                        addInitingCls = !params.elem;
                    }
        
                    buffer.push('<', tag);
        
                    if(isBEM || params.cls) {
                        buffer.push(' class="');
                        if(isBEM) {
                            buildClasses(curBlock, params.elem, params.mods, buffer);
                            params.mix && $.each(params.mix, function(i, mix) {
                                if(mix) {
                                    buffer.push(' ');
                                    buildClasses(mix.block, mix.elem, mix.mods, buffer);
                                    if(mix.js) {
                                        (jsParams || (jsParams = {}))[buildClass(mix.block, mix.elem)] = mix.js === true? {} : mix.js;
                                        addInitingCls || (addInitingCls = !mix.elem);
                                    }
                                }
                            });
                        }
        
                        params.cls && buffer.push(isBEM? ' ' : '', params.cls);
        
                        addInitingCls && buffer.push(' i-bem');
                        buffer.push('"');
                    }
        
                    jsParams && buffer.push(
                        ' onclick="return ',
                        $.stringify(jsParams).replace(/'/g, '\\\'').replace(/"/g, '\''),
                        '"');
        
                    params.attrs && $.each(params.attrs, function(name, val) {
                        typeof val != 'undefined' && val !== null && val !== false && buffer.push(
                            ' ',
                            name,
                            '="',
                            val.toString().replace(/"/g, "&quot;"),
                            '"');
                    });
        
                    if(SHORT_TAGS[tag]) {
                        buffer.push('/>');
                    } else {
                        buffer.push('>');
        
                        if(typeof params.content != 'undefined') {
                            _this._params = params.content;
                            _this._buildAll();
                        }
        
                        buffer.push('</', tag, '>');
                    }
        
                },
        
                /**
                 * Очищает буфер и возвращает его содержимое
                 * @private
                 * @returns {String} содержимое буфера
                 */
                _flush : function() {
        
                    var res = this._buffer.join('');
                    delete this._buffer;
                    return res;
        
                },
        
                _buildByDecl : function() {
        
                    var _this = this,
                        currBlock = _this._curBlock,
                        params = _this._params;
        
                    params._curBlock && (_this._curBlock = params._curBlock);
                    params.block && (_this._curBlock = params);
        
                    if(!params._wrapper) {
                        if(params.block || params.elem) {
                            var decl = decls[_this._curBlock.block];
                            if(decl) {
                                var fns;
                                if(params.elem) {
                                    fns = decl['_elem' + ELEM_DELIM + params.elem];
                                    decl._elem && (fns = (fns? fns.concat(decl._elem) : decl._elem));
                                } else {
                                    fns = decl._block;
                                }
        
                                if(fns) {
                                    var i = 0, fn;
                                    while(fn = fns[i++]) {
                                        fn(_this);
                                        if(params._isStopped) break;
                                    }
                                }
                            }
                        }
        
                        if(params._wrapper) {
                            params._curBlock = _this._curBlock;
                            _this._params = params._wrapper;
                            return _this._buildAll();
                        }
                    }
        
                    var tParamsChanges = _this._tParamsChanges;
                        _this._tParamsChanges = null;
        
                    _this._build();
        
                    _this._curBlock = currBlock;
        
                    if(tParamsChanges) {
                        var tParams = _this._tParams;
                        $.each(tParamsChanges, function(name, val) {
                            typeof val == 'undefined'?
                                delete tParams[name] :
                                tParams[name] = val;
                        });
                    }
        
                }
        
            })
        
        };
        
        })(BEM, jQuery);
        
        }
    /* lego/blocks/i-bem/html/i-bem__html.js: end */ /**/
    
    /* lego/blocks/i-common/i-common.js: begin */ /**/
        if(_ycssjs('oBxXkftuvFSxIodWbtoM8GzKW3g')){
        (function(Lego){
        if (!Lego) Lego = window.Lego = {};
        
        Lego.messages = Lego.messages || {};
        
        Lego.message = function(id, text) {
            return Lego.params.locale == 'ru' ? text : (Lego.messages[id] || text);
        };
        
        })(window.Lego);
        }
    /* lego/blocks/i-common/i-common.js: end */ /**/
    
    /* lego/blocks/i-oframebust/i-oframebust.js: begin */ /**/
        if(_ycssjs('ShgATzASB+ROJtabxwGoPQHpFf4')){
        (function(Lego) {
        
            Lego = Lego || {};
        
            Lego.oframebustMatchDomain = function(whitelist, domain) {
                whitelist = Object.prototype.toString.call(whitelist) === "[object Array]" ? whitelist : (function() {
                    var arr = [];
                    for (var k in whitelist) {
                        whitelist.hasOwnProperty(k) && arr.push(k);
                    }
                    return arr;
                }());
        
                for (var i = 0, l = whitelist.length; i < l; i++) {
                    var d = whitelist[i];
                    if (typeof(d) == 'string') {
                        //поддержка wildcard
                        if (/(\?|\*)/.test(d)) {
                            var re = d.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\?/g, '\.{1}');
                            if ((new RegExp('^' + re + '$')).test(domain)) return true;
                        } else if (domain == d) {
                            return true; //обычная строка
                        }
                    } else {
                        //предполагаем, что d -- regexp
                        try {
                            if (d.test(domain)) return true;
                        } catch(e) {}
                    }
                }
            }
        
        })(window.Lego);
        
        }
    /* lego/blocks/i-oframebust/i-oframebust.js: end */ /**/
    
    /* lego/blocks/i-oframebust/_type/i-oframebust_type_html.js: begin */ /**/
        if(_ycssjs('BHkEtHOnTK1SBJzP2TCTJ1N9VPM')){
        (function(Lego) {
        
            if (!Lego) Lego = window.Lego = {};
        
            Lego.oframebust = function(whitelist) {
                if (location == top.location) return;
        
                var domain = (location.search.match(/[&?]oframebust=([^&;]+)/) || [])[1];
                if (!domain) top.location = location;
        
                if (Lego.oframebustMatchDomain(whitelist, domain)) {
                    var iframe = document.createElement('iframe');
                    iframe.style.position = 'absolute';
                    iframe.style.left = '-999px';
                    iframe.style.width = '1px';
                    iframe.src = '//' + domain + '/oframebust.html?'
                            + encodeURIComponent(location.href);
                    (function() {
                        if (document.body && document.body.firstChild) {
                            document.body.insertBefore(iframe, document.body.firstChild);
                        } else {
                            setTimeout(arguments.callee, 0);
                        }
                    })();
                    return;
                }
        
                top.location = location;
            };
        
        })(window.Lego);
        
        }
    /* lego/blocks/i-oframebust/_type/i-oframebust_type_html.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-bem/__dom/i-bem__dom.js: begin */ /**/
        if(_ycssjs('sejjV9s/MuIYn+Ib46pe+NtzaXc')){
        /** @requires BEM */
        /** @requires BEM.INTERNAL */
        
        (function(BEM, $, undefined) {
        
        var win = $(window),
            doc = $(document),
        
        /**
         * Хранилище для DOM-элементов по уникальному ключу
         * @private
         * @type Object
         */
            uniqIdToDomElems = {},
        
        
        /**
         * Хранилище для блоков по уникальному ключу
         * @static
         * @private
         * @type Object
         */
            uniqIdToBlock = {},
        
        /**
         * Хранилище для параметров блоков
         * @private
         * @type Object
         */
            domElemToParams = {},
        
        /**
         * Хранилище для обработчиков liveCtx-событий
         * @private
         * @type Object
         */
            liveEventCtxStorage = {},
        
        /**
         * Хранилище для обработчиков liveClass-событий
         * @private
         * @type Object
         */
            liveClassEventStorage = {},
        
            blocks = BEM.blocks,
        
            INTERNAL = BEM.INTERNAL,
        
            NAME_PATTERN = INTERNAL.NAME_PATTERN,
        
            MOD_DELIM = INTERNAL.MOD_DELIM,
            ELEM_DELIM = INTERNAL.ELEM_DELIM,
        
            buildModPostfix = INTERNAL.buildModPostfix,
            buildClass = INTERNAL.buildClass;
        
        /**
         * Инициализирует блоки на DOM-элементе
         * @private
         * @param {jQuery} domElem DOM-элемент
         * @param {String} uniqInitId идентификатор "волны инициализации"
         */
        function init(domElem, uniqInitId) {
        
            var domNode = domElem[0];
            $.each(getParams(domNode), function(blockName, params) {
                processParams(params, domNode, blockName, uniqInitId);
                var block = uniqIdToBlock[params.uniqId];
                if(block) {
                    block.domElem = block.domElem.add(domElem);
                    $.extend(block.params, params);
                } else {
                    initBlock(blockName, domElem, params);
                }
            });
        
        }
        
        /**
         * Инициализирует конкретный блок на DOM-элементе или возвращает существующий блок, если он уже был создан
         * @private
         * @param {String} blockName имя блока
         * @param {jQuery} domElem DOM-элемент
         * @param {Object} [params] параметры инициализации
         * @param {Boolean} [forceLive] форсировать возможность live-инициализации
         * @param {Function} [callback] обработчик, вызываемый после полной инициализации
         */
        function initBlock(blockName, domElem, params, forceLive, callback) {
        
            if(typeof params == 'boolean') {
                callback = forceLive;
                forceLive = params;
                params = undefined;
            }
        
            var domNode = domElem[0];
            params = processParams(params || getParams(domNode)[blockName], domNode, blockName);
        
            var uniqId = params.uniqId;
            if(uniqIdToBlock[uniqId]) {
                return uniqIdToBlock[uniqId]._init();
            }
        
            uniqIdToDomElems[uniqId] = uniqIdToDomElems[uniqId]?
                uniqIdToDomElems[uniqId].add(domElem) :
                domElem;
        
            var blockClass = blocks[blockName] || DOM.decl(blockName, {}, { live : true });
            if(!(blockClass._liveInitable = !!blockClass._processLive()) || forceLive || params.live === false) {
                var block = new blockClass(uniqIdToDomElems[uniqId], params, !!forceLive);
                delete uniqIdToDomElems[uniqId];
                callback && callback.apply(block, Array.prototype.slice.call(arguments, 4));
                return block;
            }
        
        }
        
        /**
         * Обрабатывает и добавляет необходимые параметры блока
         * @private
         * @param {Object} params параметры инициализации
         * @param {HTMLElement} domNode DOM-нода
         * @param {String} blockName имя блока
         * @param {String} [uniqInitId] идентификатор "волны инициализации"
         */
        function processParams(params, domNode, blockName, uniqInitId) {
        
            (params || (params = {})).uniqId ||
                (params.uniqId = (params.id? blockName + '-id-' + params.id : $.identify()) + (uniqInitId || $.identify()));
        
            var domUniqId = $.identify(domNode),
                domParams = domElemToParams[domUniqId] || (domElemToParams[domUniqId] = {});
        
            domParams[blockName] || (domParams[blockName] = params);
        
            return params;
        
        }
        
        /**
         * Хелпер для поиска DOM-элемента по селектору внутри контекста, включая сам контекст
         * @private
         * @param {jQuery} ctx контекст
         * @param {String} selector CSS-селектор
         * @param {Boolean} [excludeSelf=false] исключить контекст из поиска
         * @returns {jQuery}
         */
        function findDomElem(ctx, selector, excludeSelf) {
        
            var res = ctx.find(selector);
            return excludeSelf?
               res :
               res.add(ctx.filter(selector));
        
        }
        
        /**
         * Возвращает параметры DOM-элемента блока
         * @private
         * @param {HTMLElement} domNode DOM-нода
         * @returns {Object}
         */
        function getParams(domNode) {
        
            var uniqId = $.identify(domNode);
            return domElemToParams[uniqId] ||
                   (domElemToParams[uniqId] = extractParams(domNode));
        
        }
        
        /**
         * Извлекает параметры блока из DOM-элемента
         * @private
         * @param {HTMLElement} domNode DOM-нода
         * @returns {Object}
         */
        function extractParams(domNode) {
        
            var fn = domNode.onclick || domNode.ondblclick;
            if(!fn && domNode.tagName.toLowerCase() == 'body') { // LEGO-2027 в FF onclick не работает на body
                var elem = $(domNode),
                    attr = elem.attr('onclick') || elem.attr('ondblclick');
                attr && (fn = Function(attr));
            }
            return fn? fn() : {};
        
        }
        
        /**
         * Очищает все BEM-хранилища, связанные с DOM-нодой
         * @private
         * @param {HTMLElement} domNode DOM-нода
         */
        function cleanupDomNode(domNode) {
        
            delete domElemToParams[$.identify(domNode)];
        
        }
        
        /**
         * Возвращает DOM-ноду для вычислений размера окна в IE
         * @returns {HTMLElement}
         */
        function getClientNode() {
        
            return doc[0][$.support.boxModel? 'documentElement' : 'body'];
        
        }
        
        /**
         * Возвращает и, при необходимости, инициализирует блок на DOM-элементе
         * @param {String} blockName имя блока
         * @param {Object} params параметры блока
         * @returns {BEM}
         */
        $.fn.bem = function(blockName, params) {
            return initBlock(blockName, this, params, true);
        };
        
        /**
         * @namespace
         * @name BEM.DOM
         */
        var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
            /**
             * @class Базовый блок для создания bem-блоков, имеющих DOM-представление
             * @constructs
             * @private
             * @param {jQuery} domElem DOM-элемент, на котором создается блок
             * @param {Object} params параметры блока
             * @param {Boolean} [initImmediately=true]
             */
            __constructor : function(domElem, params, initImmediately) {
        
                var _this = this;
        
                /**
                 * DOM-элементы блока
                 * @protected
                 * @type jQuery
                 */
                _this.domElem = domElem;
        
                /**
                 * кэш для имен событий на DOM-элементах
                 * @private
                 * @type Object
                 */
                _this._eventNameCache = {};
        
                /**
                 * кэш для элементов
                 * @private
                 * @type Object
                 */
                _this._elemCache = {};
        
                /**
                 * уникальный идентификатор блока
                 * @private
                 * @type String
                 */
                uniqIdToBlock[_this._uniqId = params.uniqId || $.identify(_this)] = _this;
        
                /**
                 * флаг необходимости unbind от document и window при уничтожении блока
                 * @private
                 * @type Boolean
                 */
                _this._needSpecialUnbind = false;
        
                _this.__base(null, params, initImmediately);
        
            },
        
            /**
             * Находит блоки внутри (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM[]}
             */
            findBlocksInside : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('find', elem, block));
        
            },
        
            /**
             * Находит первый блок внутри (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM}
             */
            findBlockInside : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('find', elem, block, true));
        
            },
        
            /**
             * Находит блоки снаружи (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM[]}
             */
            findBlocksOutside : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('parents', elem, block));
        
            },
        
            /**
             * Находит первый блок снаружи (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM}
             */
            findBlockOutside : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('closest', elem, block))[0];
        
            },
        
            /**
             * Находит блоки на DOM-элементах текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM[]}
             */
            findBlocksOn : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('', elem, block));
        
            },
        
            /**
             * Находит первый блок на DOM-элементах текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {BEM}
             */
            findBlockOn : function(elem, block) {
        
                return this._doBlocksMethod(
                    this._buildFindBlocksParams('', elem, block, true));
        
            },
        
            /**
             * Хелпер для маппинга аргументов поиска в хэш параметров для вызова
             * @private
             * @param {String} select возможные значения: 'find', 'closest', ''
             * @param {String|jQuery|undefined} elem элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @returns {Object}
             */
            _buildFindBlocksParams : function(select, elem, block, onlyFirst) {
        
                return {
                    select    : select,
                    elem      : block? elem : undefined,
                    block     : block || elem,
                    onlyFirst : onlyFirst
                };
        
            },
        
            /**
             * Выполняет метод блоков внутри (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @param {String} method имя метода
             * @param {Array} [args] параметры метода
             * @returns {Array} результаты вызовов метода
             */
            doBlocksMethodInside : function(elem, block, method, args) {
        
                return this._doBlocksMethod(
                    this._buildDoBlocksMethodParams('find', elem, block, method, args));
        
            },
        
            /**
             * Выполняет метод блоков снаружи (включая контекст) текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @param {String} method имя метода
             * @param {Array} [args] параметры метода
             * @returns {Array} результаты вызовов метода
             */
            doBlocksMethodOutside : function(elem, block, method, args) {
        
                return this._doBlocksMethod(
                    this._buildDoBlocksMethodParams('closest', elem, block, method, args));
        
            },
        
            /**
             * Выполняет метод блоков на DOM-элементах текущего блока или его элементов
             * @protected
             * @param {String|jQuery} [elem] элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @param {String} method имя метода
             * @param {Array} [args] параметры метода
             * @returns {Array} результаты вызовов метода
             */
            doBlocksMethodOn : function(elem, block, method, args) {
        
                return this._doBlocksMethod(
                    this._buildDoBlocksMethodParams('', elem, block, method, args));
        
            },
        
            /**
             * Выполняет метод блоков
             * @protected
             * @param {BEM[]} blocks блоки
             * @param {String} method имя метода
             * @param {Array} [args] параметры метода
             * @returns {Array} результаты вызовов метода
             */
            doBlocksMethod : function(blocks, method, args) {
        
                return this._doBlocksMethod({
                    blocks  : blocks,
                    method  : method,
                    args    : args
                });
        
            },
        
            /**
             * Хелпер для маппинга аргументов вызова методов в хэш параметров для вызова
             * @private
             * @param {String} select возможные значения: 'find', 'closest', ''
             * @param {String|jQuery|undefined} elem элемент блока
             * @param {String|Object} block имя или описание (blockName,modName,modVal) искомого блока
             * @param {String} method имя метода
             * @param {Array} [args] параметры метода
             * @returns {Object}
             */
            _buildDoBlocksMethodParams : function(select, elem, block, method, args) {
        
                var hasElem = typeof method == 'string';
                return {
                    select : select,
                    elem   : hasElem? elem : undefined,
                    block  : hasElem? block : elem,
                    method : hasElem? method : block,
                    args   : hasElem? args : method
                };
        
            },
        
            /**
             * Ищет блоки и выполняет заданный метод, если метод не задан, то возвращает блоки
             * @private
             * @param {Object} params параметры
             * @returns {BEM[]|Array} блоки или результаты вызовов метода
             */
            _doBlocksMethod : function(params) {
        
                var _this = this;
        
                if(params.blocks) {
                    return $.map(params.blocks, function(block) {
                        return _this._doBlockMethod(block, params.method, params.args);
                    });
                }
        
                var ctxElem = params.elem?
                        (typeof params.elem == 'string'? this.findElem(params.elem) : params.elem) :
                        this.domElem,
                    isSimpleBlock = typeof params.block == 'string',
                    blockName = isSimpleBlock? params.block : params.block.blockName,
                    selector = '.' +
                        (isSimpleBlock?
                            buildClass(blockName) :
                            buildClass(blockName, params.block.modName, params.block.modVal)) +
                        (params.onlyFirst? ':first' : ''),
                    domElems = ctxElem.filter(selector);
        
                params.select && (domElems = domElems.add(ctxElem[params.select](selector)));
        
                if(params.onlyFirst) {
                    return domElems[0]?
                        this._doBlockMethod(
                            initBlock(blockName, domElems.eq(0), true),
                            params.method,
                            params.args) :
                        null;
                }
        
                if(params.method) {
                    return $.map(domElems, function(domElem) {
                        return _this._doBlockMethod(
                            initBlock(blockName, $(domElem), true),
                            params.method,
                            params.args);
                    });
                }
        
                var res = [],
                    uniqIds = {};
        
                $.each(domElems, function(i, domElem) {
                    var block = initBlock(blockName, $(domElem), true);
                    if(!uniqIds[block._uniqId]) {
                        uniqIds[block._uniqId] = true;
                        res.push(block);
                    }
                });
        
                return res;
        
            },
        
            /**
             * Выполняет заданный метод, если метод не задан, то возвращает блок
             * @private
             * @param {BEM} block блок
             * @param {String} method имя метода
             * @param {Array} args параметры метода
             */
            _doBlockMethod : function(block, method, args) {
        
                return method? block[method].apply(block, args || []) : block;
        
            },
        
            /**
             * Добавляет обработчик события произвольного DOM-элемента
             * @protected
             * @param {jQuery} domElem DOM-элемент, на котором будет слушаться событие
             * @param {String|Object} event имя события или объект события
             * @param {Function} fn функция-обработчик, будет выполнена в контексте блока
             * @returns {BEM}
             */
            bindToDomElem : function(domElem, event, fn) {
        
                var _this = this;
        
                fn?
                    domElem.bind(
                        _this._buildEventName(event),
                        function(e) {
                            (e.data || (e.data = {})).domElem = $(this);
                            return fn.apply(_this, arguments);
                        }
                    ) :
                    $.each(event, function(event, fn) {
                        _this.bindToDomElem(domElem, event, fn);
                    });
        
                return _this;
        
            },
        
            /**
             * Добавляет обработчик события на document
             * @protected
             * @param {String} event имя события
             * @param {Function} fn функция-обработчик, будет выполнена в контексте блока
             * @returns {BEM}
             */
            bindToDoc : function(event, fn) {
        
                this._needSpecialUnbind = true;
                return this.bindToDomElem(doc, event, fn);
        
            },
        
            /**
             * Добавляет обработчик события на window
             * @protected
             * @param {String} event имя события
             * @param {Function} fn функция-обработчик, будет выполнена в контексте блока
             * @returns {BEM}
             */
            bindToWin : function(event, fn) {
        
                this._needSpecialUnbind = true;
                return this.bindToDomElem(win, event, fn);
        
            },
        
            /**
             * Добавляет обработчик события на основные DOM-элементы блока или его вложенные элементы
             * @protected
             * @param {jQuery|String} [elem] элемент
             * @param {String} event имя события
             * @param {Function} fn функция-обработчик, будет выполнена в контексте блока
             * @returns {BEM}
             */
            bindTo : function(elem, event, fn) {
        
                if(!event || $.isFunction(event)) { // если нет элемента
                    fn = event;
                    event = elem;
                    elem = this.domElem;
                } else if(typeof elem == 'string') {
                    elem = this.elem(elem);
                }
        
                return this.bindToDomElem(elem, event, fn);
        
            },
        
            /**
             * Удаляет обработчики события произвольного DOM-элемента
             * @protected
             * @param {jQuery} domElem DOM-элемент, на котором будет слушаться событие
             * @param {String} event имя события
             * @returns {BEM}
             */
            unbindFromDomElem : function(domElem, event) {
        
                domElem.unbind(this._buildEventName(event));
                return this;
        
            },
        
            /**
             * Удаляет обработчик события у document
             * @protected
             * @param {String} event имя события
             * @returns {BEM}
             */
            unbindFromDoc : function(event) {
        
                return this.unbindFromDomElem(doc, event);
        
            },
        
            /**
             * Удаляет обработчик события у document
             * @protected
             * @param {String} event имя события
             * @returns {BEM}
             */
            unbindFromWin : function(event) {
        
                return this.unbindFromDomElem(win, event);
        
            },
        
            /**
             * Удаляет обработчики события из основных DOM-элементы блока или его вложенных элементов
             * @protected
             * @param {jQuery|String} [elem] вложенный элемент
             * @param {String} event имя события
             * @returns {BEM}
             */
            unbindFrom : function(elem, event) {
        
                if(!event) {
                    event = elem;
                    elem = this.domElem;
                } else if(typeof elem == 'string') {
                    elem = this.elem(elem);
                }
        
                return this.unbindFromDomElem(elem, event);
        
            },
        
            /**
             * Строит полное имя события
             * @private
             * @param {String} event имя события
             * @returns {String}
             */
            _buildEventName : function(event) {
        
                var _this = this;
                return event.indexOf(' ') > 1?
                    $.map(event.split(' '), function(e) {
                        return _this._buildOneEventName(e);
                    }).join(' ') :
                    _this._buildOneEventName(event);
        
            },
        
            /**
             * Строит полное имя для одного события
             * @private
             * @param {String} event имя события
             * @returns {String}
             */
            _buildOneEventName : function(event) {
        
                var _this = this,
                    eventNameCache = _this._eventNameCache;
        
                if(event in eventNameCache) return eventNameCache[event];
        
                var uniq = '.' + _this._uniqId;
        
                if(event.indexOf('.') < 0) return eventNameCache[event] = event + uniq;
        
                var lego = '.bem_' + _this.__self._name;
        
                return eventNameCache[event] = $.map(event.split('.'), function(e, i) {
                    return i == 0? e + lego : lego + '_' + e;
                }).join('') + uniq;
        
            },
        
            /**
             * Запускает обработчики события у блока и обработчики live-событий
             * @protected
             * @param {String} e имя события
             * @param {Object} [data] дополнительные данные
             * @returns {BEM}
             */
            trigger : function(e, data) {
        
                this
                    .__base(e = this.buildEvent(e), data)
                    .domElem && this._ctxTrigger(e, data);
        
                return this;
        
            },
        
            _ctxTrigger : function(e, data) {
        
                var _this = this,
                    storage = liveEventCtxStorage[_this.__self._buildCtxEventName(e.type)],
                    ctxIds = {};
        
                storage && _this.domElem.each(function() {
                    var ctx = this,
                        counter = storage.counter;
                    while(ctx && counter) {
                        var ctxId = $.identify(ctx, true);
                        if(ctxId) {
                            if(ctxIds[ctxId]) break;
                            var storageCtx = storage.ctxs[ctxId];
                            if(storageCtx) {
                                $.each(storageCtx, function(uniqId, handler) {
                                    handler.fn.call(
                                        handler.ctx || _this,
                                        e,
                                        data);
                                });
                                counter--;
                            }
                            ctxIds[ctxId] = true;
                        }
                        ctx = ctx.parentNode;
                    }
                });
        
            },
        
            /**
             * Устанавливает модификатор у блока/вложенного элемента
             * @protected
             * @param {jQuery} [elem] вложенный элемент
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @returns {BEM}
             */
            setMod : function(elem, modName, modVal) {
        
                if(elem && typeof modVal != 'undefined' && elem.length > 1) {
                    var _this = this;
                    elem.each(function() {
                        _this.setMod($(this), modName, modVal);
                    });
                    return _this;
                }
                return this.__base(elem, modName, modVal);
        
            },
        
            /**
             * Извлекает значение модификатора из CSS-класса DOM-ноды
             * @private
             * @param {String} modName имя модификатора
             * @param {jQuery} [elem] вложенный элемент
             * @param {String} [elemName] имя вложенного элемента
             * @returns {String} значение модификатора
             */
            _extractModVal : function(modName, elem, elemName) {
        
                var domNode = (elem || this.domElem)[0],
                    matches;
        
                domNode &&
                    (matches = domNode.className
                        .match(this.__self._buildModValRE(modName, elemName || elem)));
        
                return matches? matches[2] : '';
        
            },
        
            /**
             * Извлекает имя/значение списка модификаторов
             * @private
             * @param {Array} [modNames] имена модификаторов
             * @param {Object} [elem] элемент
             * @returns {Object} хэш значений модификаторов по имени
             */
            _extractMods : function(modNames, elem) {
        
                var res = {},
                    extractAll = !modNames.length,
                    countMatched = 0;
        
                $.each((elem || this.domElem)[0].className
                    .match(this.__self._buildModValRE(
                        '(' + (extractAll? NAME_PATTERN : modNames.join('|')) + ')',
                        elem,
                        'g')) || [], function(i, className) {
                            var iModVal = (className = $.trim(className)).lastIndexOf(MOD_DELIM),
                                iModName = className.substr(0, iModVal - 1).lastIndexOf(MOD_DELIM);
                            res[className.substr(iModName + 1, iModVal - iModName - 1)] = className.substr(iModVal + 1);
                            ++countMatched;
                        });
        
                // пустые значения модификаторов не отражены в классах, нужно их заполнить пустыми значения
                countMatched < modNames.length && $.each(modNames, function(i, modName) {
                    modName in res || (res[modName] = '');
                });
        
                return res;
        
            },
        
            /**
             * Уставливает CSS-класс модификатора на DOM-элемент блока или вложенный элемент
             * @private
             * @param {String} modName имя модификатора
             * @param {String} modVal значение модификатора
             * @param {jQuery} [elem] DOM-элемент
             * @param {String} [elemName] имя элемента
             */
            _afterSetMod : function(modName, modVal, elem, elemName) {
        
                var _self = this.__self,
                    classPrefix = _self._buildModClassPrefix(modName, elemName),
                    classRE = _self._buildModValRE(modName, elemName),
                    needDel = modVal === '';
        
                (elem || this.domElem).each(function() {
                    var className = this.className;
                    className.indexOf(classPrefix) > -1?
                        this.className = className.replace(
                            classRE,
                            (needDel? '' : '$1' + classPrefix + modVal) + '$3') :
                        needDel || $(this).addClass(classPrefix + modVal);
                });
                elemName && this.dropElemCache(elemName, modName, modVal);
        
            },
        
            /**
             * Находит вложенные в блок элементы
             * @protected
             * @param {jQuery|String} [ctx] элемент, на котором проходит поиск (по умолчанию - DOM-элемент блока)
             * @param {String} names имя (или через пробел имена) вложенного элемента
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {jQuery} DOM-элементы
             */
            findElem : function(ctx, names, modName, modVal) {
        
                if(arguments.length % 2) { // если кол-во аргументов один или три
                    modVal = modName;
                    modName = names;
                    names = ctx;
                    ctx = this.domElem;
                } else if(typeof ctx == 'string') {
                    ctx = this.findElem(ctx);
                }
        
                var _self = this.__self,
                    selector = '.' +
                        $.map(names.split(' '), function(name) {
                            return buildClass(_self._name, name, modName, modVal);
                        }).join(',.');
                return findDomElem(ctx, selector);
        
            },
        
            /**
             * Находит вложенные в блок элементы
             * @protected
             * @param {String} name имя вложенного элемента
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {jQuery} DOM-элементы
             */
            _elem : function(name, modName, modVal) {
        
                var key = name + buildModPostfix(modName, modVal);
                return this._elemCache[key] || (this._elemCache[key] = this.findElem(name, modName, modVal));
        
            },
        
            /**
             * Ленивый поиск вложенных в блок элементы (результат кэшируется)
             * @protected
             * @param {String} names имя (или через пробел имена) вложенных элементов
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {jQuery} DOM-элементы
             */
            elem : function(names, modName, modVal) {
        
                if(names.indexOf(' ') < 0) {
                    return this._elem(names, modName, modVal);
                }
        
                var res = $([]),
                    _this = this;
                $.each(names.split(' '), function() {
                    res = res.add(_this._elem(this, modName, modVal));
                });
                return res;
        
            },
        
            /**
             * Сброс кэша для элементов
             * @protected
             * @param {String} names имя (или через пробел имена) вложенных элементов
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {BEM}
             */
            dropElemCache : function(names, modName, modVal) {
        
                if(names) {
                    var _this = this,
                        modPostfix = buildModPostfix(modName, modVal);
                    names.indexOf(' ') < 0?
                        delete _this._elemCache[names + modPostfix] :
                        $.each(names.split(' '), function(i, name) {
                            delete _this._elemCache[name + modPostfix];
                        });
                } else {
                    this._elemCache = {};
                }
        
                return this;
        
            },
        
            /**
             * Извлекает параметры элемента блока
             * @param {String|jQuery} elem элемент
             * @returns {Object} параметры
             */
            elemParams : function(elem) {
        
                var elemName;
                if(typeof elem ==  'string') {
                    elemName = elem;
                    elem = this.elem(elem);
                } else {
                    elemName = this.__self._extractElemNameFrom(elem);
                }
        
                return extractParams(elem[0])[buildClass(this.__self.getName(), elemName)] || {};
        
            },
        
            /**
             * Проверяет, находится ли DOM-элемент в блоке
             * @protected
             * @param {jQuery} domElem DOM-элемент
             * @returns {Boolean}
             */
            containsDomElem : function(domElem) {
        
                return domElem.parents().andSelf().index(this.domElem) > -1;
        
            },
        
            /**
             * Строит CSS-селектор, соответствующий блоку/элементу и модификатору
             * @param {String} [elem] имя элемент
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {String}
             */
            buildSelector : function(elem, modName, modVal) {
        
                return this.__self.buildSelector(elem, modName, modVal);
        
            },
        
            /**
             * Удаляет блок
             * @param {Boolean} [keepDOM=false] нужно ли оставлять DOM-ноды блока в документе
             */
            destruct : function(keepDOM) {
        
                var _this = this,
                    _self = _this.__self;
        
                _this._isDestructing = true;
        
                _this._needSpecialUnbind && _self.doc.add(_self.win).unbind('.' + _this._uniqId);
        
                _this.dropElemCache().domElem.each(function(i, domNode) {
                    $.each(getParams(domNode), function(blockName, blockParams) {
                        var block = uniqIdToBlock[blockParams.uniqId];
                        block && !block._isDestructing && block.destruct();
                    });
                    cleanupDomNode(domNode);
                });
        
                keepDOM || _this.domElem.remove();
        
                delete uniqIdToBlock[_this.un()._uniqId];
                delete _this.domElem;
                delete _this._elemCache;
        
                _this.__base();
        
            }
        
        }, /** @lends BEM.DOM */{
        
            /**
             * Шорткат для документа
             * @protected
             * @type jQuery
             */
            doc : doc,
        
            /**
             * Шорткат для window
             * @protected
             * @type jQuery
             */
            win : win,
        
            /**
             * Осуществляет обработку live-свойств блока
             * @private
             * @param {Boolean} [heedLive=false] нужно ли учитывать то, что блок обрабатывал уже свои live-свойства
             * @returns {Boolean} является ли блок live-блоком
             */
            _processLive : function(heedLive) {
        
                var _this = this,
                    res = _this._liveInitable;
        
                if('live' in _this) {
                    var noLive = typeof res == 'undefined';
        
                    if(noLive ^ heedLive) {
                        if($.isFunction(_this.live)) {
                            res = _this.live() !== false;
                            _this.live = function() {};
                        } else {
                            res = _this.live;
                        }
                    }
                }
        
                return res;
        
            },
        
            /**
             * Инициализирует блоки на фрагменте DOM-дерева
             * @static
             * @protected
             * @param {jQuery} [ctx=document] корневая DOM-нода
             * @returns {jQuery} ctx контекст инициализации
             */
            init : function(ctx, callback, callbackCtx) {
        
                if(!ctx || $.isFunction(ctx)) {
                    callbackCtx = callback;
                    callback = ctx;
                    ctx = doc;
                }
        
                var uniqInitId = $.identify();
                findDomElem(ctx, '.i-bem').each(function() {
                    init($(this), uniqInitId);
                });
        
                callback && this.afterCurrentEvent(
                    function() {
                        callback.call(callbackCtx || this, ctx);
                    });
        
                // чтобы инициализация была полностью синхронной
                this._runAfterCurrentEventFns();
        
                return ctx;
        
            },
        
            /**
             * Уничтожает блоки на фрагменте DOM-дерева
             * @static
             * @protected
             * @param {Boolean} [keepDOM=false] нужно ли оставлять DOM-ноды в документе
             * @param {jQuery} ctx корневая DOM-нода
             * @param {Boolean} [excludeSelf=false] не учитывать контекст
             */
            destruct : function(keepDOM, ctx, excludeSelf) {
        
                if(typeof keepDOM != 'boolean') {
                    excludeSelf = ctx;
                    ctx = keepDOM;
                    keepDOM = undefined;
                }
        
                findDomElem(ctx, '.i-bem', excludeSelf).each(function() {
                    $.each(getParams(this), function(blockName, blockParams) {
                        if(blockParams.uniqId) {
                            var block = uniqIdToBlock[blockParams.uniqId];
                            block && block.destruct(true);
                        }
                    });
                    cleanupDomNode(this);
                });
                keepDOM || (excludeSelf? ctx.empty() : ctx.remove());
        
            },
        
            /**
             * Заменяет фрагмент DOM-дерева внутри контекста, уничтожая старые блоки и инициализируя новые
             * @static
             * @protected
             * @param {jQuery} ctx корневая DOM-нода
             * @param {jQuery|String} content новый контент
             * @param {Function} [callback] обработчик, вызываемый после инициализации
             * @param {Object} [callbackCtx] контекст обработчика
             */
            update : function(ctx, content, callback, callbackCtx) {
        
                this.destruct(ctx, true);
                this.init(ctx.html(content), callback, callbackCtx);
        
            },
        
            /**
             * Строит полное имя live-события
             * @static
             * @private
             * @param {String} e имя события
             * @returns {String}
             */
            _buildCtxEventName : function(e) {
        
                return this._name + ':' + e;
        
            },
        
            _liveClassBind : function(className, e, callback, invokeOnInit) {
        
                var _this = this;
                if(e.indexOf(' ') > -1) {
                    $.each(e.split(' '), function(i, e) {
                        _this._liveClassBind(className, e, callback, invokeOnInit);
                    });
                }
                else {
                    var storage = liveClassEventStorage[e],
                        uniqId = $.identify(callback);
        
                    if(!storage) {
                        storage = liveClassEventStorage[e] = {};
                        doc.bind(e, _this.changeThis(_this._liveClassTrigger, _this));
                    }
        
                    storage = storage[className] || (storage[className] = { uniqIds : {}, fns : [] });
        
                    if(!(uniqId in storage.uniqIds)) {
                        storage.fns.push({ uniqId : uniqId, fn : _this._buildLiveEventFn(callback, invokeOnInit) });
                        storage.uniqIds[uniqId] = storage.fns.length - 1;
                    }
                }
        
                return this;
        
            },
        
            _liveClassUnbind : function(className, e, callback) {
        
                var storage = liveClassEventStorage[e];
                if(storage) {
                    if(callback) {
                        if(storage = storage[className]) {
                            var uniqId = $.identify(callback);
                            if(uniqId in storage.uniqIds) {
                                var i = storage.uniqIds[uniqId],
                                    len = storage.fns.length - 1;
                                storage.fns.splice(i, 1);
                                while(i < len) storage.uniqIds[storage.fns[i++].uniqId] = i - 1;
                                delete storage.uniqIds[uniqId];
                            }
                        }
                    } else {
                        delete storage[className];
                    }
                }
        
                return this;
        
            },
        
            _liveClassTrigger : function(e) {
        
                var storage = liveClassEventStorage[e.type];
                if(storage) {
                    var node = e.target, classNames = [];
                    for(var className in storage) storage.hasOwnProperty(className) && classNames.push(className);
                    do {
                        var nodeClassName = ' ' + node.className + ' ', i = 0;
                        while(className = classNames[i++]) {
                            if(nodeClassName.indexOf(' ' + className + ' ') > -1) {
                                var j = 0, fns = storage[className].fns, fn;
                                while(fn = fns[j++]) fn.fn.call($(node), e);
                                if(e.isPropagationStopped()) return;
                                classNames.splice(--i, 1);
                            }
                        }
                    } while(classNames.length && (node = node.parentNode));
                }
        
            },
        
            _buildLiveEventFn : function(callback, invokeOnInit) {
        
                var _this = this;
                return function(e) {
                    var args = [
                            _this._name,
                            ((e.data || (e.data = {})).domElem = $(this)).closest(_this.buildSelector()),
                            true ],
                        block = initBlock.apply(null, invokeOnInit? args.concat([callback, e]) : args);
                    block && (invokeOnInit || callback.apply(block, arguments));
                };
        
            },
        
            /**
             * Хелпер для live-инициализации по событию на DOM-элементах блока или его элементов
             * @static
             * @protected
             * @param {String} [elemName] имя элемента или элементов (через пробел)
             * @param {String} event имя события
             * @param {Function} callback обработчик, вызываемый после успешной инициализации
             */
            liveInitOnEvent : function(elemName, event, callback) {
        
                return this.liveBindTo(elemName, event, callback, true);
        
            },
        
            /**
             * Хелпер для подписки на live-события на DOM-элементах блока или его элементов
             * @static
             * @protected
             * @param {String|Object} [to] описание (объект с modName, modVal, elemName) или имя элемента или элементов (через пробел)
             * @param {String} event имя события
             * @param {Function} callback обработчик
             */
            liveBindTo : function(to, event, callback, invokeOnInit) {
        
                if(!callback) {
                    callback = event;
                    event = to;
                    to = undefined;
                }
        
                if(!to || typeof to == 'string') {
                    to = { elemName : to };
                }
        
                var _this = this;
        
                if(to.elemName && to.elemName.indexOf(' ') > 1) {
                    $.each(to.elemName.split(' '), function(i, elemName) {
                        _this._liveClassBind(
                            buildClass(_this._name, elemName, to.modName, to.modVal),
                            event,
                            callback,
                            invokeOnInit);
                    });
                    return _this;
                }
        
                return _this._liveClassBind(
                    buildClass(_this._name, to.elemName, to.modName, to.modVal),
                    event,
                    callback,
                    invokeOnInit);
        
            },
        
            /**
             * Хелпер для отписки от live-событий на DOM-элементах блока или его элементов
             * @static
             * @protected
             * @param {String} [elemName] имя элемента или элементов (через пробел)
             * @param {String} event имя события
             * @param {Function} [callback] обработчик
             */
            liveUnbindFrom : function(elemName, event, callback) {
        
                var _this = this;
        
                if(elemName.indexOf(' ') > 1) {
                    $.each(elemName.split(' '), function(i, elemName) {
                        _this._liveClassUnbind(
                            buildClass(_this._name, elemName),
                            event,
                            callback);
                    });
                    return _this;
                }
        
                return _this._liveClassUnbind(
                    buildClass(_this._name, elemName),
                    event,
                    callback);
        
            },
        
            /**
             * Хелпер для live-инициализации по инициализации другого блока
             * @static
             * @private
             * @param {String} blockName имя блока, на инициализацию которого нужно реагировать
             * @param {Function} callback обработчик, вызываемый после успешной инициализации в контексте нового блока
             * @param {String} findFnName имя метода для поиска
             */
            _liveInitOnBlockInit : function(blockName, callback, findFnName) {
        
                var name = this._name;
                blocks[blockName].on('init', function(e) {
                    var blocks = e.block[findFnName](name);
                    callback && $.each(blocks, function() {
                        callback.call(this);
                    });
                });
                return this;
        
            },
        
            /**
             * Хелпер для live-инициализации по инициализации другого блока на DOM-элементе текущего
             * @static
             * @protected
             * @param {String} blockName имя блока, на инициализацию которого нужно реагировать
             * @param {Function} callback обработчик, вызываемый после успешной инициализации в контексте нового блока
             */
            liveInitOnBlockInit : function(blockName, callback) {
        
                return this._liveInitOnBlockInit(blockName, callback, 'findBlocksOn');
        
            },
        
            /**
             * Хелпер для live-инициализации по инициализации другого блока внутри текущего
             * @static
             * @protected
             * @param {String} blockName имя блока, на инициализацию которого нужно реагировать
             * @param {Function} [callback] обработчик, вызываемый после успешной инициализации в контексте нового блока
             */
            liveInitOnBlockInsideInit : function(blockName, callback) {
        
                return this._liveInitOnBlockInit(blockName, callback, 'findBlocksOutside');
        
            },
        
            /**
             * Добавляет обработчик live-события на блок, с учётом заданного элемента,
             * внутри которого будет слушаться событие
             * @static
             * @protected
             * @param {jQuery} [ctx] элемент, внутри которого будет слушаться событие
             * @param {String} e имя события
             * @param {Object} [data] дополнительные данные, приходящие в обработчик как e.data
             * @param {Function} fn обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            on : function(ctx, e, data, fn, fnCtx) {
        
                return ctx.jquery?
                    this._liveCtxBind(ctx, e, data, fn, fnCtx) :
                    this.__base(ctx, e, data, fn);
        
            },
        
            /**
             * Удаляет обработчик live-события у блока, с учётом заданного элемента,
             * внутри которого слушалось событие
             * @static
             * @protected
             * @param {jQuery} [ctx] элемент, внутри которого слушалось событие
             * @param {String} e имя события
             * @param {Function} [fn] обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            un : function(ctx, e, fn, fnCtx) {
        
                return ctx.jquery?
                    this._liveCtxUnbind(ctx, e, fn, fnCtx) :
                    this.__base(ctx, e, fn);
        
            },
        
            /**
             * Добавляет обработчик live-события на блок, с учётом заданного элемента,
             * внутри которого будет слушаться событие
             * @deprecated использовать on
             * @static
             * @protected
             * @param {jQuery} ctx элемент, внутри которого будет слушаться событие
             * @param {String} e имя события
             * @param {Object} [data] дополнительные данные, приходящие в обработчик как e.data
             * @param {Function} fn обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            liveCtxBind : function(ctx, e, data, fn, fnCtx) {
        
                return this._liveCtxBind(ctx, e, data, fn, fnCtx);
        
            },
        
            /**
             * Добавляет обработчик live-события на блок, с учётом заданного элемента,
             * внутри которого будет слушаться событие
             * @static
             * @private
             * @param {jQuery} ctx элемент, внутри которого будет слушаться событие
             * @param {String} e имя события
             * @param {Object} [data] дополнительные данные, приходящие в обработчик как e.data
             * @param {Function} fn обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            _liveCtxBind : function(ctx, e, data, fn, fnCtx) {
        
                if($.isFunction(data)) {
                    fnCtx = fn;
                    fn = data;
                    data = undefined;
                }
        
                var _this = this;
        
                if(e.indexOf(' ') > -1) {
                    $.each(e.split(' '), function(i, e) {
                        _this._liveCtxBind(ctx, e, data, fn, fnCtx);
                    });
                } else {
                    var ctxE = _this._buildCtxEventName(e),
                        storage = liveEventCtxStorage[ctxE] ||
                            (liveEventCtxStorage[ctxE] = { counter : 0, ctxs : {} });
        
                    ctx.each(function() {
                        var ctxId = $.identify(this),
                            ctxStorage = storage.ctxs[ctxId];
                        if(!ctxStorage) {
                            ctxStorage = storage.ctxs[ctxId] = {};
                            ++storage.counter;
                        }
                        ctxStorage[$.identify(fn) + (fnCtx? $.identify(fnCtx) : '')] = {
                            fn   : fn,
                            data : data,
                            ctx  : fnCtx
                        };
                    });
                }
        
                return _this;
        
            },
        
            /**
             * Удаляет обработчик live-события у блока, с учётом заданного элемента,
             * внутри которого слушалось событие
             * @deprecated использовать un
             * @static
             * @protected
             * @param {jQuery} ctx элемент, внутри которого слушалось событие
             * @param {String} e имя события
             * @param {Function} [fn] обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            liveCtxUnbind : function(ctx, e, fn, fnCtx) {
        
                return this._liveCtxBind(ctx, e, fn, fnCtx);
        
            },
        
            /**
             * Удаляет обработчик live-события у блока, с учётом заданного элемента,
             * внутри которого слушалось событие
             * @static
             * @private
             * @param {jQuery} ctx элемент, внутри которого слушалось событие
             * @param {String} e имя события
             * @param {Function} [fn] обработчик
             * @param {Object} [fnCtx] контекст обработчика
             */
            _liveCtxUnbind : function(ctx, e, fn, fnCtx) {
        
                var _this = this,
                    storage = liveEventCtxStorage[e =_this.buildEventName(e)];
        
                if(storage) {
                    ctx.each(function() {
                        var ctxId = $.identify(this, true),
                            ctxStorage;
                        if(ctxId && (ctxStorage = storage.ctxs[ctxId])) {
                            fn && delete ctxStorage[$.identify(fn) + (fnCtx? $.identify(fnCtx) : '')];
                            if(!fn || $.isEmptyObject(ctxStorage)) {
                                storage.counter--;
                                delete storage.ctxs[ctxId];
                            }
                        }
                    });
                    storage.counter || delete liveEventCtxStorage[e];
                }
        
                return _this;
        
            },
        
            /**
             * Извлекает имя вложенного в блок элемента
             * @static
             * @private
             * @param {jQuery} elem вложенный элемент
             * @returns {String|undefined}
             */
            _extractElemNameFrom : function(elem) {
        
                var matches = elem[0].className.match(this._buildElemNameRE());
                return matches? matches[1] : undefined;
        
            },
        
            /**
             * Извлекает параметры блока из DOM-элемента
             * @static
             * @param {HTMLElement} domNode DOM-нода
             * @returns {Object}
             */
            extractParams : extractParams,
        
            /**
             * Строит префикс для CSS-класса DOM-элемента или вложенного элемента блока по имени модификатора
             * @static
             * @private
             * @param {String} modName имя модификатора
             * @param {jQuery|String} [elem] элемент
             * @returns {String}
             */
            _buildModClassPrefix : function(modName, elem) {
        
                return buildClass(this._name) +
                       (elem?
                           ELEM_DELIM + (typeof elem === 'string'? elem : this._extractElemNameFrom(elem)) :
                           '') +
                       MOD_DELIM + modName + MOD_DELIM;
        
            },
        
            /**
             * Строит регулярное выражение для извлечения значения модификатора из DOM-элемента или вложенного элемента блока
             * @static
             * @private
             * @param {String} modName имя модификатора
             * @param {jQuery|String} [elem] элемент
             * @param {String} [quantifiers] квантификаторы регулярного выражения
             * @returns {RegExp}
             */
            _buildModValRE : function(modName, elem, quantifiers) {
        
                return new RegExp('(\\s?)' + this._buildModClassPrefix(modName, elem) + '(' + NAME_PATTERN + ')(\\s|$)', quantifiers);
        
            },
        
            /**
             * Строит регулярное выражение для извлечения имени вложенного в блок элемента
             * @static
             * @private
             * @returns {RegExp}
             */
            _buildElemNameRE : function() {
        
                return new RegExp(this._name + ELEM_DELIM + '(' + NAME_PATTERN + ')(?:\\s|$)');
        
            },
        
            /**
             * Строит CSS-селектор, соответствующий блоку/элементу и модификатору
             * @param {String} [elem] имя элемент
             * @param {String} [modName] имя модификатора
             * @param {String} [modVal] значение модификатора
             * @returns {String}
             */
            buildSelector : function(elem, modName, modVal) {
        
                return '.' + buildClass(this._name, elem, modName, modVal);
        
            },
        
            /**
             * Возвращает инстанс блока по уникальному идентификатору
             * @deprecated
             * @param {String} [uniqId]
             * @returns {BEM.DOM}
             */
            getBlockByUniqId : function(uniqId) {
        
                return uniqIdToBlock[uniqId];
        
            },
        
            /**
             * Возвращает размер текущего окна
             * @returns {Object} объект с полями width, height
             */
            getWindowSize : function() {
        
                return {
                    width  : win.width(),
                    height : win.height()
                }
        
            }
        
        });
        
        })(BEM, jQuery);
        
        }
    /* lego/bem-bl/blocks-common/i-bem/__dom/i-bem__dom.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-bem/__dom/_init/i-bem__dom_init_auto.js: begin */ /**/
        if(_ycssjs('eRpp7IVMuj+kBGQLeckT10TuVF8')){
        /* дефолтная инициализация */
        $(function() {
            BEM.DOM.init();
        });
        }
    /* lego/bem-bl/blocks-common/i-bem/__dom/_init/i-bem__dom_init_auto.js: end */ /**/
    
    /* lego/blocks/b-pager/b-pager.js: begin */ /**/
        if(_ycssjs('a1FkHdQrnZs1yxHv+/yjQHpi3v8')){
        (function($, Lego) {
        
        var currentPager;
        
        function goByHref(el) {
            el[0] && !!el.attr('href') && (window.location.href = el.attr('href'));
        }
        
        Lego.block['b-pager'] = function(params) {
        
            if(currentPager) {
                return params.override && (currentPager = $(this));
            }
        
            currentPager = $(this);
        
            if(params.keydownReaction) {
                $(document).keydown(function(e) {
                    if(!e.ctrlKey || $(e.target).is('input, textarea')) {
                        return;
                    }
        
                    if(e.keyCode == 37) { // <-ctrl
                        goByHref(currentPager.find('.b-pager__prev'));
                    }
                    else if(e.keyCode == 39) { // ctrl->
                        goByHref(currentPager.find('.b-pager__next'));
                    }
                });
            }
        
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-pager/b-pager.js: end */ /**/
    
    /* lego/bem-bl/blocks-common/i-jquery/__leftclick/i-jquery__leftclick.js: begin */ /**/
        if(_ycssjs('+X2f+4NCE97fyQyR29pNg7C9cp0')){
        /**
         * leftClick event plugin
         *
         * Copyright (c) 2010 Filatov Dmitry (alpha@zforms.ru)
         * Dual licensed under the MIT and GPL licenses:
         * http://www.opensource.org/licenses/mit-license.php
         * http://www.gnu.org/licenses/gpl.html
         *
         * @version 1.0.0
         */
        
        (function($) {
        
        var leftClick = $.event.special.leftclick = {
        
            setup : function() {
        
                $(this).bind('click', leftClick.handler);
        
            },
        
            teardown : function() {
        
                $(this).unbind('click', leftClick.handler);
        
            },
        
            handler : function(e) {
        
                if(!e.button) {
                    e.type = 'leftclick';
                    $.event.handle.apply(this, arguments);
                    e.type = 'click';
                }
        
            }
        
        };
        
        })(jQuery);
        }
    /* lego/bem-bl/blocks-common/i-jquery/__leftclick/i-jquery__leftclick.js: end */ /**/
    
    /* lego/blocks/b-statcounter/metrika/_type/b-statcounter__metrika_type_js.js: begin */ /**/
        if(_ycssjs('YdM2n8kJNtUtbk0rNLG/il9OAWQ')){
        (function($, Lego){
        
        var iM = Lego.block['b-statcounter__metrika'] = function(p) {
            p.counter && iM.newCounter(p.counter)
            };
        
        iM.counters = [];
        
        // изначально, новые счётчики запоминаются для отложенного создания (когда будет Ya.Metrika)
        iM.newCounter = function(counter) { iM.counters.push(counter) };
        
        iM.callback = function(old) {
            return function(){
                // как только случился callback (т.е. есть Ya.Metrika), новые счётчики делаются сразу
                iM.newCounter = function(c) {
                    var counter = window['yaCounter' + c] = new Ya.Metrika({id: c, ut: 'noindex'});
                    counter.clickmap();
                    counter.trackLinks({external:true});
                };
        
                // делаем все отложенные счётчики
                var c; while(c = iM.counters.shift()) iM.newCounter(c);
        
                // запускаем старый callback, если он был
                old && old();
            }
        };
        
        !(window.Ya && Ya.Metrika) && $(function() {
            var d = document,
                s = d.createElement('script');
            s.type = 'text/javascript';
            s.src = '//mc.yandex.ru/metrika/watch.js';
            s.setAttribute('async', 'true');
            window.yandex_metrika_callback = iM.callback(window.yandex_metrika_callback);
            d.documentElement.firstChild.appendChild(s);
        });
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-statcounter/metrika/_type/b-statcounter__metrika_type_js.js: end */ /**/
    
    /* lego/blocks/b-head-tabs/b-head-tabs.js: begin */ /**/
        if(_ycssjs('1zYhfm5dVEv3FWFaxNz4C9ZAvU8')){
        (function($, Lego){
        
        var bHeadTabs = Lego.block['b-head-tabs'] = function(params){
            var thisHeadTabs = $(this),
                headSearch = $('.b-head-search'),
                textInput = headSearch.find('.b-search .b-form-input input:first'),
                fromServiceId = Lego.params.id,
        
                // текущие параметры из урла
                urlParams = unserializeUrl(document.location.search),
        
                // отдельно вычисляем clid для маркета
                marketClid = { www: 505, search: 521, images: 526 }[fromServiceId] || 527,
        
                // параметры с дефолтными значениями, которые пробрасываем если нет текста
                noSearchDefParamsMap = { market: { cvredirect: 1, clid: marketClid } },
        
                // параметры с дефолтными значениями, которые пробрасываем если есть текст
                searchDefParamsMap = {
                        news: { rpt: 'nnews', grhow: 'clutop' },
                        haber: { rpt: 'nnews2', grhow: 'clutop' },
                        yaca: { rpt: 'rs2' },
                        market: { cvredirect: 1, clid: marketClid },
                        blogs: { ft: 'blog' }
                    },
        
                // параметры из урла, которые нужно пробросить если нет текста
                noSearchUrlParamsMap = (function() {
                    var res = {};
                    $.each(
                        ['news', 'yaca', 'market', 'blogs', 'maps', 'adresa', 'video', 'fotki', 'slovari', 'auto', 'images', 'music', 'www', 'aile', 'yandex', 'haber', 'gorsel'],
                        function () { res[this] = ['family'] });
                    return res;
                })(),
        
                // параметры из урла, которые нужно пробросить если есть текст
                searchUrlParamsMap = (function() {
                    var res = {};
                    $.each(
                        ['news', 'yaca', 'market', 'blogs', 'maps', 'adresa', 'video', 'fotki', 'slovari', 'auto', 'images', 'music', 'www', 'aile', 'yandex', 'haber', 'gorsel'],
                        function () { res[this] = ['noreask', 'family'] });
                    return res;
                })(),
        
                tabs = thisHeadTabs
                    .find(':not(strong)>a.b-head-tabs__link:not([href$="/all"])')
                    .map(function() {
                        var toServiceId = this.host.split('.')[0],
                            tabUrlParams = unserializeUrl(this.search),
                            clid = tabUrlParams.clid,
                            noSearchParams = $.param($.extend(tabUrlParams, getNoSearchParams(toServiceId, clid)), true);
                        return {
                            node: this,
                            clid: clid,
                            toServiceId: toServiceId,
                            path: bHeadTabs.getHostToUrlMap()[toServiceId], // пути к поиску на сервисах
                            host: this.host,
                            searchHost: bHeadTabs.getHostMap()[toServiceId], // host поиска (ипользуем, если есть текст)
                            noSearchParamsUrl: noSearchParams ? '?' + noSearchParams : '', // урл с параметрами, если нет текста
                            searchParams: $.extend(tabUrlParams, getSearchParams(toServiceId, clid)) // параметры, если есть текст
                        };
                    })
                    .filter(function() { return typeof this.path !== 'undefined' }),
        
        
                // последнее значение поля, чтобы правильно реагировать на изменения
                lastTextValue,
        
                // добавляем к табам ссылку "расширенный поиск"
                advancedSearch = headSearch.find('.b-search__advanced')[0];
                if(advancedSearch && advancedSearch.pathname) {
                    var advUrlParams = unserializeUrl(advancedSearch.search),
                        path = advancedSearch.pathname.replace(/^\/?(.*)/, "$1");
                    advUrlParams.text = '';
                    tabs.push({
                        node: advancedSearch,
                        clid: advUrlParams.clid,
                        toServiceId: fromServiceId,
                        path: path,
                        host: advancedSearch.host,
                        noSearchParamsUrl: path + '?' + $.param(advUrlParams, true),
                        searchParams: advUrlParams
                    });
                }
        
            (function() {
                var textValue = $.trim(textInput.val()) || params['default'];
        
                if(lastTextValue != textValue) {
                    lastTextValue = textValue;
        
                    $.each(tabs, function() {
                        textValue && (this.searchParams[bHeadTabs.getSearchParamName(this.toServiceId)] = textValue);
        
                        this.node.href = [
                            this.node.protocol + '/',
                            textValue && this.searchHost ?
                                this.searchHost :
                                this.host,
                            textValue ?
                                this.path + '?' + $.param(this.searchParams, true) :
                                this.noSearchParamsUrl
                        ].join('/');
                    });
                }
        
                setTimeout(arguments.callee, 200);
            })();
        
            // получить все параметры, которые нужно пробросить, если нет текста
            function getNoSearchParams(toServiceId, clid) {
                var params = noSearchDefParamsMap[toServiceId] || {};
        
                !params.clid && clid && (params.clid = clid);
        
                $.each(noSearchUrlParamsMap[toServiceId] || [], function() {
                    urlParams[this] && (params[this] = urlParams[this]);
                });
        
                return params;
            }
        
            // получить все параметры, которые нужно пробросить, если есть текст
            function getSearchParams(toServiceId, clid) {
                var filterUrlParams = [].concat(searchUrlParamsMap[toServiceId]),
                    toAndFrom = toServiceId + fromServiceId;
        
                (toAndFrom == 'imageswww' || toAndFrom == 'wwwimages') &&
                    filterUrlParams.push('site');
        
                var params = searchDefParamsMap[toServiceId] || {};
        
                $.each(filterUrlParams, function() {
                    urlParams[this] && (params[this] = urlParams[this]);
                });
        
                !params['clid'] && clid && toServiceId !== 'www' &&
                    (params.clid = clid);
        
                return params;
            }
        
            // парсит параметры из урла в хэш
            function unserializeUrl(url) {
                var params = {};
                if (!url) {
                    return params
                }
        
                $.each(url.substr(1).split('&'), function(param) {
                    var splitted = this.split('='),
                        key = splitted[0],
                        val = splitted[1];
        
                    if (key)
                        if(params.hasOwnProperty(key)) {
                            var vals = params[key];
                            $.isArray(vals) ?
                                vals.push(val) :
                                params[key] = [vals, val];
                        } else params[key] = val;
                });
        
                return $.decodeURIComponent !== undefined ? unencodeFields(params) : params;
            }
        
            function unencodeFields(obj) {
                var fields = ['site'];
                $.each(obj, function(key, value) {
                    if($.inArray(key, fields) > -1) obj[key] = $.isArray(value) ? value.map(function(v){ return $.decodeURIComponent(v) }) : $.decodeURIComponent(value);
                });
                return obj
            }
        };
        
        $.extend(bHeadTabs, {
        
            getHostToUrlMap: function() {
                var result = {
                    www: 'yandsearch',
                    market: 'search.xml',
                    maps: '',
                    music: '#/search',
                    video: '#search'
                };
                result.harita = result.maps;
                result.blogs = result.adresa = result.fotki = result.slovari = result.auto = result.market;
                result.news = result.yaca = result.images = result.gorsel = result.haber = result.aile = result.yandex = result.www;
                return result;
            },
        
            getHostMap: function() { return {} },
        
            getSearchParamName: function(serviceId) { return 'text' }
        
        });
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-head-tabs/b-head-tabs.js: end */ /**/
    
    /* lego/blocks/b-pseudo-link/_is-bem/b-pseudo-link_is-bem_yes.js: begin */ /**/
        if(_ycssjs('NEU6X9hlgOVTW5BPUM20R3vrYwA')){
        BEM.DOM.decl({'name': 'b-pseudo-link', 'modName': 'is-bem', 'modVal': 'yes'}, {
        
            _onClick : function(e) {
        
                e.preventDefault();
        
                this.hasMod('disabled', 'yes') || this.afterCurrentEvent(function() {
                    this.trigger('click');
                });
        
            }
        
        }, {
        
            live : function() {
        
                this.liveBindTo({ modName : 'is-bem', modVal : 'yes' }, 'leftclick', function(e) {
                    this._onClick(e);
                });
        
            }
        
        });
        
        BEM.HTML.decl('b-pseudo-link', {
        
            onBlock : function(ctx) {
        
                var url = ctx.param('url');
        
                ctx
                    .tag(url? 'a' : 'span')
                    .js(true);
                url && ctx.attr('href', url);
        
            }
        
        });
        
        }
    /* lego/blocks/b-pseudo-link/_is-bem/b-pseudo-link_is-bem_yes.js: end */ /**/
    
    /* lego/blocks/b-dropdowna/b-dropdowna.js: begin */ /**/
        if(_ycssjs('4HNs5R/5vIxBfV0mZQvu9z5vpJ4')){
        (function($) {
        BEM.DOM.decl('b-dropdowna', {
        
            onSetMod : {
        
                'js' : function() {
        
                    this._getSwitcher().on('click', this._toggle, this);
        
                },
        
                'disabled' : function(modName, modVal) {
        
                    this._getSwitcher().setMod(modName, modVal);
                    modVal == 'yes' && this.getPopup().hide();
        
                }
        
            },
        
            /**
             * Возвращает блок свитчера
             * @private
             */
            _getSwitcher : function() {
        
                return this._switcher ||
                    (this._switcher =
                        this.findBlockInside('b-' + (this.getMod(this.elem('switcher'), 'type') || 'pseudo-link')));
        
            },
        
            _toggle : function() {
        
                this.getPopup().toggle(this.elem('switcher'));
        
            },
        
            getPopup : function() {
        
                return this._popup || (this._popup = this.findBlockInside('b-popupa'))
                    .on('outside-click', function(e, data) {
                        this._getSwitcher().containsDomElem($(data.domEvent.target)) && e.preventDefault();
                    }, this);
        
            },
        
            destruct : function() {
        
                var popup = this._popup;
                popup && popup.destruct.apply(popup, arguments);
        
                this.__base.apply(this, arguments);
        
            }
        
        }, {
        
            live : function() {
        
                this.liveInitOnEvent('switcher', 'leftclick', function() {});
        
            }
        
        });
        })(jQuery);
        }
    /* lego/blocks/b-dropdowna/b-dropdowna.js: end */ /**/
    
    /* lego/blocks/b-popupa/b-popupa.js: begin */ /**/
        if(_ycssjs('JSV+4GBtwd4XiYxzvA5JyAbt4as')){
        (function($) {
        
        BEM.DOM.decl('b-popupa', {
        
            onSetMod : {
        
                'js' : function() {
        
                    /**
                     * DOM-элемент, для которого открывается попап
                     * @private
                     * @type jQuery
                     */
                    this._owner = null;
        
                    /**
                     * Состояние видимости
                     * @private
                     * @type Boolean
                     */
                    this._isShowed = false;
        
                    /**
                     * Приоритетное направление для открытия попапа
                     * @private
                     * @type String
                     */
                    this._direction = this.getMod('direction') || 'down';
        
                }
        
            },
        
            /**
             * Показывает попап
             * @param {jQuery|Object} owner DOM-элемент или координаты { left : x, top : y }, относительно которых рассчитывается положение
             */
            show : function(owner) {
        
                if(!this._isShowed || this._owner !== owner) {
                    this._owner = owner;
                    this._getUnder().show({ left : -10000, top : -10000 });
                    this.pos();
                }
        
                return this;
        
            },
        
            /**
             * Скрывает попап
             */
            hide : function() {
        
                this._isShowed && this._getUnder().hide();
                return this;
        
            },
        
            /**
             * Показывает/скрывает попап в зависимости от текущего состояния
             * @param {jQuery|Object} owner DOM-элемент или координаты { left : x, top : y }, относительно которых рассчитывается положение
             */
            toggle : function(owner) {
        
                return this.isShowed()?
                    this.hide() :
                    this.show(owner);
        
            },
        
            /**
             * Позиционирует попап
             */
            pos : function() {
        
                var params = this._calcParams(this._owner);
        
                this.elem('tail').css(params.tailOffsets);
                this
                    .setMod('direction', params.direction)
                    ._getUnder().show(params.offsets);
        
                return this;
        
            },
        
            /**
             * Возвращает состояние видимости попапа
             * @returns {Boolean}
             */
            isShowed : function() {
        
                return this._isShowed;
        
            },
        
            /**
             * Устанавливает приоритетное направление открытия попапа
             * @param {String} direction направление (up|right|down|left)
             */
            setDirection : function(direction) {
        
                if(this._direction != direction) {
                    this._direction = direction;
                    this.isShowed() && this.pos();
                }
        
            },
        
            /**
             * Устанавливает контент попапа
             * @param {String|jQuery} content контент
             * @param {Function} [callback] обработчик, вызываемый после инициализации
             * @param {Object} [callbackCtx] контекст обработчика
             */
            setContent : function(content, callback, callbackCtx) {
        
                BEM.DOM.update(this.elem('content'), content, callback, callbackCtx);
                return this.isShowed()? this.pos() : this;
        
            },
        
            /**
             * Проверяет, является ли владелец попапа DOM-элементом
             * @returns {Boolean}
             */
            _isOwnerNode : function() {
        
                return !!(this._owner && this._owner.jquery);
        
            },
        
            /**
             * Вычисляет необходимые метрики для расчета направления открытия попапа
             * @private
             * @returns {Object}
             */
            _calcDimensions : function() {
        
                var underElem = this._getUnder()._getUnder(),
                    doc = this.__self.doc,
                    owner = this._owner,
                    isOwnerNode = this._isOwnerNode(),
                    ownerOffset = isOwnerNode? owner.offset() : owner,
                    ownerWidth = isOwnerNode? owner.outerWidth() : TAIL_OFFSET,
                    ownerHeight = isOwnerNode? owner.outerHeight() : TAIL_OFFSET,
                    scrollLeft = doc.scrollLeft(),
                    scrollTop = doc.scrollTop(),
                    windowSize = this.__self.getWindowSize(),
                    borderWidth = parseInt(this.elem('content').css('border-top-width'), 10);
        
                return {
                    ownerLeft : ownerOffset.left,
                    ownerTop : ownerOffset.top,
                    ownerRight : ownerOffset.left + ownerWidth,
                    ownerBottom : ownerOffset.top + ownerHeight,
                    ownerMiddle : ownerOffset.left + ownerWidth / 2,
                    underWidth : underElem.outerWidth(),
                    underHeight : underElem.outerHeight(),
                    borderWidth : isNaN(borderWidth)? 0 : borderWidth,
                    windowLeft : scrollLeft,
                    windowRight : scrollLeft + windowSize.width,
                    windowTop : scrollTop,
                    windowBottom : scrollTop + windowSize.height
                };
        
            },
        
            /**
             * Вычисляет параметры открытия попапа
             * @private
             * @returns {Object} хэш вида { direction, offset.left, offset.top }
             */
            _calcParams : function() {
        
                var d = this._calcDimensions();
        
                if(this.hasMod('adjustable', 'no'))
                    return calcDirectionParams(this._direction, d);
        
                var checkedDirections = {},
                    currentDirectionIndex = $.inArray(this._direction, directionPriorities),
                    priorityDirectionIndex = currentDirectionIndex,
                    currentDirection, params;
        
                do {
                    currentDirection = directionPriorities[currentDirectionIndex];
        
                    params = checkedDirections[currentDirection] = calcDirectionParams(currentDirection, d);
                    if(!params.factor) // значит полностью попал в окно
                        return params;
        
                    // находим следующее возможное направление открытия, если оно есть
                    ++currentDirectionIndex == directionPriorities.length && (currentDirectionIndex = 0);
        
                } while(currentDirectionIndex !== priorityDirectionIndex);
        
                return checkedDirections['down-right'];
        
            },
        
            destruct : function() {
        
                var under = this._under;
                if(!under) {
                    this.__base.apply(this, arguments);
                }
                else if(!this._destructing) {
                    this._destructing = true;
                    BEM.DOM.destruct(false, under.domElem);
                    this.__base(true);
                }
        
            },
        
            /**
             * Возвращает подложку
             * @private
             * @returns {BEM.DOM.blocks['i-popup']}
             */
            _getUnder : function() {
        
                var _this = this;
        
                if(!_this._under) {
                    var under = $(BEM.HTML.build({
                        block : 'i-popup',
                        zIndex : this.params.zIndex,
                        mods : {
                            autoclosable : _this.getMod('autoclosable') || 'yes',
                            fixed : _this.hasMod('direction', 'fixed') && 'yes'
                        },
                        underMods : _this.params.underMods,
                        underMix : [{ block : 'b-popupa', elem : 'under' }]
                    }));
        
                    (_this._under = _this.findBlockOn(under, 'i-popup'))
                        .on(
                            {
                                'show' : function() {
        
                                    _this._isShowed = true;
        
                                    _this
                                        .bindToWin('resize', _this.pos)
                                        ._isOwnerNode() &&
                                            _this.bindToDomElem(_this._owner.parents(), 'scroll', _this.pos);
        
                                    _this.trigger('show');
        
                                },
                                'hide' : function() {
        
                                    _this._isShowed = false;
        
                                    _this
                                        .unbindFromWin('resize')
                                        ._isOwnerNode() &&
                                            _this.unbindFromDomElem(_this._owner.parents(), 'scroll');
        
                                    _this.trigger('hide');
        
                                },
                                'outside-click' : function() {
        
                                    _this.trigger.apply(_this, arguments);
        
                                }
                            })
                        .elem('content').append(_this.domElem);
        
                }
        
                return _this._under;
        
            }
        
        }, {
        
            live : function() {
        
                this.liveBindTo('close', 'leftclick', function() {
                    this.hide();
                });
        
            }
        
        });
        
        var TAIL_OFFSET = 19,
            TAIL_WIDTH_HORIZONTAL = 7,
            TAIL_WIDTH_VERTICAL = 15,
            TAIL_HEIGHT_HORIZONTAL = 15,
            TAIL_HEIGHT_VERTICAL = 7,
            SHADOW_SIZE = 7,
            directionPriorities =
                ['up', 'up-right', 'up-left', 'down', 'down-right', 'down-left', 'right', 'right-up', 'left', 'left-up'];
        
        /**
         * Рассчитывает параметры открытия попапа в заданном направлении
         * @private
         * @param {String} direction направление
         * @param {Object} d метрики
         * @returns {Object}
         */
        function calcDirectionParams(direction, d) {
        
            var factor, offsets, tailOffsets, calcDirection;
        
            switch(direction) {
                case 'down':
                case 'up':
                    factor = calcInWindowFactor(offsets = {
                        left : d.ownerMiddle - d.underWidth / 2,
                        top : direction == 'down'?
                            d.ownerBottom + TAIL_HEIGHT_VERTICAL :
                            d.ownerTop - d.underHeight + SHADOW_SIZE * 2 - TAIL_HEIGHT_VERTICAL
                    }, d);
                    offsets.left += SHADOW_SIZE;
                    tailOffsets = {
                        marginLeft : (d.ownerRight - d.ownerLeft) / 2 +
                            d.ownerLeft - offsets.left - TAIL_WIDTH_VERTICAL / 2,
                        marginTop : (direction == 'down'? -TAIL_HEIGHT_VERTICAL + d.borderWidth : -d.borderWidth)
                    };
                break;
        
                case 'down-right':
                case 'down-left':
                case 'up-right':
                case 'up-left':
                    calcDirection = direction == 'down-right' || direction == 'down-left'? 'down' : 'up';
                    factor = calcInWindowFactor(offsets = {
                        left : (direction == 'down-right' || direction == 'up-right'?
                            d.ownerLeft :
                            d.ownerRight - d.underWidth + SHADOW_SIZE),
                        top : calcDirection == 'down'?
                            d.ownerBottom + TAIL_HEIGHT_VERTICAL :
                            d.ownerTop - d.underHeight + SHADOW_SIZE * 2 - TAIL_HEIGHT_VERTICAL
                    }, d);
                    (direction == 'down-left' || direction == 'up-left') && (offsets.left += SHADOW_SIZE);
                    tailOffsets = {
                        marginLeft : (d.ownerRight - d.ownerLeft) / 2 + d.ownerLeft - offsets.left - TAIL_WIDTH_VERTICAL / 2,
                        marginTop : (calcDirection == 'down'? -TAIL_HEIGHT_VERTICAL + d.borderWidth : -d.borderWidth)
                    };
                break;
        
                case 'left':
                case 'right':
                    factor = calcInWindowFactor(offsets = {
                        left : (direction == 'left'?
                            d.ownerLeft - d.underWidth - TAIL_WIDTH_HORIZONTAL :
                            d.ownerRight + TAIL_WIDTH_HORIZONTAL),
                        top : d.ownerTop - TAIL_OFFSET + TAIL_HEIGHT_HORIZONTAL / 2
                    }, d);
                    direction == 'left' && (offsets.left += SHADOW_SIZE + TAIL_WIDTH_HORIZONTAL);
                    tailOffsets = {
                        marginLeft : direction == 'left'? -d.borderWidth : -TAIL_WIDTH_HORIZONTAL + d.borderWidth,
                        marginTop : TAIL_OFFSET - TAIL_HEIGHT_HORIZONTAL / 2
                    };
                break;
        
                case 'left-up':
                case 'right-up':
                    calcDirection = direction == 'left-up'? 'left' : 'right';
                    factor = calcInWindowFactor(offsets = {
                        left : (direction == 'left-up'?
                            d.ownerLeft - d.underWidth - TAIL_WIDTH_HORIZONTAL :
                            d.ownerRight + TAIL_WIDTH_HORIZONTAL),
                        top : d.ownerTop + TAIL_HEIGHT_HORIZONTAL / 2 + TAIL_OFFSET - d.underHeight + SHADOW_SIZE
                    }, d);
                    direction == 'left-up' && (offsets.left += SHADOW_SIZE + TAIL_WIDTH_HORIZONTAL);
                    tailOffsets = {
                        marginLeft : calcDirection == 'left'? -d.borderWidth : -TAIL_WIDTH_HORIZONTAL + d.borderWidth,
                        marginTop : d.ownerTop - offsets.top + SHADOW_SIZE - TAIL_HEIGHT_HORIZONTAL / 2
                    };
            }
        
            return {
                direction : calcDirection || direction,
                factor : factor,
                offsets : offsets,
                tailOffsets : tailOffsets
            };
        
        }
        
        /**
         * Вычисляет фактор попадания объекта в окно
         * @param {Object} pos параметры объекта
         * @param {Object} d метрики
         * @returns {Number} фактор попадания (если 0 - то полностью попадает, если нет -- то чем он больше, тем хуже попадает)
         */
        function calcInWindowFactor(pos, d) {
        
            var res = 0;
        
            d.windowTop > pos.top && (res += d.windowTop - pos.top);
            pos.top + d.underHeight > d.windowBottom && (res += pos.top + d.underHeight - d.windowBottom);
            d.windowLeft > pos.left && (res += d.windowLeft - pos.left);
            pos.left + d.underWidth > d.windowRight && (res += pos.left + d.underWidth - d.windowRight);
        
            return res;
        
        }
        
        BEM.HTML.decl('b-popupa', {
        
            onBlock : function(ctx) {
        
                var hasClose = false;
                $.each(ctx.param('content'), function(i, item) {
                    return !(hasClose = item.elem == 'close');
                });
                ctx
                    .mods({ theme : 'ffffff', direction : 'down', 'has-close' : hasClose && 'yes' })
                    .js(true)
                    .afterContent({ elem : 'shadow' });
        
            },
        
            onElem : {
        
                'content' : function(ctx) {
        
                    ctx
                        .wrap({ elem : 'wrap-cell', tag : 'td' })
                        .wrap({ tag : 'tr' })
                        .wrap({ elem : 'wrap', tag : 'table' });
        
                },
        
                'close' : function(ctx) {
        
                    ctx.tag('i');
        
                },
        
                'shadow' : function(ctx) {
        
                    ctx.tag('i');
        
                },
        
                'tail' : function(ctx) {
        
                    ctx
                        .tag('i')
                        .wrapContent({ elem : 'tail-i', tag : 'i' });
        
                }
        
            }
        
        });
        
        })(jQuery);
        
        }
    /* lego/blocks/b-popupa/b-popupa.js: end */ /**/
    
    /* lego/blocks/i-popup/i-popup.js: begin */ /**/
        if(_ycssjs('33yUyxzLSSnkEEPqSJifhyJN97U')){
        (function($) {
        
        /**
         * Шаблон для подложки
         * @private
         * @type jQuery
         */
        var template,
        
        /**
         * Пул подложек
         * @private
         * @type Array
         */
            underPool = [],
        
            browser = $.browser;
        
        /**
         * Достает подложку из пула, при необходимости создает новую
         * @private
         * @returns jQuery
         */
        function getUnder() {
        
            return underPool.length?
                underPool.shift() :
                template?
                    template.clone() :
                    template = createUnder();
        
        }
        
        /**
         * Возвращает подложку в пул
         * @private
         * @param {jQuery} under
         */
        function putUnder(under) {
        
            underPool.push(under);
        
        }
        
        /**
         * Создает подложку
         * @private
         * @returns {jQuery}
         */
        function createUnder() {
        
            // TODO пока только для мобильного сафари отдаем div, нужно сделать более умно для тех браузеров, которым достаточно div
            return $((browser.safari || browser.webkit) && navigator.userAgent.toLowerCase().indexOf('mobile') > -1?
                '<div/>' :
                '<iframe' + (browser.msie && browser.version < 9? ' frameborder="0"' : '') + '/>');
        
        }
        
        BEM.DOM.decl('i-popup', {
        
            onSetMod : {
        
                'visibility' : {
        
                    'visible' : function() {
        
                        var under = this._getUnder(),
                            underParent = under.parent();
        
                        this.hasMod(under, 'type', 'paranja')?
                            underParent.is('body') || under.appendTo('body') :
                            (underParent[0] !== this.domElem[0]) && under.prependTo(this.domElem);
        
                        this._inBody || (this._inBody = !!this.domElem.appendTo('body'));
        
                        this.trigger('show');
        
                    },
        
                    '' : function() {
        
                        var under = this._getUnder();
        
                        this.hasMod(under, 'type', 'paranja') && under.remove();
                        this._putUnder();
                        this.trigger('hide');
        
                    }
        
                }
        
            },
        
            /**
             * Получает элемент подложки
             * @private
             * @returns {jQuery}
             */
            _getUnder : function() {
        
                return this._under ||
                    (this._under = getUnder().attr(
                        'class',
                        this._underClass || (this._underClass = this.findElem('under').remove().attr('class'))));
        
            },
        
            /**
             * Возвращает элемент подложки
             * @private
             */
            _putUnder : function() {
        
                putUnder(this._under);
                delete this._under;
        
            },
        
            /**
             * Открывает попап
             * @param {Object} css объект css-свойств, описывающих положение попапа
             * @returns {BEM.DOM}
             */
            show : function(css) {
        
                css && this.domElem.css(css);
                return this.setMod('visibility', 'visible');
        
            },
        
            /**
             * Закрывает попап
             * @returns {BEM.DOM}
             */
            hide : function() {
        
                return this.delMod('visibility');
        
            }
        
        }, {
        
            live : true
        
        });
        
        })(jQuery);
        
        BEM.HTML.decl('i-popup', {
        
            onBlock : function(ctx) {
        
                ctx
                    .mod('autoclosable', 'yes')
                    .js(true)
                    .wrapContent({ elem : 'content' })
                    .afterContent({
                        elem : 'under',
                        mods : ctx.param('underMods'),
                        mix : ctx.param('underMix')})
                    .param('zIndex') &&
                        ctx.attr('style', 'z-index:' + (32700 + ctx.param('zIndex')));
        
        
            }
        
        });
        }
    /* lego/blocks/i-popup/i-popup.js: end */ /**/
    
    /* lego/blocks/i-popup/_autoclosable/i-popup_autoclosable_yes.js: begin */ /**/
        if(_ycssjs('ufxn6b+gNgluVOVsGx/GBVnWNLE')){
        (function($) {
        BEM.DOM.decl({ name : 'i-popup', modName : 'autoclosable', modVal : 'yes' }, {
        
            onSetMod : {
        
                'visibility' : {
        
                    'visible' : function() {
        
                        var keyDownEvent = $.browser.opera? 'keypress' : 'keydown';
                        this.afterCurrentEvent(function() {
                            this
                                .bindToDoc('leftclick', function(e) {
                                    this.containsDomElem($(e.target)) || this._onOutClick(e);
                                })
                                .bindToDoc(keyDownEvent, function(e) {
                                    // на Escape закрываем
                                    e.keyCode == 27 && this.hide();
                                });
                        });
                        this.__base.apply(this, arguments);
        
                    },
        
                    '' : function() {
        
                        return this
                            .unbindFromDoc('leftclick keypress')
                            .__base.apply(this, arguments);
        
                    }
        
                }
        
            },
        
            _onOutClick : function(domEvent) {
        
                var e = $.Event('outside-click');
                this.trigger(e, { domEvent : domEvent });
                e.isDefaultPrevented() || this.hide();
        
            }
        
        });
        })(jQuery);
        }
    /* lego/blocks/i-popup/_autoclosable/i-popup_autoclosable_yes.js: end */ /**/
    
    /* lego/blocks/i-statface/i-statface.js: begin */ /**/
        if(_ycssjs('9lWWHlqYc4jmLteQreXwF+bLANQ')){
        BEM.decl('i-statface', {
        
            onSetMod : {
        
                'js' : function() {
        
                    this._data = {};
                    this._needSend = false;
                    this.hasMod('send', 'manual') || $(window).unload(this.changeThis(this.send));
        
                }
        
            },
        
            /**
             * @param {Object|string} name
             * @param {string} [val]
             */
            set : function(name, val) {
        
                this._needSend = true;
                var data = this._data;
                if(typeof name == 'object') {
                    $.each(name, function(key, value) {
                        data[key] = value;
                    })
                } else {
                    data[name] = val;
                }
        
                return this;
            },
        
            reset : function() {
        
                var _this = this;
                arguments[0]?
                    $.each(arguments, function(i, key) {
                        delete _this._data[key];
                    }) :
                    this._data = {};
                $.isEmptyObject(this._data) && (this._needSend = false);
                return this;
        
            },
        
            serialize : function() {
        
                var _this = this;
        
                return $.map(_this.params.keys, function(val) {
                    return _this._data[val];
                }).join('.') + (_this.params.customKeys?
                    $.map(_this.params.customKeys, function(key) {
                        var val = _this._data[key];
                        return '/' + key + '=' + (val == undefined ? '' : val)
                    }).join('') :
                    '');
        
            },
        
            /**
             * @param {Function} [onComplete]
             */
            send : function(onComplete) {
        
                if(this._needSend) {
                    var params = this.params,
                        url = ['//', params.host, '/jclck/dtype=stred/pid=', params.pid,
                        '/cid=', params.cid, '/path=', this.serialize(), '/*', location.href].join('');
        
                    $.ajax({
                        type: 'GET',
                        url: url,
                        data: null,
                        complete: onComplete || $.noop,
                        dataType: 'script',
                        timeout: 500
                    });
                    this._needSend = false;
                }
                return this;
        
            },
        
            getDefaultParams : function() {
        
                return {
                    host : 'clck.yandex.ru'
                };
        
            }
        
        });
        
        }
    /* lego/blocks/i-statface/i-statface.js: end */ /**/
    
    /* blocks/i-statface/i-statface.js: begin */ /**/
        if(_ycssjs('PXkyxUuYJzL6pqADeWeX3Klgbqk')){
        BEM.decl('i-statface', {
        
            send : function(callback) {
        
                if(this._needSend) {
                    var params = this.params,
                        img = new Image();
        
                    img.src = ['//', params.host, '/click/dtype=stred/pid=', params.pid,
                    '/cid=', params.cid, '/path=', this.serialize(), '/*', location.href].join('');
        
                    if (callback) $(img).load(callback);
        
                    this._needSend = false;
                }
                return this;
        
            }
        
        });
        
        }
    /* blocks/i-statface/i-statface.js: end */ /**/
    
    /* lego/blocks/b-search/input/b-search__input.js: begin */ /**/
        if(_ycssjs('HNC+Si8gZl+yTKbRX8iWy928Ztg')){
        (function($, Lego){
        
        Lego.block['b-search__input'] = function(params){
        
            var _this = $(this);
            var _params = $.extend({focus: false, shortcut: false}, params);
        
            if(_params.focus || _this.data('lego:focused')) {
                if(!_this.data('lego:focused')) {
                    var activeNode = document.activeElement;
                    (activeNode && 'input textarea'.indexOf(activeNode.tagName.toLowerCase()) > -1) ||
                        setTimeout(function() {
                            _this.focus();
                            if(_this[0].createTextRange) { // ставим каретку в конец для opera и ie
                                var range = _this[0].createTextRange(),
                                len = _this.val().length;
        
                                range.collapse();
                                range.moveStart('character', len);
                                range.moveEnd('character', len);
                                range.select();
                            }
                            _this.data('lego:focused', true);
                        }, 0);
                }
                if(!!window.history.length && !$.trim(_this.val())) { // только если есть хистори и пустое поле
                    _this.bind('keydown', function(e) {
                        if(e.keyCode == 8) { // если первое нажатие Backspace
                            if (!$.trim(_this.val())) return window.history.back();
                        }
                        _this.unbind('keydown', arguments.callee);
                    });
                }
                _this.blur(function() {
                    _this.data('lego:focused', false);
                }).focus(function() { //b-suggest делает blur-focus для установки autocomplete=off, это может сломать инициализацию клавиатуры
                    _this.data('lego:focused', true);
                });
            }
        
            if(_params.shortcut) {
                $(document).keydown(function(e) {
                    if(!e.ctrlKey || $(e.target).is('input, textarea')) {
                        return;
                    }
        
                    if(e.keyCode == 38) {
                        _this.focus().select();
                    }
                });
            }
        
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-search/input/b-search__input.js: end */ /**/
    
    /* lego/blocks/b-form-input/b-form-input.js: begin */ /**/
        if(_ycssjs('vqyMx4lovBmzBaPLaohfrO0221Q')){
        (function() {
        
        var instances,
            sysChannel;
        
        function update() {
            var instance, i = 0;
            while(instance = instances[i++]) instance.val(instance.elem('input').val());
        }
        
        BEM.DOM.decl('b-form-input', {
        
            onSetMod : {
        
                'js' : function() {
        
                    var _this = this,
                        input = _this.elem('input');
        
                    try {
                        // В iframe в IE9 происходит "Error: Unspecified error."
                        var activeNode = _this.__self.doc[0].activeElement;
                    } catch(e) {}
        
                    _this._val = input.val();
                    _this._focused = activeNode === input[0];
        
                    // факт подписки
                    if(!sysChannel) {
                        instances = [];
                        sysChannel = _this.channel('sys')
                            .on({
                                'tick' : update,
                                'idle' : function() {
                                    sysChannel.un('tick', update);
                                },
                                'wakeup' : function() {
                                    sysChannel.on('tick', update);
                                }});
                    }
        
                    // синхронизируем состояние фокуса
                    _this._focused && _this.setMod('focused', 'yes');
        
                    if(_this.params.autoFocus && !_this._focused &&
                        !(activeNode && 'input textarea'.indexOf(activeNode.tagName.toLowerCase()) > -1)) {
                        _this
                            .setMod('focused', 'yes')
                            ._focused = true;
                    }
        
                    // сохраняем индекс в массиве инстансов чтобы потом быстро из него удалять
                    _this._instanceIndex = instances.push(
                        _this
                            .bindTo(input, {
                                focus : _this._onFocus,
                                blur  : _this._onBlur
                            })) - 1;
        
                    // шорткат для перехода в инпут - crtl+стрелка вверх
                    _this.params.shortcut && _this.bindToDoc('keydown', function(e) {
                        if(e.ctrlKey && e.keyCode == 38 && !$(e.target).is('input, textarea')) {
                            _this.setMod('focused', 'yes');
                        }
                    });
                },
        
                'disabled' : function(modName, modVal) {
        
                    this.elem('input').attr('disabled', modVal == 'yes');
        
                },
        
                'focused' : function(modName, modVal) {
        
                    if(this.hasMod('disabled', 'yes'))
                        return false;
        
                    var focused = modVal == 'yes';
        
                    focused?
                        this._focused || this._focus() :
                        this._focused && this._blur();
        
                    this.afterCurrentEvent(function() {
                        this.trigger(focused? 'focus' : 'blur');
                    });
        
                }
        
            },
        
            onElemSetMod : {
        
                'message' : {
        
                    'visibility' : function(elem, modName, modVal) {
        
                        var _this = this,
                            type = _this.getMod(elem, 'type');
        
                        if(type) {
                            var needSetMod = true;
                            modVal || _this.elem('message', 'type', type).each(function() {
                                this != elem[0] && _this.hasMod($(this), 'visibility', 'visible') && (needSetMod = false);
                            });
                            needSetMod && _this.toggleMod('message-' + type, 'yes', '', modVal === 'visible');
                        }
        
                    }
        
                }
        
            },
        
            /**
             * Возвращает/устанавливает текущее значение
             * @param {String} [val] значение
             * @param {Object} [data] дополнительные данные
             * @returns {String|BEM} если передан параметр val, то возвращается сам блок, если не передан -- текущее значение
             */
            val : function(val, data) {
        
                if(typeof val == 'undefined') return this._val;
        
                if(this._val != val) {
                    var input = this.elem('input');
                    input.val() != val && input.val(val);
                    this._val = val;
                    this.trigger('change', data);
                }
        
                return this;
        
            },
        
            name : function(name) {
                return this.elem('input').attr('name');
            },
        
            _onFocus : function() {
        
                this._focused = true;
                return this.setMod('focused', 'yes');
        
            },
        
            _onBlur : function() {
        
                this._focused = false;
                return this.delMod('focused');
        
            },
        
            /**
             * Нормализует установку фокуса для IE
             * @private
             */
            _focus : function() {
        
                var input = this.elem('input')[0];
                if(input.createTextRange && !input.selectionStart) {
                    var range = input.createTextRange();
                    range.move('character', input.value.length);
                    range.select();
                } else {
                    input.focus();
                }
        
            },
        
            _blur : function() {
        
                this.elem('input').blur();
        
            },
        
            destruct : function() {
        
                this.__base.apply(this, arguments);
        
                this.params.shortcut && this.unbindFromDoc('keydown');
                instances.splice(this._instanceIndex, 1);
        
                var i = this._instanceIndex,
                    instance;
        
                while(instance = instances[i++]) --instance._instanceIndex;
        
            }
        
        });
        
        BEM.HTML.decl('b-form-input', {
        
            onBlock : function(ctx) {
        
                var id = ctx.param('id') || ctx.generateId();
        
                ctx
                    .tag('span')
                    .tParam('id', id)
                    .tParam('has-clear', ctx.mod('has-clear') === 'yes')
                    .afterContent(
                        {
                            elem : 'box',
                            tag : 'span',
                            content : {
                                elem : 'input',
                                tag : ctx.mod('type') || 'input',
                                attrs : {
                                    value : ctx.param('value'),
                                    name : ctx.param('name'),
                                    id : id
                                }
                            }
                        })
                    .js(true);
        
            },
        
            onElem : {
        
                'label' : function(ctx) {
        
                    ctx
                        .tag('label')
                        .attr('for', ctx.tParam('id'))
        
                },
        
                'box': function (ctx) {
        
                    if (ctx.tParam('has-clear')) {
                        ctx.afterContent({elem: 'clear', tag: 'span'});
                    }
        
                },
        
                'hint' : function(ctx) {
        
                    ctx
                        .tag('label')
                        .attr('for', ctx.tParam('id'))
        
                }
        
            }
        
        });
        
        })();
        
        }
    /* lego/blocks/b-form-input/b-form-input.js: end */ /**/
    
    /* lego/blocks/i-system/i-system.js: begin */ /**/
        if(_ycssjs('Z/2AsDqoOKDPn3Mim9QrGSOsDyc')){
        (function() {
        
        var timer,
            counter = 0,
            isIdle = false,
            idleInterval = 0,
            channel = BEM.channel('sys'),
            TICK_INTERVAL = 50;
        
        BEM.decl('i-system', {}, {
        
            start : function() {
        
                $(document).bind('mousemove keydown', function() {
                    idleInterval = 0;
                    if(isIdle) {
                        isIdle = false;
                        channel.trigger('wakeup');
                    }
                });
        
                this._tick();
        
            },
        
            _tick : function() {
        
                var _this = this;
        
                channel.trigger('tick', { counter : counter++ });
        
                if(!isIdle && (idleInterval += TICK_INTERVAL) > 3000) {
                    isIdle = true;
                    channel.trigger('idle');
                }
        
                timer = setTimeout(function() {
                    _this._tick();
                }, TICK_INTERVAL);
        
            }
        
        }).start();
        
        })();
        }
    /* lego/blocks/i-system/i-system.js: end */ /**/
    
    /* lego/blocks/b-form-button/b-form-button.js: begin */ /**/
        if(_ycssjs('0x2H0gdaKEj7tE9gR8oH3uhfaQU')){
        BEM.DOM.decl('b-form-button', {
        
            onSetMod : {
        
                'js' : function() {
        
                    (this._href = this.domElem.attr('href')) && this.isDisabled() &&
                        this.domElem.removeAttr('href');
        
                },
        
                'focused' : {
        
                    'yes' : function() {
        
                        if(this.isDisabled())
                            return false;
        
                        this
                            .bindTo('keydown', this._onKeyDown)
                            .elem('input').focus();
        
                    },
        
                    '' : function() {
        
                        this
                            .unbindFrom('keydown')
                            .elem('input').blur();
        
                    }
        
                },
        
                'disabled' : function(modName, modVal) {
        
                    var disable = modVal == 'yes';
        
                    this.elem('input').attr('disabled', disable);
        
                    this._href && (disable?
                        this.domElem.removeAttr('href') :
                        this.domElem.attr('href', this._href));
        
                    disable && this.domElem.keyup();
        
                },
        
                'pressed' : function(modName, modVal) {
        
                    this.isDisabled() || this.trigger(modVal == 'yes'? 'press' : 'release');
        
                },
        
                'hovered' : {
        
                    '' : function() {
        
                        this.delMod('pressed');
        
                    }
        
                },
        
                '*' : function(modName) {
        
                    if(this.isDisabled() && 'hovered pressed'.indexOf(modName) > -1)
                        return false;
        
                }
        
            },
        
            /**
             * Шорткат для проверки модификатора disabled_yes
             * @returns {Boolean}
             */
            isDisabled : function() {
        
                return this.hasMod('disabled', 'yes');
        
            },
        
            /**
             * Получение/установка урла (для кнопки-ссылки)
             * @param {String} [val] урл
             */
            url : function(val) {
        
                if(typeof val == 'undefined') {
                    return this._href;
                } else {
                    this._href = val;
                    this.isDisabled() || this.domElem.attr('href', val);
                    return this;
                }
        
            },
        
            _onKeyDown : function(e) {
        
                var keyCode = e.keyCode;
                // имитируем state_pressed по нажатию на enter и space
                if((keyCode == 13 || keyCode == 32) && !this._keyDowned) {
                    this._keyDowned = true;
                    this
                        .setMod('pressed', 'yes')
                        .bindTo('keyup', function() {
                            this
                                .delMod('pressed')
                                .unbindFrom('keyup');
                            delete this._keyDowned;
                            // делаем переход по ссылке по space
                            if(keyCode == 32 && this.domElem.attr('href')) {
                                document.location = this.domElem.attr('href');
                            }
                        });
                }
        
            },
        
            _onClick : function(e) {
        
                this.isDisabled()?
                    e.preventDefault() :
                    this.afterCurrentEvent(function() {
                        this.trigger('click');
                    });
            }
        
        }, {
        
            live : function() {
        
                var eventsToMods = {
                    'mouseover' : { name : 'hovered', val : 'yes' },
                    'mouseout' : { name : 'hovered' },
                    'mousedown' : { name : 'pressed', val : 'yes' },
                    'mouseup' : { name : 'pressed' },
                    'focusin' : { name : 'focused', val : 'yes' },
                    'focusout' : { name : 'focused' }
                };
        
                this
                    .liveBindTo('leftclick', function(e) {
                        this._onClick(e);
                    })
                    .liveBindTo('mouseover mouseout mouseup focusin focusout', function(e) {
                        var mod = eventsToMods[e.type];
                        this.setMod(mod.name, mod.val || '');
                    })
                    .liveBindTo('mousedown', function(e) {
                        var mod = eventsToMods[e.type];
                        e.which == 1 && this.setMod(mod.name, mod.val || '');
                    });
            }
        
        });
        
        BEM.HTML.decl('b-form-button', {
        
            onBlock : function(ctx) {
        
                ctx
                    .tag(ctx.param('url')? 'a' : 'span')
                    .attrs({ href : ctx.param('url'), target : ctx.param('target') })
                    .mods({
                            theme : ctx.mod('theme') || 'grey-19',
                            height : ctx.mod('height') || 19
                        })
                     .content(
                         [
                            {
                                elem : 'left',
                                tag : 'i'
                            },
                            {
                                elem : 'content',
                                tag : 'span',
                                content : {
                                    elem : 'text',
                                    content : ctx.content(),
                                    tag : 'span'
                                }
                            },
        
                            ((ctx.param('type') == 'button' || ctx.param('type') == 'submit') && // input нужен только кнопке и субмиту
                            {
                                elem : 'input',
                                tag : 'input',
                                attrs : {
                                    type : ctx.param('type'),
                                    disabled : ctx.param('disabled'),
                                    value : '' // без пустого value получается невалидный html
                                }
                            }),
        
                            ctx.param('url') &&
                            {
                                elem : 'click',
                                tag : 'i'
                            }
        
                        ],
                        true)
                    .js(true);
        
            }
        
        });
        
        }
    /* lego/blocks/b-form-button/b-form-button.js: end */ /**/
    
    /* lego/blocks/i-request/i-request.js: begin */ /**/
        if(_ycssjs('dd6FleXp7UufmoYTwH3/FUEuLDs')){
        (function() {
        
        var cache = {};
        
        BEM.decl('i-request', {
        
            get : function(request, onSuccess, onError, params) {
        
                if(!$.isFunction(onError)) {
                    params = onError;
                    onError = this.params.onError;
                }
        
                this._get(request, onSuccess, onError, $.extend({}, this.params, params));
        
            },
        
            _get : function(request, onSuccess, onError, params) {
        
                var key = this._buildCacheKey(request, params),
                    cacheGroup = cache[params.cacheGroup];
        
                params.cache && cacheGroup && key in cacheGroup.data?
                    onSuccess.call(this.params.callbackCtx, cacheGroup.data[key]) :
                    this._do(request, onSuccess, onError, params);
        
            },
        
            _do : function(request, onSuccess, onError, params) {},
        
            _onSuccess : function(requestKey, request, data, params) {
        
                params.cache && this.putToCache(params, requestKey, data);
        
            },
        
            _buildCacheKey : function(obj, params) {
        
                return typeof obj == 'string'?
                   obj :
                   $.param(obj);
        
            },
        
            putToCache : function(params, request, data) {
        
                var cacheGroup = cache[params.cacheGroup] || (cache[params.cacheGroup] = { keys : [], data : {}});
        
                if(cacheGroup.keys.length >= params.cacheSize) {
                    delete cacheGroup.data[cacheGroup.keys.shift()];
                }
        
                var key = this._buildCacheKey(request, params);
        
                cacheGroup.data[key] = data;
                cacheGroup.keys.push(key);
        
            },
        
            dropCache : function() {
        
                delete cache[this.params.cacheGroup];
        
            },
        
            getDefaultParams : function() {
        
                return {
                    cache : false,
                    cacheGroup : 'default',
                    cacheSize : 100,
                    callbackCtx : this
                };
        
            }
        
        });
        
        })();
        }
    /* lego/blocks/i-request/i-request.js: end */ /**/
    
    /* lego/blocks/i-request/_type/i-request_type_ajax.js: begin */ /**/
        if(_ycssjs('Y3zeEFXxrKFgaSnrULP+NDlU2ZU')){
        BEM.decl({ block : 'i-request_type_ajax', baseBlock : 'i-request' }, {
        
            onSetMod : {
        
                'js' : function() {
        
                    this.__base();
                    this._requestNumber = this._number = this._preventNumber = this._retryCount = 0;
        
                }
        
            },
        
            _get : function(request, onSuccess, onError, params) {
        
                this._number++;
                this._requestNumber++;
                this._retryCount = params.retryCount;
        
                this.__base.apply(this, arguments);
        
            },
        
            _do : function(request, onSuccess, onError, params) {
        
                var _this = this;
                if(_this._number > _this._preventNumber) { // условие на случай, если кто-то синхронно позовет preventCallbacks
                    var args = arguments,
                        settings = {
                            data : params.data?
                                $.extend({}, params.data, request) :
                                request,
                            success : _this._wrapCallback(function(respArgs, requestNumber, number) {
                                    _this._onSuccess(_this._buildCacheKey(request, params), request, respArgs[0], params);
                                    _this._allowCallback(requestNumber, number) &&
                                    onSuccess.apply(params.callbackCtx, respArgs);
                                }),
                            error : _this._wrapCallback(function(respArgs, requestNumber, number) {
                                    _this._allowCallback(requestNumber, number) &&
                                        (_this._retryCount-- > 0?
                                            setTimeout(
                                                function() {
                                                    _this._do.apply(_this, args);
                                                },
                                                params.retryInterval) :
                                            onError && onError.apply(params.callbackCtx, respArgs));
                                    })
                        };
        
                    $.each(['url', 'dataType', 'timeout', 'type'].concat(params.paramsToSettings || []), function(i, name) {
                        settings[name] = params[name];
                    });
        
                    $.ajax(settings);
                }
        
            },
        
            _wrapCallback : function(callback) {
        
                var requestNumber = this._requestNumber,
                    number = this._number;
        
                return function(data) {
                    data !== null && callback(arguments, requestNumber, number);
                };
        
            },
        
            _allowCallback : function(requestNumber, number) {
        
                return number > this._preventNumber && this._requestNumber == requestNumber;
        
            },
        
            _buildCacheKey : function(obj, params) {
        
                return typeof obj == 'string'?
                    obj :
                    this.__base(obj) + params.url;
        
            },
        
            abort : function() {
        
                this._preventNumber = ++this._number;
        
            },
        
            /**
             * @deprecated использовать abort
             */
            preventCallbacks : function() {
        
                this.abort();
        
            },
        
            getDefaultParams : function() {
        
                return $.extend(
                    this.__base(),
                    {
                        cache         : true,
                        type          : 'GET',
                        dataType      : 'jsonp',
                        timeout       : 20000,
                        retryCount    : 0,
                        retryInterval : 2000
                    });
        
            }
        
        });
        }
    /* lego/blocks/i-request/_type/i-request_type_ajax.js: end */ /**/
    
    /* lego/blocks/i-https/i-https.js: begin */ /**/
        if(_ycssjs('ROSMQp7TSyje64t5a9BnHliqqhg')){
        /** @requires BEM */
        
        (function() {
        
        var _isHTTPSChecked = false,
            _isHTTPSSupported = false,
            _callbackFns = [];
        
        BEM.decl('i-https', {}, {
        
            isHTTPSSupported : function() {
                return _isHTTPSSupported;
            },
        
            enableHTTPS : function() {
                _isHTTPSSupported = true;
        
                var fn;
                while(fn = _callbackFns.shift()) {
                    fn();
                }
            },
        
            getHTTPSHost : function() {
                var staticHost = Lego.params['lego-static-host'];
        
                if(staticHost) {
                    if(staticHost.indexOf('https:') == 0) {
                        return staticHost;
                    }
                    if(staticHost.indexOf('http:') == 0) {
                        return 'https' + staticHost.substr(4);
                    }
                    if(staticHost.indexOf('//') == 0) {
                        return 'https:' + staticHost;
                    }
                    else {
                        return 'https://' + location.host + staticHost;
                    }
                } else {
                    return 'https://' + location.host;
                }
            },
        
            checkForHTTPS : function(callback) {
                // если результат проверки уже известен, то сразу вызываем `callback()`
                if(_isHTTPSSupported)
                    return callback();
        
                _callbackFns.push(callback);
        
                // не выполнять повторную проверку
                if(_isHTTPSChecked) return;
                _isHTTPSChecked = true;
        
                BEM.create('i-request_type_ajax', {
                    url: this.getHTTPSHost() + '/blocks/i-https/check-https.js',
                    dataType: 'script'
                }).get({}, function(){}, false, this);
            }
        
        });
        
        })();
        
        }
    /* lego/blocks/i-https/i-https.js: end */ /**/
    
    /* lego/blocks/b-head-userinfo/b-head-userinfo.js: begin */ /**/
        if(_ycssjs('7DxrbrgmDDorkIb2zBnVGyuQhic')){
        /** @requires BEM */
        /** @requires BEM.DOM */
        
        (function(){
        
        var IHttps = BEM.blocks['i-https'];
        
        BEM.DOM.decl('b-head-userinfo', {
        
            onSetMod : {
        
                'js' : function() {
        
                    var self = this;
                    IHttps.checkForHTTPS(function() {
                        self._onHttps();
                    });
        
                }
        
            },
        
            _onHttps : function() {
        
                // Элемент внутри элемента?
                var exitLink = this.findBlockInside(this.elem('exit'), 'b-link'),
                    exitUrl = exitLink && (exitLink = exitLink.domElem, exitLink.attr('href'));
        
                if(exitUrl && IHttps.isHTTPSSupported()) {
                    exitLink.attr('href', exitUrl.replace(/^http:/, 'https:'));
                }
        
            }
        
        });
        
        }());
        }
    /* lego/blocks/b-head-userinfo/b-head-userinfo.js: end */ /**/
    
    /* lego/blocks/i-common/string/i-common__string.js: begin */ /**/
        if(_ycssjs('xqa5nEhLd6+9m5az9B9fQRUXw54')){
        (function(Lego){
        if(!Lego) Lego = window.Lego = {};
        
        var ellipsisChar = '…';
        
        /**
         * Обрезать входную строку `str` до `maxLength` символов.
         * Порт функции `lego:clever-substring()` из i-common.xsl.
         *
         * @param {String} str строка на вход
         * @param {Nubmer} maxLength максимальная длина в символах
         * @param {Number} maxLengthRelative погрешность при обрезе сверх макс. длины
         *
         * @return {String}
         */
        Lego.cleverSubstring = function(str, maxLength, maxLengthRelative) {
            return (str.length > maxLength + maxLengthRelative) ? str.substring(0, maxLength - 1) + ellipsisChar : str;
        }
        
        })(window.Lego);
        
        }
    /* lego/blocks/i-common/string/i-common__string.js: end */ /**/
    
    /* lego/blocks/i-user-services/i-user-services.js: begin */ /**/
        if(_ycssjs('ogL4/3aFLq7XeEZyWl3F6p4NW/8')){
        BEM.decl('i-user-services', {}, {
        
            /**
             * @param {Function} onComplete
             */
            get : function(onComplete) {
        
                this._data?
                    onComplete(this._data) :
                    this._get(onComplete);
        
            },
        
            /**
             * @return {String}
             */
            getApiUrl : function(){
                return Lego.params['pass-host'] + '/services?callback=?'
            },
        
            _callbacks : [],
        
            _get : function(onComplete) {
        
                this._callbacks.push(onComplete);
                var _this = this;
        
                this._callbacks.length == 1 && $.getJSON(
                    _this.getApiUrl(),
                    {
                        locale : Lego.params.locale,
                        login : 'yes',
                        'current-login' : Lego.params.login,
                        yu : Lego.getCookie('yandexuid')
                    },
                    function(data) {
                        _this._data = data;
                        $.each(_this._callbacks, function() {
                            this(data);
                        });
                        _this._callbacks.length = 0;
                    }
                )
        
            }
        
        
        });
        
        }
    /* lego/blocks/i-user-services/i-user-services.js: end */ /**/
    
    /* lego/blocks/b-head-user/b-head-user.js: begin */ /**/
        if(_ycssjs('dI+xhrGwHTu2f5TFj3m7awKPMKU')){
        (function($, Lego){
        
        var bHeadUser = Lego.block['b-head-user'] = function(params){
            var thisBlock = $(this);
        
            var maxLength = parseInt(params.maxlength, 10) || 1000,
                maxLengthRel = parseInt(params['maxlength-relative'], 10) || 3;
        
            if (Lego.params.login != '' || Lego.params.displayName) {
                BEM.blocks['i-user-services'].get(function(data) {
                    bHeadUser.buildHtml(data, thisBlock, maxLength, maxLengthRel);
                });
            }
        
        };
        
        bHeadUser.buildHtml = function(data, thisBlock, maxLength, maxLengthRel) {
            if (!data || !data.services) return;
            var social = data.displayName && data.displayName.social,
                login = Lego.cleverSubstring($('<div/>').text(bHeadUser.getUserLogin(data)).html(), maxLength, maxLengthRel),
                user = social?
                    '<b class="b-user b-user_social_yes">' +
                        '<span class="b-user__provider-ico" style="background:url(http://static.yandex.st/social/current/icons/16/' + social.provider + '.png)"></span>' + login +
                    '</b>' :
                    '<b class="b-user"><b class="b-user__first-letter">' + login.substring(0, 1) + '</b>' + login.substring(1) + '</b>',
        
                link = '<a class="b-pseudo-link b-pseudo-link_is-bem_yes i-bem" onclick="return {\'b-pseudo-link\':{name:\'b-pseudo-link\'}}"' +
                    (!social && thisBlock.hasClass('b-head-user_type_com')?
                        '' :
                        ' href="' + (social? Lego.params['social-host'] : 'http://i.yandex.ru') + '"'
                    ) + '>' + user + '</a>',
                html =  '<div class="b-dropdowna b-dropdowna_is-bem_yes i-bem" onclick="return {\'b-dropdowna\':{name:\'b-dropdowna\'}}">' +
                            '<span class="b-dropdowna__switcher">' +
                                link +
                            '</span>' +
                            '<div class="i-popup i-popup_autoclosable_yes i-popup_is-bem_yes i-bem" ' +
                            'onclick="return {\'i-popup\':{name:\'i-popup\'}}">' +
                                '<div class="i-popup__content">' +
                                    '<div class="i-popup__under b-popupa__under"></div>' +
                                    '<div class="b-popupa b-popupa_theme_ffffff b-popupa_direction_down b-popupa_is-bem_yes ' +
                                        'i-bem b-dropdowna__popup" ' +
                                        'onclick="return {\'b-popupa\':{name:\'b-popupa\'}}">' +
                                            '<i class="b-popupa__shadow"></i>' +
                                            '<i class="b-popupa__tail">' +
                                                '<i class="b-popupa__tail-i"></i>' +
                                            '</i>' +
                                            '<table cellpadding="0" cellspasing="0" class="b-popupa__wrap">' +
                                                '<tr>' +
                                                    '<td class="b-popupa__wrap-cell">' +
                                                        '<div class="b-popupa__content">' +
                                                            '<div class="b-menu b-menu_layout_vert b-dropdowna__menu">' +
                                                                '<ul class="b-menu__layout-vert">';
        
            social && thisBlock.addClass('b-head-user_social_yes');
        
            $.each(data.services, function(i){
            html += '<li class="b-menu__layout-vert-cell' +
                        (i == 0? ' b-menu__layout-vert-cell_position_first' : '') +
                        '">' +
                        '<div class="b-menu__item">';
                if (Lego.params.id == this.id && Lego.params.index) {
                    html += '<strong>' + this.title + '</strong>';
                } else {
                    html += '<a ' +
                        'class="b-link b-head-user__link" ' +
                        'href="' + this.url + '" ' +
                        'onmousedown="Lego.ch(\'' + Lego.params.id + '.login.myservices.' + this.id + '\',this)">' +
                            this.title +
                        '</a>';
                }
                html += '</div></li>';
            });
        
            if (data.services.length)
                html += '<li class="b-menu__layout-vert-separator"><i class="b-menu__separator"></i></li>';
        
            html += bHeadUser.getUserItems(data, thisBlock);
        
            html += '</ul></div></div></td></tr></table></div></div></div></div>';
        
            thisBlock.find('.b-user').replaceWith(html);
            BEM.DOM.init(thisBlock);
        };
        
        bHeadUser.getApiUrl = function(){ return Lego.params['pass-host'] + '/services?callback=?' };
        
        bHeadUser.getUserItems = function(data){
        
            var services = data.displayName && data.displayName.social? [
                    {
                        name : Lego.message('b-head-userinfo.user:profile', 'Мои профили'),
                        url : Lego.params['social-host']
                    }
                ] : [
                    {
                        name : Lego.message('b-head-userinfo.user:passport', 'Паспорт'),
                        url : Lego.params['passport-host']
                    },
                    {
                        name : Lego.message('b-head-userinfo.user:change-password', 'Сменить пароль'),
                        url : Lego.params['passport-host'] + '/passport?mode=changepass' +
                            '&retpath=' + encodeURIComponent(Lego.params['retpath']) + '/'
                    }
                ];
        
            var html = '';
        
            $.each(services, function(i, service) {
                html += '<li class="b-menu__layout-vert-cell' +
                            (i == services.length-1? ' b-menu__layout-vert-cell_position_last' : '') +
                            '">' +
                            '<div class="b-menu__item">' +
                        '<a class="b-link b-head-user__link" href="' + service.url + '">' +
                            service.name +
                        '</a>' +
                            '</div>' +
                    '</li>';
            });
            return html;
        };
        
        bHeadUser.getUserLogin = function(data){
            return Lego.params.displayName && Lego.params.displayName.social && Lego.params.displayName.name ||
                data.displayName && data.displayName.name ||
                Lego.params.login ||
                data.login;
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-head-user/b-head-user.js: end */ /**/
    
    /* lego/blocks/b-domik/b-domik.js: begin */ /**/
        if(_ycssjs('CGeLwVff1myPat8JF+OiIkiVUhQ')){
        (function($, Lego) {
        
        var IHttps = BEM.blocks['i-https'];
        
        Lego.block['b-domik'] = function(params) {
        
            var thisLoginForm = this,
                lockElem = thisLoginForm.find('.b-domik__lock'),
                socialElem = thisLoginForm.find('.b-domik__social'),
                iconSize = socialElem[0] ? socialElem[0].onclick()['size'] : 0,
                bDomik = arguments.callee,
                timestampInput = $('<input type="hidden" name="timestamp"/>'),
                typeMod = this.attr('class').match(/\bb-domik_type_(\w+)\b/)[1];
        
            if (socialElem.length && Lego.params['social-host']) {
                if (Lego.params['social-providers']) {
                    showSocial(Lego.params['social-providers']);
                } else {
                    $.getJSON(Lego.params['social-host'] + '/providers2.jsonp?callback=?', function(data) {
                        showSocial(data.providers, data.icon_sprites[iconSize]);
                    });
                }
        
                var broker = new Lego.block['i-social'];
                $('.b-domik__social-link').live('click', function(e) {
                    showLoading();
                    $('.b-domik__social-popup').each(function() {
                        $(this).bem('b-popupa').hide();
                    });
                    broker.start(
                        function() {
                            if (!Lego.params.retpath || top.location.href == Lego.params.retpath)
                                top.location.reload();
                            else
                                top.location.href = Lego.params.retpath;
                        },
                        function() {
                            socialElem
                                .removeClass('b-domik__social_loading_yes')
                                .css('height', '');
                        },
                        {provider: this.onclick()['b-domik__social-link'].provider}
                    );
                    e.preventDefault();
                });
            }
        
            /**
             * @param {Object} [data]
             */
            function showSocial(data, sprite) {
                if (!data.length) {
                    socialElem.remove();
                    return;
                }
        
                socialElem.html(getSocialBlock(data, sprite));
                var bDropdowna = socialElem.find('.b-dropdowna');
                if(!bDropdowna.length) return;
        
                BEM.DOM.init(bDropdowna);
        
                var bPopupa = bDropdowna.bem('b-dropdowna').getPopup();
        
                function onScroll() {
                    bPopupa.pos();
                }
        
                bPopupa
                    .on('show', function() {
                        $(window).scroll(onScroll);
                    })
                    .on('hide', function() {
                        $(window).unbind('scroll', onScroll);
                    });
            }
        
        
            /**
             * @nosideeffects
             * @returns {String}
             */
            function getSocialBlock(data, sprite) {
                var bemhtml = [
                    {
                        block: 'b-domik',
                        elem: 'social-title',
                        content: Lego.message('b-domik:enter-with', 'Войти при помощи')
                    }
                ];
        
                data = $.grep(data, function(provider) {
                    return provider.enabled;
                });
        
                var visibleIcons = $.grep(data, function(provider) {
                    return provider.primary;
                });
                visibleIcons = $.map(visibleIcons, function(provider) {
                    return {
                        block: 'b-domik',
                        tag: 'a',
                        elem: 'social-link',
                        content: {
                            tag: 'i', elem: 'social-icon', attrs: {
                                'style' : 'background-image:url("' + sprite + '");background-position: 0px -' + (provider.id - 1) * 32 + 'px;'
                            }
                        },
                        js: {provider: provider.code},
                        attrs: {
                            tabIndex: 103
                        }
                    }
                });
        
                [].push.apply(bemhtml, visibleIcons);
        
                function buildRows(data) {
        
                    var allIcons = $.map(data, function(provider) {
                        return {
                            block: 'b-domik',
                            tag: 'a',
                            elem: 'social-link',
                            mods: {},
                            attrs: {
                                tabIndex: 103
                            },
                            js: {provider: provider.code},
                            content: [
                                {tag: 'i', elem: 'social-icon', attrs: {
                                    'style' : 'background-image:url("' + sprite +'");background-position: 0px -' + (provider.id - 1) * 32 + 'px;'
                                }},
                                provider.display_name
                            ]
                        }
                    });
        
                    allIcons.length % 2 && (allIcons[allIcons.length] = '');
                    var rows = [],
                        row;
        
                    for (var i = 0; i < allIcons.length; i++) {
                        i % 2 || rows.push(row = {tag: 'tr', content: []});
                        row.content.push({tag: 'td', elem: 'provider', content: allIcons[i]});
                    }
        
                    return rows;
                }
        
                // varankinv@: LEGO-5434 (не отображать '...' если все провайдеры primary)
                if(visibleIcons.length < data.length) {
                    bemhtml.push({
                        tag: 'div',
                        block: 'b-dropdowna',
                        js: true,
                        content: [
                            {
                                elem: 'switcher',
                                tag: 'span',
                                content: {
                                    tag: 'a',
                                    block: 'b-pseudo-link',
                                    mods: {'is-bem': 'yes'},
                                    js: true,
                                    attrs: {
                                        href: Lego.message('b-domik:passport-link', 'http://passport.yandex.ru/'),
                                        tabIndex: 103
                                    }
                                }
                            },
                            {
                                block: 'b-popupa',
                                js: true,
                                tag: 'div',
                                mix: [
                                    {block: 'b-dropdowna', elem: 'popup'},
                                    {block: 'b-domik', elem: 'social-popup', mods: {'type': typeMod}}
                                ],
                                content: [
                                    { elem: 'tail', tag: 'i' },
                                    {
                                        elem: 'content',
                                        content: [
                                            {elem: 'providers', tag: 'table', content: buildRows(data)}
                                        ]
                                    }
                                ]
                            }
                        ]
                    });
                }
        
                bemhtml.push({
                    block: 'b-spin',
                    mods: {
                        theme: typeMod == 'bigform' ? 'blue-50' : 'blue-16'
                    }
                });
        
                return BEM.HTML.build(bemhtml);
            }
        
        
            function showLoading() {
                socialElem
                    .css('height', socialElem.height())
                    .addClass('b-domik__social_loading_yes');
            }
        
        
            bDomik.isHTTPSSupported = false;
        
            thisLoginForm.append(timestampInput)
                .submit(function() {
                    timestampInput.val(+new Date);
                    var action = thisLoginForm.attr('action');
                    if (action && Lego.block['b-domik'].isHTTPSSupported)
                        thisLoginForm.attr('action', action.replace(/^http:/, 'https:'));
                });
        
            var loginInput = thisLoginForm.find('input[name=login]'),
                passwordInput = thisLoginForm.find('input[name=passwd]'),
                submit = thisLoginForm.find('input[type=submit]');
        
            loginInput.change(function() {
                var val = loginInput.val();
                val.indexOf('@') == -1 && /[а-яçğıöşü]/i.test(val)?
                    showError(params && params.err_msg || Lego.message('b-domik:wrong-keyboard-layout', 'смените раскладку')) :
                    hideError();
            });
            loginInput.change();
        
            passwordInput.change(function() {
                var val = passwordInput.val();
                val.length && /[^0-9a-z!@#\$%\^&\*\(\)_\-\+:;\,\.]/i.test(val)?
                    showError(Lego.message('b-domik:wrong-keyboard-layout', 'смените раскладку')) :
                    hideError();
            });
            passwordInput.change();
        
            var errorElem;
            function showError(error) {
                !errorElem &&
                    (errorElem = $('<div class="b-domik__error"/>').insertAfter(thisLoginForm.find('.b-domik__password')));
                errorElem.text(error).show();
            }
        
            function hideError() {
                errorElem && errorElem.hide();
            }
        
            bDomik.enableHTTPS = function() {
                bDomik.isHTTPSSupported = true;
                lockElem.addClass('b-domik__lock_visibility_visible');
            };
        
            bDomik.checkForHTTPS = IHttps.checkForHTTPS;
        
            IHttps.checkForHTTPS(function() {
                bDomik.enableHTTPS();
            });
        
        
            var getLockBaloonContent = bDomik.getLockBaloonContent || function() {
                    // HACK (varankinv@): заменяем "((link))" на <a href="">link</a>
                    var _linkRe = /\(\(([^\)]+)\)\)/g;
                    function makeLinkContent(t, url) {
                        return t.replace(_linkRe, '<a class="b-link" href="' + url +'">$1</a>');
                    }
        
                    var text = Lego.message('b-domik.lock-balloon:content', 'Логин и пароль будут передаваться в&#160;((безопасном режиме))');
                    return makeLinkContent(text, Lego.message('b-domik.lock-balloon:linkHref', 'http://help.yandex.ru/mail/?id=1113446'));
                },
                balloon = $(BEM.HTML.build({
                    block: 'b-popupa',
                    mods: {
                        direction: 'right',
                        theme: 'feffd6'
                    },
                    mix: [{block: 'b-domik', elem: 'lock-balloon'}],
                    content: [
                        { elem: 'tail', tag: 'i' },
                        {
                            elem: 'content',
                            content : getLockBaloonContent()
                        }
                    ]
                }));
        
            thisLoginForm.append(balloon);
        
            var bemBalloon = balloon.bem('b-popupa'),
                balloonDelay = 300,
                timerId;
        
            function hideBalloon() {
                timerId = setTimeout(function(){
                    bemBalloon.hide();
                }, balloonDelay);
            }
        
            var eventBound;
        
            function showBalloon() {
                timerId && clearTimeout(timerId);
                timerId = null;
                bemBalloon.show(lockElem);
        
                if(!eventBound) {
                    eventBound = true;
                    balloon.hover(showBalloon, hideBalloon);
                }
            }
        
            lockElem.hover(showBalloon, hideBalloon);
        
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-domik/b-domik.js: end */ /**/
    
    /* lego/blocks/i-social/i-social.js: begin */ /**/
        if(_ycssjs('YRO0wy2CbdMg/KtNKmohREOUMp4')){
        (function($) {
        window.Lego || (window.Lego = {block: {}});
        
        Lego.block['i-social'] = function(params) {
        
            function Broker(params) {
                var that = this,
                    handlers = {};
        
                this.url = params.startUrl + '?';
                delete params.startUrl;
                this.popupName = params.popupName;
                this.yaWindow = null;
                this.wTimer = null;
                this.paramsDefault = params;
        
                function isClosed() {
                    var closed;
                    if (!that.yaWindow) return true;
                    try {
                        closed = that.yaWindow.closed;
                    } catch (e) {
                        closed = true;
                    }
                    return closed;
                }
        
                function windowWatcher() {
                    if (isClosed()) {
                        that.wTimer = clearInterval(that.wTimer);
                        that.onFailure({status: 'error'});
                    }
                }
        
                function openPopup(paramsOverride) {
                    var popupName = that.popupName,
                        width = 500,
                        height = 280,
                        left = Math.round (((window.opera ? window.innerWidth : screen.availWidth) - width) / 2),
                        top = Math.round (((window.opera ? window.innerHeight : screen.availHeight) - height) / 2),
                        popupParams = 'scrollbars=yes, resizable=1, menubar=0, toolbar=0, status=0, location=0, directories=0' + ', left=' + left + ', top=' + top + ', width=' + width + ', height=' + height;
        
                    var myP = {};
        
                    for (var i in that.paramsDefault) {
                        myP[i] = that.paramsDefault[i];
                    }
        
                    for (var i in paramsOverride) {
                        myP[i] = paramsOverride[i];
                    }
        
                    var cbParams = ['ddom=' + (myP.ddom || (location.hostname == document.domain ? '' : document.domain))];
                    myP.retpath += (myP.retpath.match('#') ? '&' : '#') + cbParams.join('&');
                    var url = that.url;
        
                    var p = [];
                    for (var j in myP) {
                       p.push(encodeURIComponent(j) + '=' + encodeURIComponent(myP[j]));
                    }
                    url += p.join('&');
        
                    that.yaWindow = window.open(url, popupName, popupParams);
                    that.yaWindow.focus();
        
                    if (that.yaWindow) {
                        that.wTimer = setInterval(windowWatcher, 500);
                    }
                }
        
                function cleanup() {
                    this.handlers = {onSuccess: null, onFailure: null};
                    that.wTimer = clearInterval(that.wTimer);
                    isClosed() || that.yaWindow.close();
                    that.yaWindow = false;
                }
        
                this.start = function(onSuccess, onFailure, paramsOverride) {
                    cleanup();
                    that.handlers = {onSuccess: onSuccess, onFailure: onFailure};
                    openPopup(paramsOverride);
                };
        
                this.onSuccess = function(data) {
                    cleanup();
                    var f = that.handlers.onSuccess;
                    f && f();
                };
        
                this.onFailure = function(data) {
                    cleanup();
                    var f = that.handlers.onFailure;
                    f && f();
                };
            }
        
            arguments.callee.Broker = Broker;
        
            var defaultParams = arguments.callee.defaultParams = {
                startUrl: Lego.params['social-startUrl'] || Lego.params['social-host'] + '/broker/start',
                retpath: Lego.params['social-retpath'] || location.protocol + '//' + location.host + Lego.params['lego-path'] + '/blocks/i-social/closer/i-social__closer.html',
                consumer: Lego.params.id || 'morda',
                popupName: 'social_' + (Lego.params.id || 'morda'),
                application: '',
                action_if_anonymous: 'authorize',
                result_location: 'fragment'
            };
        
            var broker = arguments.callee.broker = new Broker($.extend(defaultParams, params));
            return broker;
        
        };
        })(jQuery);
        
        }
    /* lego/blocks/i-social/i-social.js: end */ /**/
    
    /* lego/blocks/b-hint-input/b-hint-input.js: begin */ /**/
        if(_ycssjs('8JPgC/ct+WFjT8/mzchjez5jB30')){
        (function($, Lego){
        
        Lego.block['b-hint-input'] = function(){
            var thisHintInput = $(this),
                input = $('#' + thisHintInput.attr('for')),
                hide = function(){ thisHintInput.hide() },
                show = function(){ thisHintInput.show() },
                check = function(){ focused || input.val()? hide() : show() },
                focused = false;
        
            input
                .bind('focus blur', function(e){ focused = e.type == 'focus'; check() })
                .bind('change mouseover', check);
        
            thisHintInput.click(function(){ input.focus() });
        
            input.change();
        
            // сами следим за изменением и генерируем событие,
            // нужно для всяких автоподстановщиков форм, которые не генерят события сами
            var oldValue = input.val();
            (function(){
                if (input.val() != oldValue) {
                    $(input).trigger('change');
                    oldValue = input.val();
                }
                setTimeout(arguments.callee, 200);
            })();
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-hint-input/b-hint-input.js: end */ /**/
    
    /* lego/blocks/b-domik/_type/b-domik_type_popup.js: begin */ /**/
        if(_ycssjs('wQcGdMyuTeioKN8mq01Vg5kzyYU')){
        (function($, Lego) {
        Lego.block['b-domik_type_popup'] = function(params) {
        
            var thisHolder = $(this), popup;
        
            // навешиваемся на ссылку "войти"
            $('.b-head-userinfo__entry .b-pseudo-link').click(function(e) {
                e.preventDefault();
                setTimeout(function() {
                    show();
                }, 0);
            });
        
            function show(retpath) {
                if(!popup) init();
        
                if (retpath)
                    Lego.params.retpath = retpath;
        
                var urlParams = '&from=' + Lego.params['passport-msg'] +
                    '&retpath=' + encodeURIComponent(Lego.params.retpath);
                thisHolder.attr('action', Lego.params['passport-host'] + '/passport?mode=auth' + urlParams);
                popup.find('.b-domik__register .b-domik__link')
                    .attr('href', Lego.params['passport-host'] + '/passport?mode=' +
                        (params.regMode || 'register') + urlParams);
                $(document)
                     // скрываем по esc
                    .bind('keyup.b-domik', function(e) { if(e.keyCode == 27) { hide(); }})
                    // скрываем по клику вне попапа
                    .bind('click.b-domik', function(e) {
                        var target = $(e.target),
                            parents = target.parents().andSelf();
        
                        if(target.is('input[type=button]') || parents.index(popup) == -1 && !parents.is('.b-popupa')) {
                            hide();
                        }
                    });
                !popup.hasClass('b-domik_position_popup-50-50') && window.scrollTo(0, 0);
                popup
                    .show()
                    .find('input[name=login]').focus();
                $(document).trigger('show.b-domik_type_popup');
            }
        
            function hide() {
                $(document).unbind('.b-domik');
                popup.hide();
            }
        
            function init() { // вспомогательная ф-ия, создающая элемент попапа при первом открытии попапа
                popup = $(
                    '<form class="' + thisHolder.attr('class').replace('g-hidden', '') +  '" method="POST">' +
                        '<i class="b-domik__roof"></i>' +
                        '<table class="b-domik__shadow">' +
                        '<tr>' +
                            '<td class="b-domik__shadow__lt">&nbsp;</td>' +
                            '<td class="b-domik__shadow__t"></td>' +
                            '<td class="b-domik__shadow__rt">&nbsp;</td>' +
                        '</tr>' +
                        '<tr>' +
                            '<td class="b-domik__shadow__l">&nbsp;</td>' +
                            '<td class="b-domik__shadow__m">' +
                                '<div class="b-domik__form">' +
                                    '<div class="b-domik__title">' +
                                        (params.title || Lego.message('b-domik:title', 'Вход')) +
                                    '</div>' +
                                    '<div class="b-domik__username">' +
                                        '<label for="b-domik_popup-username" class="b-hint-input g-js" onclick="return {name:\'b-hint-input\'}">' +
                                            Lego.message('b-domik:login', 'логин') +
                                        '</label>' +
                                        '<div class="b-input"><input class="b-input__text" id="b-domik_popup-username" name="login" value="' + thisHolder.find('input[name=login]').val() + '" tabindex="11"/></div>' +
                                    '</div>' +
                                    '<div class="b-domik__password">' +
                                        '<label for="b-domik_popup-password" class="b-hint-input g-js" onclick="return {name:\'b-hint-input\'}">' +
                                            Lego.message('b-domik:password', 'пароль') +
                                        '</label>' +
                                        '<div class="b-domik__lock"></div>' +
                                        '<div class="b-input"><input class="b-input__text" id="b-domik_popup-password" name="passwd" value="' + thisHolder.find('input[name=passwd]').val() + '" type="password" tabindex="11"/></div>' +
                                    '</div>' +
                                    '<div class="b-domik__permanent">' +
                                        '<input class="b-domik__check" id="b-domik_popup-permanent" name="twoweeks" type="checkbox" value="yes" tabindex="11"/>' +
                                        '<label for="b-domik_popup-permanent" class="b-domik__permanent-label">' +
                                            Lego.message('b-domik:permanent', 'запомнить меня') +
                                        '</label> ' +
                                        '<span class="b-domik__help">(<a class="b-domik__link" href="' + Lego.message('b-domik:help-link', 'http://help.yandex.ru/passport/?id=922493') + '" tabindex="12">' +
                                            Lego.message('b-domik:help', 'что&nbsp;это') +
                                        '</a>)</span>' +
                                    '</div>' +
                                    '<div class="b-domik__button">' +
                                        '<input class="b-domik__submit" type="submit" value="' +
                                            Lego.message('b-domik:logon', 'Войти') +
                                        '" tabindex="11"/>' +
                                        '<input class="b-domik__submit" type="button" value="' +
                                            Lego.message('b-domik:cancel', 'Отмена') +
                                        '" tabindex="11"/>' +
                                    '</div>' +
                                    '<div class="b-domik__social" onclick="return { size: 16 }"></div>' +
                                    '<div class="b-domik__register">' +
                                        '<a class="b-domik__link" href="" tabindex="11">' +
                                            (params.register || Lego.message('b-domik:register', 'Зарегистрироваться')) +
                                        '</a>' +
                                    '</div>' +
                                    '<div class="b-domik__remember">' +
                                        '<a class="b-domik__remind" href="' + Lego.params['passport-host'] + '/passport?mode=restore" tabindex="11">' +
                                            Lego.message('b-domik:remember', 'Напомнить пароль') +
                                        '</a>' +
                                    '</div>' +
                                '</div>' +
                            '</td>' +
                            '<td class="b-domik__shadow__r">&nbsp;</td>' +
                        '</tr>' +
                        '<tr>' +
                            '<td class="b-domik__shadow__lb">&nbsp;</td>' +
                            '<td class="b-domik__shadow__b"></td>' +
                            '<td class="b-domik__shadow__rb">&nbsp;</td>' +
                        '</tr>' +
                        '</table>' +
                        '<iframe class="b-popup-under" frameborder="0"></iframe>' +
                    '</form>').submit(function(e) {
                        e.preventDefault();
                        thisHolder
                            .find('input[name=login]').val(popup.find('input[name=login]').change().val()).end()
                            .find('input[name=passwd]').val(popup.find('input[name=passwd]').change().val()).end()
                            .find('input[name=twoweeks]').attr('checked', popup.find('input[name=twoweeks]').attr('checked') || false).end()
                            .append('<input type="hidden" name="timestamp" value="' + +new Date + '"/>')
                            .attr('action', Lego.block['b-domik'].isHTTPSSupported?
                                thisHolder.attr('action').replace(/^http:/, 'https:') :
                                thisHolder.attr('action'))
                            .submit();
                    });
                    if(Lego.block['b-domik']) {
                        Lego.block['b-domik'].call(popup);
                    }
                    $('body').append(popup);
                    Lego.blockInit(popup);
            }
        
            arguments.callee.login = function() { // ф-ия для открытия попапа извне Lego.block['b-domik_type_popup'].login()
                var args = arguments;
                setTimeout(function() {
                    show.apply(this, args);
                }, 0);
            };
        
        };
        
        })(jQuery, window.Lego);
        
        }
    /* lego/blocks/b-domik/_type/b-domik_type_popup.js: end */ /**/
    
    /* lego/blocks/i-flashcookie/_type/i-flashcookie_type_iframe.js: begin */ /**/
        if(_ycssjs('lsOtnkirkagM+26Pk3IcHVG4TV0')){
        (function() {
        
        var oldBlock = Lego.block['i-flashcookie'],
            newBlock = function(params) {
        
                var thisBlock = this,
                    load = arguments.callee.load = function() {
                        location.protocol.indexOf('https') < 0 &&
                            thisBlock.replaceWith(
                                $('<iframe src="http://kiks.yandex' +
                                    location.host.match(/.*([.].*?):?\d{0,}$/)[1] +
                                    '/su/" class="' +
                                    thisBlock.attr('class') +
                                '"/>'));
                    };
        
                thisBlock.hasClass('i-flashcookie_autoload_no') || load();
        
            };
        
        Lego.block['i-flashcookie'] = function (params) {
            var thisBlock = this.hasClass('i-flashcookie_type_iframe') ? newBlock : oldBlock;
            thisBlock && thisBlock.call(this, params)
        };
        
        })();
        
        }
    /* lego/blocks/i-flashcookie/_type/i-flashcookie_type_iframe.js: end */ /**/
    
    /* lego/blocks/i-loader/i-loader.js: begin */ /**/
        if(_ycssjs('Pyd5BqOXO9f5RlPeTxv2Jple6lA')){
        (function() {
        
        var head,
            bundles = {},
            loader =
        
        BEM.decl('i-loader', {}, {
        
            /**
             * Загружает бандл
             * @param {String} bundleId идентификатор бандла
             * @param {String} bundlePath путь бандла
             * @param {Function} onSuccess callback-функция на успешную загрузку
             * @param {Function} [onError] callback-функция на неуспешную загрузку
             */
            load : function(bundleId, bundlePath, onSuccess, onError) {
        
                if(typeof bundlePath != 'string') {
                    onError = onSuccess;
                    onSuccess = bundlePath;
                    bundlePath = bundleId;
                }
        
                var bundle = bundles[bundleId];
                if(bundle) {
                    if(bundle.successFns[0]) { // значит идет загрузка бандла
                        bundle.successFns.push(onSuccess);
                        onError && bundle.errorFns.push(onError);
                    } else if(bundle.error) { // была ошибка при загрузке
                        onError && onError();
                    } else { // бандл уже был загружен
                        this.afterCurrentEvent(onSuccess);
                    }
                    return;
                }
        
                var doc = document,
                    script = doc.createElement('script'),
                    errorFn = function() { loader._error(bundleId) };
        
                script.type = 'text/javascript';
                script.charset = 'utf-8';
                script.src = !$.browser.msie || doc.documentMode > 8? bundlePath : bundlePath.replace(/(\.[^.]+)$/, '.ie$1');
                script.onerror = errorFn; // для тех браузеров, кто поддерживает
                setTimeout(function() {
                    (head || (head = $('head')[0])).insertBefore(script, head.firstChild);
                }, 0);
        
                bundles[bundleId] = {
                    successFns : [onSuccess],
                    errorFns : onError? [onError] : [],
                    timer : setTimeout(errorFn, 20000)
                };
        
            },
        
            loaded : function(bundle) {
        
                var bundleDesc = bundles[bundle.id];
        
                clearTimeout(bundleDesc.timer);
        
                bundle.js && bundle.js();
                if(bundle.css) {
                    var style = document.createElement('style');
                    style.type = 'text/css';
                    $('head')[0].appendChild(style); // для IE важно сначала вставить стиль, а потом заполнить контент
                    style.styleSheet?
                        style.styleSheet.cssText = bundle.css :
                        style.appendChild(document.createTextNode(bundle.css));
                }
        
                var fns = bundleDesc.successFns, fn;
                while(fn = fns.shift()) fn();
        
            },
        
            _error : function(bundleId) {
        
                var bundleDesc = bundles[bundleId],
                    fns = bundleDesc.errorFns, fn;
        
                bundleDesc.error = true;
                while(fn = fns.shift()) fn();
        
            }
        
        });
        
        })();
        }
    /* lego/blocks/i-loader/i-loader.js: end */ /**/
    
    /* lego/blocks/b-smart-help/_loading/b-smart-help_loading_no.js: begin */ /**/
        if(_ycssjs('Q69nD6ygY+0JbFCz8nxiXaHSlLE')){
        BEM.DOM.decl('b-smart-help', {
        
            onSetMod : {
        
                'loading' : {
        
                    'progress' : function() {
                        var _this = this.setMod(this.elem('action', 'type', 'open'), 'loading', 'yes');
                        BEM.blocks['i-loader'].load(
                            'b-smart-help',
                            Lego.params['lego-static-host'] +
                                '/blocks/b-smart-help/b-smart-help.bembundle.js',
                            function() {
                                _this._onBundleLoad();
                            },
                            function() {
                                _this._onError();
                            });
        
                    }
        
                }
        
            },
        
            _onActionClick : function(domElem) {
        
                this.setMod('loading', 'progress');
        
            },
        
            _onError : function() {
        
                this
                    .delMod(this.elem('action', 'type', 'open'), 'loading')
                    .elem('placeholder').show();
        
            },
        
            _onBundleLoad : function() {
        
                this.setMod('loading', 'completed');
        
            },
        
            getDefaultParams : function() {
        
                return { prjId : 1059394, fromPrj : 'default' };
        
            }
        
        }, {
            live : function() {
        
                this.liveBindTo('action', 'leftclick', function(e) {
                    this._onActionClick(e.data.domElem);
                });
        
            }
        });
        
        }
    /* lego/blocks/b-smart-help/_loading/b-smart-help_loading_no.js: end */ /**/
    
    /* blocks/b-smart-help/_loading/b-smart-help_loading_no.js: begin */ /**/
        if(_ycssjs('k41iYCQD8nXiSm2FIrJEKr5cvRU')){
        BEM.DOM.decl('b-smart-help', {
        
            onSetMod : {
                'loading' : {
        
                    'progress' : function() {
                        var _this = this.setMod(this.elem('action', 'type', 'open'), 'loading', 'yes');
                        BEM.blocks['i-loader'].load(
                            'b-smart-help', 
                            '/lego/blocks/b-smart-help/b-smart-help.bembundle.js',
                            function() {
                                _this._onBundleLoad();
                            },
                            function() {
                                _this._onError();
                            });
        
                    }
        
                }
        
            }
        });
        
        }
    /* blocks/b-smart-help/_loading/b-smart-help_loading_no.js: end */ /**/
    
    /* blocks/b-smart-help/_service/b-smart-help_service_yaca.js: begin */ /**/
        if(_ycssjs('lXWYL56h74mWKbhF0S5JT20RL6k')){
        BEM.DOM.decl({name:'b-smart-help', modName: 'service', modVal: 'yaca'}, {
        
            _onBundleLoad : function() {
                BEM.DOM.decl({name:'b-smart-help', modName: 'service', modVal: 'yaca'}, {
                    
                    onSetMod : {
                        'visibility' : {
                            'visible' : function() {
        
                                    this.__base.apply(this, arguments);
                                    this._emailInput = this.findBlockOn(this.elem('email'), 'b-form-input');
                                    this.setMod('send-state', 'wish');
                                
                                }
                        }
                    },
        
                    _buildMessage : function(){
        
                        return {
                            subject : this.findElem('subject').val(),
                            message : this._searchInput.val() +
                                        '\n\nСайт: ' + this.findBlockOn(this.elem('siteurl'), 'b-form-input').val() +
                                        '\n\n--\n' + this.findBlockOn(this.elem('fio'), 'b-form-input').val() +
                                        '\n\n' + document.location
                        }
        
                    },
        
                    _onError : function() {
        
                        this.elem('message', 'type', 'error').show();
                        this.elem('placeholder').show();
                        this.delMod(this.elem('action'), 'loading');
        
                    }
        
                });
                
                this.__base.apply(this, arguments);
            }
        
        });
        }
    /* blocks/b-smart-help/_service/b-smart-help_service_yaca.js: end */ /**/
    
    /* lego/blocks/b-keyboard-loader/b-keyboard-loader.js: begin */ /**/
        if(_ycssjs('GAu8p8Z95QmE5p5GRvJFUm3Puao')){
        /**
         * Загрузчик виртуальной клавиатуры
         *
         * Отправляет на window события:
         *   - keyboardOpened.lego: клавиатура открылась
         *   - keyboardClosed.lego: клавиатура закрылась
         *
         * Слушает на window события:
         *   - keyboardClose.lego: открыть клавиатуру
         *   - keyboardOpen.lego: закрыть клавиатуру
         *   - keyboardChangeLang.lego: изменить язык клавиатуры
         */
        
        /*!jeanny-ignore*/
        (function($, Lego) {
        
            /**
             * @param {Object} [params] Параметры.
             * @param {Boolean} [params.autoLoad=false] Сразу открывать клавиатуру.
             * @param {Boolean} [params.storeState=true] Сохранять в window.name факт открытия клавиатуры и последний выбранный язык.
             */
            Lego.block['b-keyboard-loader'] = function(params) {
                var $body = $(document.body),
                    $window = $(window),
                    targetElem = this,
                    lng;
        
                targetElem.click(function(e) {
                    e.preventDefault();
        
                    var $this = $(this),
                        defaultLang = (this.className.match(/b-keyboard-loader_lang_(\w+)/) || ['', ''])[1];
                        switch(defaultLang) {
                            case 'uk':
                                defaultLang = 'ua'
                                break
                            case 'kk':
                                defaultLang = 'kz'
                                break
                            case 'be':
                                defaultLang = 'by'
                                break
                        }
        
                    var isDropdowna = $this.hasClass('b-keyboard-loader_dropdowna_yes');
        
                    if (!$body.find('.b-keyboard')[0]) {
                        var blocksUrl = Lego.params['lego-static-host'] + (Lego.params['lego-static-host'] == '/' ? '' : '/') + 'blocks/',
                            jsFiles = (isDropdowna ? [
                                blocksUrl + 'b-keyboard/_keyboard.js'
                            ] : [
                                blocksUrl + 'b-keyboard-popup/_b-keyboard-popup.js',
                                blocksUrl + 'b-keyboard/_b-keyboard.js',
                                blocksUrl + 'b-dropdown/_b-dropdown.js'
                            ]),
                            cssPostfix = $.browser.msie && ((!document.documentMode) || (document.documentMode < 9)) ? '.ie' : '',
                            cssFiles = [
                                blocksUrl + 'b-keyboard/_keyboard' + cssPostfix +'.css'
                            ];
        
                        $this.append('<i class="b-keyboard-loader__progress"/>');
        
                        $.xLazyLoader({
                            name: 'b-keyboard',
                            js: jsFiles,
                            css: cssFiles,
                            success: function() {
                                // Создаем b-keyboard-popup
                                Lego.block['b-keyboard-popup']({lang: defaultLang, isDropdowna: isDropdowna});
                                // Этот блок b-keyboard - временный, он нужен только для того, чтобы можно было вызвать Lego.blockInit
        //                        if ()
                                $body.append('<div class="b-keyboard' + (isDropdowna ? ' b-keyboard-loader_dropdowna_yes' : '') + ' g-js" onclick="return {name: \'b-keyboard\', lang: \'' + defaultLang + '\'};"></div>');
                                Lego.blockInit($body, '.b-keyboard');
                                $this.find('.b-keyboard-loader__progress').remove();
                                $window.trigger('keyboardOpened.lego', { afterLoad : true });
                            }
                        });
                    } else {
                        keyboardClose();
                    }
                });
        
                /**
                 *
                 * @param {Event} [e]
                 */
                function keyboardClose(e) {
                    // если e != undefined, то вызов пришел из события keyboardClose, поэтому принудительно закрываем клавиатуру
                    var method = e ? 'addClass' : 'toggleClass',
                        $popup = $body.find('.b-keyboard-popup');
        
                    if ($popup.length) {
                        $body.find('.b-keyboard-popup__gap')[method]('g-hidden');
                        if ($body.find('.b-keyboard-popup')[method]('g-hidden').hasClass('g-hidden')) {
                            // оповещение о закрытии клавиатуры
                            $window.trigger('keyboardClosed');
                            $(document).trigger('popupsClose.lego');
                        } else {
                            // оповещение об открытии клавиатуры
                            $window.trigger('keyboardOpened.lego');
                        }
                        //сбрасываем статус видимости b-keyboard-popup
                        $popup.data('isHidden', false);
                    }
                }
        
                // Keyboard API
                $window
                    // событие для открытия клавиатуры
                    .bind('keyboardOpen.lego', function() {
                        targetElem.click();
                    })
                    // событие для закрытия клавиатуры
                    .bind('keyboardClose.lego', keyboardClose);
        
                params['for'] && $window.bind('keyboardOpened.lego', function(e, data) {
                    !(data && data.afterLoad && params.autoLoad) && $(params['for']).focus();
                });
        
                $window.bind('keyboardLangChanged.lego keyboardSetLang.lego', function(e, lang) {
                    var $img = targetElem.find('.b-keyboard-loader__flag');
        
                    if ($img[0]) {
                        if (lang === 'tt') {
                            lang = 'ru';
                        }
        
                        $img.attr('src', $img.attr('src').replace(/[a-z]+\.png$/, lang + '.png'));
                    }
                });
        
                params.storeState = params.storeState !== false;
        
                if (params.storeState) {
                    $window
                        .bind('keyboardOpened.lego', function() {
                            winNameSet('keyboard_state', 'open');
        
                            var lng = winNameGet('keyboard_lang');
                            if (lng) {
                                $(window).trigger('keyboardSetLang.lego', lng);
                            }
                        })
                        .bind('keyboardClosed.lego', function() {
                            winNameSet('keyboard_state', 'close');
                        })
                        .bind('keyboardLangChanged.lego', function(e, lang) {
                            winNameSet('keyboard_lang', lang);
                        });
                }
        
                // автооткрытие клавиатуры
                (params.autoLoad = params.autoLoad || (params.storeState && winNameGet('keyboard_state') == 'open')) &&
                    targetElem.click();
        
                var statsSubmitted;
        
                function sumbitStats() {
                    if (statsSubmitted)
                        return;
        
                    Lego.cp(0, 70873, Lego.params.id + '.' + (params.autoLoad ? 'auto' : 'manual'));
                    statsSubmitted = true;
                }
        
                $window.bind('keyboardOpened.lego', function(){
                    sumbitStats();
                });
        
                function winNameGet(name) {
                    return _winNameGetData()[name];
                }
        
                function _winNameGetData() {
                    var data = {};
        
                    $.each(window.name.split('&'), function(){
                        if (this.toString()) {
                            var vars = this.split('=');
                            data[vars[0]] = vars[1];
                        }
                    });
        
                    return data;
                }
        
                function winNameSet(name, value) {
                    var data = _winNameGetData(),
                        newdata = [];
        
                    data[name] = value;
        
                    $.each(data, function(name, value){
                        newdata.push(name + '=' + value);
                    });
        
                    window.name = newdata.join('&');
                }
            };
        
        })(jQuery, window.Lego);
        
        /* lego/blocks/b-keyboard-loader/jquery.xLazyLoader.js: begin */ /**/
            if(_ycssjs('Rb3sNk43MchJQm8Yq4R43nRkbaI')){
            /*
             * xLazyLoader 1.3 - Plugin for jQuery
             * 
             * Load js, css and images asynchron and get different callbacks
             *
             * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
             * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
             *
             * Depends:
             *   jquery.js
             *
             *  Copyright (c) 2008 Oleg Slobodskoi (ajaxsoft.de)
             */
            
            ;(function($){
            
                $.xLazyLoader =  function ( method, options ) {
                    if ( typeof method == 'object' ) {
                        options = method;
                        method = 'init';
                    };
                    new xLazyLoader()[method](options);
                };
                
                $.xLazyLoader.defaults = {
                    js: [], css: [], img: [],
                    name: null,
                    timeout: 20000,
                    //success callback for all files
                    success: function(){}, 
                    //error callback - by load errors / timeout
                    error: function(){},
                    //complete callbck - by success or errors
                    complete: function(){},
                    //success callback for each file
                    each: function(){} 
                };
            
                var head = document.getElementsByTagName("head")[0];
                
                function xLazyLoader ()
                {
            
                    var self = this,
                        s,
                        loaded = [],
                        errors = [],
                        tTimeout,
                        cssTimeout,
                        toLoad,
                        files = []
                    ;
                    
                    this.init = function ( options )
                    {
                    	if ( !options ) return;
                    	
                    	s = $.extend({}, $.xLazyLoader.defaults, options);
                    	toLoad = {js: s.js, css: s.css, img: s.img};
                    	
                        $.each(toLoad, function( type, f ){
                            if ( typeof f == 'string' )        
                                f = f.split(',');
                            files = files.concat(f);    
                        });
            
                        if ( !files.length ) {
                            dispatchCallbacks('error');
                            return;    
                        };
            
                        if (s.timeout) {
                            tTimeout = setTimeout(function(){
                                var handled = loaded.concat(errors);
                                /* search for unhandled files */
                                $.each(files, function(i, file){
                                    $.inArray(file, handled) == -1 && errors.push(file);        
                                });
                                dispatchCallbacks('error');            
                            }, s.timeout);
                        };
            
            
                        $.each(toLoad, function(type, urls){
                            if ( $.isArray(urls) )
                                $.each( urls, function(i, url){
                                    load(type, url);
                                });
                            else if (typeof urls == 'string')
                                load(type, urls);
                        });
                        
            
            
                    };
            
                    this.js = function ( src, callback, name )
                    {
                        var $script = $('script[src*="'+src+'"]');
                        if ( $script.length ) {
                            $script.attr('pending') ? $script.bind('scriptload',callback) : callback();
                            return;
                        };
            
                        var s = document.createElement('script');
                        s.setAttribute("type","text/javascript");
                        s.setAttribute("charset", 'utf-8');
                        s.setAttribute("src", src);
                        s.setAttribute('pending', 1);
                        // Mozilla only
                        s.onerror = addError;
                        
                        
                        $(s).bind('scriptload',function(){
                            $(this).removeAttr('pending');
                            callback();
                             //unbind load event
                             //timeout because of pending callbacks
                            setTimeout(function(){
                                $(s).unbind('scriptload');
                            },10);
                        });
                        
                        // jQuery doesn't handling onload event special for script tag,
            			var done = false;
            			s.onload = s.onreadystatechange = function() {
            				if ( !done && ( !this.readyState || /loaded|complete/.test(this.readyState) ) ) {
            					done = true;
            					// Handle memory leak in IE
            					s.onload = s.onreadystatechange = null;
                                $(s).trigger('scriptload'); 
            				};
            			};
                        head.appendChild(s);
                    
                    };
            
                    this.css = function ( href, callback, name )
                    {
            
                        if ( $('link[href*="'+href+'"]').length ) {
                            callback();
                            return;
                        }
            
                        // нельзя создавать link через $(), т.к. он загружается раньше чем вставляется в DOM
                        // из-за этого появляются глюки с загруженными, но непримененными стилями в IE
                        var link = document.createElement('link');
                        link.setAttribute('type', 'text/css');
                        link.setAttribute('rel', 'stylesheet');
                        link.setAttribute('href', href);
            
                        if ( $.browser.msie ) {
                            link.onreadystatechange = function () {
                                /loaded|complete/.test(link.readyState) && callback();
                            };
                        } else if ( $.browser.opera ) {
                            link.onload = callback;
                        } else {
                            /*
                             * Mozilla, Safari, Chrome 
                             * unfortunately it is inpossible to check if the stylesheet is really loaded or it is "HTTP/1.0 400 Bad Request"
                             * the only way to do this is to check if some special properties  were set, so there is no error callback for stylesheets -
                             * it fires alway success
                             * 
                             * There is also no access to sheet properties by crossdomain stylesheets, 
                             * so we fire callback immediately
                             */
            
                            /*var hostname = location.hostname.replace('www.',''),
                                hrefHostname = /http:/.test(href) ? /^(\w+:)?\/\/([^\/?#]+)/.exec( href )[2] : hostname;
                            hostname != hrefHostname && $.browser.mozilla ?
                                callback()
                                : */
                                //stylesheet is from the same domain or it is not firefox
                                (function(){
                                    if (link && link.sheet) {
                                        callback();
                                    } else {
                                        cssTimeout = setTimeout(arguments.callee, 20);
                                    }
                                })();
                        }
            
                        head.appendChild(link);
                    };
            
                    this.img = function ( src, callback )
                    {
                        var img = new Image();
                        img.onload = callback;
                        img.onerror = addError;
                        img.src = src;
                    };
                    
                    /* It works only for css */
                    this.disable = function ( name )
                    {    
                        $('#lazy-loaded-'+name, head).attr('disabled', 'disabled');
                    };
            
                    /* It works only for css */
                    this.enable = function ( name )
                    {    
                        $('#lazy-loaded-'+name, head).removeAttr('disabled');
                    };
                    
                    /*
                     * By removing js tag, script ist still living in browser memory,
                     * css will be really destroyed
                     */
                    this.destroy = function ( name )
                    {
                        $('#lazy-loaded-'+name, head).remove();    
                    };
                    
                    function load ( type, url ) {
                        self[type](url, function(status) {
                            status == 'error' ? errors.push(url) : loaded.push(url) && s.each(url);
                            checkProgress();
                        }, 'lazy-loaded-'+ (s.name ? s.name : new Date().getTime()) );
                    };
                    
                    function dispatchCallbacks ( status ) {
                        s.complete(status, loaded, errors);
                        s[status]( status=='error' ? errors : loaded);
                        clearTimeout(tTimeout);
                        clearTimeout(cssTimeout);
                    };
                    
                    function checkProgress () {
                        if (loaded.length == files.length) dispatchCallbacks('success')
                        else if (loaded.length+errors.length == files.length) dispatchCallbacks('error');
                    };
                    
                    function addError () {
                        errors.push(this.src);    
                        checkProgress();
                    };
            
                };
            
            
            
            })(jQuery);        
            
            }
        /* lego/blocks/b-keyboard-loader/jquery.xLazyLoader.js: end */ /**/
        
        /*!jeanny-ignore*/
        
        }
    /* lego/blocks/b-keyboard-loader/b-keyboard-loader.js: end */ /**/
    
    /* lego/blocks/b-menu/_is-bem/b-menu_is-bem_yes.js: begin */ /**/
        if(_ycssjs('VXaWCnYl0AlkOSqkQx5NLVuYBDI')){
        BEM.DOM.decl('b-menu', {
        
            onElemSetMod : {
        
                'trigger' : {
        
                    'state' : function(elem, modName, modVal) {
        
                        this
                            .toggleMod(
                                this.findElem(elem.closest(this.buildSelector('layout-vert-cell')), 'item-content').eq(0),
                                'visibility',
                                'visible',
                                modVal == 'opened')
                            .trigger('trigger', {
                                domElem : elem,
                                state : modVal
                            });
        
                    }
        
                },
        
                'item' : {
        
                    'state' : {
        
                        'current' : function(elem) {
        
                            var _this = this,
                                blockName = _this.__self.getName(),
                                prev = _this.elem('item', 'state', 'current').filter(function() {
                                        return $(this).closest(_this.buildSelector()).bem(blockName) === _this;
                                    });
        
                            // открываем все триггеры более верхнего уровня
                            _this.findElem(
                                elem
                                    .parents(_this.buildSelector('item-content'))
                                    .prev(_this.buildSelector('item')), 'trigger')
                                        .each(function() {
                                            _this.setMod($(this), 'state', 'opened');
                                        });
        
                            _this
                                .delMod(prev, 'state')
                                .trigger('current', {
                                    prev    : prev,
                                    current : elem
                                });
        
                        }
        
                    }
        
                }
        
            },
        
            onTriggerClick : function(e) {
        
                e.preventDefault();
                this.toggleMod(e.data.domElem, 'state', 'opened');
        
            },
        
            onItemSelectorClick : function(e) {
        
                var item = this._getItemByEvent(e);
                this.hasMod(item, 'state', 'disabled') || this.setMod(item, 'state', 'current');
        
            },
        
            _getItemByEvent : function(e) {
                return e.data.domElem.closest(this.buildSelector('item'));
            }
        
        }, {
        
            live : function() {
        
                this
                    .liveBindTo('trigger', 'leftclick', function(e) {
                        this.onTriggerClick(e);
                    })
                    .liveBindTo('item-selector', 'leftclick', function(e) {
                        this.onItemSelectorClick(e);
                    });
        
            }
        
        });
        }
    /* lego/blocks/b-menu/_is-bem/b-menu_is-bem_yes.js: end */ /**/
    
    /* lego/blocks/b-dropdown/b-dropdown.js: begin */ /**/
        if(_ycssjs('AxEK5w+sHSiBW8JvxDKke00PUSg')){
        (function($, Lego){
        
        Lego.block['b-dropdown'] = function(params){
            var thisDropdown = $(this),
                thisDropdownList,
                dropdownPopup,
                dropdownIframe,
                dropdownSpacer,
                hidden = false,
                inited = false,
                init = function() {
                    thisDropdownList = thisDropdown.find('.b-dropdown__list');
                    dropdownPopup = $('<div class="b-dropdown__popup"/>');
                    dropdownIframe = $('<iframe class="b-dropdown__iframe" frameborder="0" src="javascript:' + "'<body style=\\'background:none;overflow:hidden\\'>'" + '"/>');
                    dropdownSpacer = thisDropdownList.clone(true).addClass('b-dropdown__list_clone').hide();
                    thisDropdownList.before(dropdownPopup);
                    dropdownPopup.after(dropdownSpacer);
                    hide();
                    $(document)
                        // нажатие Esc и клик вне попапа скрывают его
                        .keydown(function(e){ if(e.keyCode == 27 && !(e.metaKey || e.ctrlKey || e.altKey || e.shiftKey)) hide() })
                        .click(function(e) { if(!$(e.target).is('.b-dropdown *')) hide() })
                        .bind('popupsClose.lego', hide);
                    inited = true;
                },
                hide = (function(){
                    if (hidden) return;
                    dropdownPopup
                        .css('visibility', 'hidden')
                        .before(thisDropdownList)
                        .hide();
                    dropdownSpacer.hide();
                    hidden = true;
                });
        
            thisDropdown.find('.b-dropdown__or').click(function(e){
                e.preventDefault();
                if(!inited) init();
                if (thisDropdown.hasClass("b-dropdown_state_disabled")) {
                    thisDropdown.trigger('popupDisabled.lego');
                    return;
                }
                if (hidden) {
                    $(document).trigger('popupsClose.lego', { source : thisDropdown[0] });
                    var oe = $.Event('popupOpen.lego');
                    thisDropdown.trigger(oe);
                    if (!oe.isDefaultPrevented()) {
                        dropdownSpacer.css('display', '');
        
                        dropdownPopup
                            .append(thisDropdownList)
                            .css('visibility', '');
        
                        if(params.direction == 'up' || thisDropdown.hasClass('b-dropdown_direction_up')) {
                            var dropdownHeight = dropdownPopup.height() - dropdownSpacer.height();
                            dropdownPopup
                                .css('margin-top', -(dropdownHeight - (
                                    parseInt(thisDropdownList.css('padding-bottom'), 10) +
                                    parseInt($(this).closest('.b-dropdown__item').css('padding-bottom'), 10))));
                        }
        
                        dropdownPopup
                            .prepend(dropdownIframe)
                            .css('display', '');
                        hidden = false;
                    }
                } else { hide() }
            });
        };
        
        })(jQuery, window.Lego);
        
        
        }
    /* lego/blocks/b-dropdown/b-dropdown.js: end */ /**/
    
    
    }
/* pages/yaca/yaca.js: end */ /**/

/* blocks/b-setup/b-setup.js: begin */ /**/
    if(_ycssjs('MPVaTbPg1WLnbTN4Yj7Ufn+I5h8')){
    function toggleScreen(elem, number){
            if (elem.checked) {$('.b-setup__image').get(0).className='b-setup__image b-setup__image_'+number}
        }
    
    
    }
/* blocks/b-setup/b-setup.js: end */ /**/


/*Счетчик кликов*/
function r(a,w){
    var d = new Date().getTime();
    var s = a ? a.href : document.location;
    document.createElement("IMG").src = "http://clck.yandex.ru/click/dtype=" + w + "/u=" + d +  "/*" + s;
};

/*Заглушка для директа*/
function yandex_direct_phonePrint(){};

$(function(){

    /*Вывод адресов*/
    $('.b-result__address__link').click(
        function() {
            $(this).parent().next().toggle();
            return false;
        }
    );
       
});


}

