Greasy Fork is available in English.

题海 x 划词搜题

所有网页均支持划词搜题,支持截图搜题,也可输入文本搜题悬浮窗可拖动可关闭,可个性化设置解除网页禁止复制限制适用于各类问答,网课问题,竞赛问题,专业术语,业务名称,情景问题,在线作业等

// ==UserScript==
// @name         题海 x 划词搜题
// @version      2.2.0
// @namespace    题海官方团队
// @description  所有网页均支持划词搜题,支持截图搜题,也可输入文本搜题悬浮窗可拖动可关闭,可个性化设置解除网页禁止复制限制适用于各类问答,网课问题,竞赛问题,专业术语,业务名称,情景问题,在线作业等
// @author       题海官方团队
// @match        *://*/*
// @grant        GM_getResourceText
// @grant        GM_info
// @grant        unsafeWindow
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_setClipboard
// @run-at       document-end
// @connect      baidu.com
// @connect      app.itihey.com
// @connect      lyck6.cn
// @connect      localhost
// @resource     Vue http://lib.baomitu.com/vue/2.6.0/vue.min.js
// @resource     TCaptcha https://turing.captcha.qcloud.com/TCaptcha.js
// @resource     JQ361JS https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.min.js
// @resource     jqueryweui https://cdn.bootcdn.net/ajax/libs/jquery-weui/1.2.1/js/jquery-weui.min.js
// @resource     weuiCss https://cdn.bootcdn.net/ajax/libs/weui/2.5.12/style/weui.min.css
// @resource     questionCss https://app.itihey.com/static/css/question_search.css
// @resource     bootstrap https://app.itihey.com/static/css/bootstrap.min.css
// @resource     Table https://www.forestpolice.org/ttf/2.0/table.json
// @require      https://greasyfork.org/scripts/466179-typr%E5%BA%93/code/Typr%E5%BA%93.js?version=1189955
// @require      https://lib.baomitu.com/cryptico/0.0.1343522940/hash.min.js
// @require      https://lib.baomitu.com/jquery/3.6.0/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js
// @antifeature  membership 关注微信公众号
// @icon         data:image/png;base64,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
// ==/UserScript==

(function () {
    'use strict';

    (function($) {
        var tips = [];
        function handleWindowResize() {
            $.each(tips, function() {
                this.refresh(true);
            });
        }
        $(window).resize(handleWindowResize);

        $.JPopBox = function(elm, options) {
            this.$elm = $(elm);
            this.opts = this.getOptions(options);
            var popBoxHtml=[];
            popBoxHtml.push('<div class="'+this.opts.className+'">');
            if(this.opts.title!=""){
                popBoxHtml.push('<div class="JPopBox-tip-title">'+this.opts.title+'</div>');
            }
            if(this.opts.isShowArrow){
                popBoxHtml.push('<div class="JPopBox-tip-arrow JPopBox-tip-arrow-top JPopBox-tip-arrow-right JPopBox-tip-arrow-bottom JPopBox-tip-arrow-left" style="visibility:inherit"></div>');
            }
            popBoxHtml.push('<div class="JPopBox-tip-content"></div>'),
                popBoxHtml.push('</div>');
            this.$tip = $(popBoxHtml.join('')).appendTo(document.body);
            this.$arrow = this.$tip.find('div.JPopBox-tip-arrow');
            this.$inner = this.$tip.find('div.JPopBox-tip-content');
            this.disabled = false;
            this.content = null;
            this.init();
        };

        $.JPopBox.hideAll = function() {
            $.each(tips, function() {
                this.hide();
            });
        };

        $.JPopBox.prototype = {
            getOptions:function(options){
                options = $.extend({}, $.fn.jPopBox.defaults, options);
                if (options.delay && typeof options.delay == 'number') {
                    options.delay = {
                        show: options.delay,
                        hide: options.delay
                    };
                }
                if (typeof options.offset == 'number') {
                    options.offset = {
                        X: options.offset,
                        Y: options.offset
                    };
                }
                return options
            },
            init: function() {
                tips.push(this);
                this.$elm.data('jPopBox', this);
                if (this.opts.trigger != 'none') {
                    this.opts.trigger!="click" && this.$elm.on({
                        'mouseenter.jPopBox': $.proxy(this.mouseenter, this),
                        'mouseleave.jPopBox': $.proxy(this.mouseleave, this)
                    });
                    switch (this.opts.trigger) {
                        case 'click':
                            this.$elm.on('click.jPopBox', $.proxy(this.toggle, this));
                            break;
                        case 'hover':
                            if (this.opts.isTipHover)
                                this.$tip.hover($.proxy(this.clearTimeouts, this), $.proxy(this.mouseleave, this));
                            break;
                        case 'focus':
                            this.$elm.on({
                                'focus.jPopBox': $.proxy(this.showDelayed, this),
                                'blur.jPopBox': $.proxy(this.hideDelayed, this)
                            });
                            break;
                    }
                }
            },
            toggle:function(){
                var active=this.$tip.data('active');
                if(!active)
                    this.showDelayed();
                else
                    this.hideDelayed();
            },
            mouseenter: function(e) {
                if (this.disabled)
                    return true;
                this.updateCursorPos(e);
                this.$elm.attr('title', '');
                if (this.opts.trigger == 'focus')
                    return true;
                this.showDelayed();
            },
            mouseleave: function(e) {
                if (this.disabled || this.asyncAnimating && (this.$tip[0] === e.relatedTarget || jQuery.contains(this.$tip[0], e.relatedTarget)))
                    return true;
                if (this.opts.trigger == 'focus')
                    return true;
                this.hideDelayed();
            },
            mousemove: function(e) {
                if (this.disabled)
                    return true;
                this.updateCursorPos(e);
                if (this.opts.isFollowCursor && this.$tip.data('active')) {
                    this.calcPos();
                    this.$tip.css({left: this.pos.l, top: this.pos.t});
                }
            },
            show: function() {
                this.$elm.trigger($.Event('show.jPopBox'));
                if (this.disabled || this.$tip.data('active'))
                    return;
                this.reset();
                this.update();
                if (!this.content)
                    return;
                this.display();
                this.$elm.trigger($.Event('shown.jPopBox'));
            },
            showDelayed: function(timeout) {
                this.clearTimeouts();
                this.showTimeout = setTimeout($.proxy(this.show, this), typeof timeout == 'number' ? timeout:this.opts.delay.show);
            },
            hide: function() {
                this.$elm.trigger($.Event('hide.jPopBox'));
                if (this.disabled || !this.$tip.data('active'))
                    return;
                this.display(true);
                this.$elm.trigger($.Event('hidden.jPopBox'));
            },
            hideDelayed: function(timeout) {
                this.clearTimeouts();
                this.hideTimeout = setTimeout($.proxy(this.hide, this),typeof timeout == 'number' ? timeout :this.opts.delay.hide);
            },
            reset: function() {
                this.$tip.queue([]).detach().css('visibility', 'hidden').data('active', false);
                this.$inner.find('*').jPopBox('hide');
                this.$arrow.length && (this.$arrow[0].className = 'JPopBox-tip-arrow JPopBox-tip-arrow-top JPopBox-tip-arrow-right JPopBox-tip-arrow-bottom JPopBox-tip-arrow-left');
                this.asyncAnimating = false;
            },
            update: function(content, dontOverwriteOption) {
                if (this.disabled)
                    return;

                var async = content !== undefined;
                if (async) {
                    if (!dontOverwriteOption)
                        this.opts.content = content;
                    if (!this.$tip.data('active'))
                        return;
                } else {
                    content = this.opts.content;
                }

                // update content only if it has been changed since last time
                var self = this,
                    newContent = typeof content == 'function' ?
                        content.call(this.$elm[0], function(newContent) {
                            self.update(newContent);
                        }) : content;
                if (this.content !== newContent) {
                    this.$inner.empty().append(newContent);
                    this.content = newContent;
                }
                this.refresh(async);
            },
            refresh: function(async) {
                if (this.disabled)
                    return;
                if (async) {
                    if (!this.$tip.data('active'))
                        return;
                }
                this.$tip.css({left: 0, top: 0}).appendTo(document.body);
                if (this.opacity === undefined)
                    this.opacity = this.$tip.css('opacity');
                this.calcPos();
                this.$tip.css({left: this.pos.l, top: this.pos.t});
            },
            display: function(hide) {
                var active = this.$tip.data('active');
                if (active && !hide || !active && hide)
                    return;

                this.$tip.stop();
                var from = {}, to = {};
                from.opacity = hide ? this.$tip.css('opacity') : 0;
                to.opacity = hide ? 0 : this.opacity;
                this.$tip.css(from).animate(to, 300);

                hide ? this.$tip.queue($.proxy(this.reset, this)) : this.$tip.css('visibility', 'inherit');
                this.$tip.data('active', !active);
            },
            disable: function() {
                this.reset();
                this.disabled = true;
            },
            enable: function() {
                this.disabled = false;
            },
            destroy: function() {
                this.reset();
                this.$tip.remove();
                delete this.$tip;
                this.content = null;
                this.$elm.off('.jPopBox').removeData('jPopBox');
                tips.splice($.inArray(this, tips), 1);
            },
            clearTimeouts: function() {
                if (this.showTimeout) {
                    clearTimeout(this.showTimeout);
                    this.showTimeout = 0;
                }
                if (this.hideTimeout) {
                    clearTimeout(this.hideTimeout);
                    this.hideTimeout = 0;
                }
            },
            updateCursorPos: function(e) {
                this.eventX = e.pageX;
                this.eventY = e.pageY;
            },
            calcPos: function() {
                this.tipOuterW = this.$tip.outerWidth();
                this.tipOuterH = this.$tip.outerHeight();
                var pos = {l: 0, t: 0, arrow: ''},
                    $win = $(window),
                    win = {
                        l: $win.scrollLeft(),
                        t: $win.scrollTop(),
                        w: $win.width(),
                        h: $win.height()
                    }, xL, xC, xR, yT, yC, yB,arrowOuterWH,placement,isAuto=false;
                var elmOffset = this.$elm.offset(),
                    elm = {
                        l: elmOffset.left,
                        t: elmOffset.top,
                        w: this.$elm.outerWidth(),
                        h: this.$elm.outerHeight()
                    };
                xL = elm.l;	        // left
                xC = xL + Math.floor(elm.w / 2);    // h center
                xR = xL + elm.w;    // right
                yT = elm.t;	        // top
                yC = yT + Math.floor(elm.h / 2);    // v center
                yB = yT +elm.h;	    // bottom
                placement=this.opts.placement;
                var autoReg=/\s?auto?\s?/i;
                isAuto=autoReg.test(placement);
                if (isAuto) placement = placement.replace(autoReg, '') || 'top';
                //calc left position
                switch (placement) {
                    case "top":
                    case "bottom":
                        pos.l = xC - Math.floor(this.tipOuterW / 2)-this.opts.offset.X;
                        {
                            if (pos.l + this.tipOuterW > win.l + win.w)
                                pos.l = win.l + win.w - this.tipOuterW;
                            else if (pos.l < win.l)
                                pos.l = win.l;
                        }
                        break;
                    case "right":
                        arrowOuterWH=this.setArrowAndGetWH(placement);
                        pos.l = xR + this.opts.offset.X+arrowOuterWH.W;
                        if (isAuto && pos.l + this.tipOuterW > win.l + win.w){
                            arrowOuterWH=this.setArrowAndGetWH("left");
                            pos.l =xL - this.tipOuterW - this.opts.offset.X-arrowOuterWH.W;
                        }
                        break;
                    case "left":
                        arrowOuterWH=this.setArrowAndGetWH(placement);
                        pos.l = xL - this.tipOuterW- this.opts.offset.X-arrowOuterWH.W;
                        if (isAuto && pos.l < win.l){
                            arrowOuterWH=this.setArrowAndGetWH("right");
                            pos.l =xR + this.opts.offset.X+arrowOuterWH.W;
                        }
                        break;
                }
                //calc top position
                switch (placement) {
                    case "top":
                        arrowOuterWH=this.setArrowAndGetWH(placement);
                        pos.t = yT - this.tipOuterH - this.opts.offset.Y-arrowOuterWH.H;
                        if (isAuto && pos.t < win.t) {
                            arrowOuterWH=this.setArrowAndGetWH("bottom");
                            pos.t = yB + this.opts.offset.Y+arrowOuterWH.H;
                        }
                        break;
                    case "bottom":
                        arrowOuterWH=this.setArrowAndGetWH(placement);
                        pos.t = yB+ this.opts.offset.Y +arrowOuterWH.H;
                        if (isAuto && pos.t + this.tipOuterH > win.t + win.h) {
                            arrowOuterWH=this.setArrowAndGetWH("top");
                            pos.t = yT - this.tipOuterH - this.opts.offset.Y-arrowOuterWH.H;
                        }
                        break;
                    case "right":
                    case "left":
                        pos.t = yC - Math.floor(this.tipOuterH / 2)-this.opts.offset.Y;
                        {
                            if (pos.t + this.tipOuterH > win.t + win.h){
                                pos.t = win.t + win.h - this.tipOuterH;
                            }
                            else if (pos.t < win.t)
                                pos.t = win.t;
                        }
                        break;
                }
                this.pos = pos;
            },
            setArrowAndGetWH:function(placement){
                var arrowOuteWH={};
                var W=0,H=0;
                if(this.$arrow.length){
                    this.$arrow.attr("class", "JPopBox-tip-arrow JPopBox-tip-arrow-" + placement);
                    W = this.$arrow.outerWidth();
                    H = this.$arrow.outerHeight();
                }
                arrowOuteWH.W=W;
                arrowOuteWH.H=H;
                return arrowOuteWH;
            }
        };
        $.fn.jPopBox = function(options) {
            if (typeof options == 'string') {
                var args = arguments,
                    method = options;
                Array.prototype.shift.call(args);
                if (method == 'destroy') {
                    this.die ?
                        this.die('mouseenter.jPopBox').die('focus.jPopBox') :
                        $(document).undelegate(this.selector, 'mouseenter.jPopBox').undelegate(this.selector, 'focus.jPopBox');
                }
                return this.each(function() {
                    var jPopBox = $(this).data('jPopBox');
                    if (jPopBox && jPopBox[method])
                        jPopBox[method].apply(jPopBox, args);
                });
            }

            var opts = $.extend({}, $.fn.jPopBox.defaults, options);
            if (!$('#jPopBox-css-' + opts.className)[0])
                $(['<style id="jPopBox-css-',opts.className,'" type="text/css">',
                    'div.',opts.className,'{visibility:hidden;position:absolute;top:0;left:0;}',
                    'div.',opts.className,' div.JPopBox-tip-arrow{visibility:hidden;position:absolute;font:1px/1px sans-serif;}',
                    '</style>'].join('')).appendTo('head');

            return this.each(function() {
                new $.JPopBox(this, opts);
            });
        };

        // default settings
        $.fn.jPopBox.defaults = {
            title:'',                   // 标题
            content:'',	                // 弹出框内容 ('string', element, function(updateCallback){...})
            className:'JPopBox-tip-white',	    // class名称
            placement:'top',            // 如何定位弹出框 (top|bottom|left|right|auto)。当指定为 auto 时,会动态调整弹出框。例如,如果 placement 是 "auto left",弹出框将会尽可能显示在左边,在情况不允许的情况下它才会显示在右边
            delay:100,                  // 延迟显示和隐藏弹出框的毫秒数,对 trigger:none 手动触发类型不适用。如果提供的是一个数字,那么延迟将会应用于显示和隐藏。如果提供的是一个对象{ show: 500, hide: 100 },那么延迟将会分别应用于显示和隐藏
            trigger:'hover',	        // 如何触发弹出框 ('click',hover', 'focus', 'none'),none为手动触发
            offset:0,                   // 方向偏移量,值为负数时,将会反向偏移。如果提供的是一个数字,那么偏移量将会应用于X轴和Y轴。如果提供的是一个对象{ X:200, Y: 100 },那么偏移量将会分别应用于X轴和Y轴
            isShowArrow:true,           // 是否显示指向箭头
            isTipHover:true             // 是否允许在弹出框上移动,而不自动隐藏。只对trigger:hover有效。
        };
    })(jQuery);

    /**
     * 字符串模板格式化
     * @param {string} formatStr - 字符串模板
     * @returns {string} 格式化后的字符串
     * @example
     * StringFormat("ab{0}c{1}ed",1,"q")  output "ab1cqed"
     */


    function StringFormat(formatStr) {
        var args = arguments;
        return formatStr.replace(/\{(\d+)\}/g, function (m, i) {
            i = parseInt(i);
            return args[i + 1];
        });
    }

    /**
     * 日期格式化
     * @param {Date} date - 日期
     * @param {string} formatStr - 格式化模板
     * @returns {string} 格式化日期后的字符串
     * @example
     * DateFormat(new Date(),"yyyy-MM-dd")  output "2020-03-23"
     * @example
     * DateFormat(new Date(),"yyyy/MM/dd hh:mm:ss")  output "2020/03/23 10:30:05"
     */
    function DateFormat(date, formatStr) {
        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "h+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": date.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(formatStr)) {
            formatStr = formatStr.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(formatStr)) {
                formatStr = formatStr.replace(
                    RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }
        return formatStr;
    }

    /**
     * 清除dom元素默认事件
     * @param {object} e - dom元素
     */
    function ClearBubble(e) {
        if (e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    }

    /**
     * 寻找最外层doc
     * @param _self
     * @param top
     * @returns {*|string|boolean|number|string|Window}
     */
    function searchOutDocument(_self, top) {
        try {
            while (top !== _self.top) {
                top = top.parent.document ? top.parent : _self.top;
                if (top.location.pathname === '/mycourse/studentstudy') break;
            }
        } catch (err) {
            top = _self;
        }
        return top;
    }

    function imgOcrBase64(base64) {
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                url: "https://appwk.baidu.com/naapi/api/totxt",
                method: "POST",
                headers:{
                    'Content-type':'application/x-www-form-urlencoded'
                },
                responseType: 'json',
                data: 'image='+encodeURIComponent(base64),
                onload: function (r) {
                    try {
                        const res = r.response.words_result.map(item => {
                            return item.words
                        }).join('');
                        resolve(res);
                    } catch (err) {
                        resolve('');
                    }
                }
            });
        })
    }

    //面板
    var Panel={
        popBoxEl:{},
        randomCode:"",
        Create:function(title,placement,isShowArrow,content,shownFn){
            var self=this;
            $(self.popBoxEl).jPopBox({
                title: title,
                className: 'JPopBox-tip-white',
                placement: placement,
                trigger: 'none',
                isTipHover: true,
                isShowArrow: isShowArrow,
                content: function(){
                    return StringFormat('<div id="panelBody{0}">{1}</div>',self.randomCode,content);
                }
            });
            $(self.popBoxEl).on("shown.jPopBox",function(){
                var $panel=$("div.JPopBox-tip-white");
                typeof shownFn === 'function' && shownFn($panel);
            });
            $(self.popBoxEl).jPopBox('show');
        },
        Update:function(Fn){
            var $panel=$("div.JPopBox-tip-white");
            Fn($panel);    
        },
        Destroy:function(){
            //$(this.popBoxEl).jPopBox("hideDelayed");
            $(this.popBoxEl).jPopBox("destroy");
        },
        CreateStyle:function(){
            var s="";
            s+=StringFormat("#panelBody{0}>div input,#panelBody{0}>div select{padding: 3px; margin: 0; background: #fff; font-size: 14px; border: 1px solid #a9a9a9; color:black;width: auto;min-height: auto; }",this.randomCode);
            s+=StringFormat("#panelBody{0}>div:first-child{padding-bottom: 5px;height:30px}",this.randomCode);
            s+=StringFormat("#panelBody{0}>div:last-child hr{border: 1px inset #eeeeee;background: none;height: 0px;margin: 0px;}",this.randomCode);
            return s;
        }
    };

    var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

    function getDefaultExportFromCjs (x) {
    	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
    }

    var sso_pb = {};

    var googleProtobuf = {};

    /*

     Copyright The Closure Library Authors.
     SPDX-License-Identifier: Apache-2.0
    */

    (function (exports) {
    	var $jscomp = $jscomp || {};
    	$jscomp.scope = {};
    	$jscomp.findInternal = function (a, b, c) {
    	    a instanceof String && (a = String(a));
    	    for (var d = a.length, e = 0; e < d; e++) {
    	        var f = a[e];
    	        if (b.call(c, f, e, a)) return {i: e, v: f}
    	    }
    	    return {i: -1, v: void 0}
    	};
    	$jscomp.ASSUME_ES5 = !1;
    	$jscomp.ASSUME_NO_NATIVE_MAP = !1;
    	$jscomp.ASSUME_NO_NATIVE_SET = !1;
    	$jscomp.SIMPLE_FROUND_POLYFILL = !1;
    	$jscomp.defineProperty = $jscomp.ASSUME_ES5 || "function" == typeof Object.defineProperties ? Object.defineProperty : function (a, b, c) {
    	    a != Array.prototype && a != Object.prototype && (a[b] = c.value);
    	};
    	$jscomp.getGlobal = function (a) {
    	    return "undefined" != typeof window && window === a ? a : "undefined" != typeof commonjsGlobal && null != commonjsGlobal ? commonjsGlobal : a
    	};
    	$jscomp.global = $jscomp.getGlobal(commonjsGlobal);
    	$jscomp.polyfill = function (a, b, c, d) {
    	    if (b) {
    	        c = $jscomp.global;
    	        a = a.split(".");
    	        for (d = 0; d < a.length - 1; d++) {
    	            var e = a[d];
    	            e in c || (c[e] = {});
    	            c = c[e];
    	        }
    	        a = a[a.length - 1];
    	        d = c[a];
    	        b = b(d);
    	        b != d && null != b && $jscomp.defineProperty(c, a, {configurable: !0, writable: !0, value: b});
    	    }
    	};
    	$jscomp.polyfill("Array.prototype.findIndex", function (a) {
    	    return a ? a : function (a, c) {
    	        return $jscomp.findInternal(this, a, c).i
    	    }
    	}, "es6", "es3");
    	$jscomp.checkStringArgs = function (a, b, c) {
    	    if (null == a) throw new TypeError("The 'this' value for String.prototype." + c + " must not be null or undefined");
    	    if (b instanceof RegExp) throw new TypeError("First argument to String.prototype." + c + " must not be a regular expression");
    	    return a + ""
    	};
    	$jscomp.polyfill("String.prototype.endsWith", function (a) {
    	    return a ? a : function (a, c) {
    	        var b = $jscomp.checkStringArgs(this, a, "endsWith");
    	        a += "";
    	        void 0 === c && (c = b.length);
    	        c = Math.max(0, Math.min(c | 0, b.length));
    	        for (var e = a.length; 0 < e && 0 < c;) if (b[--c] != a[--e]) return !1;
    	        return 0 >= e
    	    }
    	}, "es6", "es3");
    	$jscomp.polyfill("Array.prototype.find", function (a) {
    	    return a ? a : function (a, c) {
    	        return $jscomp.findInternal(this, a, c).v
    	    }
    	}, "es6", "es3");
    	$jscomp.polyfill("String.prototype.startsWith", function (a) {
    	    return a ? a : function (a, c) {
    	        var b = $jscomp.checkStringArgs(this, a, "startsWith");
    	        a += "";
    	        var e = b.length, f = a.length;
    	        c = Math.max(0, Math.min(c | 0, b.length));
    	        for (var g = 0; g < f && c < e;) if (b[c++] != a[g++]) return !1;
    	        return g >= f
    	    }
    	}, "es6", "es3");
    	$jscomp.polyfill("String.prototype.repeat", function (a) {
    	    return a ? a : function (a) {
    	        var b = $jscomp.checkStringArgs(this, null, "repeat");
    	        if (0 > a || 1342177279 < a) throw new RangeError("Invalid count value");
    	        a |= 0;
    	        for (var d = ""; a;) if (a & 1 && (d += b), a >>>= 1) b += b;
    	        return d
    	    }
    	}, "es6", "es3");
    	var COMPILED = !0, goog = goog || {};
    	goog.global = commonjsGlobal || self;
    	goog.exportPath_ = function (a, b, c) {
    	    a = a.split(".");
    	    c = c || goog.global;
    	    a[0] in c || "undefined" == typeof c.execScript || c.execScript("var " + a[0]);
    	    for (var d; a.length && (d = a.shift());) a.length || void 0 === b ? c = c[d] && c[d] !== Object.prototype[d] ? c[d] : c[d] = {} : c[d] = b;
    	};
    	goog.define = function (a, b) {
    	    return b
    	};
    	goog.FEATURESET_YEAR = 2012;
    	goog.DEBUG = !0;
    	goog.LOCALE = "en";
    	goog.TRUSTED_SITE = !0;
    	goog.STRICT_MODE_COMPATIBLE = !1;
    	goog.DISALLOW_TEST_ONLY_CODE = !goog.DEBUG;
    	goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING = !1;
    	goog.provide = function (a) {
    	    if (goog.isInModuleLoader_()) throw Error("goog.provide cannot be used within a module.");
    	    goog.constructNamespace_(a);
    	};
    	goog.constructNamespace_ = function (a, b) {
    	    goog.exportPath_(a, b);
    	};
    	goog.getScriptNonce = function (a) {
    	    if (a && a != goog.global) return goog.getScriptNonce_(a.document);
    	    null === goog.cspNonce_ && (goog.cspNonce_ = goog.getScriptNonce_(goog.global.document));
    	    return goog.cspNonce_
    	};
    	goog.NONCE_PATTERN_ = /^[\w+/_-]+[=]{0,2}$/;
    	goog.cspNonce_ = null;
    	goog.getScriptNonce_ = function (a) {
    	    return (a = a.querySelector && a.querySelector("script[nonce]")) && (a = a.nonce || a.getAttribute("nonce")) && goog.NONCE_PATTERN_.test(a) ? a : ""
    	};
    	goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;
    	goog.module = function (a) {
    	    if ("string" !== typeof a || !a || -1 == a.search(goog.VALID_MODULE_RE_)) throw Error("Invalid module identifier");
    	    if (!goog.isInGoogModuleLoader_()) throw Error("Module " + a + " has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.");
    	    if (goog.moduleLoaderState_.moduleName) throw Error("goog.module may only be called once per module.");
    	    goog.moduleLoaderState_.moduleName = a;
    	};
    	goog.module.get = function (a) {
    	    return goog.module.getInternal_(a)
    	};
    	goog.module.getInternal_ = function (a) {
    	    return null
    	};
    	goog.ModuleType = {ES6: "es6", GOOG: "goog"};
    	goog.moduleLoaderState_ = null;
    	goog.isInModuleLoader_ = function () {
    	    return goog.isInGoogModuleLoader_() || goog.isInEs6ModuleLoader_()
    	};
    	goog.isInGoogModuleLoader_ = function () {
    	    return !!goog.moduleLoaderState_ && goog.moduleLoaderState_.type == goog.ModuleType.GOOG
    	};
    	goog.isInEs6ModuleLoader_ = function () {
    	    if (goog.moduleLoaderState_ && goog.moduleLoaderState_.type == goog.ModuleType.ES6) return !0;
    	    var a = goog.global.$jscomp;
    	    return a ? "function" != typeof a.getCurrentModulePath ? !1 : !!a.getCurrentModulePath() : !1
    	};
    	goog.module.declareLegacyNamespace = function () {
    	    goog.moduleLoaderState_.declareLegacyNamespace = !0;
    	};
    	goog.declareModuleId = function (a) {
    	    if (goog.moduleLoaderState_) goog.moduleLoaderState_.moduleName = a; else {
    	        var b = goog.global.$jscomp;
    	        if (!b || "function" != typeof b.getCurrentModulePath) throw Error('Module with namespace "' +
    	            a + '" has been loaded incorrectly.');
    	        b = b.require(b.getCurrentModulePath());
    	        goog.loadedModules_[a] = {exports: b, type: goog.ModuleType.ES6, moduleId: a};
    	    }
    	};
    	goog.setTestOnly = function (a) {
    	    if (goog.DISALLOW_TEST_ONLY_CODE) throw a = a || "", Error("Importing test-only code into non-debug environment" + (a ? ": " + a : "."));
    	};
    	goog.forwardDeclare = function (a) {
    	};
    	goog.getObjectByName = function (a, b) {
    	    a = a.split(".");
    	    b = b || goog.global;
    	    for (var c = 0; c < a.length; c++) if (b = b[a[c]], null == b) return null;
    	    return b
    	};
    	goog.globalize = function (a, b) {
    	    b = b || goog.global;
    	    for (var c in a) b[c] = a[c];
    	};
    	goog.addDependency = function (a, b, c, d) {
    	};
    	goog.ENABLE_DEBUG_LOADER = !0;
    	goog.logToConsole_ = function (a) {
    	    goog.global.console && goog.global.console.error(a);
    	};
    	goog.require = function (a) {
    	};
    	goog.requireType = function (a) {
    	    return {}
    	};
    	goog.basePath = "";
    	goog.nullFunction = function () {
    	};
    	goog.abstractMethod = function () {
    	    throw Error("unimplemented abstract method");
    	};
    	goog.addSingletonGetter = function (a) {
    	    a.instance_ = void 0;
    	    a.getInstance = function () {
    	        if (a.instance_) return a.instance_;
    	        goog.DEBUG && (goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = a);
    	        return a.instance_ = new a
    	    };
    	};
    	goog.instantiatedSingletons_ = [];
    	goog.LOAD_MODULE_USING_EVAL = !0;
    	goog.SEAL_MODULE_EXPORTS = goog.DEBUG;
    	goog.loadedModules_ = {};
    	goog.DEPENDENCIES_ENABLED = !COMPILED ;
    	goog.TRANSPILE = "detect";
    	goog.ASSUME_ES_MODULES_TRANSPILED = !1;
    	goog.TRANSPILE_TO_LANGUAGE = "";
    	goog.TRANSPILER = "transpile.js";
    	goog.hasBadLetScoping = null;
    	goog.useSafari10Workaround = function () {
    	    if (null == goog.hasBadLetScoping) {
    	        try {
    	            var a = !eval('"use strict";let x = 1; function f() { return typeof x; };f() == "number";');
    	        } catch (b) {
    	            a = !1;
    	        }
    	        goog.hasBadLetScoping = a;
    	    }
    	    return goog.hasBadLetScoping
    	};
    	goog.workaroundSafari10EvalBug = function (a) {
    	    return "(function(){" + a + "\n;})();\n"
    	};
    	goog.loadModule = function (a) {
    	    var b = goog.moduleLoaderState_;
    	    try {
    	        goog.moduleLoaderState_ = {moduleName: "", declareLegacyNamespace: !1, type: goog.ModuleType.GOOG};
    	        if (goog.isFunction(a)) var c = a.call(void 0, {}); else if ("string" === typeof a) goog.useSafari10Workaround() && (a = goog.workaroundSafari10EvalBug(a)), c = goog.loadModuleFromSource_.call(void 0, a); else throw Error("Invalid module definition");
    	        var d = goog.moduleLoaderState_.moduleName;
    	        if ("string" === typeof d && d) goog.moduleLoaderState_.declareLegacyNamespace ? goog.constructNamespace_(d,
    	            c) : goog.SEAL_MODULE_EXPORTS && Object.seal && "object" == typeof c && null != c && Object.seal(c), goog.loadedModules_[d] = {
    	            exports: c,
    	            type: goog.ModuleType.GOOG,
    	            moduleId: goog.moduleLoaderState_.moduleName
    	        }; else throw Error('Invalid module name "' + d + '"');
    	    } finally {
    	        goog.moduleLoaderState_ = b;
    	    }
    	};
    	goog.loadModuleFromSource_ = function (a) {
    	    eval(a);
    	    return {}
    	};
    	goog.normalizePath_ = function (a) {
    	    a = a.split("/");
    	    for (var b = 0; b < a.length;) "." == a[b] ? a.splice(b, 1) : b && ".." == a[b] && a[b - 1] && ".." != a[b - 1] ? a.splice(--b, 2) : b++;
    	    return a.join("/")
    	};
    	goog.loadFileSync_ = function (a) {
    	    if (goog.global.CLOSURE_LOAD_FILE_SYNC) return goog.global.CLOSURE_LOAD_FILE_SYNC(a);
    	    try {
    	        var b = new goog.global.XMLHttpRequest;
    	        b.open("get", a, !1);
    	        b.send();
    	        return 0 == b.status || 200 == b.status ? b.responseText : null
    	    } catch (c) {
    	        return null
    	    }
    	};
    	goog.transpile_ = function (a, b, c) {
    	    var d = goog.global.$jscomp;
    	    d || (goog.global.$jscomp = d = {});
    	    var e = d.transpile;
    	    if (!e) {
    	        var f = goog.basePath + goog.TRANSPILER, g = goog.loadFileSync_(f);
    	        if (g) {
    	            (function () {
    	                (0, eval)(g + "\n//# sourceURL=" + f);
    	            }).call(goog.global);
    	            if (goog.global.$gwtExport && goog.global.$gwtExport.$jscomp && !goog.global.$gwtExport.$jscomp.transpile) throw Error('The transpiler did not properly export the "transpile" method. $gwtExport: ' + JSON.stringify(goog.global.$gwtExport));
    	            goog.global.$jscomp.transpile =
    	                goog.global.$gwtExport.$jscomp.transpile;
    	            d = goog.global.$jscomp;
    	            e = d.transpile;
    	        }
    	    }
    	    e || (e = d.transpile = function (a, b) {
    	        goog.logToConsole_(b + " requires transpilation but no transpiler was found.");
    	        return a
    	    });
    	    return e(a, b, c)
    	};
    	goog.typeOf = function (a) {
    	    var b = typeof a;
    	    if ("object" == b) if (a) {
    	        if (a instanceof Array) return "array";
    	        if (a instanceof Object) return b;
    	        var c = Object.prototype.toString.call(a);
    	        if ("[object Window]" == c) return "object";
    	        if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) return "array";
    	        if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) return "function"
    	    } else return "null";
    	    else if ("function" == b && "undefined" == typeof a.call) return "object";
    	    return b
    	};
    	goog.isArray = function (a) {
    	    return "array" == goog.typeOf(a)
    	};
    	goog.isArrayLike = function (a) {
    	    var b = goog.typeOf(a);
    	    return "array" == b || "object" == b && "number" == typeof a.length
    	};
    	goog.isDateLike = function (a) {
    	    return goog.isObject(a) && "function" == typeof a.getFullYear
    	};
    	goog.isFunction = function (a) {
    	    return "function" == goog.typeOf(a)
    	};
    	goog.isObject = function (a) {
    	    var b = typeof a;
    	    return "object" == b && null != a || "function" == b
    	};
    	goog.getUid = function (a) {
    	    return Object.prototype.hasOwnProperty.call(a, goog.UID_PROPERTY_) && a[goog.UID_PROPERTY_] || (a[goog.UID_PROPERTY_] = ++goog.uidCounter_)
    	};
    	goog.hasUid = function (a) {
    	    return !!a[goog.UID_PROPERTY_]
    	};
    	goog.removeUid = function (a) {
    	    null !== a && "removeAttribute" in a && a.removeAttribute(goog.UID_PROPERTY_);
    	    try {
    	        delete a[goog.UID_PROPERTY_];
    	    } catch (b) {
    	    }
    	};
    	goog.UID_PROPERTY_ = "closure_uid_" + (1E9 * Math.random() >>> 0);
    	goog.uidCounter_ = 0;
    	goog.getHashCode = goog.getUid;
    	goog.removeHashCode = goog.removeUid;
    	goog.cloneObject = function (a) {
    	    var b = goog.typeOf(a);
    	    if ("object" == b || "array" == b) {
    	        if ("function" === typeof a.clone) return a.clone();
    	        b = "array" == b ? [] : {};
    	        for (var c in a) b[c] = goog.cloneObject(a[c]);
    	        return b
    	    }
    	    return a
    	};
    	goog.bindNative_ = function (a, b, c) {
    	    return a.call.apply(a.bind, arguments)
    	};
    	goog.bindJs_ = function (a, b, c) {
    	    if (!a) throw Error();
    	    if (2 < arguments.length) {
    	        var d = Array.prototype.slice.call(arguments, 2);
    	        return function () {
    	            var c = Array.prototype.slice.call(arguments);
    	            Array.prototype.unshift.apply(c, d);
    	            return a.apply(b, c)
    	        }
    	    }
    	    return function () {
    	        return a.apply(b, arguments)
    	    }
    	};
    	goog.bind = function (a, b, c) {
    	    Function.prototype.bind && -1 != Function.prototype.bind.toString().indexOf("native code") ? goog.bind = goog.bindNative_ : goog.bind = goog.bindJs_;
    	    return goog.bind.apply(null, arguments)
    	};
    	goog.partial = function (a, b) {
    	    var c = Array.prototype.slice.call(arguments, 1);
    	    return function () {
    	        var b = c.slice();
    	        b.push.apply(b, arguments);
    	        return a.apply(this, b)
    	    }
    	};
    	goog.mixin = function (a, b) {
    	    for (var c in b) a[c] = b[c];
    	};
    	goog.now = goog.TRUSTED_SITE && Date.now || function () {
    	    return +new Date
    	};
    	goog.globalEval = function (a) {
    	    if (goog.global.execScript) goog.global.execScript(a, "JavaScript"); else if (goog.global.eval) {
    	        if (null == goog.evalWorksForGlobals_) {
    	            try {
    	                goog.global.eval("var _evalTest_ = 1;");
    	            } catch (d) {
    	            }
    	            if ("undefined" != typeof goog.global._evalTest_) {
    	                try {
    	                    delete goog.global._evalTest_;
    	                } catch (d) {
    	                }
    	                goog.evalWorksForGlobals_ = !0;
    	            } else goog.evalWorksForGlobals_ = !1;
    	        }
    	        if (goog.evalWorksForGlobals_) goog.global.eval(a); else {
    	            var b = goog.global.document, c = b.createElement("script");
    	            c.type = "text/javascript";
    	            c.defer =
    	                !1;
    	            c.appendChild(b.createTextNode(a));
    	            b.head.appendChild(c);
    	            b.head.removeChild(c);
    	        }
    	    } else throw Error("goog.globalEval not available");
    	};
    	goog.evalWorksForGlobals_ = null;
    	goog.getCssName = function (a, b) {
    	    if ("." == String(a).charAt(0)) throw Error('className passed in goog.getCssName must not start with ".". You passed: ' + a);
    	    var c = function (a) {
    	        return goog.cssNameMapping_[a] || a
    	    }, d = function (a) {
    	        a = a.split("-");
    	        for (var b = [], d = 0; d < a.length; d++) b.push(c(a[d]));
    	        return b.join("-")
    	    };
    	    d = goog.cssNameMapping_ ? "BY_WHOLE" == goog.cssNameMappingStyle_ ? c : d : function (a) {
    	        return a
    	    };
    	    a = b ? a + "-" + d(b) : d(a);
    	    return goog.global.CLOSURE_CSS_NAME_MAP_FN ? goog.global.CLOSURE_CSS_NAME_MAP_FN(a) : a
    	};
    	goog.setCssNameMapping = function (a, b) {
    	    goog.cssNameMapping_ = a;
    	    goog.cssNameMappingStyle_ = b;
    	};
    	goog.getMsg = function (a, b, c) {
    	    c && c.html && (a = a.replace(/</g, "&lt;"));
    	    b && (a = a.replace(/\{\$([^}]+)}/g, function (a, c) {
    	        return null != b && c in b ? b[c] : a
    	    }));
    	    return a
    	};
    	goog.getMsgWithFallback = function (a, b) {
    	    return a
    	};
    	goog.exportSymbol = function (a, b, c) {
    	    goog.exportPath_(a, b, c);
    	};
    	goog.exportProperty = function (a, b, c) {
    	    a[b] = c;
    	};
    	goog.inherits = function (a, b) {
    	    function c() {
    	    }

    	    c.prototype = b.prototype;
    	    a.superClass_ = b.prototype;
    	    a.prototype = new c;
    	    a.prototype.constructor = a;
    	    a.base = function (a, c, f) {
    	        for (var d = Array(arguments.length - 2), e = 2; e < arguments.length; e++) d[e - 2] = arguments[e];
    	        return b.prototype[c].apply(a, d)
    	    };
    	};
    	goog.scope = function (a) {
    	    if (goog.isInModuleLoader_()) throw Error("goog.scope is not supported within a module.");
    	    a.call(goog.global);
    	};
    	goog.defineClass = function (a, b) {
    	    var c = b.constructor, d = b.statics;
    	    c && c != Object.prototype.constructor || (c = function () {
    	        throw Error("cannot instantiate an interface (no constructor defined).");
    	    });
    	    c = goog.defineClass.createSealingConstructor_(c, a);
    	    a && goog.inherits(c, a);
    	    delete b.constructor;
    	    delete b.statics;
    	    goog.defineClass.applyProperties_(c.prototype, b);
    	    null != d && (d instanceof Function ? d(c) : goog.defineClass.applyProperties_(c, d));
    	    return c
    	};
    	goog.defineClass.SEAL_CLASS_INSTANCES = goog.DEBUG;
    	goog.defineClass.createSealingConstructor_ = function (a, b) {
    	    if (!goog.defineClass.SEAL_CLASS_INSTANCES) return a;
    	    var c = !goog.defineClass.isUnsealable_(b), d = function () {
    	        var b = a.apply(this, arguments) || this;
    	        b[goog.UID_PROPERTY_] = b[goog.UID_PROPERTY_];
    	        this.constructor === d && c && Object.seal instanceof Function && Object.seal(b);
    	        return b
    	    };
    	    return d
    	};
    	goog.defineClass.isUnsealable_ = function (a) {
    	    return a && a.prototype && a.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]
    	};
    	goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
    	goog.defineClass.applyProperties_ = function (a, b) {
    	    for (var c in b) Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]);
    	    for (var d = 0; d < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; d++) c = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[d], Object.prototype.hasOwnProperty.call(b, c) && (a[c] = b[c]);
    	};
    	goog.tagUnsealableClass = function (a) {
    	};
    	goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = "goog_defineClass_legacy_unsealable";
    	goog.TRUSTED_TYPES_POLICY_NAME = "";
    	goog.identity_ = function (a) {
    	    return a
    	};
    	goog.createTrustedTypesPolicy = function (a) {
    	    var b = null, c = goog.global.trustedTypes || goog.global.TrustedTypes;
    	    if (!c || !c.createPolicy) return b;
    	    try {
    	        b = c.createPolicy(a, {
    	            createHTML: goog.identity_,
    	            createScript: goog.identity_,
    	            createScriptURL: goog.identity_,
    	            createURL: goog.identity_
    	        });
    	    } catch (d) {
    	        goog.logToConsole_(d.message);
    	    }
    	    return b
    	};
    	goog.TRUSTED_TYPES_POLICY_ = goog.TRUSTED_TYPES_POLICY_NAME ? goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME + "#base") : null;
    	goog.object = {};
    	goog.object.is = function (a, b) {
    	    return a === b ? 0 !== a || 1 / a === 1 / b : a !== a && b !== b
    	};
    	goog.object.forEach = function (a, b, c) {
    	    for (var d in a) b.call(c, a[d], d, a);
    	};
    	goog.object.filter = function (a, b, c) {
    	    var d = {}, e;
    	    for (e in a) b.call(c, a[e], e, a) && (d[e] = a[e]);
    	    return d
    	};
    	goog.object.map = function (a, b, c) {
    	    var d = {}, e;
    	    for (e in a) d[e] = b.call(c, a[e], e, a);
    	    return d
    	};
    	goog.object.some = function (a, b, c) {
    	    for (var d in a) if (b.call(c, a[d], d, a)) return !0;
    	    return !1
    	};
    	goog.object.every = function (a, b, c) {
    	    for (var d in a) if (!b.call(c, a[d], d, a)) return !1;
    	    return !0
    	};
    	goog.object.getCount = function (a) {
    	    var b = 0, c;
    	    for (c in a) b++;
    	    return b
    	};
    	goog.object.getAnyKey = function (a) {
    	    for (var b in a) return b
    	};
    	goog.object.getAnyValue = function (a) {
    	    for (var b in a) return a[b]
    	};
    	goog.object.contains = function (a, b) {
    	    return goog.object.containsValue(a, b)
    	};
    	goog.object.getValues = function (a) {
    	    var b = [], c = 0, d;
    	    for (d in a) b[c++] = a[d];
    	    return b
    	};
    	goog.object.getKeys = function (a) {
    	    var b = [], c = 0, d;
    	    for (d in a) b[c++] = d;
    	    return b
    	};
    	goog.object.getValueByKeys = function (a, b) {
    	    var c = goog.isArrayLike(b), d = c ? b : arguments;
    	    for (c = c ? 0 : 1; c < d.length; c++) {
    	        if (null == a) return;
    	        a = a[d[c]];
    	    }
    	    return a
    	};
    	goog.object.containsKey = function (a, b) {
    	    return null !== a && b in a
    	};
    	goog.object.containsValue = function (a, b) {
    	    for (var c in a) if (a[c] == b) return !0;
    	    return !1
    	};
    	goog.object.findKey = function (a, b, c) {
    	    for (var d in a) if (b.call(c, a[d], d, a)) return d
    	};
    	goog.object.findValue = function (a, b, c) {
    	    return (b = goog.object.findKey(a, b, c)) && a[b]
    	};
    	goog.object.isEmpty = function (a) {
    	    for (var b in a) return !1;
    	    return !0
    	};
    	goog.object.clear = function (a) {
    	    for (var b in a) delete a[b];
    	};
    	goog.object.remove = function (a, b) {
    	    var c;
    	    (c = b in a) && delete a[b];
    	    return c
    	};
    	goog.object.add = function (a, b, c) {
    	    if (null !== a && b in a) throw Error('The object already contains the key "' + b + '"');
    	    goog.object.set(a, b, c);
    	};
    	goog.object.get = function (a, b, c) {
    	    return null !== a && b in a ? a[b] : c
    	};
    	goog.object.set = function (a, b, c) {
    	    a[b] = c;
    	};
    	goog.object.setIfUndefined = function (a, b, c) {
    	    return b in a ? a[b] : a[b] = c
    	};
    	goog.object.setWithReturnValueIfNotSet = function (a, b, c) {
    	    if (b in a) return a[b];
    	    c = c();
    	    return a[b] = c
    	};
    	goog.object.equals = function (a, b) {
    	    for (var c in a) if (!(c in b) || a[c] !== b[c]) return !1;
    	    for (var d in b) if (!(d in a)) return !1;
    	    return !0
    	};
    	goog.object.clone = function (a) {
    	    var b = {}, c;
    	    for (c in a) b[c] = a[c];
    	    return b
    	};
    	goog.object.unsafeClone = function (a) {
    	    var b = goog.typeOf(a);
    	    if ("object" == b || "array" == b) {
    	        if (goog.isFunction(a.clone)) return a.clone();
    	        b = "array" == b ? [] : {};
    	        for (var c in a) b[c] = goog.object.unsafeClone(a[c]);
    	        return b
    	    }
    	    return a
    	};
    	goog.object.transpose = function (a) {
    	    var b = {}, c;
    	    for (c in a) b[a[c]] = c;
    	    return b
    	};
    	goog.object.PROTOTYPE_FIELDS_ = "constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");
    	goog.object.extend = function (a, b) {
    	    for (var c, d, e = 1; e < arguments.length; e++) {
    	        d = arguments[e];
    	        for (c in d) a[c] = d[c];
    	        for (var f = 0; f < goog.object.PROTOTYPE_FIELDS_.length; f++) c = goog.object.PROTOTYPE_FIELDS_[f], Object.prototype.hasOwnProperty.call(d, c) && (a[c] = d[c]);
    	    }
    	};
    	goog.object.create = function (a) {
    	    var b = arguments.length;
    	    if (1 == b && Array.isArray(arguments[0])) return goog.object.create.apply(null, arguments[0]);
    	    if (b % 2) throw Error("Uneven number of arguments");
    	    for (var c = {}, d = 0; d < b; d += 2) c[arguments[d]] = arguments[d + 1];
    	    return c
    	};
    	goog.object.createSet = function (a) {
    	    var b = arguments.length;
    	    if (1 == b && Array.isArray(arguments[0])) return goog.object.createSet.apply(null, arguments[0]);
    	    for (var c = {}, d = 0; d < b; d++) c[arguments[d]] = !0;
    	    return c
    	};
    	goog.object.createImmutableView = function (a) {
    	    var b = a;
    	    Object.isFrozen && !Object.isFrozen(a) && (b = Object.create(a), Object.freeze(b));
    	    return b
    	};
    	goog.object.isImmutableView = function (a) {
    	    return !!Object.isFrozen && Object.isFrozen(a)
    	};
    	goog.object.getAllPropertyNames = function (a, b, c) {
    	    if (!a) return [];
    	    if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) return goog.object.getKeys(a);
    	    for (var d = {}; a && (a !== Object.prototype || b) && (a !== Function.prototype || c);) {
    	        for (var e = Object.getOwnPropertyNames(a), f = 0; f < e.length; f++) d[e[f]] = !0;
    	        a = Object.getPrototypeOf(a);
    	    }
    	    return goog.object.getKeys(d)
    	};
    	goog.object.getSuperClass = function (a) {
    	    return (a = Object.getPrototypeOf(a.prototype)) && a.constructor
    	};
    	var jspb = {asserts: {}};
    	jspb.asserts.doAssertFailure = function (a, b, c, d) {
    	    var e = "Assertion failed";
    	    if (c) {
    	        e += ": " + c;
    	        var f = d;
    	    } else a && (e += ": " + a, f = b);
    	    throw Error("" + e, f || []);
    	};
    	jspb.asserts.assert = function (a, b, c) {
    	    for (var d = [], e = 2; e < arguments.length; ++e) d[e - 2] = arguments[e];
    	    a || jspb.asserts.doAssertFailure("", null, b, d);
    	    return a
    	};
    	jspb.asserts.assertString = function (a, b, c) {
    	    for (var d = [], e = 2; e < arguments.length; ++e) d[e - 2] = arguments[e];
    	    "string" !== typeof a && jspb.asserts.doAssertFailure("Expected string but got %s: %s.", [goog.typeOf(a), a], b, d);
    	    return a
    	};
    	jspb.asserts.assertArray = function (a, b, c) {
    	    for (var d = [], e = 2; e < arguments.length; ++e) d[e - 2] = arguments[e];
    	    Array.isArray(a) || jspb.asserts.doAssertFailure("Expected array but got %s: %s.", [goog.typeOf(a), a], b, d);
    	    return a
    	};
    	jspb.asserts.fail = function (a, b) {
    	    for (var c = [], d = 1; d < arguments.length; ++d) c[d - 1] = arguments[d];
    	    throw Error("Failure" + (a ? ": " + a : ""), c);
    	};
    	jspb.asserts.assertInstanceof = function (a, b, c, d) {
    	    for (var e = [], f = 3; f < arguments.length; ++f) e[f - 3] = arguments[f];
    	    a instanceof b || jspb.asserts.doAssertFailure("Expected instanceof %s but got %s.", [jspb.asserts.getType(b), jspb.asserts.getType(a)], c, e);
    	    return a
    	};
    	jspb.asserts.getType = function (a) {
    	    return a instanceof Function ? a.displayName || a.name || "unknown type name" : a instanceof Object ? a.constructor.displayName || a.constructor.name || Object.prototype.toString.call(a) : null === a ? "null" : typeof a
    	};
    	jspb.BinaryConstants = {};
    	jspb.ConstBinaryMessage = function () {
    	};
    	jspb.BinaryMessage = function () {
    	};
    	jspb.BinaryConstants.FieldType = {
    	    INVALID: -1,
    	    DOUBLE: 1,
    	    FLOAT: 2,
    	    INT64: 3,
    	    UINT64: 4,
    	    INT32: 5,
    	    FIXED64: 6,
    	    FIXED32: 7,
    	    BOOL: 8,
    	    STRING: 9,
    	    GROUP: 10,
    	    MESSAGE: 11,
    	    BYTES: 12,
    	    UINT32: 13,
    	    ENUM: 14,
    	    SFIXED32: 15,
    	    SFIXED64: 16,
    	    SINT32: 17,
    	    SINT64: 18,
    	    FHASH64: 30,
    	    VHASH64: 31
    	};
    	jspb.BinaryConstants.WireType = {
    	    INVALID: -1,
    	    VARINT: 0,
    	    FIXED64: 1,
    	    DELIMITED: 2,
    	    START_GROUP: 3,
    	    END_GROUP: 4,
    	    FIXED32: 5
    	};
    	jspb.BinaryConstants.FieldTypeToWireType = function (a) {
    	    var b = jspb.BinaryConstants.FieldType, c = jspb.BinaryConstants.WireType;
    	    switch (a) {
    	        case b.INT32:
    	        case b.INT64:
    	        case b.UINT32:
    	        case b.UINT64:
    	        case b.SINT32:
    	        case b.SINT64:
    	        case b.BOOL:
    	        case b.ENUM:
    	        case b.VHASH64:
    	            return c.VARINT;
    	        case b.DOUBLE:
    	        case b.FIXED64:
    	        case b.SFIXED64:
    	        case b.FHASH64:
    	            return c.FIXED64;
    	        case b.STRING:
    	        case b.MESSAGE:
    	        case b.BYTES:
    	            return c.DELIMITED;
    	        case b.FLOAT:
    	        case b.FIXED32:
    	        case b.SFIXED32:
    	            return c.FIXED32;
    	        default:
    	            return c.INVALID
    	    }
    	};
    	jspb.BinaryConstants.INVALID_FIELD_NUMBER = -1;
    	jspb.BinaryConstants.FLOAT32_EPS = 1.401298464324817E-45;
    	jspb.BinaryConstants.FLOAT32_MIN = 1.1754943508222875E-38;
    	jspb.BinaryConstants.FLOAT32_MAX = 3.4028234663852886E38;
    	jspb.BinaryConstants.FLOAT64_EPS = 4.9E-324;
    	jspb.BinaryConstants.FLOAT64_MIN = 2.2250738585072014E-308;
    	jspb.BinaryConstants.FLOAT64_MAX = 1.7976931348623157E308;
    	jspb.BinaryConstants.TWO_TO_20 = 1048576;
    	jspb.BinaryConstants.TWO_TO_23 = 8388608;
    	jspb.BinaryConstants.TWO_TO_31 = 2147483648;
    	jspb.BinaryConstants.TWO_TO_32 = 4294967296;
    	jspb.BinaryConstants.TWO_TO_52 = 4503599627370496;
    	jspb.BinaryConstants.TWO_TO_63 = 0x7fffffffffffffff;
    	jspb.BinaryConstants.TWO_TO_64 = 1.8446744073709552E19;
    	jspb.BinaryConstants.ZERO_HASH = "\x00\x00\x00\x00\x00\x00\x00\x00";
    	goog.debug = {};
    	goog.debug.Error = function (a) {
    	    if (Error.captureStackTrace) Error.captureStackTrace(this, goog.debug.Error); else {
    	        var b = Error().stack;
    	        b && (this.stack = b);
    	    }
    	    a && (this.message = String(a));
    	    this.reportErrorToServer = !0;
    	};
    	goog.inherits(goog.debug.Error, Error);
    	goog.debug.Error.prototype.name = "CustomError";
    	goog.dom = {};
    	goog.dom.NodeType = {
    	    ELEMENT: 1,
    	    ATTRIBUTE: 2,
    	    TEXT: 3,
    	    CDATA_SECTION: 4,
    	    ENTITY_REFERENCE: 5,
    	    ENTITY: 6,
    	    PROCESSING_INSTRUCTION: 7,
    	    COMMENT: 8,
    	    DOCUMENT: 9,
    	    DOCUMENT_TYPE: 10,
    	    DOCUMENT_FRAGMENT: 11,
    	    NOTATION: 12
    	};
    	goog.asserts = {};
    	goog.asserts.ENABLE_ASSERTS = goog.DEBUG;
    	goog.asserts.AssertionError = function (a, b) {
    	    goog.debug.Error.call(this, goog.asserts.subs_(a, b));
    	    this.messagePattern = a;
    	};
    	goog.inherits(goog.asserts.AssertionError, goog.debug.Error);
    	goog.asserts.AssertionError.prototype.name = "AssertionError";
    	goog.asserts.DEFAULT_ERROR_HANDLER = function (a) {
    	    throw a;
    	};
    	goog.asserts.errorHandler_ = goog.asserts.DEFAULT_ERROR_HANDLER;
    	goog.asserts.subs_ = function (a, b) {
    	    a = a.split("%s");
    	    for (var c = "", d = a.length - 1, e = 0; e < d; e++) c += a[e] + (e < b.length ? b[e] : "%s");
    	    return c + a[d]
    	};
    	goog.asserts.doAssertFailure_ = function (a, b, c, d) {
    	    var e = "Assertion failed";
    	    if (c) {
    	        e += ": " + c;
    	        var f = d;
    	    } else a && (e += ": " + a, f = b);
    	    a = new goog.asserts.AssertionError("" + e, f || []);
    	    goog.asserts.errorHandler_(a);
    	};
    	goog.asserts.setErrorHandler = function (a) {
    	    goog.asserts.ENABLE_ASSERTS && (goog.asserts.errorHandler_ = a);
    	};
    	goog.asserts.assert = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && !a && goog.asserts.doAssertFailure_("", null, b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertExists = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && null == a && goog.asserts.doAssertFailure_("Expected to exist: %s.", [a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.fail = function (a, b) {
    	    goog.asserts.ENABLE_ASSERTS && goog.asserts.errorHandler_(new goog.asserts.AssertionError("Failure" + (a ? ": " + a : ""), Array.prototype.slice.call(arguments, 1)));
    	};
    	goog.asserts.assertNumber = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && "number" !== typeof a && goog.asserts.doAssertFailure_("Expected number but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertString = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && "string" !== typeof a && goog.asserts.doAssertFailure_("Expected string but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertFunction = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && !goog.isFunction(a) && goog.asserts.doAssertFailure_("Expected function but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertObject = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && !goog.isObject(a) && goog.asserts.doAssertFailure_("Expected object but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertArray = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && !Array.isArray(a) && goog.asserts.doAssertFailure_("Expected array but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertBoolean = function (a, b, c) {
    	    goog.asserts.ENABLE_ASSERTS && "boolean" !== typeof a && goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertElement = function (a, b, c) {
    	    !goog.asserts.ENABLE_ASSERTS || goog.isObject(a) && a.nodeType == goog.dom.NodeType.ELEMENT || goog.asserts.doAssertFailure_("Expected Element but got %s: %s.", [goog.typeOf(a), a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertInstanceof = function (a, b, c, d) {
    	    !goog.asserts.ENABLE_ASSERTS || a instanceof b || goog.asserts.doAssertFailure_("Expected instanceof %s but got %s.", [goog.asserts.getType_(b), goog.asserts.getType_(a)], c, Array.prototype.slice.call(arguments, 3));
    	    return a
    	};
    	goog.asserts.assertFinite = function (a, b, c) {
    	    !goog.asserts.ENABLE_ASSERTS || "number" == typeof a && isFinite(a) || goog.asserts.doAssertFailure_("Expected %s to be a finite number but it is not.", [a], b, Array.prototype.slice.call(arguments, 2));
    	    return a
    	};
    	goog.asserts.assertObjectPrototypeIsIntact = function () {
    	    for (var a in Object.prototype) goog.asserts.fail(a + " should not be enumerable in Object.prototype.");
    	};
    	goog.asserts.getType_ = function (a) {
    	    return a instanceof Function ? a.displayName || a.name || "unknown type name" : a instanceof Object ? a.constructor.displayName || a.constructor.name || Object.prototype.toString.call(a) : null === a ? "null" : typeof a
    	};
    	goog.array = {};
    	goog.NATIVE_ARRAY_PROTOTYPES = goog.TRUSTED_SITE;
    	goog.array.ASSUME_NATIVE_FUNCTIONS = 2012 < goog.FEATURESET_YEAR;
    	goog.array.peek = function (a) {
    	    return a[a.length - 1]
    	};
    	goog.array.last = goog.array.peek;
    	goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.indexOf) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.indexOf.call(a, b, c)
    	} : function (a, b, c) {
    	    c = null == c ? 0 : 0 > c ? Math.max(0, a.length + c) : c;
    	    if ("string" === typeof a) return "string" !== typeof b || 1 != b.length ? -1 : a.indexOf(b, c);
    	    for (; c < a.length; c++) if (c in a && a[c] === b) return c;
    	    return -1
    	};
    	goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.lastIndexOf) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.lastIndexOf.call(a, b, null == c ? a.length - 1 : c)
    	} : function (a, b, c) {
    	    c = null == c ? a.length - 1 : c;
    	    0 > c && (c = Math.max(0, a.length + c));
    	    if ("string" === typeof a) return "string" !== typeof b || 1 != b.length ? -1 : a.lastIndexOf(b, c);
    	    for (; 0 <= c; c--) if (c in a && a[c] === b) return c;
    	    return -1
    	};
    	goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.forEach) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    Array.prototype.forEach.call(a, b, c);
    	} : function (a, b, c) {
    	    for (var d = a.length, e = "string" === typeof a ? a.split("") : a, f = 0; f < d; f++) f in e && b.call(c, e[f], f, a);
    	};
    	goog.array.forEachRight = function (a, b, c) {
    	    var d = a.length, e = "string" === typeof a ? a.split("") : a;
    	    for (--d; 0 <= d; --d) d in e && b.call(c, e[d], d, a);
    	};
    	goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.filter) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.filter.call(a, b, c)
    	} : function (a, b, c) {
    	    for (var d = a.length, e = [], f = 0, g = "string" === typeof a ? a.split("") : a, h = 0; h < d; h++) if (h in g) {
    	        var k = g[h];
    	        b.call(c, k, h, a) && (e[f++] = k);
    	    }
    	    return e
    	};
    	goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.map) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.map.call(a, b, c)
    	} : function (a, b, c) {
    	    for (var d = a.length, e = Array(d), f = "string" === typeof a ? a.split("") : a, g = 0; g < d; g++) g in f && (e[g] = b.call(c, f[g], g, a));
    	    return e
    	};
    	goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduce) ? function (a, b, c, d) {
    	    goog.asserts.assert(null != a.length);
    	    d && (b = goog.bind(b, d));
    	    return Array.prototype.reduce.call(a, b, c)
    	} : function (a, b, c, d) {
    	    var e = c;
    	    goog.array.forEach(a, function (c, g) {
    	        e = b.call(d, e, c, g, a);
    	    });
    	    return e
    	};
    	goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduceRight) ? function (a, b, c, d) {
    	    goog.asserts.assert(null != a.length);
    	    goog.asserts.assert(null != b);
    	    d && (b = goog.bind(b, d));
    	    return Array.prototype.reduceRight.call(a, b, c)
    	} : function (a, b, c, d) {
    	    var e = c;
    	    goog.array.forEachRight(a, function (c, g) {
    	        e = b.call(d, e, c, g, a);
    	    });
    	    return e
    	};
    	goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.some) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.some.call(a, b, c)
    	} : function (a, b, c) {
    	    for (var d = a.length, e = "string" === typeof a ? a.split("") : a, f = 0; f < d; f++) if (f in e && b.call(c, e[f], f, a)) return !0;
    	    return !1
    	};
    	goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.every) ? function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.every.call(a, b, c)
    	} : function (a, b, c) {
    	    for (var d = a.length, e = "string" === typeof a ? a.split("") : a, f = 0; f < d; f++) if (f in e && !b.call(c, e[f], f, a)) return !1;
    	    return !0
    	};
    	goog.array.count = function (a, b, c) {
    	    var d = 0;
    	    goog.array.forEach(a, function (a, f, g) {
    	        b.call(c, a, f, g) && ++d;
    	    }, c);
    	    return d
    	};
    	goog.array.find = function (a, b, c) {
    	    b = goog.array.findIndex(a, b, c);
    	    return 0 > b ? null : "string" === typeof a ? a.charAt(b) : a[b]
    	};
    	goog.array.findIndex = function (a, b, c) {
    	    for (var d = a.length, e = "string" === typeof a ? a.split("") : a, f = 0; f < d; f++) if (f in e && b.call(c, e[f], f, a)) return f;
    	    return -1
    	};
    	goog.array.findRight = function (a, b, c) {
    	    b = goog.array.findIndexRight(a, b, c);
    	    return 0 > b ? null : "string" === typeof a ? a.charAt(b) : a[b]
    	};
    	goog.array.findIndexRight = function (a, b, c) {
    	    var d = a.length, e = "string" === typeof a ? a.split("") : a;
    	    for (--d; 0 <= d; d--) if (d in e && b.call(c, e[d], d, a)) return d;
    	    return -1
    	};
    	goog.array.contains = function (a, b) {
    	    return 0 <= goog.array.indexOf(a, b)
    	};
    	goog.array.isEmpty = function (a) {
    	    return 0 == a.length
    	};
    	goog.array.clear = function (a) {
    	    if (!Array.isArray(a)) for (var b = a.length - 1; 0 <= b; b--) delete a[b];
    	    a.length = 0;
    	};
    	goog.array.insert = function (a, b) {
    	    goog.array.contains(a, b) || a.push(b);
    	};
    	goog.array.insertAt = function (a, b, c) {
    	    goog.array.splice(a, c, 0, b);
    	};
    	goog.array.insertArrayAt = function (a, b, c) {
    	    goog.partial(goog.array.splice, a, c, 0).apply(null, b);
    	};
    	goog.array.insertBefore = function (a, b, c) {
    	    var d;
    	    2 == arguments.length || 0 > (d = goog.array.indexOf(a, c)) ? a.push(b) : goog.array.insertAt(a, b, d);
    	};
    	goog.array.remove = function (a, b) {
    	    b = goog.array.indexOf(a, b);
    	    var c;
    	    (c = 0 <= b) && goog.array.removeAt(a, b);
    	    return c
    	};
    	goog.array.removeLast = function (a, b) {
    	    b = goog.array.lastIndexOf(a, b);
    	    return 0 <= b ? (goog.array.removeAt(a, b), !0) : !1
    	};
    	goog.array.removeAt = function (a, b) {
    	    goog.asserts.assert(null != a.length);
    	    return 1 == Array.prototype.splice.call(a, b, 1).length
    	};
    	goog.array.removeIf = function (a, b, c) {
    	    b = goog.array.findIndex(a, b, c);
    	    return 0 <= b ? (goog.array.removeAt(a, b), !0) : !1
    	};
    	goog.array.removeAllIf = function (a, b, c) {
    	    var d = 0;
    	    goog.array.forEachRight(a, function (e, f) {
    	        b.call(c, e, f, a) && goog.array.removeAt(a, f) && d++;
    	    });
    	    return d
    	};
    	goog.array.concat = function (a) {
    	    return Array.prototype.concat.apply([], arguments)
    	};
    	goog.array.join = function (a) {
    	    return Array.prototype.concat.apply([], arguments)
    	};
    	goog.array.toArray = function (a) {
    	    var b = a.length;
    	    if (0 < b) {
    	        for (var c = Array(b), d = 0; d < b; d++) c[d] = a[d];
    	        return c
    	    }
    	    return []
    	};
    	goog.array.clone = goog.array.toArray;
    	goog.array.extend = function (a, b) {
    	    for (var c = 1; c < arguments.length; c++) {
    	        var d = arguments[c];
    	        if (goog.isArrayLike(d)) {
    	            var e = a.length || 0, f = d.length || 0;
    	            a.length = e + f;
    	            for (var g = 0; g < f; g++) a[e + g] = d[g];
    	        } else a.push(d);
    	    }
    	};
    	goog.array.splice = function (a, b, c, d) {
    	    goog.asserts.assert(null != a.length);
    	    return Array.prototype.splice.apply(a, goog.array.slice(arguments, 1))
    	};
    	goog.array.slice = function (a, b, c) {
    	    goog.asserts.assert(null != a.length);
    	    return 2 >= arguments.length ? Array.prototype.slice.call(a, b) : Array.prototype.slice.call(a, b, c)
    	};
    	goog.array.removeDuplicates = function (a, b, c) {
    	    b = b || a;
    	    var d = function (a) {
    	        return goog.isObject(a) ? "o" + goog.getUid(a) : (typeof a).charAt(0) + a
    	    };
    	    c = c || d;
    	    d = {};
    	    for (var e = 0, f = 0; f < a.length;) {
    	        var g = a[f++], h = c(g);
    	        Object.prototype.hasOwnProperty.call(d, h) || (d[h] = !0, b[e++] = g);
    	    }
    	    b.length = e;
    	};
    	goog.array.binarySearch = function (a, b, c) {
    	    return goog.array.binarySearch_(a, c || goog.array.defaultCompare, !1, b)
    	};
    	goog.array.binarySelect = function (a, b, c) {
    	    return goog.array.binarySearch_(a, b, !0, void 0, c)
    	};
    	goog.array.binarySearch_ = function (a, b, c, d, e) {
    	    for (var f = 0, g = a.length, h; f < g;) {
    	        var k = f + (g - f >>> 1);
    	        var l = c ? b.call(e, a[k], k, a) : b(d, a[k]);
    	        0 < l ? f = k + 1 : (g = k, h = !l);
    	    }
    	    return h ? f : -f - 1
    	};
    	goog.array.sort = function (a, b) {
    	    a.sort(b || goog.array.defaultCompare);
    	};
    	goog.array.stableSort = function (a, b) {
    	    for (var c = Array(a.length), d = 0; d < a.length; d++) c[d] = {index: d, value: a[d]};
    	    var e = b || goog.array.defaultCompare;
    	    goog.array.sort(c, function (a, b) {
    	        return e(a.value, b.value) || a.index - b.index
    	    });
    	    for (d = 0; d < a.length; d++) a[d] = c[d].value;
    	};
    	goog.array.sortByKey = function (a, b, c) {
    	    var d = c || goog.array.defaultCompare;
    	    goog.array.sort(a, function (a, c) {
    	        return d(b(a), b(c))
    	    });
    	};
    	goog.array.sortObjectsByKey = function (a, b, c) {
    	    goog.array.sortByKey(a, function (a) {
    	        return a[b]
    	    }, c);
    	};
    	goog.array.isSorted = function (a, b, c) {
    	    b = b || goog.array.defaultCompare;
    	    for (var d = 1; d < a.length; d++) {
    	        var e = b(a[d - 1], a[d]);
    	        if (0 < e || 0 == e && c) return !1
    	    }
    	    return !0
    	};
    	goog.array.equals = function (a, b, c) {
    	    if (!goog.isArrayLike(a) || !goog.isArrayLike(b) || a.length != b.length) return !1;
    	    var d = a.length;
    	    c = c || goog.array.defaultCompareEquality;
    	    for (var e = 0; e < d; e++) if (!c(a[e], b[e])) return !1;
    	    return !0
    	};
    	goog.array.compare3 = function (a, b, c) {
    	    c = c || goog.array.defaultCompare;
    	    for (var d = Math.min(a.length, b.length), e = 0; e < d; e++) {
    	        var f = c(a[e], b[e]);
    	        if (0 != f) return f
    	    }
    	    return goog.array.defaultCompare(a.length, b.length)
    	};
    	goog.array.defaultCompare = function (a, b) {
    	    return a > b ? 1 : a < b ? -1 : 0
    	};
    	goog.array.inverseDefaultCompare = function (a, b) {
    	    return -goog.array.defaultCompare(a, b)
    	};
    	goog.array.defaultCompareEquality = function (a, b) {
    	    return a === b
    	};
    	goog.array.binaryInsert = function (a, b, c) {
    	    c = goog.array.binarySearch(a, b, c);
    	    return 0 > c ? (goog.array.insertAt(a, b, -(c + 1)), !0) : !1
    	};
    	goog.array.binaryRemove = function (a, b, c) {
    	    b = goog.array.binarySearch(a, b, c);
    	    return 0 <= b ? goog.array.removeAt(a, b) : !1
    	};
    	goog.array.bucket = function (a, b, c) {
    	    for (var d = {}, e = 0; e < a.length; e++) {
    	        var f = a[e], g = b.call(c, f, e, a);
    	        void 0 !== g && (d[g] || (d[g] = [])).push(f);
    	    }
    	    return d
    	};
    	goog.array.toObject = function (a, b, c) {
    	    var d = {};
    	    goog.array.forEach(a, function (e, f) {
    	        d[b.call(c, e, f, a)] = e;
    	    });
    	    return d
    	};
    	goog.array.range = function (a, b, c) {
    	    var d = [], e = 0, f = a;
    	    c = c || 1;
    	    void 0 !== b && (e = a, f = b);
    	    if (0 > c * (f - e)) return [];
    	    if (0 < c) for (a = e; a < f; a += c) d.push(a); else for (a = e; a > f; a += c) d.push(a);
    	    return d
    	};
    	goog.array.repeat = function (a, b) {
    	    for (var c = [], d = 0; d < b; d++) c[d] = a;
    	    return c
    	};
    	goog.array.flatten = function (a) {
    	    for (var b = [], c = 0; c < arguments.length; c++) {
    	        var d = arguments[c];
    	        if (Array.isArray(d)) for (var e = 0; e < d.length; e += 8192) {
    	            var f = goog.array.slice(d, e, e + 8192);
    	            f = goog.array.flatten.apply(null, f);
    	            for (var g = 0; g < f.length; g++) b.push(f[g]);
    	        } else b.push(d);
    	    }
    	    return b
    	};
    	goog.array.rotate = function (a, b) {
    	    goog.asserts.assert(null != a.length);
    	    a.length && (b %= a.length, 0 < b ? Array.prototype.unshift.apply(a, a.splice(-b, b)) : 0 > b && Array.prototype.push.apply(a, a.splice(0, -b)));
    	    return a
    	};
    	goog.array.moveItem = function (a, b, c) {
    	    goog.asserts.assert(0 <= b && b < a.length);
    	    goog.asserts.assert(0 <= c && c < a.length);
    	    b = Array.prototype.splice.call(a, b, 1);
    	    Array.prototype.splice.call(a, c, 0, b[0]);
    	};
    	goog.array.zip = function (a) {
    	    if (!arguments.length) return [];
    	    for (var b = [], c = arguments[0].length, d = 1; d < arguments.length; d++) arguments[d].length < c && (c = arguments[d].length);
    	    for (d = 0; d < c; d++) {
    	        for (var e = [], f = 0; f < arguments.length; f++) e.push(arguments[f][d]);
    	        b.push(e);
    	    }
    	    return b
    	};
    	goog.array.shuffle = function (a, b) {
    	    b = b || Math.random;
    	    for (var c = a.length - 1; 0 < c; c--) {
    	        var d = Math.floor(b() * (c + 1)), e = a[c];
    	        a[c] = a[d];
    	        a[d] = e;
    	    }
    	};
    	goog.array.copyByIndex = function (a, b) {
    	    var c = [];
    	    goog.array.forEach(b, function (b) {
    	        c.push(a[b]);
    	    });
    	    return c
    	};
    	goog.array.concatMap = function (a, b, c) {
    	    return goog.array.concat.apply([], goog.array.map(a, b, c))
    	};
    	goog.crypt = {};
    	goog.crypt.stringToByteArray = function (a) {
    	    for (var b = [], c = 0, d = 0; d < a.length; d++) {
    	        var e = a.charCodeAt(d);
    	        255 < e && (b[c++] = e & 255, e >>= 8);
    	        b[c++] = e;
    	    }
    	    return b
    	};
    	goog.crypt.byteArrayToString = function (a) {
    	    if (8192 >= a.length) return String.fromCharCode.apply(null, a);
    	    for (var b = "", c = 0; c < a.length; c += 8192) {
    	        var d = goog.array.slice(a, c, c + 8192);
    	        b += String.fromCharCode.apply(null, d);
    	    }
    	    return b
    	};
    	goog.crypt.byteArrayToHex = function (a, b) {
    	    return goog.array.map(a, function (a) {
    	        a = a.toString(16);
    	        return 1 < a.length ? a : "0" + a
    	    }).join(b || "")
    	};
    	goog.crypt.hexToByteArray = function (a) {
    	    goog.asserts.assert(0 == a.length % 2, "Key string length must be multiple of 2");
    	    for (var b = [], c = 0; c < a.length; c += 2) b.push(parseInt(a.substring(c, c + 2), 16));
    	    return b
    	};
    	goog.crypt.stringToUtf8ByteArray = function (a) {
    	    for (var b = [], c = 0, d = 0; d < a.length; d++) {
    	        var e = a.charCodeAt(d);
    	        128 > e ? b[c++] = e : (2048 > e ? b[c++] = e >> 6 | 192 : (55296 == (e & 64512) && d + 1 < a.length && 56320 == (a.charCodeAt(d + 1) & 64512) ? (e = 65536 + ((e & 1023) << 10) + (a.charCodeAt(++d) & 1023), b[c++] = e >> 18 | 240, b[c++] = e >> 12 & 63 | 128) : b[c++] = e >> 12 | 224, b[c++] = e >> 6 & 63 | 128), b[c++] = e & 63 | 128);
    	    }
    	    return b
    	};
    	goog.crypt.utf8ByteArrayToString = function (a) {
    	    for (var b = [], c = 0, d = 0; c < a.length;) {
    	        var e = a[c++];
    	        if (128 > e) b[d++] = String.fromCharCode(e); else if (191 < e && 224 > e) {
    	            var f = a[c++];
    	            b[d++] = String.fromCharCode((e & 31) << 6 | f & 63);
    	        } else if (239 < e && 365 > e) {
    	            f = a[c++];
    	            var g = a[c++], h = a[c++];
    	            e = ((e & 7) << 18 | (f & 63) << 12 | (g & 63) << 6 | h & 63) - 65536;
    	            b[d++] = String.fromCharCode(55296 + (e >> 10));
    	            b[d++] = String.fromCharCode(56320 + (e & 1023));
    	        } else f = a[c++], g = a[c++], b[d++] = String.fromCharCode((e & 15) << 12 | (f & 63) << 6 | g & 63);
    	    }
    	    return b.join("")
    	};
    	goog.crypt.xorByteArray = function (a, b) {
    	    goog.asserts.assert(a.length == b.length, "XOR array lengths must match");
    	    for (var c = [], d = 0; d < a.length; d++) c.push(a[d] ^ b[d]);
    	    return c
    	};
    	goog.dom.asserts = {};
    	goog.dom.asserts.assertIsLocation = function (a) {
    	    if (goog.asserts.ENABLE_ASSERTS) {
    	        var b = goog.dom.asserts.getWindow_(a);
    	        b && (!a || !(a instanceof b.Location) && a instanceof b.Element) && goog.asserts.fail("Argument is not a Location (or a non-Element mock); got: %s", goog.dom.asserts.debugStringForType_(a));
    	    }
    	    return a
    	};
    	goog.dom.asserts.assertIsElementType_ = function (a, b) {
    	    if (goog.asserts.ENABLE_ASSERTS) {
    	        var c = goog.dom.asserts.getWindow_(a);
    	        c && "undefined" != typeof c[b] && (a && (a instanceof c[b] || !(a instanceof c.Location || a instanceof c.Element)) || goog.asserts.fail("Argument is not a %s (or a non-Element, non-Location mock); got: %s", b, goog.dom.asserts.debugStringForType_(a)));
    	    }
    	    return a
    	};
    	goog.dom.asserts.assertIsHTMLAnchorElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLAnchorElement")
    	};
    	goog.dom.asserts.assertIsHTMLButtonElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLButtonElement")
    	};
    	goog.dom.asserts.assertIsHTMLLinkElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLLinkElement")
    	};
    	goog.dom.asserts.assertIsHTMLImageElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLImageElement")
    	};
    	goog.dom.asserts.assertIsHTMLAudioElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLAudioElement")
    	};
    	goog.dom.asserts.assertIsHTMLVideoElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLVideoElement")
    	};
    	goog.dom.asserts.assertIsHTMLInputElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLInputElement")
    	};
    	goog.dom.asserts.assertIsHTMLTextAreaElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLTextAreaElement")
    	};
    	goog.dom.asserts.assertIsHTMLCanvasElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLCanvasElement")
    	};
    	goog.dom.asserts.assertIsHTMLEmbedElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLEmbedElement")
    	};
    	goog.dom.asserts.assertIsHTMLFormElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLFormElement")
    	};
    	goog.dom.asserts.assertIsHTMLFrameElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLFrameElement")
    	};
    	goog.dom.asserts.assertIsHTMLIFrameElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLIFrameElement")
    	};
    	goog.dom.asserts.assertIsHTMLObjectElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLObjectElement")
    	};
    	goog.dom.asserts.assertIsHTMLScriptElement = function (a) {
    	    return goog.dom.asserts.assertIsElementType_(a, "HTMLScriptElement")
    	};
    	goog.dom.asserts.debugStringForType_ = function (a) {
    	    if (goog.isObject(a)) try {
    	        return a.constructor.displayName || a.constructor.name || Object.prototype.toString.call(a)
    	    } catch (b) {
    	        return "<object could not be stringified>"
    	    } else return void 0 === a ? "undefined" : null === a ? "null" : typeof a
    	};
    	goog.dom.asserts.getWindow_ = function (a) {
    	    try {
    	        var b = a && a.ownerDocument, c = b && (b.defaultView || b.parentWindow);
    	        c = c || goog.global;
    	        if (c.Element && c.Location) return c
    	    } catch (d) {
    	    }
    	    return null
    	};
    	goog.functions = {};
    	goog.functions.constant = function (a) {
    	    return function () {
    	        return a
    	    }
    	};
    	goog.functions.FALSE = function () {
    	    return !1
    	};
    	goog.functions.TRUE = function () {
    	    return !0
    	};
    	goog.functions.NULL = function () {
    	    return null
    	};
    	goog.functions.identity = function (a, b) {
    	    return a
    	};
    	goog.functions.error = function (a) {
    	    return function () {
    	        throw Error(a);
    	    }
    	};
    	goog.functions.fail = function (a) {
    	    return function () {
    	        throw a;
    	    }
    	};
    	goog.functions.lock = function (a, b) {
    	    b = b || 0;
    	    return function () {
    	        return a.apply(this, Array.prototype.slice.call(arguments, 0, b))
    	    }
    	};
    	goog.functions.nth = function (a) {
    	    return function () {
    	        return arguments[a]
    	    }
    	};
    	goog.functions.partialRight = function (a, b) {
    	    var c = Array.prototype.slice.call(arguments, 1);
    	    return function () {
    	        var b = Array.prototype.slice.call(arguments);
    	        b.push.apply(b, c);
    	        return a.apply(this, b)
    	    }
    	};
    	goog.functions.withReturnValue = function (a, b) {
    	    return goog.functions.sequence(a, goog.functions.constant(b))
    	};
    	goog.functions.equalTo = function (a, b) {
    	    return function (c) {
    	        return b ? a == c : a === c
    	    }
    	};
    	goog.functions.compose = function (a, b) {
    	    var c = arguments, d = c.length;
    	    return function () {
    	        var a;
    	        d && (a = c[d - 1].apply(this, arguments));
    	        for (var b = d - 2; 0 <= b; b--) a = c[b].call(this, a);
    	        return a
    	    }
    	};
    	goog.functions.sequence = function (a) {
    	    var b = arguments, c = b.length;
    	    return function () {
    	        for (var a, e = 0; e < c; e++) a = b[e].apply(this, arguments);
    	        return a
    	    }
    	};
    	goog.functions.and = function (a) {
    	    var b = arguments, c = b.length;
    	    return function () {
    	        for (var a = 0; a < c; a++) if (!b[a].apply(this, arguments)) return !1;
    	        return !0
    	    }
    	};
    	goog.functions.or = function (a) {
    	    var b = arguments, c = b.length;
    	    return function () {
    	        for (var a = 0; a < c; a++) if (b[a].apply(this, arguments)) return !0;
    	        return !1
    	    }
    	};
    	goog.functions.not = function (a) {
    	    return function () {
    	        return !a.apply(this, arguments)
    	    }
    	};
    	goog.functions.create = function (a, b) {
    	    var c = function () {
    	    };
    	    c.prototype = a.prototype;
    	    c = new c;
    	    a.apply(c, Array.prototype.slice.call(arguments, 1));
    	    return c
    	};
    	goog.functions.CACHE_RETURN_VALUE = !0;
    	goog.functions.cacheReturnValue = function (a) {
    	    var b = !1, c;
    	    return function () {
    	        if (!goog.functions.CACHE_RETURN_VALUE) return a();
    	        b || (c = a(), b = !0);
    	        return c
    	    }
    	};
    	goog.functions.once = function (a) {
    	    var b = a;
    	    return function () {
    	        if (b) {
    	            var a = b;
    	            b = null;
    	            a();
    	        }
    	    }
    	};
    	goog.functions.debounce = function (a, b, c) {
    	    var d = 0;
    	    return function (e) {
    	        goog.global.clearTimeout(d);
    	        var f = arguments;
    	        d = goog.global.setTimeout(function () {
    	            a.apply(c, f);
    	        }, b);
    	    }
    	};
    	goog.functions.throttle = function (a, b, c) {
    	    var d = 0, e = !1, f = [], g = function () {
    	        d = 0;
    	        e && (e = !1, h());
    	    }, h = function () {
    	        d = goog.global.setTimeout(g, b);
    	        a.apply(c, f);
    	    };
    	    return function (a) {
    	        f = arguments;
    	        d ? e = !0 : h();
    	    }
    	};
    	goog.functions.rateLimit = function (a, b, c) {
    	    var d = 0, e = function () {
    	        d = 0;
    	    };
    	    return function (f) {
    	        d || (d = goog.global.setTimeout(e, b), a.apply(c, arguments));
    	    }
    	};
    	goog.dom.HtmlElement = function () {
    	};
    	goog.dom.TagName = function (a) {
    	    this.tagName_ = a;
    	};
    	goog.dom.TagName.prototype.toString = function () {
    	    return this.tagName_
    	};
    	goog.dom.TagName.A = new goog.dom.TagName("A");
    	goog.dom.TagName.ABBR = new goog.dom.TagName("ABBR");
    	goog.dom.TagName.ACRONYM = new goog.dom.TagName("ACRONYM");
    	goog.dom.TagName.ADDRESS = new goog.dom.TagName("ADDRESS");
    	goog.dom.TagName.APPLET = new goog.dom.TagName("APPLET");
    	goog.dom.TagName.AREA = new goog.dom.TagName("AREA");
    	goog.dom.TagName.ARTICLE = new goog.dom.TagName("ARTICLE");
    	goog.dom.TagName.ASIDE = new goog.dom.TagName("ASIDE");
    	goog.dom.TagName.AUDIO = new goog.dom.TagName("AUDIO");
    	goog.dom.TagName.B = new goog.dom.TagName("B");
    	goog.dom.TagName.BASE = new goog.dom.TagName("BASE");
    	goog.dom.TagName.BASEFONT = new goog.dom.TagName("BASEFONT");
    	goog.dom.TagName.BDI = new goog.dom.TagName("BDI");
    	goog.dom.TagName.BDO = new goog.dom.TagName("BDO");
    	goog.dom.TagName.BIG = new goog.dom.TagName("BIG");
    	goog.dom.TagName.BLOCKQUOTE = new goog.dom.TagName("BLOCKQUOTE");
    	goog.dom.TagName.BODY = new goog.dom.TagName("BODY");
    	goog.dom.TagName.BR = new goog.dom.TagName("BR");
    	goog.dom.TagName.BUTTON = new goog.dom.TagName("BUTTON");
    	goog.dom.TagName.CANVAS = new goog.dom.TagName("CANVAS");
    	goog.dom.TagName.CAPTION = new goog.dom.TagName("CAPTION");
    	goog.dom.TagName.CENTER = new goog.dom.TagName("CENTER");
    	goog.dom.TagName.CITE = new goog.dom.TagName("CITE");
    	goog.dom.TagName.CODE = new goog.dom.TagName("CODE");
    	goog.dom.TagName.COL = new goog.dom.TagName("COL");
    	goog.dom.TagName.COLGROUP = new goog.dom.TagName("COLGROUP");
    	goog.dom.TagName.COMMAND = new goog.dom.TagName("COMMAND");
    	goog.dom.TagName.DATA = new goog.dom.TagName("DATA");
    	goog.dom.TagName.DATALIST = new goog.dom.TagName("DATALIST");
    	goog.dom.TagName.DD = new goog.dom.TagName("DD");
    	goog.dom.TagName.DEL = new goog.dom.TagName("DEL");
    	goog.dom.TagName.DETAILS = new goog.dom.TagName("DETAILS");
    	goog.dom.TagName.DFN = new goog.dom.TagName("DFN");
    	goog.dom.TagName.DIALOG = new goog.dom.TagName("DIALOG");
    	goog.dom.TagName.DIR = new goog.dom.TagName("DIR");
    	goog.dom.TagName.DIV = new goog.dom.TagName("DIV");
    	goog.dom.TagName.DL = new goog.dom.TagName("DL");
    	goog.dom.TagName.DT = new goog.dom.TagName("DT");
    	goog.dom.TagName.EM = new goog.dom.TagName("EM");
    	goog.dom.TagName.EMBED = new goog.dom.TagName("EMBED");
    	goog.dom.TagName.FIELDSET = new goog.dom.TagName("FIELDSET");
    	goog.dom.TagName.FIGCAPTION = new goog.dom.TagName("FIGCAPTION");
    	goog.dom.TagName.FIGURE = new goog.dom.TagName("FIGURE");
    	goog.dom.TagName.FONT = new goog.dom.TagName("FONT");
    	goog.dom.TagName.FOOTER = new goog.dom.TagName("FOOTER");
    	goog.dom.TagName.FORM = new goog.dom.TagName("FORM");
    	goog.dom.TagName.FRAME = new goog.dom.TagName("FRAME");
    	goog.dom.TagName.FRAMESET = new goog.dom.TagName("FRAMESET");
    	goog.dom.TagName.H1 = new goog.dom.TagName("H1");
    	goog.dom.TagName.H2 = new goog.dom.TagName("H2");
    	goog.dom.TagName.H3 = new goog.dom.TagName("H3");
    	goog.dom.TagName.H4 = new goog.dom.TagName("H4");
    	goog.dom.TagName.H5 = new goog.dom.TagName("H5");
    	goog.dom.TagName.H6 = new goog.dom.TagName("H6");
    	goog.dom.TagName.HEAD = new goog.dom.TagName("HEAD");
    	goog.dom.TagName.HEADER = new goog.dom.TagName("HEADER");
    	goog.dom.TagName.HGROUP = new goog.dom.TagName("HGROUP");
    	goog.dom.TagName.HR = new goog.dom.TagName("HR");
    	goog.dom.TagName.HTML = new goog.dom.TagName("HTML");
    	goog.dom.TagName.I = new goog.dom.TagName("I");
    	goog.dom.TagName.IFRAME = new goog.dom.TagName("IFRAME");
    	goog.dom.TagName.IMG = new goog.dom.TagName("IMG");
    	goog.dom.TagName.INPUT = new goog.dom.TagName("INPUT");
    	goog.dom.TagName.INS = new goog.dom.TagName("INS");
    	goog.dom.TagName.ISINDEX = new goog.dom.TagName("ISINDEX");
    	goog.dom.TagName.KBD = new goog.dom.TagName("KBD");
    	goog.dom.TagName.KEYGEN = new goog.dom.TagName("KEYGEN");
    	goog.dom.TagName.LABEL = new goog.dom.TagName("LABEL");
    	goog.dom.TagName.LEGEND = new goog.dom.TagName("LEGEND");
    	goog.dom.TagName.LI = new goog.dom.TagName("LI");
    	goog.dom.TagName.LINK = new goog.dom.TagName("LINK");
    	goog.dom.TagName.MAIN = new goog.dom.TagName("MAIN");
    	goog.dom.TagName.MAP = new goog.dom.TagName("MAP");
    	goog.dom.TagName.MARK = new goog.dom.TagName("MARK");
    	goog.dom.TagName.MATH = new goog.dom.TagName("MATH");
    	goog.dom.TagName.MENU = new goog.dom.TagName("MENU");
    	goog.dom.TagName.MENUITEM = new goog.dom.TagName("MENUITEM");
    	goog.dom.TagName.META = new goog.dom.TagName("META");
    	goog.dom.TagName.METER = new goog.dom.TagName("METER");
    	goog.dom.TagName.NAV = new goog.dom.TagName("NAV");
    	goog.dom.TagName.NOFRAMES = new goog.dom.TagName("NOFRAMES");
    	goog.dom.TagName.NOSCRIPT = new goog.dom.TagName("NOSCRIPT");
    	goog.dom.TagName.OBJECT = new goog.dom.TagName("OBJECT");
    	goog.dom.TagName.OL = new goog.dom.TagName("OL");
    	goog.dom.TagName.OPTGROUP = new goog.dom.TagName("OPTGROUP");
    	goog.dom.TagName.OPTION = new goog.dom.TagName("OPTION");
    	goog.dom.TagName.OUTPUT = new goog.dom.TagName("OUTPUT");
    	goog.dom.TagName.P = new goog.dom.TagName("P");
    	goog.dom.TagName.PARAM = new goog.dom.TagName("PARAM");
    	goog.dom.TagName.PICTURE = new goog.dom.TagName("PICTURE");
    	goog.dom.TagName.PRE = new goog.dom.TagName("PRE");
    	goog.dom.TagName.PROGRESS = new goog.dom.TagName("PROGRESS");
    	goog.dom.TagName.Q = new goog.dom.TagName("Q");
    	goog.dom.TagName.RP = new goog.dom.TagName("RP");
    	goog.dom.TagName.RT = new goog.dom.TagName("RT");
    	goog.dom.TagName.RTC = new goog.dom.TagName("RTC");
    	goog.dom.TagName.RUBY = new goog.dom.TagName("RUBY");
    	goog.dom.TagName.S = new goog.dom.TagName("S");
    	goog.dom.TagName.SAMP = new goog.dom.TagName("SAMP");
    	goog.dom.TagName.SCRIPT = new goog.dom.TagName("SCRIPT");
    	goog.dom.TagName.SECTION = new goog.dom.TagName("SECTION");
    	goog.dom.TagName.SELECT = new goog.dom.TagName("SELECT");
    	goog.dom.TagName.SMALL = new goog.dom.TagName("SMALL");
    	goog.dom.TagName.SOURCE = new goog.dom.TagName("SOURCE");
    	goog.dom.TagName.SPAN = new goog.dom.TagName("SPAN");
    	goog.dom.TagName.STRIKE = new goog.dom.TagName("STRIKE");
    	goog.dom.TagName.STRONG = new goog.dom.TagName("STRONG");
    	goog.dom.TagName.STYLE = new goog.dom.TagName("STYLE");
    	goog.dom.TagName.SUB = new goog.dom.TagName("SUB");
    	goog.dom.TagName.SUMMARY = new goog.dom.TagName("SUMMARY");
    	goog.dom.TagName.SUP = new goog.dom.TagName("SUP");
    	goog.dom.TagName.SVG = new goog.dom.TagName("SVG");
    	goog.dom.TagName.TABLE = new goog.dom.TagName("TABLE");
    	goog.dom.TagName.TBODY = new goog.dom.TagName("TBODY");
    	goog.dom.TagName.TD = new goog.dom.TagName("TD");
    	goog.dom.TagName.TEMPLATE = new goog.dom.TagName("TEMPLATE");
    	goog.dom.TagName.TEXTAREA = new goog.dom.TagName("TEXTAREA");
    	goog.dom.TagName.TFOOT = new goog.dom.TagName("TFOOT");
    	goog.dom.TagName.TH = new goog.dom.TagName("TH");
    	goog.dom.TagName.THEAD = new goog.dom.TagName("THEAD");
    	goog.dom.TagName.TIME = new goog.dom.TagName("TIME");
    	goog.dom.TagName.TITLE = new goog.dom.TagName("TITLE");
    	goog.dom.TagName.TR = new goog.dom.TagName("TR");
    	goog.dom.TagName.TRACK = new goog.dom.TagName("TRACK");
    	goog.dom.TagName.TT = new goog.dom.TagName("TT");
    	goog.dom.TagName.U = new goog.dom.TagName("U");
    	goog.dom.TagName.UL = new goog.dom.TagName("UL");
    	goog.dom.TagName.VAR = new goog.dom.TagName("VAR");
    	goog.dom.TagName.VIDEO = new goog.dom.TagName("VIDEO");
    	goog.dom.TagName.WBR = new goog.dom.TagName("WBR");
    	goog.dom.tags = {};
    	goog.dom.tags.VOID_TAGS_ = {
    	    area: !0,
    	    base: !0,
    	    br: !0,
    	    col: !0,
    	    command: !0,
    	    embed: !0,
    	    hr: !0,
    	    img: !0,
    	    input: !0,
    	    keygen: !0,
    	    link: !0,
    	    meta: !0,
    	    param: !0,
    	    source: !0,
    	    track: !0,
    	    wbr: !0
    	};
    	goog.dom.tags.isVoidTag = function (a) {
    	    return !0 === goog.dom.tags.VOID_TAGS_[a]
    	};
    	goog.html = {};
    	goog.html.trustedtypes = {};
    	goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY = goog.TRUSTED_TYPES_POLICY_NAME ? goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME + "#html") : null;
    	goog.string = {};
    	goog.string.TypedString = function () {
    	};
    	goog.string.Const = function (a, b) {
    	    this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ = a === goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_ && b || "";
    	    this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ = goog.string.Const.TYPE_MARKER_;
    	};
    	goog.string.Const.prototype.implementsGoogStringTypedString = !0;
    	goog.string.Const.prototype.getTypedStringValue = function () {
    	    return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_
    	};
    	goog.DEBUG && (goog.string.Const.prototype.toString = function () {
    	    return "Const{" + this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ + "}"
    	});
    	goog.string.Const.unwrap = function (a) {
    	    if (a instanceof goog.string.Const && a.constructor === goog.string.Const && a.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ === goog.string.Const.TYPE_MARKER_) return a.stringConstValueWithSecurityContract__googStringSecurityPrivate_;
    	    goog.asserts.fail("expected object of type Const, got '" + a + "'");
    	    return "type_error:Const"
    	};
    	goog.string.Const.from = function (a) {
    	    return new goog.string.Const(goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_, a)
    	};
    	goog.string.Const.TYPE_MARKER_ = {};
    	goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_ = {};
    	goog.string.Const.EMPTY = goog.string.Const.from("");
    	goog.html.SafeScript = function () {
    	    this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = "";
    	    this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	};
    	goog.html.SafeScript.prototype.implementsGoogStringTypedString = !0;
    	goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.SafeScript.fromConstant = function (a) {
    	    a = goog.string.Const.unwrap(a);
    	    return 0 === a.length ? goog.html.SafeScript.EMPTY : goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeScript.fromConstantAndArgs = function (a, b) {
    	    for (var c = [], d = 1; d < arguments.length; d++) c.push(goog.html.SafeScript.stringify_(arguments[d]));
    	    return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("(" + goog.string.Const.unwrap(a) + ")(" + c.join(", ") + ");")
    	};
    	goog.html.SafeScript.fromJson = function (a) {
    	    return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(goog.html.SafeScript.stringify_(a))
    	};
    	goog.html.SafeScript.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString()
    	};
    	goog.DEBUG && (goog.html.SafeScript.prototype.toString = function () {
    	    return "SafeScript{" + this.privateDoNotAccessOrElseSafeScriptWrappedValue_ + "}"
    	});
    	goog.html.SafeScript.unwrap = function (a) {
    	    return goog.html.SafeScript.unwrapTrustedScript(a).toString()
    	};
    	goog.html.SafeScript.unwrapTrustedScript = function (a) {
    	    if (a instanceof goog.html.SafeScript && a.constructor === goog.html.SafeScript && a.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseSafeScriptWrappedValue_;
    	    goog.asserts.fail("expected object of type SafeScript, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:SafeScript"
    	};
    	goog.html.SafeScript.stringify_ = function (a) {
    	    return JSON.stringify(a).replace(/</g, "\\x3c")
    	};
    	goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse = function (a) {
    	    return (new goog.html.SafeScript).initSecurityPrivateDoNotAccessOrElse_(a)
    	};
    	goog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_ = function (a) {
    	    this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ? goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScript(a) : a;
    	    return this
    	};
    	goog.html.SafeScript.EMPTY = goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse("");
    	goog.fs = {};
    	goog.fs.url = {};
    	goog.fs.url.createObjectUrl = function (a) {
    	    return goog.fs.url.getUrlObject_().createObjectURL(a)
    	};
    	goog.fs.url.revokeObjectUrl = function (a) {
    	    goog.fs.url.getUrlObject_().revokeObjectURL(a);
    	};
    	goog.fs.url.UrlObject_ = function () {
    	};
    	goog.fs.url.UrlObject_.prototype.createObjectURL = function (a) {
    	};
    	goog.fs.url.UrlObject_.prototype.revokeObjectURL = function (a) {
    	};
    	goog.fs.url.getUrlObject_ = function () {
    	    var a = goog.fs.url.findUrlObject_();
    	    if (null != a) return a;
    	    throw Error("This browser doesn't seem to support blob URLs");
    	};
    	goog.fs.url.findUrlObject_ = function () {
    	    return void 0 !== goog.global.URL && void 0 !== goog.global.URL.createObjectURL ? goog.global.URL : void 0 !== goog.global.webkitURL && void 0 !== goog.global.webkitURL.createObjectURL ? goog.global.webkitURL : void 0 !== goog.global.createObjectURL ? goog.global : null
    	};
    	goog.fs.url.browserSupportsObjectUrls = function () {
    	    return null != goog.fs.url.findUrlObject_()
    	};
    	goog.fs.blob = {};
    	goog.fs.blob.getBlob = function (a) {
    	    var b = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder;
    	    if (void 0 !== b) {
    	        b = new b;
    	        for (var c = 0; c < arguments.length; c++) b.append(arguments[c]);
    	        return b.getBlob()
    	    }
    	    return goog.fs.blob.getBlobWithProperties(goog.array.toArray(arguments))
    	};
    	goog.fs.blob.getBlobWithProperties = function (a, b, c) {
    	    var d = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder;
    	    if (void 0 !== d) {
    	        d = new d;
    	        for (var e = 0; e < a.length; e++) d.append(a[e], c);
    	        return d.getBlob(b)
    	    }
    	    if (void 0 !== goog.global.Blob) return d = {}, b && (d.type = b), c && (d.endings = c), new Blob(a, d);
    	    throw Error("This browser doesn't seem to support creating Blobs");
    	};
    	goog.i18n = {};
    	goog.i18n.bidi = {};
    	goog.i18n.bidi.FORCE_RTL = !1;
    	goog.i18n.bidi.IS_RTL = goog.i18n.bidi.FORCE_RTL || ("ar" == goog.LOCALE.substring(0, 2).toLowerCase() || "fa" == goog.LOCALE.substring(0, 2).toLowerCase() || "he" == goog.LOCALE.substring(0, 2).toLowerCase() || "iw" == goog.LOCALE.substring(0, 2).toLowerCase() || "ps" == goog.LOCALE.substring(0, 2).toLowerCase() || "sd" == goog.LOCALE.substring(0, 2).toLowerCase() || "ug" == goog.LOCALE.substring(0, 2).toLowerCase() || "ur" == goog.LOCALE.substring(0, 2).toLowerCase() || "yi" == goog.LOCALE.substring(0, 2).toLowerCase()) && (2 == goog.LOCALE.length ||
    	    "-" == goog.LOCALE.substring(2, 3) || "_" == goog.LOCALE.substring(2, 3)) || 3 <= goog.LOCALE.length && "ckb" == goog.LOCALE.substring(0, 3).toLowerCase() && (3 == goog.LOCALE.length || "-" == goog.LOCALE.substring(3, 4) || "_" == goog.LOCALE.substring(3, 4)) || 7 <= goog.LOCALE.length && ("-" == goog.LOCALE.substring(2, 3) || "_" == goog.LOCALE.substring(2, 3)) && ("adlm" == goog.LOCALE.substring(3, 7).toLowerCase() || "arab" == goog.LOCALE.substring(3, 7).toLowerCase() || "hebr" == goog.LOCALE.substring(3, 7).toLowerCase() || "nkoo" == goog.LOCALE.substring(3,
    	    7).toLowerCase() || "rohg" == goog.LOCALE.substring(3, 7).toLowerCase() || "thaa" == goog.LOCALE.substring(3, 7).toLowerCase()) || 8 <= goog.LOCALE.length && ("-" == goog.LOCALE.substring(3, 4) || "_" == goog.LOCALE.substring(3, 4)) && ("adlm" == goog.LOCALE.substring(4, 8).toLowerCase() || "arab" == goog.LOCALE.substring(4, 8).toLowerCase() || "hebr" == goog.LOCALE.substring(4, 8).toLowerCase() || "nkoo" == goog.LOCALE.substring(4, 8).toLowerCase() || "rohg" == goog.LOCALE.substring(4, 8).toLowerCase() || "thaa" == goog.LOCALE.substring(4, 8).toLowerCase());
    	goog.i18n.bidi.Format = {LRE: "\u202a", RLE: "\u202b", PDF: "\u202c", LRM: "\u200e", RLM: "\u200f"};
    	goog.i18n.bidi.Dir = {LTR: 1, RTL: -1, NEUTRAL: 0};
    	goog.i18n.bidi.RIGHT = "right";
    	goog.i18n.bidi.LEFT = "left";
    	goog.i18n.bidi.I18N_RIGHT = goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.LEFT : goog.i18n.bidi.RIGHT;
    	goog.i18n.bidi.I18N_LEFT = goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.RIGHT : goog.i18n.bidi.LEFT;
    	goog.i18n.bidi.toDir = function (a, b) {
    	    return "number" == typeof a ? 0 < a ? goog.i18n.bidi.Dir.LTR : 0 > a ? goog.i18n.bidi.Dir.RTL : b ? null : goog.i18n.bidi.Dir.NEUTRAL : null == a ? null : a ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR
    	};
    	goog.i18n.bidi.ltrChars_ = "A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0900-\u1fff\u200e\u2c00-\ud801\ud804-\ud839\ud83c-\udbff\uf900-\ufb1c\ufe00-\ufe6f\ufefd-\uffff";
    	goog.i18n.bidi.rtlChars_ = "\u0591-\u06ef\u06fa-\u08ff\u200f\ud802-\ud803\ud83a-\ud83b\ufb1d-\ufdff\ufe70-\ufefc";
    	goog.i18n.bidi.htmlSkipReg_ = /<[^>]*>|&[^;]+;/g;
    	goog.i18n.bidi.stripHtmlIfNeeded_ = function (a, b) {
    	    return b ? a.replace(goog.i18n.bidi.htmlSkipReg_, "") : a
    	};
    	goog.i18n.bidi.rtlCharReg_ = new RegExp("[" + goog.i18n.bidi.rtlChars_ + "]");
    	goog.i18n.bidi.ltrCharReg_ = new RegExp("[" + goog.i18n.bidi.ltrChars_ + "]");
    	goog.i18n.bidi.hasAnyRtl = function (a, b) {
    	    return goog.i18n.bidi.rtlCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.hasRtlChar = goog.i18n.bidi.hasAnyRtl;
    	goog.i18n.bidi.hasAnyLtr = function (a, b) {
    	    return goog.i18n.bidi.ltrCharReg_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.ltrRe_ = new RegExp("^[" + goog.i18n.bidi.ltrChars_ + "]");
    	goog.i18n.bidi.rtlRe_ = new RegExp("^[" + goog.i18n.bidi.rtlChars_ + "]");
    	goog.i18n.bidi.isRtlChar = function (a) {
    	    return goog.i18n.bidi.rtlRe_.test(a)
    	};
    	goog.i18n.bidi.isLtrChar = function (a) {
    	    return goog.i18n.bidi.ltrRe_.test(a)
    	};
    	goog.i18n.bidi.isNeutralChar = function (a) {
    	    return !goog.i18n.bidi.isLtrChar(a) && !goog.i18n.bidi.isRtlChar(a)
    	};
    	goog.i18n.bidi.ltrDirCheckRe_ = new RegExp("^[^" + goog.i18n.bidi.rtlChars_ + "]*[" + goog.i18n.bidi.ltrChars_ + "]");
    	goog.i18n.bidi.rtlDirCheckRe_ = new RegExp("^[^" + goog.i18n.bidi.ltrChars_ + "]*[" + goog.i18n.bidi.rtlChars_ + "]");
    	goog.i18n.bidi.startsWithRtl = function (a, b) {
    	    return goog.i18n.bidi.rtlDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.isRtlText = goog.i18n.bidi.startsWithRtl;
    	goog.i18n.bidi.startsWithLtr = function (a, b) {
    	    return goog.i18n.bidi.ltrDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.isLtrText = goog.i18n.bidi.startsWithLtr;
    	goog.i18n.bidi.isRequiredLtrRe_ = /^http:\/\/.*/;
    	goog.i18n.bidi.isNeutralText = function (a, b) {
    	    a = goog.i18n.bidi.stripHtmlIfNeeded_(a, b);
    	    return goog.i18n.bidi.isRequiredLtrRe_.test(a) || !goog.i18n.bidi.hasAnyLtr(a) && !goog.i18n.bidi.hasAnyRtl(a)
    	};
    	goog.i18n.bidi.ltrExitDirCheckRe_ = new RegExp("[" + goog.i18n.bidi.ltrChars_ + "][^" + goog.i18n.bidi.rtlChars_ + "]*$");
    	goog.i18n.bidi.rtlExitDirCheckRe_ = new RegExp("[" + goog.i18n.bidi.rtlChars_ + "][^" + goog.i18n.bidi.ltrChars_ + "]*$");
    	goog.i18n.bidi.endsWithLtr = function (a, b) {
    	    return goog.i18n.bidi.ltrExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.isLtrExitText = goog.i18n.bidi.endsWithLtr;
    	goog.i18n.bidi.endsWithRtl = function (a, b) {
    	    return goog.i18n.bidi.rtlExitDirCheckRe_.test(goog.i18n.bidi.stripHtmlIfNeeded_(a, b))
    	};
    	goog.i18n.bidi.isRtlExitText = goog.i18n.bidi.endsWithRtl;
    	goog.i18n.bidi.rtlLocalesRe_ = /^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;
    	goog.i18n.bidi.isRtlLanguage = function (a) {
    	    return goog.i18n.bidi.rtlLocalesRe_.test(a)
    	};
    	goog.i18n.bidi.bracketGuardTextRe_ = /(\(.*?\)+)|(\[.*?\]+)|(\{.*?\}+)|(<.*?>+)/g;
    	goog.i18n.bidi.guardBracketInText = function (a, b) {
    	    b = (void 0 === b ? goog.i18n.bidi.hasAnyRtl(a) : b) ? goog.i18n.bidi.Format.RLM : goog.i18n.bidi.Format.LRM;
    	    return a.replace(goog.i18n.bidi.bracketGuardTextRe_, b + "$&" + b)
    	};
    	goog.i18n.bidi.enforceRtlInHtml = function (a) {
    	    return "<" == a.charAt(0) ? a.replace(/<\w+/, "$& dir=rtl") : "\n<span dir=rtl>" + a + "</span>"
    	};
    	goog.i18n.bidi.enforceRtlInText = function (a) {
    	    return goog.i18n.bidi.Format.RLE + a + goog.i18n.bidi.Format.PDF
    	};
    	goog.i18n.bidi.enforceLtrInHtml = function (a) {
    	    return "<" == a.charAt(0) ? a.replace(/<\w+/, "$& dir=ltr") : "\n<span dir=ltr>" + a + "</span>"
    	};
    	goog.i18n.bidi.enforceLtrInText = function (a) {
    	    return goog.i18n.bidi.Format.LRE + a + goog.i18n.bidi.Format.PDF
    	};
    	goog.i18n.bidi.dimensionsRe_ = /:\s*([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)\s+([.\d][.\w]*)/g;
    	goog.i18n.bidi.leftRe_ = /left/gi;
    	goog.i18n.bidi.rightRe_ = /right/gi;
    	goog.i18n.bidi.tempRe_ = /%%%%/g;
    	goog.i18n.bidi.mirrorCSS = function (a) {
    	    return a.replace(goog.i18n.bidi.dimensionsRe_, ":$1 $4 $3 $2").replace(goog.i18n.bidi.leftRe_, "%%%%").replace(goog.i18n.bidi.rightRe_, goog.i18n.bidi.LEFT).replace(goog.i18n.bidi.tempRe_, goog.i18n.bidi.RIGHT)
    	};
    	goog.i18n.bidi.doubleQuoteSubstituteRe_ = /([\u0591-\u05f2])"/g;
    	goog.i18n.bidi.singleQuoteSubstituteRe_ = /([\u0591-\u05f2])'/g;
    	goog.i18n.bidi.normalizeHebrewQuote = function (a) {
    	    return a.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_, "$1\u05f4").replace(goog.i18n.bidi.singleQuoteSubstituteRe_, "$1\u05f3")
    	};
    	goog.i18n.bidi.wordSeparatorRe_ = /\s+/;
    	goog.i18n.bidi.hasNumeralsRe_ = /[\d\u06f0-\u06f9]/;
    	goog.i18n.bidi.rtlDetectionThreshold_ = .4;
    	goog.i18n.bidi.estimateDirection = function (a, b) {
    	    var c = 0, d = 0, e = !1;
    	    a = goog.i18n.bidi.stripHtmlIfNeeded_(a, b).split(goog.i18n.bidi.wordSeparatorRe_);
    	    for (b = 0; b < a.length; b++) {
    	        var f = a[b];
    	        goog.i18n.bidi.startsWithRtl(f) ? (c++, d++) : goog.i18n.bidi.isRequiredLtrRe_.test(f) ? e = !0 : goog.i18n.bidi.hasAnyLtr(f) ? d++ : goog.i18n.bidi.hasNumeralsRe_.test(f) && (e = !0);
    	    }
    	    return 0 == d ? e ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL : c / d > goog.i18n.bidi.rtlDetectionThreshold_ ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR
    	};
    	goog.i18n.bidi.detectRtlDirectionality = function (a, b) {
    	    return goog.i18n.bidi.estimateDirection(a, b) == goog.i18n.bidi.Dir.RTL
    	};
    	goog.i18n.bidi.setElementDirAndAlign = function (a, b) {
    	    a && (b = goog.i18n.bidi.toDir(b)) && (a.style.textAlign = b == goog.i18n.bidi.Dir.RTL ? goog.i18n.bidi.RIGHT : goog.i18n.bidi.LEFT, a.dir = b == goog.i18n.bidi.Dir.RTL ? "rtl" : "ltr");
    	};
    	goog.i18n.bidi.setElementDirByTextDirectionality = function (a, b) {
    	    switch (goog.i18n.bidi.estimateDirection(b)) {
    	        case goog.i18n.bidi.Dir.LTR:
    	            a.dir = "ltr";
    	            break;
    	        case goog.i18n.bidi.Dir.RTL:
    	            a.dir = "rtl";
    	            break;
    	        default:
    	            a.removeAttribute("dir");
    	    }
    	};
    	goog.i18n.bidi.DirectionalString = function () {
    	};
    	goog.html.TrustedResourceUrl = function (a, b) {
    	    this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ = a === goog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_ && b || "";
    	    this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	};
    	goog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString = !0;
    	goog.html.TrustedResourceUrl.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_.toString()
    	};
    	goog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString = !0;
    	goog.html.TrustedResourceUrl.prototype.getDirection = function () {
    	    return goog.i18n.bidi.Dir.LTR
    	};
    	goog.html.TrustedResourceUrl.prototype.cloneWithParams = function (a, b) {
    	    var c = goog.html.TrustedResourceUrl.unwrap(this);
    	    c = goog.html.TrustedResourceUrl.URL_PARAM_PARSER_.exec(c);
    	    var d = c[3] || "";
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(c[1] + goog.html.TrustedResourceUrl.stringifyParams_("?", c[2] || "", a) + goog.html.TrustedResourceUrl.stringifyParams_("#", d, b))
    	};
    	goog.DEBUG && (goog.html.TrustedResourceUrl.prototype.toString = function () {
    	    return "TrustedResourceUrl{" + this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ + "}"
    	});
    	goog.html.TrustedResourceUrl.unwrap = function (a) {
    	    return goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(a).toString()
    	};
    	goog.html.TrustedResourceUrl.unwrapTrustedScriptURL = function (a) {
    	    if (a instanceof goog.html.TrustedResourceUrl && a.constructor === goog.html.TrustedResourceUrl && a.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;
    	    goog.asserts.fail("expected object of type TrustedResourceUrl, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:TrustedResourceUrl"
    	};
    	goog.html.TrustedResourceUrl.format = function (a, b) {
    	    var c = goog.string.Const.unwrap(a);
    	    if (!goog.html.TrustedResourceUrl.BASE_URL_.test(c)) throw Error("Invalid TrustedResourceUrl format: " + c);
    	    a = c.replace(goog.html.TrustedResourceUrl.FORMAT_MARKER_, function (a, e) {
    	        if (!Object.prototype.hasOwnProperty.call(b, e)) throw Error('Found marker, "' + e + '", in format string, "' + c + '", but no valid label mapping found in args: ' + JSON.stringify(b));
    	        a = b[e];
    	        return a instanceof goog.string.Const ? goog.string.Const.unwrap(a) :
    	            encodeURIComponent(String(a))
    	    });
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.TrustedResourceUrl.FORMAT_MARKER_ = /%{(\w+)}/g;
    	goog.html.TrustedResourceUrl.BASE_URL_ = /^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i;
    	goog.html.TrustedResourceUrl.URL_PARAM_PARSER_ = /^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/;
    	goog.html.TrustedResourceUrl.formatWithParams = function (a, b, c, d) {
    	    return goog.html.TrustedResourceUrl.format(a, b).cloneWithParams(c, d)
    	};
    	goog.html.TrustedResourceUrl.fromConstant = function (a) {
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))
    	};
    	goog.html.TrustedResourceUrl.fromConstants = function (a) {
    	    for (var b = "", c = 0; c < a.length; c++) b += goog.string.Const.unwrap(a[c]);
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.TrustedResourceUrl.fromSafeScript = function (a) {
    	    a = goog.fs.blob.getBlobWithProperties([goog.html.SafeScript.unwrap(a)], "text/javascript");
    	    a = goog.fs.url.createObjectUrl(a);
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse = function (a) {
    	    a = goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ? goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScriptURL(a) : a;
    	    return new goog.html.TrustedResourceUrl(goog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_, a)
    	};
    	goog.html.TrustedResourceUrl.stringifyParams_ = function (a, b, c) {
    	    if (null == c) return b;
    	    if ("string" === typeof c) return c ? a + encodeURIComponent(c) : "";
    	    for (var d in c) {
    	        var e = c[d];
    	        e = Array.isArray(e) ? e : [e];
    	        for (var f = 0; f < e.length; f++) {
    	            var g = e[f];
    	            null != g && (b || (b = a), b += (b.length > a.length ? "&" : "") + encodeURIComponent(d) + "=" + encodeURIComponent(String(g)));
    	        }
    	    }
    	    return b
    	};
    	goog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_ = {};
    	goog.string.internal = {};
    	goog.string.internal.startsWith = function (a, b) {
    	    return 0 == a.lastIndexOf(b, 0)
    	};
    	goog.string.internal.endsWith = function (a, b) {
    	    var c = a.length - b.length;
    	    return 0 <= c && a.indexOf(b, c) == c
    	};
    	goog.string.internal.caseInsensitiveStartsWith = function (a, b) {
    	    return 0 == goog.string.internal.caseInsensitiveCompare(b, a.substr(0, b.length))
    	};
    	goog.string.internal.caseInsensitiveEndsWith = function (a, b) {
    	    return 0 == goog.string.internal.caseInsensitiveCompare(b, a.substr(a.length - b.length, b.length))
    	};
    	goog.string.internal.caseInsensitiveEquals = function (a, b) {
    	    return a.toLowerCase() == b.toLowerCase()
    	};
    	goog.string.internal.isEmptyOrWhitespace = function (a) {
    	    return /^[\s\xa0]*$/.test(a)
    	};
    	goog.string.internal.trim = goog.TRUSTED_SITE && String.prototype.trim ? function (a) {
    	    return a.trim()
    	} : function (a) {
    	    return /^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]
    	};
    	goog.string.internal.caseInsensitiveCompare = function (a, b) {
    	    a = String(a).toLowerCase();
    	    b = String(b).toLowerCase();
    	    return a < b ? -1 : a == b ? 0 : 1
    	};
    	goog.string.internal.newLineToBr = function (a, b) {
    	    return a.replace(/(\r\n|\r|\n)/g, b ? "<br />" : "<br>")
    	};
    	goog.string.internal.htmlEscape = function (a, b) {
    	    if (b) a = a.replace(goog.string.internal.AMP_RE_, "&amp;").replace(goog.string.internal.LT_RE_, "&lt;").replace(goog.string.internal.GT_RE_, "&gt;").replace(goog.string.internal.QUOT_RE_, "&quot;").replace(goog.string.internal.SINGLE_QUOTE_RE_, "&#39;").replace(goog.string.internal.NULL_RE_, "&#0;"); else {
    	        if (!goog.string.internal.ALL_RE_.test(a)) return a;
    	        -1 != a.indexOf("&") && (a = a.replace(goog.string.internal.AMP_RE_, "&amp;"));
    	        -1 != a.indexOf("<") && (a = a.replace(goog.string.internal.LT_RE_,
    	            "&lt;"));
    	        -1 != a.indexOf(">") && (a = a.replace(goog.string.internal.GT_RE_, "&gt;"));
    	        -1 != a.indexOf('"') && (a = a.replace(goog.string.internal.QUOT_RE_, "&quot;"));
    	        -1 != a.indexOf("'") && (a = a.replace(goog.string.internal.SINGLE_QUOTE_RE_, "&#39;"));
    	        -1 != a.indexOf("\x00") && (a = a.replace(goog.string.internal.NULL_RE_, "&#0;"));
    	    }
    	    return a
    	};
    	goog.string.internal.AMP_RE_ = /&/g;
    	goog.string.internal.LT_RE_ = /</g;
    	goog.string.internal.GT_RE_ = />/g;
    	goog.string.internal.QUOT_RE_ = /"/g;
    	goog.string.internal.SINGLE_QUOTE_RE_ = /'/g;
    	goog.string.internal.NULL_RE_ = /\x00/g;
    	goog.string.internal.ALL_RE_ = /[\x00&<>"']/;
    	goog.string.internal.whitespaceEscape = function (a, b) {
    	    return goog.string.internal.newLineToBr(a.replace(/  /g, " &#160;"), b)
    	};
    	goog.string.internal.contains = function (a, b) {
    	    return -1 != a.indexOf(b)
    	};
    	goog.string.internal.caseInsensitiveContains = function (a, b) {
    	    return goog.string.internal.contains(a.toLowerCase(), b.toLowerCase())
    	};
    	goog.string.internal.compareVersions = function (a, b) {
    	    var c = 0;
    	    a = goog.string.internal.trim(String(a)).split(".");
    	    b = goog.string.internal.trim(String(b)).split(".");
    	    for (var d = Math.max(a.length, b.length), e = 0; 0 == c && e < d; e++) {
    	        var f = a[e] || "", g = b[e] || "";
    	        do {
    	            f = /(\d*)(\D*)(.*)/.exec(f) || ["", "", "", ""];
    	            g = /(\d*)(\D*)(.*)/.exec(g) || ["", "", "", ""];
    	            if (0 == f[0].length && 0 == g[0].length) break;
    	            c = 0 == f[1].length ? 0 : parseInt(f[1], 10);
    	            var h = 0 == g[1].length ? 0 : parseInt(g[1], 10);
    	            c = goog.string.internal.compareElements_(c, h) || goog.string.internal.compareElements_(0 ==
    	                f[2].length, 0 == g[2].length) || goog.string.internal.compareElements_(f[2], g[2]);
    	            f = f[3];
    	            g = g[3];
    	        } while (0 == c)
    	    }
    	    return c
    	};
    	goog.string.internal.compareElements_ = function (a, b) {
    	    return a < b ? -1 : a > b ? 1 : 0
    	};
    	goog.html.SafeUrl = function (a, b) {
    	    this.privateDoNotAccessOrElseSafeUrlWrappedValue_ = a === goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_ && b || "";
    	    this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	};
    	goog.html.SafeUrl.INNOCUOUS_STRING = "about:invalid#zClosurez";
    	goog.html.SafeUrl.prototype.implementsGoogStringTypedString = !0;
    	goog.html.SafeUrl.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString()
    	};
    	goog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString = !0;
    	goog.html.SafeUrl.prototype.getDirection = function () {
    	    return goog.i18n.bidi.Dir.LTR
    	};
    	goog.DEBUG && (goog.html.SafeUrl.prototype.toString = function () {
    	    return "SafeUrl{" + this.privateDoNotAccessOrElseSafeUrlWrappedValue_ + "}"
    	});
    	goog.html.SafeUrl.unwrap = function (a) {
    	    if (a instanceof goog.html.SafeUrl && a.constructor === goog.html.SafeUrl && a.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseSafeUrlWrappedValue_;
    	    goog.asserts.fail("expected object of type SafeUrl, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:SafeUrl"
    	};
    	goog.html.SafeUrl.fromConstant = function (a) {
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.string.Const.unwrap(a))
    	};
    	goog.html.SAFE_MIME_TYPE_PATTERN_ = /^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i;
    	goog.html.SafeUrl.isSafeMimeType = function (a) {
    	    return goog.html.SAFE_MIME_TYPE_PATTERN_.test(a)
    	};
    	goog.html.SafeUrl.fromBlob = function (a) {
    	    a = goog.html.SafeUrl.isSafeMimeType(a.type) ? goog.fs.url.createObjectUrl(a) : goog.html.SafeUrl.INNOCUOUS_STRING;
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.fromMediaSource = function (a) {
    	    goog.asserts.assert("MediaSource" in goog.global, "No support for MediaSource");
    	    a = a instanceof MediaSource ? goog.fs.url.createObjectUrl(a) : goog.html.SafeUrl.INNOCUOUS_STRING;
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.DATA_URL_PATTERN_ = /^data:(.*);base64,[a-z0-9+\/]+=*$/i;
    	goog.html.SafeUrl.fromDataUrl = function (a) {
    	    a = a.replace(/(%0A|%0D)/g, "");
    	    var b = a.match(goog.html.DATA_URL_PATTERN_);
    	    b = b && goog.html.SafeUrl.isSafeMimeType(b[1]);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b ? a : goog.html.SafeUrl.INNOCUOUS_STRING)
    	};
    	goog.html.SafeUrl.fromTelUrl = function (a) {
    	    goog.string.internal.caseInsensitiveStartsWith(a, "tel:") || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SIP_URL_PATTERN_ = /^sip[s]?:[+a-z0-9_.!$%&'*\/=^`{|}~-]+@([a-z0-9-]+\.)+[a-z0-9]{2,63}$/i;
    	goog.html.SafeUrl.fromSipUrl = function (a) {
    	    goog.html.SIP_URL_PATTERN_.test(decodeURIComponent(a)) || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.fromFacebookMessengerUrl = function (a) {
    	    goog.string.internal.caseInsensitiveStartsWith(a, "fb-messenger://share") || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.fromWhatsAppUrl = function (a) {
    	    goog.string.internal.caseInsensitiveStartsWith(a, "whatsapp://send") || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.fromSmsUrl = function (a) {
    	    goog.string.internal.caseInsensitiveStartsWith(a, "sms:") && goog.html.SafeUrl.isSmsUrlBodyValid_(a) || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.isSmsUrlBodyValid_ = function (a) {
    	    var b = a.indexOf("#");
    	    0 < b && (a = a.substring(0, b));
    	    b = a.match(/[?&]body=/gi);
    	    if (!b) return !0;
    	    if (1 < b.length) return !1;
    	    a = a.match(/[?&]body=([^&]*)/)[1];
    	    if (!a) return !0;
    	    try {
    	        decodeURIComponent(a);
    	    } catch (c) {
    	        return !1
    	    }
    	    return /^(?:[a-z0-9\-_.~]|%[0-9a-f]{2})+$/i.test(a)
    	};
    	goog.html.SafeUrl.fromSshUrl = function (a) {
    	    goog.string.internal.caseInsensitiveStartsWith(a, "ssh://") || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.sanitizeChromeExtensionUrl = function (a, b) {
    	    return goog.html.SafeUrl.sanitizeExtensionUrl_(/^chrome-extension:\/\/([^\/]+)\//, a, b)
    	};
    	goog.html.SafeUrl.sanitizeFirefoxExtensionUrl = function (a, b) {
    	    return goog.html.SafeUrl.sanitizeExtensionUrl_(/^moz-extension:\/\/([^\/]+)\//, a, b)
    	};
    	goog.html.SafeUrl.sanitizeEdgeExtensionUrl = function (a, b) {
    	    return goog.html.SafeUrl.sanitizeExtensionUrl_(/^ms-browser-extension:\/\/([^\/]+)\//, a, b)
    	};
    	goog.html.SafeUrl.sanitizeExtensionUrl_ = function (a, b, c) {
    	    (a = a.exec(b)) ? (a = a[1], -1 == (c instanceof goog.string.Const ? [goog.string.Const.unwrap(c)] : c.map(function (a) {
    	        return goog.string.Const.unwrap(a)
    	    })).indexOf(a) && (b = goog.html.SafeUrl.INNOCUOUS_STRING)) : b = goog.html.SafeUrl.INNOCUOUS_STRING;
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.SafeUrl.fromTrustedResourceUrl = function (a) {
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(goog.html.TrustedResourceUrl.unwrap(a))
    	};
    	goog.html.SAFE_URL_PATTERN_ = /^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;
    	goog.html.SafeUrl.SAFE_URL_PATTERN = goog.html.SAFE_URL_PATTERN_;
    	goog.html.SafeUrl.sanitize = function (a) {
    	    if (a instanceof goog.html.SafeUrl) return a;
    	    a = "object" == typeof a && a.implementsGoogStringTypedString ? a.getTypedStringValue() : String(a);
    	    goog.html.SAFE_URL_PATTERN_.test(a) || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.sanitizeAssertUnchanged = function (a, b) {
    	    if (a instanceof goog.html.SafeUrl) return a;
    	    a = "object" == typeof a && a.implementsGoogStringTypedString ? a.getTypedStringValue() : String(a);
    	    if (b && /^data:/i.test(a) && (b = goog.html.SafeUrl.fromDataUrl(a), b.getTypedStringValue() == a)) return b;
    	    goog.asserts.assert(goog.html.SAFE_URL_PATTERN_.test(a), "%s does not match the safe URL pattern", a) || (a = goog.html.SafeUrl.INNOCUOUS_STRING);
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse = function (a) {
    	    return new goog.html.SafeUrl(goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_, a)
    	};
    	goog.html.SafeUrl.ABOUT_BLANK = goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse("about:blank");
    	goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_ = {};
    	goog.html.SafeStyle = function () {
    	    this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = "";
    	    this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	};
    	goog.html.SafeStyle.prototype.implementsGoogStringTypedString = !0;
    	goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.SafeStyle.fromConstant = function (a) {
    	    a = goog.string.Const.unwrap(a);
    	    if (0 === a.length) return goog.html.SafeStyle.EMPTY;
    	    goog.asserts.assert(goog.string.internal.endsWith(a, ";"), "Last character of style string is not ';': " + a);
    	    goog.asserts.assert(goog.string.internal.contains(a, ":"), "Style string must contain at least one ':', to specify a \"name: value\" pair: " + a);
    	    return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeStyle.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseSafeStyleWrappedValue_
    	};
    	goog.DEBUG && (goog.html.SafeStyle.prototype.toString = function () {
    	    return "SafeStyle{" + this.privateDoNotAccessOrElseSafeStyleWrappedValue_ + "}"
    	});
    	goog.html.SafeStyle.unwrap = function (a) {
    	    if (a instanceof goog.html.SafeStyle && a.constructor === goog.html.SafeStyle && a.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseSafeStyleWrappedValue_;
    	    goog.asserts.fail("expected object of type SafeStyle, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:SafeStyle"
    	};
    	goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse = function (a) {
    	    return (new goog.html.SafeStyle).initSecurityPrivateDoNotAccessOrElse_(a)
    	};
    	goog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_ = function (a) {
    	    this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = a;
    	    return this
    	};
    	goog.html.SafeStyle.EMPTY = goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse("");
    	goog.html.SafeStyle.INNOCUOUS_STRING = "zClosurez";
    	goog.html.SafeStyle.create = function (a) {
    	    var b = "", c;
    	    for (c in a) {
    	        if (!/^[-_a-zA-Z0-9]+$/.test(c)) throw Error("Name allows only [-_a-zA-Z0-9], got: " + c);
    	        var d = a[c];
    	        null != d && (d = Array.isArray(d) ? goog.array.map(d, goog.html.SafeStyle.sanitizePropertyValue_).join(" ") : goog.html.SafeStyle.sanitizePropertyValue_(d), b += c + ":" + d + ";");
    	    }
    	    return b ? goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b) : goog.html.SafeStyle.EMPTY
    	};
    	goog.html.SafeStyle.sanitizePropertyValue_ = function (a) {
    	    if (a instanceof goog.html.SafeUrl) return 'url("' + goog.html.SafeUrl.unwrap(a).replace(/</g, "%3c").replace(/[\\"]/g, "\\$&") + '")';
    	    a = a instanceof goog.string.Const ? goog.string.Const.unwrap(a) : goog.html.SafeStyle.sanitizePropertyValueString_(String(a));
    	    if (/[{;}]/.test(a)) throw new goog.asserts.AssertionError("Value does not allow [{;}], got: %s.", [a]);
    	    return a
    	};
    	goog.html.SafeStyle.sanitizePropertyValueString_ = function (a) {
    	    var b = a.replace(goog.html.SafeStyle.FUNCTIONS_RE_, "$1").replace(goog.html.SafeStyle.FUNCTIONS_RE_, "$1").replace(goog.html.SafeStyle.URL_RE_, "url");
    	    if (goog.html.SafeStyle.VALUE_RE_.test(b)) {
    	        if (goog.html.SafeStyle.COMMENT_RE_.test(a)) return goog.asserts.fail("String value disallows comments, got: " + a), goog.html.SafeStyle.INNOCUOUS_STRING;
    	        if (!goog.html.SafeStyle.hasBalancedQuotes_(a)) return goog.asserts.fail("String value requires balanced quotes, got: " +
    	            a), goog.html.SafeStyle.INNOCUOUS_STRING;
    	        if (!goog.html.SafeStyle.hasBalancedSquareBrackets_(a)) return goog.asserts.fail("String value requires balanced square brackets and one identifier per pair of brackets, got: " + a), goog.html.SafeStyle.INNOCUOUS_STRING
    	    } else return goog.asserts.fail("String value allows only " + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ + " and simple functions, got: " + a), goog.html.SafeStyle.INNOCUOUS_STRING;
    	    return goog.html.SafeStyle.sanitizeUrl_(a)
    	};
    	goog.html.SafeStyle.hasBalancedQuotes_ = function (a) {
    	    for (var b = !0, c = !0, d = 0; d < a.length; d++) {
    	        var e = a.charAt(d);
    	        "'" == e && c ? b = !b : '"' == e && b && (c = !c);
    	    }
    	    return b && c
    	};
    	goog.html.SafeStyle.hasBalancedSquareBrackets_ = function (a) {
    	    for (var b = !0, c = /^[-_a-zA-Z0-9]$/, d = 0; d < a.length; d++) {
    	        var e = a.charAt(d);
    	        if ("]" == e) {
    	            if (b) return !1;
    	            b = !0;
    	        } else if ("[" == e) {
    	            if (!b) return !1;
    	            b = !1;
    	        } else if (!b && !c.test(e)) return !1
    	    }
    	    return b
    	};
    	goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ = "[-,.\"'%_!# a-zA-Z0-9\\[\\]]";
    	goog.html.SafeStyle.VALUE_RE_ = new RegExp("^" + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ + "+$");
    	goog.html.SafeStyle.URL_RE_ = /\b(url\([ \t\n]*)('[ -&(-\[\]-~]*'|"[ !#-\[\]-~]*"|[!#-&*-\[\]-~]*)([ \t\n]*\))/g;
    	goog.html.SafeStyle.ALLOWED_FUNCTIONS_ = "calc cubic-bezier fit-content hsl hsla linear-gradient matrix minmax repeat rgb rgba (rotate|scale|translate)(X|Y|Z|3d)?".split(" ");
    	goog.html.SafeStyle.FUNCTIONS_RE_ = new RegExp("\\b(" + goog.html.SafeStyle.ALLOWED_FUNCTIONS_.join("|") + ")\\([-+*/0-9a-z.%\\[\\], ]+\\)", "g");
    	goog.html.SafeStyle.COMMENT_RE_ = /\/\*/;
    	goog.html.SafeStyle.sanitizeUrl_ = function (a) {
    	    return a.replace(goog.html.SafeStyle.URL_RE_, function (a, c, d, e) {
    	        var b = "";
    	        d = d.replace(/^(['"])(.*)\1$/, function (a, c, d) {
    	            b = c;
    	            return d
    	        });
    	        a = goog.html.SafeUrl.sanitize(d).getTypedStringValue();
    	        return c + b + a + b + e
    	    })
    	};
    	goog.html.SafeStyle.concat = function (a) {
    	    var b = "", c = function (a) {
    	        Array.isArray(a) ? goog.array.forEach(a, c) : b += goog.html.SafeStyle.unwrap(a);
    	    };
    	    goog.array.forEach(arguments, c);
    	    return b ? goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b) : goog.html.SafeStyle.EMPTY
    	};
    	goog.html.SafeStyleSheet = function () {
    	    this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = "";
    	    this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	};
    	goog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString = !0;
    	goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.SafeStyleSheet.createRule = function (a, b) {
    	    if (goog.string.internal.contains(a, "<")) throw Error("Selector does not allow '<', got: " + a);
    	    var c = a.replace(/('|")((?!\1)[^\r\n\f\\]|\\[\s\S])*\1/g, "");
    	    if (!/^[-_a-zA-Z0-9#.:* ,>+~[\]()=^$|]+$/.test(c)) throw Error("Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|] and strings, got: " + a);
    	    if (!goog.html.SafeStyleSheet.hasBalancedBrackets_(c)) throw Error("() and [] in selector must be balanced, got: " + a);
    	    b instanceof goog.html.SafeStyle || (b = goog.html.SafeStyle.create(b));
    	    a = a + "{" + goog.html.SafeStyle.unwrap(b).replace(/</g, "\\3C ") + "}";
    	    return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeStyleSheet.hasBalancedBrackets_ = function (a) {
    	    for (var b = {"(": ")", "[": "]"}, c = [], d = 0; d < a.length; d++) {
    	        var e = a[d];
    	        if (b[e]) c.push(b[e]); else if (goog.object.contains(b, e) && c.pop() != e) return !1
    	    }
    	    return 0 == c.length
    	};
    	goog.html.SafeStyleSheet.concat = function (a) {
    	    var b = "", c = function (a) {
    	        Array.isArray(a) ? goog.array.forEach(a, c) : b += goog.html.SafeStyleSheet.unwrap(a);
    	    };
    	    goog.array.forEach(arguments, c);
    	    return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.SafeStyleSheet.fromConstant = function (a) {
    	    a = goog.string.Const.unwrap(a);
    	    if (0 === a.length) return goog.html.SafeStyleSheet.EMPTY;
    	    goog.asserts.assert(!goog.string.internal.contains(a, "<"), "Forbidden '<' character in style sheet string: " + a);
    	    return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(a)
    	};
    	goog.html.SafeStyleSheet.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_
    	};
    	goog.DEBUG && (goog.html.SafeStyleSheet.prototype.toString = function () {
    	    return "SafeStyleSheet{" + this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ + "}"
    	});
    	goog.html.SafeStyleSheet.unwrap = function (a) {
    	    if (a instanceof goog.html.SafeStyleSheet && a.constructor === goog.html.SafeStyleSheet && a.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;
    	    goog.asserts.fail("expected object of type SafeStyleSheet, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:SafeStyleSheet"
    	};
    	goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse = function (a) {
    	    return (new goog.html.SafeStyleSheet).initSecurityPrivateDoNotAccessOrElse_(a)
    	};
    	goog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_ = function (a) {
    	    this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = a;
    	    return this
    	};
    	goog.html.SafeStyleSheet.EMPTY = goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse("");
    	goog.labs = {};
    	goog.labs.userAgent = {};
    	goog.labs.userAgent.util = {};
    	goog.labs.userAgent.util.getNativeUserAgentString_ = function () {
    	    var a = goog.labs.userAgent.util.getNavigator_();
    	    return a && (a = a.userAgent) ? a : ""
    	};
    	goog.labs.userAgent.util.getNavigator_ = function () {
    	    return goog.global.navigator
    	};
    	goog.labs.userAgent.util.userAgent_ = goog.labs.userAgent.util.getNativeUserAgentString_();
    	goog.labs.userAgent.util.setUserAgent = function (a) {
    	    goog.labs.userAgent.util.userAgent_ = a || goog.labs.userAgent.util.getNativeUserAgentString_();
    	};
    	goog.labs.userAgent.util.getUserAgent = function () {
    	    return goog.labs.userAgent.util.userAgent_
    	};
    	goog.labs.userAgent.util.matchUserAgent = function (a) {
    	    var b = goog.labs.userAgent.util.getUserAgent();
    	    return goog.string.internal.contains(b, a)
    	};
    	goog.labs.userAgent.util.matchUserAgentIgnoreCase = function (a) {
    	    var b = goog.labs.userAgent.util.getUserAgent();
    	    return goog.string.internal.caseInsensitiveContains(b, a)
    	};
    	goog.labs.userAgent.util.extractVersionTuples = function (a) {
    	    for (var b = /(\w[\w ]+)\/([^\s]+)\s*(?:\((.*?)\))?/g, c = [], d; d = b.exec(a);) c.push([d[1], d[2], d[3] || void 0]);
    	    return c
    	};
    	goog.labs.userAgent.browser = {};
    	goog.labs.userAgent.browser.matchOpera_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Opera")
    	};
    	goog.labs.userAgent.browser.matchIE_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE")
    	};
    	goog.labs.userAgent.browser.matchEdgeHtml_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Edge")
    	};
    	goog.labs.userAgent.browser.matchEdgeChromium_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Edg/")
    	};
    	goog.labs.userAgent.browser.matchOperaChromium_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("OPR")
    	};
    	goog.labs.userAgent.browser.matchFirefox_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Firefox") || goog.labs.userAgent.util.matchUserAgent("FxiOS")
    	};
    	goog.labs.userAgent.browser.matchSafari_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Safari") && !(goog.labs.userAgent.browser.matchChrome_() || goog.labs.userAgent.browser.matchCoast_() || goog.labs.userAgent.browser.matchOpera_() || goog.labs.userAgent.browser.matchEdgeHtml_() || goog.labs.userAgent.browser.matchEdgeChromium_() || goog.labs.userAgent.browser.matchOperaChromium_() || goog.labs.userAgent.browser.matchFirefox_() || goog.labs.userAgent.browser.isSilk() || goog.labs.userAgent.util.matchUserAgent("Android"))
    	};
    	goog.labs.userAgent.browser.matchCoast_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Coast")
    	};
    	goog.labs.userAgent.browser.matchIosWebview_ = function () {
    	    return (goog.labs.userAgent.util.matchUserAgent("iPad") || goog.labs.userAgent.util.matchUserAgent("iPhone")) && !goog.labs.userAgent.browser.matchSafari_() && !goog.labs.userAgent.browser.matchChrome_() && !goog.labs.userAgent.browser.matchCoast_() && !goog.labs.userAgent.browser.matchFirefox_() && goog.labs.userAgent.util.matchUserAgent("AppleWebKit")
    	};
    	goog.labs.userAgent.browser.matchChrome_ = function () {
    	    return (goog.labs.userAgent.util.matchUserAgent("Chrome") || goog.labs.userAgent.util.matchUserAgent("CriOS")) && !goog.labs.userAgent.browser.matchEdgeHtml_()
    	};
    	goog.labs.userAgent.browser.matchAndroidBrowser_ = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Android") && !(goog.labs.userAgent.browser.isChrome() || goog.labs.userAgent.browser.isFirefox() || goog.labs.userAgent.browser.isOpera() || goog.labs.userAgent.browser.isSilk())
    	};
    	goog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;
    	goog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;
    	goog.labs.userAgent.browser.isEdge = goog.labs.userAgent.browser.matchEdgeHtml_;
    	goog.labs.userAgent.browser.isEdgeChromium = goog.labs.userAgent.browser.matchEdgeChromium_;
    	goog.labs.userAgent.browser.isOperaChromium = goog.labs.userAgent.browser.matchOperaChromium_;
    	goog.labs.userAgent.browser.isFirefox = goog.labs.userAgent.browser.matchFirefox_;
    	goog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;
    	goog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;
    	goog.labs.userAgent.browser.isIosWebview = goog.labs.userAgent.browser.matchIosWebview_;
    	goog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;
    	goog.labs.userAgent.browser.isAndroidBrowser = goog.labs.userAgent.browser.matchAndroidBrowser_;
    	goog.labs.userAgent.browser.isSilk = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Silk")
    	};
    	goog.labs.userAgent.browser.getVersion = function () {
    	    function a(a) {
    	        a = goog.array.find(a, d);
    	        return c[a] || ""
    	    }

    	    var b = goog.labs.userAgent.util.getUserAgent();
    	    if (goog.labs.userAgent.browser.isIE()) return goog.labs.userAgent.browser.getIEVersion_(b);
    	    b = goog.labs.userAgent.util.extractVersionTuples(b);
    	    var c = {};
    	    goog.array.forEach(b, function (a) {
    	        c[a[0]] = a[1];
    	    });
    	    var d = goog.partial(goog.object.containsKey, c);
    	    return goog.labs.userAgent.browser.isOpera() ? a(["Version", "Opera"]) : goog.labs.userAgent.browser.isEdge() ? a(["Edge"]) :
    	        goog.labs.userAgent.browser.isEdgeChromium() ? a(["Edg"]) : goog.labs.userAgent.browser.isChrome() ? a(["Chrome", "CriOS", "HeadlessChrome"]) : (b = b[2]) && b[1] || ""
    	};
    	goog.labs.userAgent.browser.isVersionOrHigher = function (a) {
    	    return 0 <= goog.string.internal.compareVersions(goog.labs.userAgent.browser.getVersion(), a)
    	};
    	goog.labs.userAgent.browser.getIEVersion_ = function (a) {
    	    var b = /rv: *([\d\.]*)/.exec(a);
    	    if (b && b[1]) return b[1];
    	    b = "";
    	    var c = /MSIE +([\d\.]+)/.exec(a);
    	    if (c && c[1]) if (a = /Trident\/(\d.\d)/.exec(a), "7.0" == c[1]) if (a && a[1]) switch (a[1]) {
    	        case "4.0":
    	            b = "8.0";
    	            break;
    	        case "5.0":
    	            b = "9.0";
    	            break;
    	        case "6.0":
    	            b = "10.0";
    	            break;
    	        case "7.0":
    	            b = "11.0";
    	    } else b = "7.0"; else b = c[1];
    	    return b
    	};
    	goog.html.SafeHtml = function () {
    	    this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = "";
    	    this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;
    	    this.dir_ = null;
    	};
    	goog.html.SafeHtml.ENABLE_ERROR_MESSAGES = goog.DEBUG;
    	goog.html.SafeHtml.SUPPORT_STYLE_ATTRIBUTE = !0;
    	goog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = !0;
    	goog.html.SafeHtml.prototype.getDirection = function () {
    	    return this.dir_
    	};
    	goog.html.SafeHtml.prototype.implementsGoogStringTypedString = !0;
    	goog.html.SafeHtml.prototype.getTypedStringValue = function () {
    	    return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString()
    	};
    	goog.DEBUG && (goog.html.SafeHtml.prototype.toString = function () {
    	    return "SafeHtml{" + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ + "}"
    	});
    	goog.html.SafeHtml.unwrap = function (a) {
    	    return goog.html.SafeHtml.unwrapTrustedHTML(a).toString()
    	};
    	goog.html.SafeHtml.unwrapTrustedHTML = function (a) {
    	    if (a instanceof goog.html.SafeHtml && a.constructor === goog.html.SafeHtml && a.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ === goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) return a.privateDoNotAccessOrElseSafeHtmlWrappedValue_;
    	    goog.asserts.fail("expected object of type SafeHtml, got '" + a + "' of type " + goog.typeOf(a));
    	    return "type_error:SafeHtml"
    	};
    	goog.html.SafeHtml.htmlEscape = function (a) {
    	    if (a instanceof goog.html.SafeHtml) return a;
    	    var b = "object" == typeof a, c = null;
    	    b && a.implementsGoogI18nBidiDirectionalString && (c = a.getDirection());
    	    a = b && a.implementsGoogStringTypedString ? a.getTypedStringValue() : String(a);
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.htmlEscape(a), c)
    	};
    	goog.html.SafeHtml.htmlEscapePreservingNewlines = function (a) {
    	    if (a instanceof goog.html.SafeHtml) return a;
    	    a = goog.html.SafeHtml.htmlEscape(a);
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.newLineToBr(goog.html.SafeHtml.unwrap(a)), a.getDirection())
    	};
    	goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces = function (a) {
    	    if (a instanceof goog.html.SafeHtml) return a;
    	    a = goog.html.SafeHtml.htmlEscape(a);
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(goog.string.internal.whitespaceEscape(goog.html.SafeHtml.unwrap(a)), a.getDirection())
    	};
    	goog.html.SafeHtml.from = goog.html.SafeHtml.htmlEscape;
    	goog.html.SafeHtml.comment = function (a) {
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("\x3c!--" + goog.string.internal.htmlEscape(a) + "--\x3e", null)
    	};
    	goog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/;
    	goog.html.SafeHtml.URL_ATTRIBUTES_ = {
    	    action: !0,
    	    cite: !0,
    	    data: !0,
    	    formaction: !0,
    	    href: !0,
    	    manifest: !0,
    	    poster: !0,
    	    src: !0
    	};
    	goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_ = {
    	    APPLET: !0,
    	    BASE: !0,
    	    EMBED: !0,
    	    IFRAME: !0,
    	    LINK: !0,
    	    MATH: !0,
    	    META: !0,
    	    OBJECT: !0,
    	    SCRIPT: !0,
    	    STYLE: !0,
    	    SVG: !0,
    	    TEMPLATE: !0
    	};
    	goog.html.SafeHtml.create = function (a, b, c) {
    	    goog.html.SafeHtml.verifyTagName(String(a));
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(String(a), b, c)
    	};
    	goog.html.SafeHtml.verifyTagName = function (a) {
    	    if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(a)) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? "Invalid tag name <" + a + ">." : "");
    	    if (a.toUpperCase() in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? "Tag name <" + a + "> is not allowed for SafeHtml." : "");
    	};
    	goog.html.SafeHtml.createIframe = function (a, b, c, d) {
    	    a && goog.html.TrustedResourceUrl.unwrap(a);
    	    var e = {};
    	    e.src = a || null;
    	    e.srcdoc = b && goog.html.SafeHtml.unwrap(b);
    	    a = goog.html.SafeHtml.combineAttributes(e, {sandbox: ""}, c);
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe", a, d)
    	};
    	goog.html.SafeHtml.createSandboxIframe = function (a, b, c, d) {
    	    if (!goog.html.SafeHtml.canUseSandboxIframe()) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? "The browser does not support sandboxed iframes." : "");
    	    var e = {};
    	    e.src = a ? goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a)) : null;
    	    e.srcdoc = b || null;
    	    e.sandbox = "";
    	    a = goog.html.SafeHtml.combineAttributes(e, {}, c);
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("iframe", a, d)
    	};
    	goog.html.SafeHtml.canUseSandboxIframe = function () {
    	    return goog.global.HTMLIFrameElement && "sandbox" in goog.global.HTMLIFrameElement.prototype
    	};
    	goog.html.SafeHtml.createScriptSrc = function (a, b) {
    	    goog.html.TrustedResourceUrl.unwrap(a);
    	    a = goog.html.SafeHtml.combineAttributes({src: a}, {}, b);
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script", a)
    	};
    	goog.html.SafeHtml.createScript = function (a, b) {
    	    for (var c in b) {
    	        var d = c.toLowerCase();
    	        if ("language" == d || "src" == d || "text" == d || "type" == d) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Cannot set "' + d + '" attribute' : "");
    	    }
    	    c = "";
    	    a = goog.array.concat(a);
    	    for (d = 0; d < a.length; d++) c += goog.html.SafeScript.unwrap(a[d]);
    	    a = goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c, goog.i18n.bidi.Dir.NEUTRAL);
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("script", b, a)
    	};
    	goog.html.SafeHtml.createStyle = function (a, b) {
    	    b = goog.html.SafeHtml.combineAttributes({type: "text/css"}, {}, b);
    	    var c = "";
    	    a = goog.array.concat(a);
    	    for (var d = 0; d < a.length; d++) c += goog.html.SafeStyleSheet.unwrap(a[d]);
    	    a = goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(c, goog.i18n.bidi.Dir.NEUTRAL);
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("style", b, a)
    	};
    	goog.html.SafeHtml.createMetaRefresh = function (a, b) {
    	    a = goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(a));
    	    (goog.labs.userAgent.browser.isIE() || goog.labs.userAgent.browser.isEdge()) && goog.string.internal.contains(a, ";") && (a = "'" + a.replace(/'/g, "%27") + "'");
    	    return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse("meta", {
    	        "http-equiv": "refresh",
    	        content: (b || 0) + "; url=" + a
    	    })
    	};
    	goog.html.SafeHtml.getAttrNameAndValue_ = function (a, b, c) {
    	    if (c instanceof goog.string.Const) c = goog.string.Const.unwrap(c); else if ("style" == b.toLowerCase()) if (goog.html.SafeHtml.SUPPORT_STYLE_ATTRIBUTE) c = goog.html.SafeHtml.getStyleValue_(c); else throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Attribute "style" not supported.' : ""); else {
    	        if (/^on/i.test(b)) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Attribute "' + b + '" requires goog.string.Const value, "' + c + '" given.' : "");
    	        if (b.toLowerCase() in
    	            goog.html.SafeHtml.URL_ATTRIBUTES_) if (c instanceof goog.html.TrustedResourceUrl) c = goog.html.TrustedResourceUrl.unwrap(c); else if (c instanceof goog.html.SafeUrl) c = goog.html.SafeUrl.unwrap(c); else if ("string" === typeof c) c = goog.html.SafeUrl.sanitize(c).getTypedStringValue(); else throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Attribute "' + b + '" on tag "' + a + '" requires goog.html.SafeUrl, goog.string.Const, or string, value "' + c + '" given.' : "");
    	    }
    	    c.implementsGoogStringTypedString && (c = c.getTypedStringValue());
    	    goog.asserts.assert("string" === typeof c || "number" === typeof c, "String or number value expected, got " + typeof c + " with value: " + c);
    	    return b + '="' + goog.string.internal.htmlEscape(String(c)) + '"'
    	};
    	goog.html.SafeHtml.getStyleValue_ = function (a) {
    	    if (!goog.isObject(a)) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'The "style" attribute requires goog.html.SafeStyle or map of style properties, ' + typeof a + " given: " + a : "");
    	    a instanceof goog.html.SafeStyle || (a = goog.html.SafeStyle.create(a));
    	    return goog.html.SafeStyle.unwrap(a)
    	};
    	goog.html.SafeHtml.createWithDir = function (a, b, c, d) {
    	    b = goog.html.SafeHtml.create(b, c, d);
    	    b.dir_ = a;
    	    return b
    	};
    	goog.html.SafeHtml.join = function (a, b) {
    	    a = goog.html.SafeHtml.htmlEscape(a);
    	    var c = a.getDirection(), d = [], e = function (a) {
    	        Array.isArray(a) ? goog.array.forEach(a, e) : (a = goog.html.SafeHtml.htmlEscape(a), d.push(goog.html.SafeHtml.unwrap(a)), a = a.getDirection(), c == goog.i18n.bidi.Dir.NEUTRAL ? c = a : a != goog.i18n.bidi.Dir.NEUTRAL && c != a && (c = null));
    	    };
    	    goog.array.forEach(b, e);
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(d.join(goog.html.SafeHtml.unwrap(a)), c)
    	};
    	goog.html.SafeHtml.concat = function (a) {
    	    return goog.html.SafeHtml.join(goog.html.SafeHtml.EMPTY, Array.prototype.slice.call(arguments))
    	};
    	goog.html.SafeHtml.concatWithDir = function (a, b) {
    	    var c = goog.html.SafeHtml.concat(goog.array.slice(arguments, 1));
    	    c.dir_ = a;
    	    return c
    	};
    	goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};
    	goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse = function (a, b) {
    	    return (new goog.html.SafeHtml).initSecurityPrivateDoNotAccessOrElse_(a, b)
    	};
    	goog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_ = function (a, b) {
    	    this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ? goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createHTML(a) : a;
    	    this.dir_ = b;
    	    return this
    	};
    	goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse = function (a, b, c) {
    	    var d = null;
    	    var e = "<" + a + goog.html.SafeHtml.stringifyAttributes(a, b);
    	    null == c ? c = [] : Array.isArray(c) || (c = [c]);
    	    goog.dom.tags.isVoidTag(a.toLowerCase()) ? (goog.asserts.assert(!c.length, "Void tag <" + a + "> does not allow content."), e += ">") : (d = goog.html.SafeHtml.concat(c), e += ">" + goog.html.SafeHtml.unwrap(d) + "</" + a + ">", d = d.getDirection());
    	    (a = b && b.dir) && (d = /^(ltr|rtl|auto)$/i.test(a) ? goog.i18n.bidi.Dir.NEUTRAL : null);
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(e,
    	        d)
    	};
    	goog.html.SafeHtml.stringifyAttributes = function (a, b) {
    	    var c = "";
    	    if (b) for (var d in b) {
    	        if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(d)) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Invalid attribute name "' + d + '".' : "");
    	        var e = b[d];
    	        null != e && (c += " " + goog.html.SafeHtml.getAttrNameAndValue_(a, d, e));
    	    }
    	    return c
    	};
    	goog.html.SafeHtml.combineAttributes = function (a, b, c) {
    	    var d = {}, e;
    	    for (e in a) goog.asserts.assert(e.toLowerCase() == e, "Must be lower case"), d[e] = a[e];
    	    for (e in b) goog.asserts.assert(e.toLowerCase() == e, "Must be lower case"), d[e] = b[e];
    	    if (c) for (e in c) {
    	        var f = e.toLowerCase();
    	        if (f in a) throw Error(goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Cannot override "' + f + '" attribute, got "' + e + '" with value "' + c[e] + '"' : "");
    	        f in b && delete d[f];
    	        d[e] = c[e];
    	    }
    	    return d
    	};
    	goog.html.SafeHtml.DOCTYPE_HTML = goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<!DOCTYPE html>", goog.i18n.bidi.Dir.NEUTRAL);
    	goog.html.SafeHtml.EMPTY = goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("", goog.i18n.bidi.Dir.NEUTRAL);
    	goog.html.SafeHtml.BR = goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse("<br>", goog.i18n.bidi.Dir.NEUTRAL);
    	goog.html.uncheckedconversions = {};
    	goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract = function (a, b, c) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(b, c || null)
    	};
    	goog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract = function (a, b) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract = function (a, b) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.uncheckedconversions.safeStyleSheetFromStringKnownToSatisfyTypeContract = function (a, b) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract = function (a, b) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.html.uncheckedconversions.trustedResourceUrlFromStringKnownToSatisfyTypeContract = function (a, b) {
    	    goog.asserts.assertString(goog.string.Const.unwrap(a), "must provide justification");
    	    goog.asserts.assert(!goog.string.internal.isEmptyOrWhitespace(goog.string.Const.unwrap(a)), "must provide non-empty justification");
    	    return goog.html.TrustedResourceUrl.createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(b)
    	};
    	goog.dom.safe = {};
    	goog.dom.safe.InsertAdjacentHtmlPosition = {
    	    AFTERBEGIN: "afterbegin",
    	    AFTEREND: "afterend",
    	    BEFOREBEGIN: "beforebegin",
    	    BEFOREEND: "beforeend"
    	};
    	goog.dom.safe.insertAdjacentHtml = function (a, b, c) {
    	    a.insertAdjacentHTML(b, goog.html.SafeHtml.unwrapTrustedHTML(c));
    	};
    	goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_ = {MATH: !0, SCRIPT: !0, STYLE: !0, SVG: !0, TEMPLATE: !0};
    	goog.dom.safe.isInnerHtmlCleanupRecursive_ = goog.functions.cacheReturnValue(function () {
    	    if (goog.DEBUG && "undefined" === typeof document) return !1;
    	    var a = document.createElement("div"), b = document.createElement("div");
    	    b.appendChild(document.createElement("div"));
    	    a.appendChild(b);
    	    if (goog.DEBUG && !a.firstChild) return !1;
    	    b = a.firstChild.firstChild;
    	    a.innerHTML = goog.html.SafeHtml.unwrapTrustedHTML(goog.html.SafeHtml.EMPTY);
    	    return !b.parentElement
    	});
    	goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse = function (a, b) {
    	    if (goog.dom.safe.isInnerHtmlCleanupRecursive_()) for (; a.lastChild;) a.removeChild(a.lastChild);
    	    a.innerHTML = goog.html.SafeHtml.unwrapTrustedHTML(b);
    	};
    	goog.dom.safe.setInnerHtml = function (a, b) {
    	    if (goog.asserts.ENABLE_ASSERTS) {
    	        var c = a.tagName.toUpperCase();
    	        if (goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[c]) throw Error("goog.dom.safe.setInnerHtml cannot be used to set content of " + a.tagName + ".");
    	    }
    	    goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(a, b);
    	};
    	goog.dom.safe.setOuterHtml = function (a, b) {
    	    a.outerHTML = goog.html.SafeHtml.unwrapTrustedHTML(b);
    	};
    	goog.dom.safe.setFormElementAction = function (a, b) {
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    goog.dom.asserts.assertIsHTMLFormElement(a).action = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setButtonFormAction = function (a, b) {
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    goog.dom.asserts.assertIsHTMLButtonElement(a).formAction = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setInputFormAction = function (a, b) {
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    goog.dom.asserts.assertIsHTMLInputElement(a).formAction = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setStyle = function (a, b) {
    	    a.style.cssText = goog.html.SafeStyle.unwrap(b);
    	};
    	goog.dom.safe.documentWrite = function (a, b) {
    	    a.write(goog.html.SafeHtml.unwrapTrustedHTML(b));
    	};
    	goog.dom.safe.setAnchorHref = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLAnchorElement(a);
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    a.href = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setImageSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLImageElement(a);
    	    if (!(b instanceof goog.html.SafeUrl)) {
    	        var c = /^data:image\//i.test(b);
    	        b = goog.html.SafeUrl.sanitizeAssertUnchanged(b, c);
    	    }
    	    a.src = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setAudioSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLAudioElement(a);
    	    if (!(b instanceof goog.html.SafeUrl)) {
    	        var c = /^data:audio\//i.test(b);
    	        b = goog.html.SafeUrl.sanitizeAssertUnchanged(b, c);
    	    }
    	    a.src = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setVideoSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLVideoElement(a);
    	    if (!(b instanceof goog.html.SafeUrl)) {
    	        var c = /^data:video\//i.test(b);
    	        b = goog.html.SafeUrl.sanitizeAssertUnchanged(b, c);
    	    }
    	    a.src = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.setEmbedSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLEmbedElement(a);
    	    a.src = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);
    	};
    	goog.dom.safe.setFrameSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLFrameElement(a);
    	    a.src = goog.html.TrustedResourceUrl.unwrap(b);
    	};
    	goog.dom.safe.setIframeSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLIFrameElement(a);
    	    a.src = goog.html.TrustedResourceUrl.unwrap(b);
    	};
    	goog.dom.safe.setIframeSrcdoc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLIFrameElement(a);
    	    a.srcdoc = goog.html.SafeHtml.unwrapTrustedHTML(b);
    	};
    	goog.dom.safe.setLinkHrefAndRel = function (a, b, c) {
    	    goog.dom.asserts.assertIsHTMLLinkElement(a);
    	    a.rel = c;
    	    goog.string.internal.caseInsensitiveContains(c, "stylesheet") ? (goog.asserts.assert(b instanceof goog.html.TrustedResourceUrl, 'URL must be TrustedResourceUrl because "rel" contains "stylesheet"'), a.href = goog.html.TrustedResourceUrl.unwrap(b)) : a.href = b instanceof goog.html.TrustedResourceUrl ? goog.html.TrustedResourceUrl.unwrap(b) : b instanceof goog.html.SafeUrl ? goog.html.SafeUrl.unwrap(b) : goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitizeAssertUnchanged(b));
    	};
    	goog.dom.safe.setObjectData = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLObjectElement(a);
    	    a.data = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);
    	};
    	goog.dom.safe.setScriptSrc = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLScriptElement(a);
    	    a.src = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(b);
    	    (b = goog.getScriptNonce()) && a.setAttribute("nonce", b);
    	};
    	goog.dom.safe.setScriptContent = function (a, b) {
    	    goog.dom.asserts.assertIsHTMLScriptElement(a);
    	    a.text = goog.html.SafeScript.unwrapTrustedScript(b);
    	    (b = goog.getScriptNonce()) && a.setAttribute("nonce", b);
    	};
    	goog.dom.safe.setLocationHref = function (a, b) {
    	    goog.dom.asserts.assertIsLocation(a);
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    a.href = goog.html.SafeUrl.unwrap(b);
    	};
    	goog.dom.safe.assignLocation = function (a, b) {
    	    goog.dom.asserts.assertIsLocation(a);
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    a.assign(goog.html.SafeUrl.unwrap(b));
    	};
    	goog.dom.safe.replaceLocation = function (a, b) {
    	    b = b instanceof goog.html.SafeUrl ? b : goog.html.SafeUrl.sanitizeAssertUnchanged(b);
    	    a.replace(goog.html.SafeUrl.unwrap(b));
    	};
    	goog.dom.safe.openInWindow = function (a, b, c, d, e) {
    	    a = a instanceof goog.html.SafeUrl ? a : goog.html.SafeUrl.sanitizeAssertUnchanged(a);
    	    b = b || goog.global;
    	    c = c instanceof goog.string.Const ? goog.string.Const.unwrap(c) : c || "";
    	    return b.open(goog.html.SafeUrl.unwrap(a), c, d, e)
    	};
    	goog.dom.safe.parseFromStringHtml = function (a, b) {
    	    return goog.dom.safe.parseFromString(a, b, "text/html")
    	};
    	goog.dom.safe.parseFromString = function (a, b, c) {
    	    return a.parseFromString(goog.html.SafeHtml.unwrapTrustedHTML(b), c)
    	};
    	goog.dom.safe.createImageFromBlob = function (a) {
    	    if (!/^image\/.*/g.test(a.type)) throw Error("goog.dom.safe.createImageFromBlob only accepts MIME type image/.*.");
    	    var b = goog.global.URL.createObjectURL(a);
    	    a = new goog.global.Image;
    	    a.onload = function () {
    	        goog.global.URL.revokeObjectURL(b);
    	    };
    	    goog.dom.safe.setImageSrc(a, goog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Image blob URL."), b));
    	    return a
    	};
    	goog.string.DETECT_DOUBLE_ESCAPING = !1;
    	goog.string.FORCE_NON_DOM_HTML_UNESCAPING = !1;
    	goog.string.Unicode = {NBSP: "\u00a0"};
    	goog.string.startsWith = goog.string.internal.startsWith;
    	goog.string.endsWith = goog.string.internal.endsWith;
    	goog.string.caseInsensitiveStartsWith = goog.string.internal.caseInsensitiveStartsWith;
    	goog.string.caseInsensitiveEndsWith = goog.string.internal.caseInsensitiveEndsWith;
    	goog.string.caseInsensitiveEquals = goog.string.internal.caseInsensitiveEquals;
    	goog.string.subs = function (a, b) {
    	    for (var c = a.split("%s"), d = "", e = Array.prototype.slice.call(arguments, 1); e.length && 1 < c.length;) d += c.shift() + e.shift();
    	    return d + c.join("%s")
    	};
    	goog.string.collapseWhitespace = function (a) {
    	    return a.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, "")
    	};
    	goog.string.isEmptyOrWhitespace = goog.string.internal.isEmptyOrWhitespace;
    	goog.string.isEmptyString = function (a) {
    	    return 0 == a.length
    	};
    	goog.string.isEmpty = goog.string.isEmptyOrWhitespace;
    	goog.string.isEmptyOrWhitespaceSafe = function (a) {
    	    return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(a))
    	};
    	goog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;
    	goog.string.isBreakingWhitespace = function (a) {
    	    return !/[^\t\n\r ]/.test(a)
    	};
    	goog.string.isAlpha = function (a) {
    	    return !/[^a-zA-Z]/.test(a)
    	};
    	goog.string.isNumeric = function (a) {
    	    return !/[^0-9]/.test(a)
    	};
    	goog.string.isAlphaNumeric = function (a) {
    	    return !/[^a-zA-Z0-9]/.test(a)
    	};
    	goog.string.isSpace = function (a) {
    	    return " " == a
    	};
    	goog.string.isUnicodeChar = function (a) {
    	    return 1 == a.length && " " <= a && "~" >= a || "\u0080" <= a && "\ufffd" >= a
    	};
    	goog.string.stripNewlines = function (a) {
    	    return a.replace(/(\r\n|\r|\n)+/g, " ")
    	};
    	goog.string.canonicalizeNewlines = function (a) {
    	    return a.replace(/(\r\n|\r|\n)/g, "\n")
    	};
    	goog.string.normalizeWhitespace = function (a) {
    	    return a.replace(/\xa0|\s/g, " ")
    	};
    	goog.string.normalizeSpaces = function (a) {
    	    return a.replace(/\xa0|[ \t]+/g, " ")
    	};
    	goog.string.collapseBreakingSpaces = function (a) {
    	    return a.replace(/[\t\r\n ]+/g, " ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, "")
    	};
    	goog.string.trim = goog.string.internal.trim;
    	goog.string.trimLeft = function (a) {
    	    return a.replace(/^[\s\xa0]+/, "")
    	};
    	goog.string.trimRight = function (a) {
    	    return a.replace(/[\s\xa0]+$/, "")
    	};
    	goog.string.caseInsensitiveCompare = goog.string.internal.caseInsensitiveCompare;
    	goog.string.numberAwareCompare_ = function (a, b, c) {
    	    if (a == b) return 0;
    	    if (!a) return -1;
    	    if (!b) return 1;
    	    for (var d = a.toLowerCase().match(c), e = b.toLowerCase().match(c), f = Math.min(d.length, e.length), g = 0; g < f; g++) {
    	        c = d[g];
    	        var h = e[g];
    	        if (c != h) return a = parseInt(c, 10), !isNaN(a) && (b = parseInt(h, 10), !isNaN(b) && a - b) ? a - b : c < h ? -1 : 1
    	    }
    	    return d.length != e.length ? d.length - e.length : a < b ? -1 : 1
    	};
    	goog.string.intAwareCompare = function (a, b) {
    	    return goog.string.numberAwareCompare_(a, b, /\d+|\D+/g)
    	};
    	goog.string.floatAwareCompare = function (a, b) {
    	    return goog.string.numberAwareCompare_(a, b, /\d+|\.\d+|\D+/g)
    	};
    	goog.string.numerateCompare = goog.string.floatAwareCompare;
    	goog.string.urlEncode = function (a) {
    	    return encodeURIComponent(String(a))
    	};
    	goog.string.urlDecode = function (a) {
    	    return decodeURIComponent(a.replace(/\+/g, " "))
    	};
    	goog.string.newLineToBr = goog.string.internal.newLineToBr;
    	goog.string.htmlEscape = function (a, b) {
    	    a = goog.string.internal.htmlEscape(a, b);
    	    goog.string.DETECT_DOUBLE_ESCAPING && (a = a.replace(goog.string.E_RE_, "&#101;"));
    	    return a
    	};
    	goog.string.E_RE_ = /e/g;
    	goog.string.unescapeEntities = function (a) {
    	    return goog.string.contains(a, "&") ? !goog.string.FORCE_NON_DOM_HTML_UNESCAPING && "document" in goog.global ? goog.string.unescapeEntitiesUsingDom_(a) : goog.string.unescapePureXmlEntities_(a) : a
    	};
    	goog.string.unescapeEntitiesWithDocument = function (a, b) {
    	    return goog.string.contains(a, "&") ? goog.string.unescapeEntitiesUsingDom_(a, b) : a
    	};
    	goog.string.unescapeEntitiesUsingDom_ = function (a, b) {
    	    var c = {"&amp;": "&", "&lt;": "<", "&gt;": ">", "&quot;": '"'};
    	    var d = b ? b.createElement("div") : goog.global.document.createElement("div");
    	    return a.replace(goog.string.HTML_ENTITY_PATTERN_, function (a, b) {
    	        var e = c[a];
    	        if (e) return e;
    	        "#" == b.charAt(0) && (b = Number("0" + b.substr(1)), isNaN(b) || (e = String.fromCharCode(b)));
    	        e || (goog.dom.safe.setInnerHtml(d, goog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(goog.string.Const.from("Single HTML entity."),
    	            a + " ")), e = d.firstChild.nodeValue.slice(0, -1));
    	        return c[a] = e
    	    })
    	};
    	goog.string.unescapePureXmlEntities_ = function (a) {
    	    return a.replace(/&([^;]+);/g, function (a, c) {
    	        switch (c) {
    	            case "amp":
    	                return "&";
    	            case "lt":
    	                return "<";
    	            case "gt":
    	                return ">";
    	            case "quot":
    	                return '"';
    	            default:
    	                return "#" != c.charAt(0) || (c = Number("0" + c.substr(1)), isNaN(c)) ? a : String.fromCharCode(c)
    	        }
    	    })
    	};
    	goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g;
    	goog.string.whitespaceEscape = function (a, b) {
    	    return goog.string.newLineToBr(a.replace(/  /g, " &#160;"), b)
    	};
    	goog.string.preserveSpaces = function (a) {
    	    return a.replace(/(^|[\n ]) /g, "$1" + goog.string.Unicode.NBSP)
    	};
    	goog.string.stripQuotes = function (a, b) {
    	    for (var c = b.length, d = 0; d < c; d++) {
    	        var e = 1 == c ? b : b.charAt(d);
    	        if (a.charAt(0) == e && a.charAt(a.length - 1) == e) return a.substring(1, a.length - 1)
    	    }
    	    return a
    	};
    	goog.string.truncate = function (a, b, c) {
    	    c && (a = goog.string.unescapeEntities(a));
    	    a.length > b && (a = a.substring(0, b - 3) + "...");
    	    c && (a = goog.string.htmlEscape(a));
    	    return a
    	};
    	goog.string.truncateMiddle = function (a, b, c, d) {
    	    c && (a = goog.string.unescapeEntities(a));
    	    if (d && a.length > b) {
    	        d > b && (d = b);
    	        var e = a.length - d;
    	        a = a.substring(0, b - d) + "..." + a.substring(e);
    	    } else a.length > b && (d = Math.floor(b / 2), e = a.length - d, a = a.substring(0, d + b % 2) + "..." + a.substring(e));
    	    c && (a = goog.string.htmlEscape(a));
    	    return a
    	};
    	goog.string.specialEscapeChars_ = {
    	    "\x00": "\\0",
    	    "\b": "\\b",
    	    "\f": "\\f",
    	    "\n": "\\n",
    	    "\r": "\\r",
    	    "\t": "\\t",
    	    "\x0B": "\\x0B",
    	    '"': '\\"',
    	    "\\": "\\\\",
    	    "<": "\\u003C"
    	};
    	goog.string.jsEscapeCache_ = {"'": "\\'"};
    	goog.string.quote = function (a) {
    	    a = String(a);
    	    for (var b = ['"'], c = 0; c < a.length; c++) {
    	        var d = a.charAt(c), e = d.charCodeAt(0);
    	        b[c + 1] = goog.string.specialEscapeChars_[d] || (31 < e && 127 > e ? d : goog.string.escapeChar(d));
    	    }
    	    b.push('"');
    	    return b.join("")
    	};
    	goog.string.escapeString = function (a) {
    	    for (var b = [], c = 0; c < a.length; c++) b[c] = goog.string.escapeChar(a.charAt(c));
    	    return b.join("")
    	};
    	goog.string.escapeChar = function (a) {
    	    if (a in goog.string.jsEscapeCache_) return goog.string.jsEscapeCache_[a];
    	    if (a in goog.string.specialEscapeChars_) return goog.string.jsEscapeCache_[a] = goog.string.specialEscapeChars_[a];
    	    var b = a.charCodeAt(0);
    	    if (31 < b && 127 > b) var c = a; else {
    	        if (256 > b) {
    	            if (c = "\\x", 16 > b || 256 < b) c += "0";
    	        } else c = "\\u", 4096 > b && (c += "0");
    	        c += b.toString(16).toUpperCase();
    	    }
    	    return goog.string.jsEscapeCache_[a] = c
    	};
    	goog.string.contains = goog.string.internal.contains;
    	goog.string.caseInsensitiveContains = goog.string.internal.caseInsensitiveContains;
    	goog.string.countOf = function (a, b) {
    	    return a && b ? a.split(b).length - 1 : 0
    	};
    	goog.string.removeAt = function (a, b, c) {
    	    var d = a;
    	    0 <= b && b < a.length && 0 < c && (d = a.substr(0, b) + a.substr(b + c, a.length - b - c));
    	    return d
    	};
    	goog.string.remove = function (a, b) {
    	    return a.replace(b, "")
    	};
    	goog.string.removeAll = function (a, b) {
    	    b = new RegExp(goog.string.regExpEscape(b), "g");
    	    return a.replace(b, "")
    	};
    	goog.string.replaceAll = function (a, b, c) {
    	    b = new RegExp(goog.string.regExpEscape(b), "g");
    	    return a.replace(b, c.replace(/\$/g, "$$$$"))
    	};
    	goog.string.regExpEscape = function (a) {
    	    return String(a).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08")
    	};
    	goog.string.repeat = String.prototype.repeat ? function (a, b) {
    	    return a.repeat(b)
    	} : function (a, b) {
    	    return Array(b + 1).join(a)
    	};
    	goog.string.padNumber = function (a, b, c) {
    	    a = void 0 !== c ? a.toFixed(c) : String(a);
    	    c = a.indexOf(".");
    	    -1 == c && (c = a.length);
    	    return goog.string.repeat("0", Math.max(0, b - c)) + a
    	};
    	goog.string.makeSafe = function (a) {
    	    return null == a ? "" : String(a)
    	};
    	goog.string.buildString = function (a) {
    	    return Array.prototype.join.call(arguments, "")
    	};
    	goog.string.getRandomString = function () {
    	    return Math.floor(2147483648 * Math.random()).toString(36) + Math.abs(Math.floor(2147483648 * Math.random()) ^ goog.now()).toString(36)
    	};
    	goog.string.compareVersions = goog.string.internal.compareVersions;
    	goog.string.hashCode = function (a) {
    	    for (var b = 0, c = 0; c < a.length; ++c) b = 31 * b + a.charCodeAt(c) >>> 0;
    	    return b
    	};
    	goog.string.uniqueStringCounter_ = 2147483648 * Math.random() | 0;
    	goog.string.createUniqueString = function () {
    	    return "goog_" + goog.string.uniqueStringCounter_++
    	};
    	goog.string.toNumber = function (a) {
    	    var b = Number(a);
    	    return 0 == b && goog.string.isEmptyOrWhitespace(a) ? NaN : b
    	};
    	goog.string.isLowerCamelCase = function (a) {
    	    return /^[a-z]+([A-Z][a-z]*)*$/.test(a)
    	};
    	goog.string.isUpperCamelCase = function (a) {
    	    return /^([A-Z][a-z]*)+$/.test(a)
    	};
    	goog.string.toCamelCase = function (a) {
    	    return String(a).replace(/\-([a-z])/g, function (a, c) {
    	        return c.toUpperCase()
    	    })
    	};
    	goog.string.toSelectorCase = function (a) {
    	    return String(a).replace(/([A-Z])/g, "-$1").toLowerCase()
    	};
    	goog.string.toTitleCase = function (a, b) {
    	    b = "string" === typeof b ? goog.string.regExpEscape(b) : "\\s";
    	    return a.replace(new RegExp("(^" + (b ? "|[" + b + "]+" : "") + ")([a-z])", "g"), function (a, b, e) {
    	        return b + e.toUpperCase()
    	    })
    	};
    	goog.string.capitalize = function (a) {
    	    return String(a.charAt(0)).toUpperCase() + String(a.substr(1)).toLowerCase()
    	};
    	goog.string.parseInt = function (a) {
    	    isFinite(a) && (a = String(a));
    	    return "string" === typeof a ? /^\s*-?0x/i.test(a) ? parseInt(a, 16) : parseInt(a, 10) : NaN
    	};
    	goog.string.splitLimit = function (a, b, c) {
    	    a = a.split(b);
    	    for (var d = []; 0 < c && a.length;) d.push(a.shift()), c--;
    	    a.length && d.push(a.join(b));
    	    return d
    	};
    	goog.string.lastComponent = function (a, b) {
    	    if (b) "string" == typeof b && (b = [b]); else return a;
    	    for (var c = -1, d = 0; d < b.length; d++) if ("" != b[d]) {
    	        var e = a.lastIndexOf(b[d]);
    	        e > c && (c = e);
    	    }
    	    return -1 == c ? a : a.slice(c + 1)
    	};
    	goog.string.editDistance = function (a, b) {
    	    var c = [], d = [];
    	    if (a == b) return 0;
    	    if (!a.length || !b.length) return Math.max(a.length, b.length);
    	    for (var e = 0; e < b.length + 1; e++) c[e] = e;
    	    for (e = 0; e < a.length; e++) {
    	        d[0] = e + 1;
    	        for (var f = 0; f < b.length; f++) d[f + 1] = Math.min(d[f] + 1, c[f + 1] + 1, c[f] + Number(a[e] != b[f]));
    	        for (f = 0; f < c.length; f++) c[f] = d[f];
    	    }
    	    return d[b.length]
    	};
    	goog.labs.userAgent.engine = {};
    	goog.labs.userAgent.engine.isPresto = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Presto")
    	};
    	goog.labs.userAgent.engine.isTrident = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Trident") || goog.labs.userAgent.util.matchUserAgent("MSIE")
    	};
    	goog.labs.userAgent.engine.isEdge = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Edge")
    	};
    	goog.labs.userAgent.engine.isWebKit = function () {
    	    return goog.labs.userAgent.util.matchUserAgentIgnoreCase("WebKit") && !goog.labs.userAgent.engine.isEdge()
    	};
    	goog.labs.userAgent.engine.isGecko = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Gecko") && !goog.labs.userAgent.engine.isWebKit() && !goog.labs.userAgent.engine.isTrident() && !goog.labs.userAgent.engine.isEdge()
    	};
    	goog.labs.userAgent.engine.getVersion = function () {
    	    var a = goog.labs.userAgent.util.getUserAgent();
    	    if (a) {
    	        a = goog.labs.userAgent.util.extractVersionTuples(a);
    	        var b = goog.labs.userAgent.engine.getEngineTuple_(a);
    	        if (b) return "Gecko" == b[0] ? goog.labs.userAgent.engine.getVersionForKey_(a, "Firefox") : b[1];
    	        a = a[0];
    	        var c;
    	        if (a && (c = a[2]) && (c = /Trident\/([^\s;]+)/.exec(c))) return c[1]
    	    }
    	    return ""
    	};
    	goog.labs.userAgent.engine.getEngineTuple_ = function (a) {
    	    if (!goog.labs.userAgent.engine.isEdge()) return a[1];
    	    for (var b = 0; b < a.length; b++) {
    	        var c = a[b];
    	        if ("Edge" == c[0]) return c
    	    }
    	};
    	goog.labs.userAgent.engine.isVersionOrHigher = function (a) {
    	    return 0 <= goog.string.compareVersions(goog.labs.userAgent.engine.getVersion(), a)
    	};
    	goog.labs.userAgent.engine.getVersionForKey_ = function (a, b) {
    	    return (a = goog.array.find(a, function (a) {
    	        return b == a[0]
    	    })) && a[1] || ""
    	};
    	goog.labs.userAgent.platform = {};
    	goog.labs.userAgent.platform.isAndroid = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Android")
    	};
    	goog.labs.userAgent.platform.isIpod = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("iPod")
    	};
    	goog.labs.userAgent.platform.isIphone = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("iPhone") && !goog.labs.userAgent.util.matchUserAgent("iPod") && !goog.labs.userAgent.util.matchUserAgent("iPad")
    	};
    	goog.labs.userAgent.platform.isIpad = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("iPad")
    	};
    	goog.labs.userAgent.platform.isIos = function () {
    	    return goog.labs.userAgent.platform.isIphone() || goog.labs.userAgent.platform.isIpad() || goog.labs.userAgent.platform.isIpod()
    	};
    	goog.labs.userAgent.platform.isMacintosh = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Macintosh")
    	};
    	goog.labs.userAgent.platform.isLinux = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Linux")
    	};
    	goog.labs.userAgent.platform.isWindows = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("Windows")
    	};
    	goog.labs.userAgent.platform.isChromeOS = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("CrOS")
    	};
    	goog.labs.userAgent.platform.isChromecast = function () {
    	    return goog.labs.userAgent.util.matchUserAgent("CrKey")
    	};
    	goog.labs.userAgent.platform.isKaiOS = function () {
    	    return goog.labs.userAgent.util.matchUserAgentIgnoreCase("KaiOS")
    	};
    	goog.labs.userAgent.platform.getVersion = function () {
    	    var a = goog.labs.userAgent.util.getUserAgent(), b = "";
    	    goog.labs.userAgent.platform.isWindows() ? (b = /Windows (?:NT|Phone) ([0-9.]+)/, b = (a = b.exec(a)) ? a[1] : "0.0") : goog.labs.userAgent.platform.isIos() ? (b = /(?:iPhone|iPod|iPad|CPU)\s+OS\s+(\S+)/, b = (a = b.exec(a)) && a[1].replace(/_/g, ".")) : goog.labs.userAgent.platform.isMacintosh() ? (b = /Mac OS X ([0-9_.]+)/, b = (a = b.exec(a)) ? a[1].replace(/_/g, ".") : "10") : goog.labs.userAgent.platform.isKaiOS() ? (b = /(?:KaiOS)\/(\S+)/i,
    	        b = (a = b.exec(a)) && a[1]) : goog.labs.userAgent.platform.isAndroid() ? (b = /Android\s+([^\);]+)(\)|;)/, b = (a = b.exec(a)) && a[1]) : goog.labs.userAgent.platform.isChromeOS() && (b = /(?:CrOS\s+(?:i686|x86_64)\s+([0-9.]+))/, b = (a = b.exec(a)) && a[1]);
    	    return b || ""
    	};
    	goog.labs.userAgent.platform.isVersionOrHigher = function (a) {
    	    return 0 <= goog.string.compareVersions(goog.labs.userAgent.platform.getVersion(), a)
    	};
    	goog.reflect = {};
    	goog.reflect.object = function (a, b) {
    	    return b
    	};
    	goog.reflect.objectProperty = function (a, b) {
    	    return a
    	};
    	goog.reflect.sinkValue = function (a) {
    	    goog.reflect.sinkValue[" "](a);
    	    return a
    	};
    	goog.reflect.sinkValue[" "] = goog.nullFunction;
    	goog.reflect.canAccessProperty = function (a, b) {
    	    try {
    	        return goog.reflect.sinkValue(a[b]), !0
    	    } catch (c) {
    	    }
    	    return !1
    	};
    	goog.reflect.cache = function (a, b, c, d) {
    	    d = d ? d(b) : b;
    	    return Object.prototype.hasOwnProperty.call(a, d) ? a[d] : a[d] = c(b)
    	};
    	goog.userAgent = {};
    	goog.userAgent.ASSUME_IE = !1;
    	goog.userAgent.ASSUME_EDGE = !1;
    	goog.userAgent.ASSUME_GECKO = !1;
    	goog.userAgent.ASSUME_WEBKIT = !1;
    	goog.userAgent.ASSUME_MOBILE_WEBKIT = !1;
    	goog.userAgent.ASSUME_OPERA = !1;
    	goog.userAgent.ASSUME_ANY_VERSION = !1;
    	goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE || goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_GECKO || goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_OPERA;
    	goog.userAgent.getUserAgentString = function () {
    	    return goog.labs.userAgent.util.getUserAgent()
    	};
    	goog.userAgent.getNavigatorTyped = function () {
    	    return goog.global.navigator || null
    	};
    	goog.userAgent.getNavigator = function () {
    	    return goog.userAgent.getNavigatorTyped()
    	};
    	goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_OPERA : goog.labs.userAgent.browser.isOpera();
    	goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_IE : goog.labs.userAgent.browser.isIE();
    	goog.userAgent.EDGE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_EDGE : goog.labs.userAgent.engine.isEdge();
    	goog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;
    	goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_GECKO : goog.labs.userAgent.engine.isGecko();
    	goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT : goog.labs.userAgent.engine.isWebKit();
    	goog.userAgent.isMobile_ = function () {
    	    return goog.userAgent.WEBKIT && goog.labs.userAgent.util.matchUserAgent("Mobile")
    	};
    	goog.userAgent.MOBILE = goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();
    	goog.userAgent.SAFARI = goog.userAgent.WEBKIT;
    	goog.userAgent.determinePlatform_ = function () {
    	    var a = goog.userAgent.getNavigatorTyped();
    	    return a && a.platform || ""
    	};
    	goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();
    	goog.userAgent.ASSUME_MAC = !1;
    	goog.userAgent.ASSUME_WINDOWS = !1;
    	goog.userAgent.ASSUME_LINUX = !1;
    	goog.userAgent.ASSUME_X11 = !1;
    	goog.userAgent.ASSUME_ANDROID = !1;
    	goog.userAgent.ASSUME_IPHONE = !1;
    	goog.userAgent.ASSUME_IPAD = !1;
    	goog.userAgent.ASSUME_IPOD = !1;
    	goog.userAgent.ASSUME_KAIOS = !1;
    	goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC || goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX || goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID || goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD || goog.userAgent.ASSUME_IPOD;
    	goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.labs.userAgent.platform.isMacintosh();
    	goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.labs.userAgent.platform.isWindows();
    	goog.userAgent.isLegacyLinux_ = function () {
    	    return goog.labs.userAgent.platform.isLinux() || goog.labs.userAgent.platform.isChromeOS()
    	};
    	goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.isLegacyLinux_();
    	goog.userAgent.isX11_ = function () {
    	    var a = goog.userAgent.getNavigatorTyped();
    	    return !!a && goog.string.contains(a.appVersion || "", "X11")
    	};
    	goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.isX11_();
    	goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.labs.userAgent.platform.isAndroid();
    	goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.labs.userAgent.platform.isIphone();
    	goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.labs.userAgent.platform.isIpad();
    	goog.userAgent.IPOD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPOD : goog.labs.userAgent.platform.isIpod();
    	goog.userAgent.IOS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD || goog.userAgent.ASSUME_IPOD : goog.labs.userAgent.platform.isIos();
    	goog.userAgent.KAIOS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_KAIOS : goog.labs.userAgent.platform.isKaiOS();
    	goog.userAgent.determineVersion_ = function () {
    	    var a = "", b = goog.userAgent.getVersionRegexResult_();
    	    b && (a = b ? b[1] : "");
    	    return goog.userAgent.IE && (b = goog.userAgent.getDocumentMode_(), null != b && b > parseFloat(a)) ? String(b) : a
    	};
    	goog.userAgent.getVersionRegexResult_ = function () {
    	    var a = goog.userAgent.getUserAgentString();
    	    if (goog.userAgent.GECKO) return /rv:([^\);]+)(\)|;)/.exec(a);
    	    if (goog.userAgent.EDGE) return /Edge\/([\d\.]+)/.exec(a);
    	    if (goog.userAgent.IE) return /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);
    	    if (goog.userAgent.WEBKIT) return /WebKit\/(\S+)/.exec(a);
    	    if (goog.userAgent.OPERA) return /(?:Version)[ \/]?(\S+)/.exec(a)
    	};
    	goog.userAgent.getDocumentMode_ = function () {
    	    var a = goog.global.document;
    	    return a ? a.documentMode : void 0
    	};
    	goog.userAgent.VERSION = goog.userAgent.determineVersion_();
    	goog.userAgent.compare = function (a, b) {
    	    return goog.string.compareVersions(a, b)
    	};
    	goog.userAgent.isVersionOrHigherCache_ = {};
    	goog.userAgent.isVersionOrHigher = function (a) {
    	    return goog.userAgent.ASSUME_ANY_VERSION || goog.reflect.cache(goog.userAgent.isVersionOrHigherCache_, a, function () {
    	        return 0 <= goog.string.compareVersions(goog.userAgent.VERSION, a)
    	    })
    	};
    	goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;
    	goog.userAgent.isDocumentModeOrHigher = function (a) {
    	    return Number(goog.userAgent.DOCUMENT_MODE) >= a
    	};
    	goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;
    	goog.userAgent.DOCUMENT_MODE = function () {
    	    if (goog.global.document && goog.userAgent.IE) {
    	        var a = goog.userAgent.getDocumentMode_();
    	        return a ? a : parseInt(goog.userAgent.VERSION, 10) || void 0
    	    }
    	}();
    	goog.userAgent.product = {};
    	goog.userAgent.product.ASSUME_FIREFOX = !1;
    	goog.userAgent.product.ASSUME_IPHONE = !1;
    	goog.userAgent.product.ASSUME_IPAD = !1;
    	goog.userAgent.product.ASSUME_ANDROID = !1;
    	goog.userAgent.product.ASSUME_CHROME = !1;
    	goog.userAgent.product.ASSUME_SAFARI = !1;
    	goog.userAgent.product.PRODUCT_KNOWN_ = goog.userAgent.ASSUME_IE || goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_OPERA || goog.userAgent.product.ASSUME_FIREFOX || goog.userAgent.product.ASSUME_IPHONE || goog.userAgent.product.ASSUME_IPAD || goog.userAgent.product.ASSUME_ANDROID || goog.userAgent.product.ASSUME_CHROME || goog.userAgent.product.ASSUME_SAFARI;
    	goog.userAgent.product.OPERA = goog.userAgent.OPERA;
    	goog.userAgent.product.IE = goog.userAgent.IE;
    	goog.userAgent.product.EDGE = goog.userAgent.EDGE;
    	goog.userAgent.product.FIREFOX = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_FIREFOX : goog.labs.userAgent.browser.isFirefox();
    	goog.userAgent.product.isIphoneOrIpod_ = function () {
    	    return goog.labs.userAgent.platform.isIphone() || goog.labs.userAgent.platform.isIpod()
    	};
    	goog.userAgent.product.IPHONE = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_IPHONE : goog.userAgent.product.isIphoneOrIpod_();
    	goog.userAgent.product.IPAD = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_IPAD : goog.labs.userAgent.platform.isIpad();
    	goog.userAgent.product.ANDROID = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_ANDROID : goog.labs.userAgent.browser.isAndroidBrowser();
    	goog.userAgent.product.CHROME = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_CHROME : goog.labs.userAgent.browser.isChrome();
    	goog.userAgent.product.isSafariDesktop_ = function () {
    	    return goog.labs.userAgent.browser.isSafari() && !goog.labs.userAgent.platform.isIos()
    	};
    	goog.userAgent.product.SAFARI = goog.userAgent.product.PRODUCT_KNOWN_ ? goog.userAgent.product.ASSUME_SAFARI : goog.userAgent.product.isSafariDesktop_();
    	goog.crypt.base64 = {};
    	goog.crypt.base64.DEFAULT_ALPHABET_COMMON_ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    	goog.crypt.base64.ENCODED_VALS = goog.crypt.base64.DEFAULT_ALPHABET_COMMON_ + "+/=";
    	goog.crypt.base64.ENCODED_VALS_WEBSAFE = goog.crypt.base64.DEFAULT_ALPHABET_COMMON_ + "-_.";
    	goog.crypt.base64.Alphabet = {DEFAULT: 0, NO_PADDING: 1, WEBSAFE: 2, WEBSAFE_DOT_PADDING: 3, WEBSAFE_NO_PADDING: 4};
    	goog.crypt.base64.paddingChars_ = "=.";
    	goog.crypt.base64.isPadding_ = function (a) {
    	    return goog.string.contains(goog.crypt.base64.paddingChars_, a)
    	};
    	goog.crypt.base64.byteToCharMaps_ = {};
    	goog.crypt.base64.charToByteMap_ = null;
    	goog.crypt.base64.ASSUME_NATIVE_SUPPORT_ = goog.userAgent.GECKO || goog.userAgent.WEBKIT && !goog.userAgent.product.SAFARI || goog.userAgent.OPERA;
    	goog.crypt.base64.HAS_NATIVE_ENCODE_ = goog.crypt.base64.ASSUME_NATIVE_SUPPORT_ || "function" == typeof goog.global.btoa;
    	goog.crypt.base64.HAS_NATIVE_DECODE_ = goog.crypt.base64.ASSUME_NATIVE_SUPPORT_ || !goog.userAgent.product.SAFARI && !goog.userAgent.IE && "function" == typeof goog.global.atob;
    	goog.crypt.base64.encodeByteArray = function (a, b) {
    	    goog.asserts.assert(goog.isArrayLike(a), "encodeByteArray takes an array as a parameter");
    	    void 0 === b && (b = goog.crypt.base64.Alphabet.DEFAULT);
    	    goog.crypt.base64.init_();
    	    b = goog.crypt.base64.byteToCharMaps_[b];
    	    for (var c = [], d = 0; d < a.length; d += 3) {
    	        var e = a[d], f = d + 1 < a.length, g = f ? a[d + 1] : 0, h = d + 2 < a.length, k = h ? a[d + 2] : 0,
    	            l = e >> 2;
    	        e = (e & 3) << 4 | g >> 4;
    	        g = (g & 15) << 2 | k >> 6;
    	        k &= 63;
    	        h || (k = 64, f || (g = 64));
    	        c.push(b[l], b[e], b[g] || "", b[k] || "");
    	    }
    	    return c.join("")
    	};
    	goog.crypt.base64.encodeString = function (a, b) {
    	    return goog.crypt.base64.HAS_NATIVE_ENCODE_ && !b ? goog.global.btoa(a) : goog.crypt.base64.encodeByteArray(goog.crypt.stringToByteArray(a), b)
    	};
    	goog.crypt.base64.decodeString = function (a, b) {
    	    if (goog.crypt.base64.HAS_NATIVE_DECODE_ && !b) return goog.global.atob(a);
    	    var c = "";
    	    goog.crypt.base64.decodeStringInternal_(a, function (a) {
    	        c += String.fromCharCode(a);
    	    });
    	    return c
    	};
    	goog.crypt.base64.decodeStringToByteArray = function (a, b) {
    	    var c = [];
    	    goog.crypt.base64.decodeStringInternal_(a, function (a) {
    	        c.push(a);
    	    });
    	    return c
    	};
    	goog.crypt.base64.decodeStringToUint8Array = function (a) {
    	    goog.asserts.assert(!goog.userAgent.IE || goog.userAgent.isVersionOrHigher("10"), "Browser does not support typed arrays");
    	    var b = a.length, c = 3 * b / 4;
    	    c % 3 ? c = Math.floor(c) : goog.crypt.base64.isPadding_(a[b - 1]) && (c = goog.crypt.base64.isPadding_(a[b - 2]) ? c - 2 : c - 1);
    	    var d = new Uint8Array(c), e = 0;
    	    goog.crypt.base64.decodeStringInternal_(a, function (a) {
    	        d[e++] = a;
    	    });
    	    return d.subarray(0, e)
    	};
    	goog.crypt.base64.decodeStringInternal_ = function (a, b) {
    	    function c(b) {
    	        for (; d < a.length;) {
    	            var c = a.charAt(d++), e = goog.crypt.base64.charToByteMap_[c];
    	            if (null != e) return e;
    	            if (!goog.string.isEmptyOrWhitespace(c)) throw Error("Unknown base64 encoding at char: " + c);
    	        }
    	        return b
    	    }

    	    goog.crypt.base64.init_();
    	    for (var d = 0; ;) {
    	        var e = c(-1), f = c(0), g = c(64), h = c(64);
    	        if (64 === h && -1 === e) break;
    	        b(e << 2 | f >> 4);
    	        64 != g && (b(f << 4 & 240 | g >> 2), 64 != h && b(g << 6 & 192 | h));
    	    }
    	};
    	goog.crypt.base64.init_ = function () {
    	    if (!goog.crypt.base64.charToByteMap_) {
    	        goog.crypt.base64.charToByteMap_ = {};
    	        for (var a = goog.crypt.base64.DEFAULT_ALPHABET_COMMON_.split(""), b = ["+/=", "+/", "-_=", "-_.", "-_"], c = 0; 5 > c; c++) {
    	            var d = a.concat(b[c].split(""));
    	            goog.crypt.base64.byteToCharMaps_[c] = d;
    	            for (var e = 0; e < d.length; e++) {
    	                var f = d[e], g = goog.crypt.base64.charToByteMap_[f];
    	                void 0 === g ? goog.crypt.base64.charToByteMap_[f] = e : goog.asserts.assert(g === e);
    	            }
    	        }
    	    }
    	};
    	jspb.utils = {};
    	jspb.utils.split64Low = 0;
    	jspb.utils.split64High = 0;
    	jspb.utils.splitUint64 = function (a) {
    	    var b = a >>> 0;
    	    a = Math.floor((a - b) / jspb.BinaryConstants.TWO_TO_32) >>> 0;
    	    jspb.utils.split64Low = b;
    	    jspb.utils.split64High = a;
    	};
    	jspb.utils.splitInt64 = function (a) {
    	    var b = 0 > a;
    	    a = Math.abs(a);
    	    var c = a >>> 0;
    	    a = Math.floor((a - c) / jspb.BinaryConstants.TWO_TO_32);
    	    a >>>= 0;
    	    b && (a = ~a >>> 0, c = (~c >>> 0) + 1, 4294967295 < c && (c = 0, a++, 4294967295 < a && (a = 0)));
    	    jspb.utils.split64Low = c;
    	    jspb.utils.split64High = a;
    	};
    	jspb.utils.splitZigzag64 = function (a) {
    	    var b = 0 > a;
    	    a = 2 * Math.abs(a);
    	    jspb.utils.splitUint64(a);
    	    a = jspb.utils.split64Low;
    	    var c = jspb.utils.split64High;
    	    b && (0 == a ? 0 == c ? c = a = 4294967295 : (c--, a = 4294967295) : a--);
    	    jspb.utils.split64Low = a;
    	    jspb.utils.split64High = c;
    	};
    	jspb.utils.splitFloat32 = function (a) {
    	    var b = 0 > a ? 1 : 0;
    	    a = b ? -a : a;
    	    if (0 === a) 0 < 1 / a ? (jspb.utils.split64High = 0, jspb.utils.split64Low = 0) : (jspb.utils.split64High = 0, jspb.utils.split64Low = 2147483648); else if (isNaN(a)) jspb.utils.split64High = 0, jspb.utils.split64Low = 2147483647; else if (a > jspb.BinaryConstants.FLOAT32_MAX) jspb.utils.split64High = 0, jspb.utils.split64Low = (b << 31 | 2139095040) >>> 0; else if (a < jspb.BinaryConstants.FLOAT32_MIN) a = Math.round(a / Math.pow(2, -149)), jspb.utils.split64High = 0, jspb.utils.split64Low = (b << 31 |
    	        a) >>> 0; else {
    	        var c = Math.floor(Math.log(a) / Math.LN2);
    	        a *= Math.pow(2, -c);
    	        a = Math.round(a * jspb.BinaryConstants.TWO_TO_23);
    	        16777216 <= a && ++c;
    	        jspb.utils.split64High = 0;
    	        jspb.utils.split64Low = (b << 31 | c + 127 << 23 | a & 8388607) >>> 0;
    	    }
    	};
    	jspb.utils.splitFloat64 = function (a) {
    	    var b = 0 > a ? 1 : 0;
    	    a = b ? -a : a;
    	    if (0 === a) jspb.utils.split64High = 0 < 1 / a ? 0 : 2147483648, jspb.utils.split64Low = 0; else if (isNaN(a)) jspb.utils.split64High = 2147483647, jspb.utils.split64Low = 4294967295; else if (a > jspb.BinaryConstants.FLOAT64_MAX) jspb.utils.split64High = (b << 31 | 2146435072) >>> 0, jspb.utils.split64Low = 0; else if (a < jspb.BinaryConstants.FLOAT64_MIN) {
    	        var c = a / Math.pow(2, -1074);
    	        a = c / jspb.BinaryConstants.TWO_TO_32;
    	        jspb.utils.split64High = (b << 31 | a) >>> 0;
    	        jspb.utils.split64Low = c >>> 0;
    	    } else {
    	        c =
    	            a;
    	        var d = 0;
    	        if (2 <= c) for (; 2 <= c && 1023 > d;) d++, c /= 2; else for (; 1 > c && -1022 < d;) c *= 2, d--;
    	        c = a * Math.pow(2, -d);
    	        a = c * jspb.BinaryConstants.TWO_TO_20 & 1048575;
    	        c = c * jspb.BinaryConstants.TWO_TO_52 >>> 0;
    	        jspb.utils.split64High = (b << 31 | d + 1023 << 20 | a) >>> 0;
    	        jspb.utils.split64Low = c;
    	    }
    	};
    	jspb.utils.splitHash64 = function (a) {
    	    var b = a.charCodeAt(0), c = a.charCodeAt(1), d = a.charCodeAt(2), e = a.charCodeAt(3), f = a.charCodeAt(4),
    	        g = a.charCodeAt(5), h = a.charCodeAt(6);
    	    a = a.charCodeAt(7);
    	    jspb.utils.split64Low = b + (c << 8) + (d << 16) + (e << 24) >>> 0;
    	    jspb.utils.split64High = f + (g << 8) + (h << 16) + (a << 24) >>> 0;
    	};
    	jspb.utils.joinUint64 = function (a, b) {
    	    return b * jspb.BinaryConstants.TWO_TO_32 + (a >>> 0)
    	};
    	jspb.utils.joinInt64 = function (a, b) {
    	    var c = b & 2147483648;
    	    c && (a = ~a + 1 >>> 0, b = ~b >>> 0, 0 == a && (b = b + 1 >>> 0));
    	    a = jspb.utils.joinUint64(a, b);
    	    return c ? -a : a
    	};
    	jspb.utils.toZigzag64 = function (a, b, c) {
    	    var d = b >> 31;
    	    return c(a << 1 ^ d, (b << 1 | a >>> 31) ^ d)
    	};
    	jspb.utils.joinZigzag64 = function (a, b) {
    	    return jspb.utils.fromZigzag64(a, b, jspb.utils.joinInt64)
    	};
    	jspb.utils.fromZigzag64 = function (a, b, c) {
    	    var d = -(a & 1);
    	    return c((a >>> 1 | b << 31) ^ d, b >>> 1 ^ d)
    	};
    	jspb.utils.joinFloat32 = function (a, b) {
    	    b = 2 * (a >> 31) + 1;
    	    var c = a >>> 23 & 255;
    	    a &= 8388607;
    	    return 255 == c ? a ? NaN : Infinity * b : 0 == c ? b * Math.pow(2, -149) * a : b * Math.pow(2, c - 150) * (a + Math.pow(2, 23))
    	};
    	jspb.utils.joinFloat64 = function (a, b) {
    	    var c = 2 * (b >> 31) + 1, d = b >>> 20 & 2047;
    	    a = jspb.BinaryConstants.TWO_TO_32 * (b & 1048575) + a;
    	    return 2047 == d ? a ? NaN : Infinity * c : 0 == d ? c * Math.pow(2, -1074) * a : c * Math.pow(2, d - 1075) * (a + jspb.BinaryConstants.TWO_TO_52)
    	};
    	jspb.utils.joinHash64 = function (a, b) {
    	    return String.fromCharCode(a >>> 0 & 255, a >>> 8 & 255, a >>> 16 & 255, a >>> 24 & 255, b >>> 0 & 255, b >>> 8 & 255, b >>> 16 & 255, b >>> 24 & 255)
    	};
    	jspb.utils.DIGITS = "0123456789abcdef".split("");
    	jspb.utils.ZERO_CHAR_CODE_ = 48;
    	jspb.utils.A_CHAR_CODE_ = 97;
    	jspb.utils.joinUnsignedDecimalString = function (a, b) {
    	    function c(a, b) {
    	        a = a ? String(a) : "";
    	        return b ? "0000000".slice(a.length) + a : a
    	    }

    	    if (2097151 >= b) return "" + jspb.utils.joinUint64(a, b);
    	    var d = (a >>> 24 | b << 8) >>> 0 & 16777215;
    	    b = b >> 16 & 65535;
    	    a = (a & 16777215) + 6777216 * d + 6710656 * b;
    	    d += 8147497 * b;
    	    b *= 2;
    	    1E7 <= a && (d += Math.floor(a / 1E7), a %= 1E7);
    	    1E7 <= d && (b += Math.floor(d / 1E7), d %= 1E7);
    	    return c(b, 0) + c(d, b) + c(a, 1)
    	};
    	jspb.utils.joinSignedDecimalString = function (a, b) {
    	    var c = b & 2147483648;
    	    c && (a = ~a + 1 >>> 0, b = ~b + (0 == a ? 1 : 0) >>> 0);
    	    a = jspb.utils.joinUnsignedDecimalString(a, b);
    	    return c ? "-" + a : a
    	};
    	jspb.utils.hash64ToDecimalString = function (a, b) {
    	    jspb.utils.splitHash64(a);
    	    a = jspb.utils.split64Low;
    	    var c = jspb.utils.split64High;
    	    return b ? jspb.utils.joinSignedDecimalString(a, c) : jspb.utils.joinUnsignedDecimalString(a, c)
    	};
    	jspb.utils.hash64ArrayToDecimalStrings = function (a, b) {
    	    for (var c = Array(a.length), d = 0; d < a.length; d++) c[d] = jspb.utils.hash64ToDecimalString(a[d], b);
    	    return c
    	};
    	jspb.utils.decimalStringToHash64 = function (a) {
    	    function b(a, b) {
    	        for (var c = 0; 8 > c && (1 !== a || 0 < b); c++) b = a * e[c] + b, e[c] = b & 255, b >>>= 8;
    	    }

    	    function c() {
    	        for (var a = 0; 8 > a; a++) e[a] = ~e[a] & 255;
    	    }

    	    jspb.asserts.assert(0 < a.length);
    	    var d = !1;
    	    "-" === a[0] && (d = !0, a = a.slice(1));
    	    for (var e = [0, 0, 0, 0, 0, 0, 0, 0], f = 0; f < a.length; f++) b(10, a.charCodeAt(f) - jspb.utils.ZERO_CHAR_CODE_);
    	    d && (c(), b(1, 1));
    	    return goog.crypt.byteArrayToString(e)
    	};
    	jspb.utils.splitDecimalString = function (a) {
    	    jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a));
    	};
    	jspb.utils.toHexDigit_ = function (a) {
    	    return String.fromCharCode(10 > a ? jspb.utils.ZERO_CHAR_CODE_ + a : jspb.utils.A_CHAR_CODE_ - 10 + a)
    	};
    	jspb.utils.fromHexCharCode_ = function (a) {
    	    return a >= jspb.utils.A_CHAR_CODE_ ? a - jspb.utils.A_CHAR_CODE_ + 10 : a - jspb.utils.ZERO_CHAR_CODE_
    	};
    	jspb.utils.hash64ToHexString = function (a) {
    	    var b = Array(18);
    	    b[0] = "0";
    	    b[1] = "x";
    	    for (var c = 0; 8 > c; c++) {
    	        var d = a.charCodeAt(7 - c);
    	        b[2 * c + 2] = jspb.utils.toHexDigit_(d >> 4);
    	        b[2 * c + 3] = jspb.utils.toHexDigit_(d & 15);
    	    }
    	    return b.join("")
    	};
    	jspb.utils.hexStringToHash64 = function (a) {
    	    a = a.toLowerCase();
    	    jspb.asserts.assert(18 == a.length);
    	    jspb.asserts.assert("0" == a[0]);
    	    jspb.asserts.assert("x" == a[1]);
    	    for (var b = "", c = 0; 8 > c; c++) {
    	        var d = jspb.utils.fromHexCharCode_(a.charCodeAt(2 * c + 2)),
    	            e = jspb.utils.fromHexCharCode_(a.charCodeAt(2 * c + 3));
    	        b = String.fromCharCode(16 * d + e) + b;
    	    }
    	    return b
    	};
    	jspb.utils.hash64ToNumber = function (a, b) {
    	    jspb.utils.splitHash64(a);
    	    a = jspb.utils.split64Low;
    	    var c = jspb.utils.split64High;
    	    return b ? jspb.utils.joinInt64(a, c) : jspb.utils.joinUint64(a, c)
    	};
    	jspb.utils.numberToHash64 = function (a) {
    	    jspb.utils.splitInt64(a);
    	    return jspb.utils.joinHash64(jspb.utils.split64Low, jspb.utils.split64High)
    	};
    	jspb.utils.countVarints = function (a, b, c) {
    	    for (var d = 0, e = b; e < c; e++) d += a[e] >> 7;
    	    return c - b - d
    	};
    	jspb.utils.countVarintFields = function (a, b, c, d) {
    	    var e = 0;
    	    d = 8 * d + jspb.BinaryConstants.WireType.VARINT;
    	    if (128 > d) for (; b < c && a[b++] == d;) for (e++; ;) {
    	        var f = a[b++];
    	        if (0 == (f & 128)) break
    	    } else for (; b < c;) {
    	        for (f = d; 128 < f;) {
    	            if (a[b] != (f & 127 | 128)) return e;
    	            b++;
    	            f >>= 7;
    	        }
    	        if (a[b++] != f) break;
    	        for (e++; f = a[b++], 0 != (f & 128);) ;
    	    }
    	    return e
    	};
    	jspb.utils.countFixedFields_ = function (a, b, c, d, e) {
    	    var f = 0;
    	    if (128 > d) for (; b < c && a[b++] == d;) f++, b += e; else for (; b < c;) {
    	        for (var g = d; 128 < g;) {
    	            if (a[b++] != (g & 127 | 128)) return f;
    	            g >>= 7;
    	        }
    	        if (a[b++] != g) break;
    	        f++;
    	        b += e;
    	    }
    	    return f
    	};
    	jspb.utils.countFixed32Fields = function (a, b, c, d) {
    	    return jspb.utils.countFixedFields_(a, b, c, 8 * d + jspb.BinaryConstants.WireType.FIXED32, 4)
    	};
    	jspb.utils.countFixed64Fields = function (a, b, c, d) {
    	    return jspb.utils.countFixedFields_(a, b, c, 8 * d + jspb.BinaryConstants.WireType.FIXED64, 8)
    	};
    	jspb.utils.countDelimitedFields = function (a, b, c, d) {
    	    var e = 0;
    	    for (d = 8 * d + jspb.BinaryConstants.WireType.DELIMITED; b < c;) {
    	        for (var f = d; 128 < f;) {
    	            if (a[b++] != (f & 127 | 128)) return e;
    	            f >>= 7;
    	        }
    	        if (a[b++] != f) break;
    	        e++;
    	        for (var g = 0, h = 1; f = a[b++], g += (f & 127) * h, h *= 128, 0 != (f & 128);) ;
    	        b += g;
    	    }
    	    return e
    	};
    	jspb.utils.debugBytesToTextFormat = function (a) {
    	    var b = '"';
    	    if (a) {
    	        a = jspb.utils.byteSourceToUint8Array(a);
    	        for (var c = 0; c < a.length; c++) b += "\\x", 16 > a[c] && (b += "0"), b += a[c].toString(16);
    	    }
    	    return b + '"'
    	};
    	jspb.utils.debugScalarToTextFormat = function (a) {
    	    return "string" === typeof a ? goog.string.quote(a) : a.toString()
    	};
    	jspb.utils.stringToByteArray = function (a) {
    	    for (var b = new Uint8Array(a.length), c = 0; c < a.length; c++) {
    	        var d = a.charCodeAt(c);
    	        if (255 < d) throw Error("Conversion error: string contains codepoint outside of byte range");
    	        b[c] = d;
    	    }
    	    return b
    	};
    	jspb.utils.byteSourceToUint8Array = function (a) {
    	    if (a.constructor === Uint8Array) return a;
    	    if (a.constructor === ArrayBuffer || a.constructor === Array) return new Uint8Array(a);
    	    if (a.constructor === String) return goog.crypt.base64.decodeStringToUint8Array(a);
    	    if (a instanceof Uint8Array) return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
    	    jspb.asserts.fail("Type not convertible to Uint8Array.");
    	    return new Uint8Array(0)
    	};
    	jspb.BinaryDecoder = function (a, b, c) {
    	    this.bytes_ = null;
    	    this.cursor_ = this.end_ = this.start_ = 0;
    	    this.error_ = !1;
    	    a && this.setBlock(a, b, c);
    	};
    	jspb.BinaryDecoder.instanceCache_ = [];
    	jspb.BinaryDecoder.alloc = function (a, b, c) {
    	    if (jspb.BinaryDecoder.instanceCache_.length) {
    	        var d = jspb.BinaryDecoder.instanceCache_.pop();
    	        a && d.setBlock(a, b, c);
    	        return d
    	    }
    	    return new jspb.BinaryDecoder(a, b, c)
    	};
    	jspb.BinaryDecoder.prototype.free = function () {
    	    this.clear();
    	    100 > jspb.BinaryDecoder.instanceCache_.length && jspb.BinaryDecoder.instanceCache_.push(this);
    	};
    	jspb.BinaryDecoder.prototype.clone = function () {
    	    return jspb.BinaryDecoder.alloc(this.bytes_, this.start_, this.end_ - this.start_)
    	};
    	jspb.BinaryDecoder.prototype.clear = function () {
    	    this.bytes_ = null;
    	    this.cursor_ = this.end_ = this.start_ = 0;
    	    this.error_ = !1;
    	};
    	jspb.BinaryDecoder.prototype.getBuffer = function () {
    	    return this.bytes_
    	};
    	jspb.BinaryDecoder.prototype.setBlock = function (a, b, c) {
    	    this.bytes_ = jspb.utils.byteSourceToUint8Array(a);
    	    this.start_ = void 0 !== b ? b : 0;
    	    this.end_ = void 0 !== c ? this.start_ + c : this.bytes_.length;
    	    this.cursor_ = this.start_;
    	};
    	jspb.BinaryDecoder.prototype.getEnd = function () {
    	    return this.end_
    	};
    	jspb.BinaryDecoder.prototype.setEnd = function (a) {
    	    this.end_ = a;
    	};
    	jspb.BinaryDecoder.prototype.reset = function () {
    	    this.cursor_ = this.start_;
    	};
    	jspb.BinaryDecoder.prototype.getCursor = function () {
    	    return this.cursor_
    	};
    	jspb.BinaryDecoder.prototype.setCursor = function (a) {
    	    this.cursor_ = a;
    	};
    	jspb.BinaryDecoder.prototype.advance = function (a) {
    	    this.cursor_ += a;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	};
    	jspb.BinaryDecoder.prototype.atEnd = function () {
    	    return this.cursor_ == this.end_
    	};
    	jspb.BinaryDecoder.prototype.pastEnd = function () {
    	    return this.cursor_ > this.end_
    	};
    	jspb.BinaryDecoder.prototype.getError = function () {
    	    return this.error_ || 0 > this.cursor_ || this.cursor_ > this.end_
    	};
    	jspb.BinaryDecoder.prototype.readSplitVarint64 = function (a) {
    	    for (var b = 128, c = 0, d = 0, e = 0; 4 > e && 128 <= b; e++) b = this.bytes_[this.cursor_++], c |= (b & 127) << 7 * e;
    	    128 <= b && (b = this.bytes_[this.cursor_++], c |= (b & 127) << 28, d |= (b & 127) >> 4);
    	    if (128 <= b) for (e = 0; 5 > e && 128 <= b; e++) b = this.bytes_[this.cursor_++], d |= (b & 127) << 7 * e + 3;
    	    if (128 > b) return a(c >>> 0, d >>> 0);
    	    jspb.asserts.fail("Failed to read varint, encoding is invalid.");
    	    this.error_ = !0;
    	};
    	jspb.BinaryDecoder.prototype.readSplitZigzagVarint64 = function (a) {
    	    return this.readSplitVarint64(function (b, c) {
    	        return jspb.utils.fromZigzag64(b, c, a)
    	    })
    	};
    	jspb.BinaryDecoder.prototype.readSplitFixed64 = function (a) {
    	    var b = this.bytes_, c = this.cursor_;
    	    this.cursor_ += 8;
    	    for (var d = 0, e = 0, f = c + 7; f >= c; f--) d = d << 8 | b[f], e = e << 8 | b[f + 4];
    	    return a(d, e)
    	};
    	jspb.BinaryDecoder.prototype.skipVarint = function () {
    	    for (; this.bytes_[this.cursor_] & 128;) this.cursor_++;
    	    this.cursor_++;
    	};
    	jspb.BinaryDecoder.prototype.unskipVarint = function (a) {
    	    for (; 128 < a;) this.cursor_--, a >>>= 7;
    	    this.cursor_--;
    	};
    	jspb.BinaryDecoder.prototype.readUnsignedVarint32 = function () {
    	    var a = this.bytes_;
    	    var b = a[this.cursor_ + 0];
    	    var c = b & 127;
    	    if (128 > b) return this.cursor_ += 1, jspb.asserts.assert(this.cursor_ <= this.end_), c;
    	    b = a[this.cursor_ + 1];
    	    c |= (b & 127) << 7;
    	    if (128 > b) return this.cursor_ += 2, jspb.asserts.assert(this.cursor_ <= this.end_), c;
    	    b = a[this.cursor_ + 2];
    	    c |= (b & 127) << 14;
    	    if (128 > b) return this.cursor_ += 3, jspb.asserts.assert(this.cursor_ <= this.end_), c;
    	    b = a[this.cursor_ + 3];
    	    c |= (b & 127) << 21;
    	    if (128 > b) return this.cursor_ += 4, jspb.asserts.assert(this.cursor_ <=
    	        this.end_), c;
    	    b = a[this.cursor_ + 4];
    	    c |= (b & 15) << 28;
    	    if (128 > b) return this.cursor_ += 5, jspb.asserts.assert(this.cursor_ <= this.end_), c >>> 0;
    	    this.cursor_ += 5;
    	    128 <= a[this.cursor_++] && 128 <= a[this.cursor_++] && 128 <= a[this.cursor_++] && 128 <= a[this.cursor_++] && 128 <= a[this.cursor_++] && jspb.asserts.assert(!1);
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return c
    	};
    	jspb.BinaryDecoder.prototype.readSignedVarint32 = function () {
    	    return ~~this.readUnsignedVarint32()
    	};
    	jspb.BinaryDecoder.prototype.readUnsignedVarint32String = function () {
    	    return this.readUnsignedVarint32().toString()
    	};
    	jspb.BinaryDecoder.prototype.readSignedVarint32String = function () {
    	    return this.readSignedVarint32().toString()
    	};
    	jspb.BinaryDecoder.prototype.readZigzagVarint32 = function () {
    	    var a = this.readUnsignedVarint32();
    	    return a >>> 1 ^ -(a & 1)
    	};
    	jspb.BinaryDecoder.prototype.readUnsignedVarint64 = function () {
    	    return this.readSplitVarint64(jspb.utils.joinUint64)
    	};
    	jspb.BinaryDecoder.prototype.readUnsignedVarint64String = function () {
    	    return this.readSplitVarint64(jspb.utils.joinUnsignedDecimalString)
    	};
    	jspb.BinaryDecoder.prototype.readSignedVarint64 = function () {
    	    return this.readSplitVarint64(jspb.utils.joinInt64)
    	};
    	jspb.BinaryDecoder.prototype.readSignedVarint64String = function () {
    	    return this.readSplitVarint64(jspb.utils.joinSignedDecimalString)
    	};
    	jspb.BinaryDecoder.prototype.readZigzagVarint64 = function () {
    	    return this.readSplitVarint64(jspb.utils.joinZigzag64)
    	};
    	jspb.BinaryDecoder.prototype.readZigzagVarintHash64 = function () {
    	    return this.readSplitZigzagVarint64(jspb.utils.joinHash64)
    	};
    	jspb.BinaryDecoder.prototype.readZigzagVarint64String = function () {
    	    return this.readSplitZigzagVarint64(jspb.utils.joinSignedDecimalString)
    	};
    	jspb.BinaryDecoder.prototype.readUint8 = function () {
    	    var a = this.bytes_[this.cursor_ + 0];
    	    this.cursor_ += 1;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return a
    	};
    	jspb.BinaryDecoder.prototype.readUint16 = function () {
    	    var a = this.bytes_[this.cursor_ + 0], b = this.bytes_[this.cursor_ + 1];
    	    this.cursor_ += 2;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return a << 0 | b << 8
    	};
    	jspb.BinaryDecoder.prototype.readUint32 = function () {
    	    var a = this.bytes_[this.cursor_ + 0], b = this.bytes_[this.cursor_ + 1], c = this.bytes_[this.cursor_ + 2],
    	        d = this.bytes_[this.cursor_ + 3];
    	    this.cursor_ += 4;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return (a << 0 | b << 8 | c << 16 | d << 24) >>> 0
    	};
    	jspb.BinaryDecoder.prototype.readUint64 = function () {
    	    var a = this.readUint32(), b = this.readUint32();
    	    return jspb.utils.joinUint64(a, b)
    	};
    	jspb.BinaryDecoder.prototype.readUint64String = function () {
    	    var a = this.readUint32(), b = this.readUint32();
    	    return jspb.utils.joinUnsignedDecimalString(a, b)
    	};
    	jspb.BinaryDecoder.prototype.readInt8 = function () {
    	    var a = this.bytes_[this.cursor_ + 0];
    	    this.cursor_ += 1;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return a << 24 >> 24
    	};
    	jspb.BinaryDecoder.prototype.readInt16 = function () {
    	    var a = this.bytes_[this.cursor_ + 0], b = this.bytes_[this.cursor_ + 1];
    	    this.cursor_ += 2;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return (a << 0 | b << 8) << 16 >> 16
    	};
    	jspb.BinaryDecoder.prototype.readInt32 = function () {
    	    var a = this.bytes_[this.cursor_ + 0], b = this.bytes_[this.cursor_ + 1], c = this.bytes_[this.cursor_ + 2],
    	        d = this.bytes_[this.cursor_ + 3];
    	    this.cursor_ += 4;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return a << 0 | b << 8 | c << 16 | d << 24
    	};
    	jspb.BinaryDecoder.prototype.readInt64 = function () {
    	    var a = this.readUint32(), b = this.readUint32();
    	    return jspb.utils.joinInt64(a, b)
    	};
    	jspb.BinaryDecoder.prototype.readInt64String = function () {
    	    var a = this.readUint32(), b = this.readUint32();
    	    return jspb.utils.joinSignedDecimalString(a, b)
    	};
    	jspb.BinaryDecoder.prototype.readFloat = function () {
    	    var a = this.readUint32();
    	    return jspb.utils.joinFloat32(a, 0)
    	};
    	jspb.BinaryDecoder.prototype.readDouble = function () {
    	    var a = this.readUint32(), b = this.readUint32();
    	    return jspb.utils.joinFloat64(a, b)
    	};
    	jspb.BinaryDecoder.prototype.readBool = function () {
    	    return !!this.bytes_[this.cursor_++]
    	};
    	jspb.BinaryDecoder.prototype.readEnum = function () {
    	    return this.readSignedVarint32()
    	};
    	jspb.BinaryDecoder.prototype.readString = function (a) {
    	    var b = this.bytes_, c = this.cursor_;
    	    a = c + a;
    	    for (var d = [], e = ""; c < a;) {
    	        var f = b[c++];
    	        if (128 > f) d.push(f); else if (192 > f) continue; else if (224 > f) {
    	            var g = b[c++];
    	            d.push((f & 31) << 6 | g & 63);
    	        } else if (240 > f) {
    	            g = b[c++];
    	            var h = b[c++];
    	            d.push((f & 15) << 12 | (g & 63) << 6 | h & 63);
    	        } else if (248 > f) {
    	            g = b[c++];
    	            h = b[c++];
    	            var k = b[c++];
    	            f = (f & 7) << 18 | (g & 63) << 12 | (h & 63) << 6 | k & 63;
    	            f -= 65536;
    	            d.push((f >> 10 & 1023) + 55296, (f & 1023) + 56320);
    	        }
    	        8192 <= d.length && (e += String.fromCharCode.apply(null, d), d.length = 0);
    	    }
    	    e += goog.crypt.byteArrayToString(d);
    	    this.cursor_ = c;
    	    return e
    	};
    	jspb.BinaryDecoder.prototype.readStringWithLength = function () {
    	    var a = this.readUnsignedVarint32();
    	    return this.readString(a)
    	};
    	jspb.BinaryDecoder.prototype.readBytes = function (a) {
    	    if (0 > a || this.cursor_ + a > this.bytes_.length) return this.error_ = !0, jspb.asserts.fail("Invalid byte length!"), new Uint8Array(0);
    	    var b = this.bytes_.subarray(this.cursor_, this.cursor_ + a);
    	    this.cursor_ += a;
    	    jspb.asserts.assert(this.cursor_ <= this.end_);
    	    return b
    	};
    	jspb.BinaryDecoder.prototype.readVarintHash64 = function () {
    	    return this.readSplitVarint64(jspb.utils.joinHash64)
    	};
    	jspb.BinaryDecoder.prototype.readFixedHash64 = function () {
    	    var a = this.bytes_, b = this.cursor_, c = a[b + 0], d = a[b + 1], e = a[b + 2], f = a[b + 3], g = a[b + 4],
    	        h = a[b + 5], k = a[b + 6];
    	    a = a[b + 7];
    	    this.cursor_ += 8;
    	    return String.fromCharCode(c, d, e, f, g, h, k, a)
    	};
    	jspb.BinaryReader = function (a, b, c) {
    	    this.decoder_ = jspb.BinaryDecoder.alloc(a, b, c);
    	    this.fieldCursor_ = this.decoder_.getCursor();
    	    this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
    	    this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
    	    this.error_ = !1;
    	    this.readCallbacks_ = null;
    	};
    	jspb.BinaryReader.instanceCache_ = [];
    	jspb.BinaryReader.alloc = function (a, b, c) {
    	    if (jspb.BinaryReader.instanceCache_.length) {
    	        var d = jspb.BinaryReader.instanceCache_.pop();
    	        a && d.decoder_.setBlock(a, b, c);
    	        return d
    	    }
    	    return new jspb.BinaryReader(a, b, c)
    	};
    	jspb.BinaryReader.prototype.alloc = jspb.BinaryReader.alloc;
    	jspb.BinaryReader.prototype.free = function () {
    	    this.decoder_.clear();
    	    this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
    	    this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
    	    this.error_ = !1;
    	    this.readCallbacks_ = null;
    	    100 > jspb.BinaryReader.instanceCache_.length && jspb.BinaryReader.instanceCache_.push(this);
    	};
    	jspb.BinaryReader.prototype.getFieldCursor = function () {
    	    return this.fieldCursor_
    	};
    	jspb.BinaryReader.prototype.getCursor = function () {
    	    return this.decoder_.getCursor()
    	};
    	jspb.BinaryReader.prototype.getBuffer = function () {
    	    return this.decoder_.getBuffer()
    	};
    	jspb.BinaryReader.prototype.getFieldNumber = function () {
    	    return this.nextField_
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "getFieldNumber", jspb.BinaryReader.prototype.getFieldNumber);
    	jspb.BinaryReader.prototype.getWireType = function () {
    	    return this.nextWireType_
    	};
    	jspb.BinaryReader.prototype.isDelimited = function () {
    	    return this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "isDelimited", jspb.BinaryReader.prototype.isDelimited);
    	jspb.BinaryReader.prototype.isEndGroup = function () {
    	    return this.nextWireType_ == jspb.BinaryConstants.WireType.END_GROUP
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "isEndGroup", jspb.BinaryReader.prototype.isEndGroup);
    	jspb.BinaryReader.prototype.getError = function () {
    	    return this.error_ || this.decoder_.getError()
    	};
    	jspb.BinaryReader.prototype.setBlock = function (a, b, c) {
    	    this.decoder_.setBlock(a, b, c);
    	    this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
    	    this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
    	};
    	jspb.BinaryReader.prototype.reset = function () {
    	    this.decoder_.reset();
    	    this.nextField_ = jspb.BinaryConstants.INVALID_FIELD_NUMBER;
    	    this.nextWireType_ = jspb.BinaryConstants.WireType.INVALID;
    	};
    	jspb.BinaryReader.prototype.advance = function (a) {
    	    this.decoder_.advance(a);
    	};
    	jspb.BinaryReader.prototype.nextField = function () {
    	    if (this.decoder_.atEnd()) return !1;
    	    if (this.getError()) return jspb.asserts.fail("Decoder hit an error"), !1;
    	    this.fieldCursor_ = this.decoder_.getCursor();
    	    var a = this.decoder_.readUnsignedVarint32(), b = a >>> 3;
    	    a &= 7;
    	    if (a != jspb.BinaryConstants.WireType.VARINT && a != jspb.BinaryConstants.WireType.FIXED32 && a != jspb.BinaryConstants.WireType.FIXED64 && a != jspb.BinaryConstants.WireType.DELIMITED && a != jspb.BinaryConstants.WireType.START_GROUP && a != jspb.BinaryConstants.WireType.END_GROUP) return jspb.asserts.fail("Invalid wire type: %s (at position %s)",
    	        a, this.fieldCursor_), this.error_ = !0, !1;
    	    this.nextField_ = b;
    	    this.nextWireType_ = a;
    	    return !0
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "nextField", jspb.BinaryReader.prototype.nextField);
    	jspb.BinaryReader.prototype.unskipHeader = function () {
    	    this.decoder_.unskipVarint(this.nextField_ << 3 | this.nextWireType_);
    	};
    	jspb.BinaryReader.prototype.skipMatchingFields = function () {
    	    var a = this.nextField_;
    	    for (this.unskipHeader(); this.nextField() && this.getFieldNumber() == a;) this.skipField();
    	    this.decoder_.atEnd() || this.unskipHeader();
    	};
    	jspb.BinaryReader.prototype.skipVarintField = function () {
    	    this.nextWireType_ != jspb.BinaryConstants.WireType.VARINT ? (jspb.asserts.fail("Invalid wire type for skipVarintField"), this.skipField()) : this.decoder_.skipVarint();
    	};
    	jspb.BinaryReader.prototype.skipDelimitedField = function () {
    	    if (this.nextWireType_ != jspb.BinaryConstants.WireType.DELIMITED) jspb.asserts.fail("Invalid wire type for skipDelimitedField"), this.skipField(); else {
    	        var a = this.decoder_.readUnsignedVarint32();
    	        this.decoder_.advance(a);
    	    }
    	};
    	jspb.BinaryReader.prototype.skipFixed32Field = function () {
    	    this.nextWireType_ != jspb.BinaryConstants.WireType.FIXED32 ? (jspb.asserts.fail("Invalid wire type for skipFixed32Field"), this.skipField()) : this.decoder_.advance(4);
    	};
    	jspb.BinaryReader.prototype.skipFixed64Field = function () {
    	    this.nextWireType_ != jspb.BinaryConstants.WireType.FIXED64 ? (jspb.asserts.fail("Invalid wire type for skipFixed64Field"), this.skipField()) : this.decoder_.advance(8);
    	};
    	jspb.BinaryReader.prototype.skipGroup = function () {
    	    var a = this.nextField_;
    	    do {
    	        if (!this.nextField()) {
    	            jspb.asserts.fail("Unmatched start-group tag: stream EOF");
    	            this.error_ = !0;
    	            break
    	        }
    	        if (this.nextWireType_ == jspb.BinaryConstants.WireType.END_GROUP) {
    	            this.nextField_ != a && (jspb.asserts.fail("Unmatched end-group tag"), this.error_ = !0);
    	            break
    	        }
    	        this.skipField();
    	    } while (1)
    	};
    	jspb.BinaryReader.prototype.skipField = function () {
    	    switch (this.nextWireType_) {
    	        case jspb.BinaryConstants.WireType.VARINT:
    	            this.skipVarintField();
    	            break;
    	        case jspb.BinaryConstants.WireType.FIXED64:
    	            this.skipFixed64Field();
    	            break;
    	        case jspb.BinaryConstants.WireType.DELIMITED:
    	            this.skipDelimitedField();
    	            break;
    	        case jspb.BinaryConstants.WireType.FIXED32:
    	            this.skipFixed32Field();
    	            break;
    	        case jspb.BinaryConstants.WireType.START_GROUP:
    	            this.skipGroup();
    	            break;
    	        default:
    	            jspb.asserts.fail("Invalid wire encoding for field.");
    	    }
    	};
    	jspb.BinaryReader.prototype.registerReadCallback = function (a, b) {
    	    null === this.readCallbacks_ && (this.readCallbacks_ = {});
    	    jspb.asserts.assert(!this.readCallbacks_[a]);
    	    this.readCallbacks_[a] = b;
    	};
    	jspb.BinaryReader.prototype.runReadCallback = function (a) {
    	    jspb.asserts.assert(null !== this.readCallbacks_);
    	    a = this.readCallbacks_[a];
    	    jspb.asserts.assert(a);
    	    return a(this)
    	};
    	jspb.BinaryReader.prototype.readAny = function (a) {
    	    this.nextWireType_ = jspb.BinaryConstants.FieldTypeToWireType(a);
    	    var b = jspb.BinaryConstants.FieldType;
    	    switch (a) {
    	        case b.DOUBLE:
    	            return this.readDouble();
    	        case b.FLOAT:
    	            return this.readFloat();
    	        case b.INT64:
    	            return this.readInt64();
    	        case b.UINT64:
    	            return this.readUint64();
    	        case b.INT32:
    	            return this.readInt32();
    	        case b.FIXED64:
    	            return this.readFixed64();
    	        case b.FIXED32:
    	            return this.readFixed32();
    	        case b.BOOL:
    	            return this.readBool();
    	        case b.STRING:
    	            return this.readString();
    	        case b.GROUP:
    	            jspb.asserts.fail("Group field type not supported in readAny()");
    	        case b.MESSAGE:
    	            jspb.asserts.fail("Message field type not supported in readAny()");
    	        case b.BYTES:
    	            return this.readBytes();
    	        case b.UINT32:
    	            return this.readUint32();
    	        case b.ENUM:
    	            return this.readEnum();
    	        case b.SFIXED32:
    	            return this.readSfixed32();
    	        case b.SFIXED64:
    	            return this.readSfixed64();
    	        case b.SINT32:
    	            return this.readSint32();
    	        case b.SINT64:
    	            return this.readSint64();
    	        case b.FHASH64:
    	            return this.readFixedHash64();
    	        case b.VHASH64:
    	            return this.readVarintHash64();
    	        default:
    	            jspb.asserts.fail("Invalid field type in readAny()");
    	    }
    	    return 0
    	};
    	jspb.BinaryReader.prototype.readMessage = function (a, b) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
    	    var c = this.decoder_.getEnd(), d = this.decoder_.readUnsignedVarint32();
    	    d = this.decoder_.getCursor() + d;
    	    this.decoder_.setEnd(d);
    	    b(a, this);
    	    this.decoder_.setCursor(d);
    	    this.decoder_.setEnd(c);
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readMessage", jspb.BinaryReader.prototype.readMessage);
    	jspb.BinaryReader.prototype.readGroup = function (a, b, c) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.START_GROUP);
    	    jspb.asserts.assert(this.nextField_ == a);
    	    c(b, this);
    	    this.error_ || this.nextWireType_ == jspb.BinaryConstants.WireType.END_GROUP || (jspb.asserts.fail("Group submessage did not end with an END_GROUP tag"), this.error_ = !0);
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readGroup", jspb.BinaryReader.prototype.readGroup);
    	jspb.BinaryReader.prototype.getFieldDecoder = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
    	    var a = this.decoder_.readUnsignedVarint32(), b = this.decoder_.getCursor(), c = b + a;
    	    a = jspb.BinaryDecoder.alloc(this.decoder_.getBuffer(), b, a);
    	    this.decoder_.setCursor(c);
    	    return a
    	};
    	jspb.BinaryReader.prototype.readInt32 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSignedVarint32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readInt32", jspb.BinaryReader.prototype.readInt32);
    	jspb.BinaryReader.prototype.readInt32String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSignedVarint32String()
    	};
    	jspb.BinaryReader.prototype.readInt64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSignedVarint64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readInt64", jspb.BinaryReader.prototype.readInt64);
    	jspb.BinaryReader.prototype.readInt64String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSignedVarint64String()
    	};
    	jspb.BinaryReader.prototype.readUint32 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readUnsignedVarint32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readUint32", jspb.BinaryReader.prototype.readUint32);
    	jspb.BinaryReader.prototype.readUint32String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readUnsignedVarint32String()
    	};
    	jspb.BinaryReader.prototype.readUint64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readUnsignedVarint64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readUint64", jspb.BinaryReader.prototype.readUint64);
    	jspb.BinaryReader.prototype.readUint64String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readUnsignedVarint64String()
    	};
    	jspb.BinaryReader.prototype.readSint32 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readZigzagVarint32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readSint32", jspb.BinaryReader.prototype.readSint32);
    	jspb.BinaryReader.prototype.readSint64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readZigzagVarint64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readSint64", jspb.BinaryReader.prototype.readSint64);
    	jspb.BinaryReader.prototype.readSint64String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readZigzagVarint64String()
    	};
    	jspb.BinaryReader.prototype.readFixed32 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
    	    return this.decoder_.readUint32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readFixed32", jspb.BinaryReader.prototype.readFixed32);
    	jspb.BinaryReader.prototype.readFixed64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readUint64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readFixed64", jspb.BinaryReader.prototype.readFixed64);
    	jspb.BinaryReader.prototype.readFixed64String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readUint64String()
    	};
    	jspb.BinaryReader.prototype.readSfixed32 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
    	    return this.decoder_.readInt32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readSfixed32", jspb.BinaryReader.prototype.readSfixed32);
    	jspb.BinaryReader.prototype.readSfixed32String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
    	    return this.decoder_.readInt32().toString()
    	};
    	jspb.BinaryReader.prototype.readSfixed64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readInt64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readSfixed64", jspb.BinaryReader.prototype.readSfixed64);
    	jspb.BinaryReader.prototype.readSfixed64String = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readInt64String()
    	};
    	jspb.BinaryReader.prototype.readFloat = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED32);
    	    return this.decoder_.readFloat()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readFloat", jspb.BinaryReader.prototype.readFloat);
    	jspb.BinaryReader.prototype.readDouble = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readDouble()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readDouble", jspb.BinaryReader.prototype.readDouble);
    	jspb.BinaryReader.prototype.readBool = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return !!this.decoder_.readUnsignedVarint32()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readBool", jspb.BinaryReader.prototype.readBool);
    	jspb.BinaryReader.prototype.readEnum = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSignedVarint64()
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readEnum", jspb.BinaryReader.prototype.readEnum);
    	jspb.BinaryReader.prototype.readString = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
    	    var a = this.decoder_.readUnsignedVarint32();
    	    return this.decoder_.readString(a)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readString", jspb.BinaryReader.prototype.readString);
    	jspb.BinaryReader.prototype.readBytes = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
    	    var a = this.decoder_.readUnsignedVarint32();
    	    return this.decoder_.readBytes(a)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readBytes", jspb.BinaryReader.prototype.readBytes);
    	jspb.BinaryReader.prototype.readVarintHash64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readVarintHash64()
    	};
    	jspb.BinaryReader.prototype.readSintHash64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readZigzagVarintHash64()
    	};
    	jspb.BinaryReader.prototype.readSplitVarint64 = function (a) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSplitVarint64(a)
    	};
    	jspb.BinaryReader.prototype.readSplitZigzagVarint64 = function (a) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.VARINT);
    	    return this.decoder_.readSplitVarint64(function (b, c) {
    	        return jspb.utils.fromZigzag64(b, c, a)
    	    })
    	};
    	jspb.BinaryReader.prototype.readFixedHash64 = function () {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readFixedHash64()
    	};
    	jspb.BinaryReader.prototype.readSplitFixed64 = function (a) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.FIXED64);
    	    return this.decoder_.readSplitFixed64(a)
    	};
    	jspb.BinaryReader.prototype.readPackedField_ = function (a) {
    	    jspb.asserts.assert(this.nextWireType_ == jspb.BinaryConstants.WireType.DELIMITED);
    	    var b = this.decoder_.readUnsignedVarint32();
    	    b = this.decoder_.getCursor() + b;
    	    for (var c = []; this.decoder_.getCursor() < b;) c.push(a.call(this.decoder_));
    	    return c
    	};
    	jspb.BinaryReader.prototype.readPackedInt32 = function () {
    	    return this.readPackedField_(this.decoder_.readSignedVarint32)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedInt32", jspb.BinaryReader.prototype.readPackedInt32);
    	jspb.BinaryReader.prototype.readPackedInt32String = function () {
    	    return this.readPackedField_(this.decoder_.readSignedVarint32String)
    	};
    	jspb.BinaryReader.prototype.readPackedInt64 = function () {
    	    return this.readPackedField_(this.decoder_.readSignedVarint64)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedInt64", jspb.BinaryReader.prototype.readPackedInt64);
    	jspb.BinaryReader.prototype.readPackedInt64String = function () {
    	    return this.readPackedField_(this.decoder_.readSignedVarint64String)
    	};
    	jspb.BinaryReader.prototype.readPackedUint32 = function () {
    	    return this.readPackedField_(this.decoder_.readUnsignedVarint32)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedUint32", jspb.BinaryReader.prototype.readPackedUint32);
    	jspb.BinaryReader.prototype.readPackedUint32String = function () {
    	    return this.readPackedField_(this.decoder_.readUnsignedVarint32String)
    	};
    	jspb.BinaryReader.prototype.readPackedUint64 = function () {
    	    return this.readPackedField_(this.decoder_.readUnsignedVarint64)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedUint64", jspb.BinaryReader.prototype.readPackedUint64);
    	jspb.BinaryReader.prototype.readPackedUint64String = function () {
    	    return this.readPackedField_(this.decoder_.readUnsignedVarint64String)
    	};
    	jspb.BinaryReader.prototype.readPackedSint32 = function () {
    	    return this.readPackedField_(this.decoder_.readZigzagVarint32)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedSint32", jspb.BinaryReader.prototype.readPackedSint32);
    	jspb.BinaryReader.prototype.readPackedSint64 = function () {
    	    return this.readPackedField_(this.decoder_.readZigzagVarint64)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedSint64", jspb.BinaryReader.prototype.readPackedSint64);
    	jspb.BinaryReader.prototype.readPackedSint64String = function () {
    	    return this.readPackedField_(this.decoder_.readZigzagVarint64String)
    	};
    	jspb.BinaryReader.prototype.readPackedFixed32 = function () {
    	    return this.readPackedField_(this.decoder_.readUint32)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedFixed32", jspb.BinaryReader.prototype.readPackedFixed32);
    	jspb.BinaryReader.prototype.readPackedFixed64 = function () {
    	    return this.readPackedField_(this.decoder_.readUint64)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedFixed64", jspb.BinaryReader.prototype.readPackedFixed64);
    	jspb.BinaryReader.prototype.readPackedFixed64String = function () {
    	    return this.readPackedField_(this.decoder_.readUint64String)
    	};
    	jspb.BinaryReader.prototype.readPackedSfixed32 = function () {
    	    return this.readPackedField_(this.decoder_.readInt32)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedSfixed32", jspb.BinaryReader.prototype.readPackedSfixed32);
    	jspb.BinaryReader.prototype.readPackedSfixed64 = function () {
    	    return this.readPackedField_(this.decoder_.readInt64)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedSfixed64", jspb.BinaryReader.prototype.readPackedSfixed64);
    	jspb.BinaryReader.prototype.readPackedSfixed64String = function () {
    	    return this.readPackedField_(this.decoder_.readInt64String)
    	};
    	jspb.BinaryReader.prototype.readPackedFloat = function () {
    	    return this.readPackedField_(this.decoder_.readFloat)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedFloat", jspb.BinaryReader.prototype.readPackedFloat);
    	jspb.BinaryReader.prototype.readPackedDouble = function () {
    	    return this.readPackedField_(this.decoder_.readDouble)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedDouble", jspb.BinaryReader.prototype.readPackedDouble);
    	jspb.BinaryReader.prototype.readPackedBool = function () {
    	    return this.readPackedField_(this.decoder_.readBool)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedBool", jspb.BinaryReader.prototype.readPackedBool);
    	jspb.BinaryReader.prototype.readPackedEnum = function () {
    	    return this.readPackedField_(this.decoder_.readEnum)
    	};
    	goog.exportProperty(jspb.BinaryReader.prototype, "readPackedEnum", jspb.BinaryReader.prototype.readPackedEnum);
    	jspb.BinaryReader.prototype.readPackedVarintHash64 = function () {
    	    return this.readPackedField_(this.decoder_.readVarintHash64)
    	};
    	jspb.BinaryReader.prototype.readPackedFixedHash64 = function () {
    	    return this.readPackedField_(this.decoder_.readFixedHash64)
    	};
    	jspb.BinaryEncoder = function () {
    	    this.buffer_ = [];
    	};
    	jspb.BinaryEncoder.prototype.length = function () {
    	    return this.buffer_.length
    	};
    	jspb.BinaryEncoder.prototype.end = function () {
    	    var a = this.buffer_;
    	    this.buffer_ = [];
    	    return a
    	};
    	jspb.BinaryEncoder.prototype.writeSplitVarint64 = function (a, b) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(b == Math.floor(b));
    	    jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_32);
    	    for (jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_32); 0 < b || 127 < a;) this.buffer_.push(a & 127 | 128), a = (a >>> 7 | b << 25) >>> 0, b >>>= 7;
    	    this.buffer_.push(a);
    	};
    	jspb.BinaryEncoder.prototype.writeSplitFixed64 = function (a, b) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(b == Math.floor(b));
    	    jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_32);
    	    jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_32);
    	    this.writeUint32(a);
    	    this.writeUint32(b);
    	};
    	jspb.BinaryEncoder.prototype.writeUnsignedVarint32 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    for (jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_32); 127 < a;) this.buffer_.push(a & 127 | 128), a >>>= 7;
    	    this.buffer_.push(a);
    	};
    	jspb.BinaryEncoder.prototype.writeSignedVarint32 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_31 && a < jspb.BinaryConstants.TWO_TO_31);
    	    if (0 <= a) this.writeUnsignedVarint32(a); else {
    	        for (var b = 0; 9 > b; b++) this.buffer_.push(a & 127 | 128), a >>= 7;
    	        this.buffer_.push(1);
    	    }
    	};
    	jspb.BinaryEncoder.prototype.writeUnsignedVarint64 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_64);
    	    jspb.utils.splitInt64(a);
    	    this.writeSplitVarint64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeSignedVarint64 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_63 && a < jspb.BinaryConstants.TWO_TO_63);
    	    jspb.utils.splitInt64(a);
    	    this.writeSplitVarint64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeZigzagVarint32 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_31 && a < jspb.BinaryConstants.TWO_TO_31);
    	    this.writeUnsignedVarint32((a << 1 ^ a >> 31) >>> 0);
    	};
    	jspb.BinaryEncoder.prototype.writeZigzagVarint64 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_63 && a < jspb.BinaryConstants.TWO_TO_63);
    	    jspb.utils.splitZigzag64(a);
    	    this.writeSplitVarint64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeZigzagVarint64String = function (a) {
    	    this.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(a));
    	};
    	jspb.BinaryEncoder.prototype.writeZigzagVarintHash64 = function (a) {
    	    var b = this;
    	    jspb.utils.splitHash64(a);
    	    jspb.utils.toZigzag64(jspb.utils.split64Low, jspb.utils.split64High, function (a, d) {
    	        b.writeSplitVarint64(a >>> 0, d >>> 0);
    	    });
    	};
    	jspb.BinaryEncoder.prototype.writeUint8 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(0 <= a && 256 > a);
    	    this.buffer_.push(a >>> 0 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeUint16 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(0 <= a && 65536 > a);
    	    this.buffer_.push(a >>> 0 & 255);
    	    this.buffer_.push(a >>> 8 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeUint32 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_32);
    	    this.buffer_.push(a >>> 0 & 255);
    	    this.buffer_.push(a >>> 8 & 255);
    	    this.buffer_.push(a >>> 16 & 255);
    	    this.buffer_.push(a >>> 24 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeUint64 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(0 <= a && a < jspb.BinaryConstants.TWO_TO_64);
    	    jspb.utils.splitUint64(a);
    	    this.writeUint32(jspb.utils.split64Low);
    	    this.writeUint32(jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeInt8 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(-128 <= a && 128 > a);
    	    this.buffer_.push(a >>> 0 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeInt16 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(-32768 <= a && 32768 > a);
    	    this.buffer_.push(a >>> 0 & 255);
    	    this.buffer_.push(a >>> 8 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeInt32 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_31 && a < jspb.BinaryConstants.TWO_TO_31);
    	    this.buffer_.push(a >>> 0 & 255);
    	    this.buffer_.push(a >>> 8 & 255);
    	    this.buffer_.push(a >>> 16 & 255);
    	    this.buffer_.push(a >>> 24 & 255);
    	};
    	jspb.BinaryEncoder.prototype.writeInt64 = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_63 && a < jspb.BinaryConstants.TWO_TO_63);
    	    jspb.utils.splitInt64(a);
    	    this.writeSplitFixed64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeInt64String = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(+a >= -jspb.BinaryConstants.TWO_TO_63 && +a < jspb.BinaryConstants.TWO_TO_63);
    	    jspb.utils.splitHash64(jspb.utils.decimalStringToHash64(a));
    	    this.writeSplitFixed64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeFloat = function (a) {
    	    jspb.asserts.assert(Infinity === a || -Infinity === a || isNaN(a) || a >= -jspb.BinaryConstants.FLOAT32_MAX && a <= jspb.BinaryConstants.FLOAT32_MAX);
    	    jspb.utils.splitFloat32(a);
    	    this.writeUint32(jspb.utils.split64Low);
    	};
    	jspb.BinaryEncoder.prototype.writeDouble = function (a) {
    	    jspb.asserts.assert(Infinity === a || -Infinity === a || isNaN(a) || a >= -jspb.BinaryConstants.FLOAT64_MAX && a <= jspb.BinaryConstants.FLOAT64_MAX);
    	    jspb.utils.splitFloat64(a);
    	    this.writeUint32(jspb.utils.split64Low);
    	    this.writeUint32(jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeBool = function (a) {
    	    jspb.asserts.assert("boolean" === typeof a || "number" === typeof a);
    	    this.buffer_.push(a ? 1 : 0);
    	};
    	jspb.BinaryEncoder.prototype.writeEnum = function (a) {
    	    jspb.asserts.assert(a == Math.floor(a));
    	    jspb.asserts.assert(a >= -jspb.BinaryConstants.TWO_TO_31 && a < jspb.BinaryConstants.TWO_TO_31);
    	    this.writeSignedVarint32(a);
    	};
    	jspb.BinaryEncoder.prototype.writeBytes = function (a) {
    	    this.buffer_.push.apply(this.buffer_, a);
    	};
    	jspb.BinaryEncoder.prototype.writeVarintHash64 = function (a) {
    	    jspb.utils.splitHash64(a);
    	    this.writeSplitVarint64(jspb.utils.split64Low, jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeFixedHash64 = function (a) {
    	    jspb.utils.splitHash64(a);
    	    this.writeUint32(jspb.utils.split64Low);
    	    this.writeUint32(jspb.utils.split64High);
    	};
    	jspb.BinaryEncoder.prototype.writeString = function (a) {
    	    var b = this.buffer_.length;
    	    jspb.asserts.assertString(a);
    	    for (var c = 0; c < a.length; c++) {
    	        var d = a.charCodeAt(c);
    	        if (128 > d) this.buffer_.push(d); else if (2048 > d) this.buffer_.push(d >> 6 | 192), this.buffer_.push(d & 63 | 128); else if (65536 > d) if (55296 <= d && 56319 >= d && c + 1 < a.length) {
    	            var e = a.charCodeAt(c + 1);
    	            56320 <= e && 57343 >= e && (d = 1024 * (d - 55296) + e - 56320 + 65536, this.buffer_.push(d >> 18 | 240), this.buffer_.push(d >> 12 & 63 | 128), this.buffer_.push(d >> 6 & 63 | 128), this.buffer_.push(d & 63 |
    	                128), c++);
    	        } else this.buffer_.push(d >> 12 | 224), this.buffer_.push(d >> 6 & 63 | 128), this.buffer_.push(d & 63 | 128);
    	    }
    	    return this.buffer_.length - b
    	};
    	jspb.arith = {};
    	jspb.arith.UInt64 = function (a, b) {
    	    this.lo = a;
    	    this.hi = b;
    	};
    	jspb.arith.UInt64.prototype.cmp = function (a) {
    	    return this.hi < a.hi || this.hi == a.hi && this.lo < a.lo ? -1 : this.hi == a.hi && this.lo == a.lo ? 0 : 1
    	};
    	jspb.arith.UInt64.prototype.rightShift = function () {
    	    return new jspb.arith.UInt64((this.lo >>> 1 | (this.hi & 1) << 31) >>> 0, this.hi >>> 1 >>> 0)
    	};
    	jspb.arith.UInt64.prototype.leftShift = function () {
    	    return new jspb.arith.UInt64(this.lo << 1 >>> 0, (this.hi << 1 | this.lo >>> 31) >>> 0)
    	};
    	jspb.arith.UInt64.prototype.msb = function () {
    	    return !!(this.hi & 2147483648)
    	};
    	jspb.arith.UInt64.prototype.lsb = function () {
    	    return !!(this.lo & 1)
    	};
    	jspb.arith.UInt64.prototype.zero = function () {
    	    return 0 == this.lo && 0 == this.hi
    	};
    	jspb.arith.UInt64.prototype.add = function (a) {
    	    return new jspb.arith.UInt64((this.lo + a.lo & 4294967295) >>> 0 >>> 0, ((this.hi + a.hi & 4294967295) >>> 0) + (4294967296 <= this.lo + a.lo ? 1 : 0) >>> 0)
    	};
    	jspb.arith.UInt64.prototype.sub = function (a) {
    	    return new jspb.arith.UInt64((this.lo - a.lo & 4294967295) >>> 0 >>> 0, ((this.hi - a.hi & 4294967295) >>> 0) - (0 > this.lo - a.lo ? 1 : 0) >>> 0)
    	};
    	jspb.arith.UInt64.mul32x32 = function (a, b) {
    	    var c = a & 65535;
    	    a >>>= 16;
    	    var d = b & 65535, e = b >>> 16;
    	    b = c * d + 65536 * (c * e & 65535) + 65536 * (a * d & 65535);
    	    for (c = a * e + (c * e >>> 16) + (a * d >>> 16); 4294967296 <= b;) b -= 4294967296, c += 1;
    	    return new jspb.arith.UInt64(b >>> 0, c >>> 0)
    	};
    	jspb.arith.UInt64.prototype.mul = function (a) {
    	    var b = jspb.arith.UInt64.mul32x32(this.lo, a);
    	    a = jspb.arith.UInt64.mul32x32(this.hi, a);
    	    a.hi = a.lo;
    	    a.lo = 0;
    	    return b.add(a)
    	};
    	jspb.arith.UInt64.prototype.div = function (a) {
    	    if (0 == a) return [];
    	    var b = new jspb.arith.UInt64(0, 0), c = new jspb.arith.UInt64(this.lo, this.hi);
    	    a = new jspb.arith.UInt64(a, 0);
    	    for (var d = new jspb.arith.UInt64(1, 0); !a.msb();) a = a.leftShift(), d = d.leftShift();
    	    for (; !d.zero();) 0 >= a.cmp(c) && (b = b.add(d), c = c.sub(a)), a = a.rightShift(), d = d.rightShift();
    	    return [b, c]
    	};
    	jspb.arith.UInt64.prototype.toString = function () {
    	    for (var a = "", b = this; !b.zero();) {
    	        b = b.div(10);
    	        var c = b[0];
    	        a = b[1].lo + a;
    	        b = c;
    	    }
    	    "" == a && (a = "0");
    	    return a
    	};
    	jspb.arith.UInt64.fromString = function (a) {
    	    for (var b = new jspb.arith.UInt64(0, 0), c = new jspb.arith.UInt64(0, 0), d = 0; d < a.length; d++) {
    	        if ("0" > a[d] || "9" < a[d]) return null;
    	        var e = parseInt(a[d], 10);
    	        c.lo = e;
    	        b = b.mul(10).add(c);
    	    }
    	    return b
    	};
    	jspb.arith.UInt64.prototype.clone = function () {
    	    return new jspb.arith.UInt64(this.lo, this.hi)
    	};
    	jspb.arith.Int64 = function (a, b) {
    	    this.lo = a;
    	    this.hi = b;
    	};
    	jspb.arith.Int64.prototype.add = function (a) {
    	    return new jspb.arith.Int64((this.lo + a.lo & 4294967295) >>> 0 >>> 0, ((this.hi + a.hi & 4294967295) >>> 0) + (4294967296 <= this.lo + a.lo ? 1 : 0) >>> 0)
    	};
    	jspb.arith.Int64.prototype.sub = function (a) {
    	    return new jspb.arith.Int64((this.lo - a.lo & 4294967295) >>> 0 >>> 0, ((this.hi - a.hi & 4294967295) >>> 0) - (0 > this.lo - a.lo ? 1 : 0) >>> 0)
    	};
    	jspb.arith.Int64.prototype.clone = function () {
    	    return new jspb.arith.Int64(this.lo, this.hi)
    	};
    	jspb.arith.Int64.prototype.toString = function () {
    	    var a = 0 != (this.hi & 2147483648), b = new jspb.arith.UInt64(this.lo, this.hi);
    	    a && (b = (new jspb.arith.UInt64(0, 0)).sub(b));
    	    return (a ? "-" : "") + b.toString()
    	};
    	jspb.arith.Int64.fromString = function (a) {
    	    var b = 0 < a.length && "-" == a[0];
    	    b && (a = a.substring(1));
    	    a = jspb.arith.UInt64.fromString(a);
    	    if (null === a) return null;
    	    b && (a = (new jspb.arith.UInt64(0, 0)).sub(a));
    	    return new jspb.arith.Int64(a.lo, a.hi)
    	};
    	jspb.BinaryWriter = function () {
    	    this.blocks_ = [];
    	    this.totalLength_ = 0;
    	    this.encoder_ = new jspb.BinaryEncoder;
    	    this.bookmarks_ = [];
    	};
    	jspb.BinaryWriter.prototype.appendUint8Array_ = function (a) {
    	    var b = this.encoder_.end();
    	    this.blocks_.push(b);
    	    this.blocks_.push(a);
    	    this.totalLength_ += b.length + a.length;
    	};
    	jspb.BinaryWriter.prototype.beginDelimited_ = function (a) {
    	    this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED);
    	    a = this.encoder_.end();
    	    this.blocks_.push(a);
    	    this.totalLength_ += a.length;
    	    a.push(this.totalLength_);
    	    return a
    	};
    	jspb.BinaryWriter.prototype.endDelimited_ = function (a) {
    	    var b = a.pop();
    	    b = this.totalLength_ + this.encoder_.length() - b;
    	    for (jspb.asserts.assert(0 <= b); 127 < b;) a.push(b & 127 | 128), b >>>= 7, this.totalLength_++;
    	    a.push(b);
    	    this.totalLength_++;
    	};
    	jspb.BinaryWriter.prototype.writeSerializedMessage = function (a, b, c) {
    	    this.appendUint8Array_(a.subarray(b, c));
    	};
    	jspb.BinaryWriter.prototype.maybeWriteSerializedMessage = function (a, b, c) {
    	    null != a && null != b && null != c && this.writeSerializedMessage(a, b, c);
    	};
    	jspb.BinaryWriter.prototype.reset = function () {
    	    this.blocks_ = [];
    	    this.encoder_.end();
    	    this.totalLength_ = 0;
    	    this.bookmarks_ = [];
    	};
    	jspb.BinaryWriter.prototype.getResultBuffer = function () {
    	    jspb.asserts.assert(0 == this.bookmarks_.length);
    	    for (var a = new Uint8Array(this.totalLength_ + this.encoder_.length()), b = this.blocks_, c = b.length, d = 0, e = 0; e < c; e++) {
    	        var f = b[e];
    	        a.set(f, d);
    	        d += f.length;
    	    }
    	    b = this.encoder_.end();
    	    a.set(b, d);
    	    d += b.length;
    	    jspb.asserts.assert(d == a.length);
    	    this.blocks_ = [a];
    	    return a
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "getResultBuffer", jspb.BinaryWriter.prototype.getResultBuffer);
    	jspb.BinaryWriter.prototype.getResultBase64String = function (a) {
    	    return goog.crypt.base64.encodeByteArray(this.getResultBuffer(), a)
    	};
    	jspb.BinaryWriter.prototype.beginSubMessage = function (a) {
    	    this.bookmarks_.push(this.beginDelimited_(a));
    	};
    	jspb.BinaryWriter.prototype.endSubMessage = function () {
    	    jspb.asserts.assert(0 <= this.bookmarks_.length);
    	    this.endDelimited_(this.bookmarks_.pop());
    	};
    	jspb.BinaryWriter.prototype.writeFieldHeader_ = function (a, b) {
    	    jspb.asserts.assert(1 <= a && a == Math.floor(a));
    	    this.encoder_.writeUnsignedVarint32(8 * a + b);
    	};
    	jspb.BinaryWriter.prototype.writeAny = function (a, b, c) {
    	    var d = jspb.BinaryConstants.FieldType;
    	    switch (a) {
    	        case d.DOUBLE:
    	            this.writeDouble(b, c);
    	            break;
    	        case d.FLOAT:
    	            this.writeFloat(b, c);
    	            break;
    	        case d.INT64:
    	            this.writeInt64(b, c);
    	            break;
    	        case d.UINT64:
    	            this.writeUint64(b, c);
    	            break;
    	        case d.INT32:
    	            this.writeInt32(b, c);
    	            break;
    	        case d.FIXED64:
    	            this.writeFixed64(b, c);
    	            break;
    	        case d.FIXED32:
    	            this.writeFixed32(b, c);
    	            break;
    	        case d.BOOL:
    	            this.writeBool(b, c);
    	            break;
    	        case d.STRING:
    	            this.writeString(b, c);
    	            break;
    	        case d.GROUP:
    	            jspb.asserts.fail("Group field type not supported in writeAny()");
    	            break;
    	        case d.MESSAGE:
    	            jspb.asserts.fail("Message field type not supported in writeAny()");
    	            break;
    	        case d.BYTES:
    	            this.writeBytes(b, c);
    	            break;
    	        case d.UINT32:
    	            this.writeUint32(b, c);
    	            break;
    	        case d.ENUM:
    	            this.writeEnum(b, c);
    	            break;
    	        case d.SFIXED32:
    	            this.writeSfixed32(b, c);
    	            break;
    	        case d.SFIXED64:
    	            this.writeSfixed64(b, c);
    	            break;
    	        case d.SINT32:
    	            this.writeSint32(b, c);
    	            break;
    	        case d.SINT64:
    	            this.writeSint64(b, c);
    	            break;
    	        case d.FHASH64:
    	            this.writeFixedHash64(b, c);
    	            break;
    	        case d.VHASH64:
    	            this.writeVarintHash64(b, c);
    	            break;
    	        default:
    	            jspb.asserts.fail("Invalid field type in writeAny()");
    	    }
    	};
    	jspb.BinaryWriter.prototype.writeUnsignedVarint32_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeUnsignedVarint32(b));
    	};
    	jspb.BinaryWriter.prototype.writeSignedVarint32_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSignedVarint32(b));
    	};
    	jspb.BinaryWriter.prototype.writeUnsignedVarint64_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeUnsignedVarint64(b));
    	};
    	jspb.BinaryWriter.prototype.writeSignedVarint64_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSignedVarint64(b));
    	};
    	jspb.BinaryWriter.prototype.writeZigzagVarint32_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeZigzagVarint32(b));
    	};
    	jspb.BinaryWriter.prototype.writeZigzagVarint64_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeZigzagVarint64(b));
    	};
    	jspb.BinaryWriter.prototype.writeZigzagVarint64String_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeZigzagVarint64String(b));
    	};
    	jspb.BinaryWriter.prototype.writeZigzagVarintHash64_ = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeZigzagVarintHash64(b));
    	};
    	jspb.BinaryWriter.prototype.writeInt32 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_31 && b < jspb.BinaryConstants.TWO_TO_31), this.writeSignedVarint32_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeInt32", jspb.BinaryWriter.prototype.writeInt32);
    	jspb.BinaryWriter.prototype.writeInt32String = function (a, b) {
    	    null != b && (b = parseInt(b, 10), jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_31 && b < jspb.BinaryConstants.TWO_TO_31), this.writeSignedVarint32_(a, b));
    	};
    	jspb.BinaryWriter.prototype.writeInt64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_63 && b < jspb.BinaryConstants.TWO_TO_63), this.writeSignedVarint64_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeInt64", jspb.BinaryWriter.prototype.writeInt64);
    	jspb.BinaryWriter.prototype.writeInt64String = function (a, b) {
    	    null != b && (b = jspb.arith.Int64.fromString(b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSplitVarint64(b.lo, b.hi));
    	};
    	jspb.BinaryWriter.prototype.writeUint32 = function (a, b) {
    	    null != b && (jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_32), this.writeUnsignedVarint32_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeUint32", jspb.BinaryWriter.prototype.writeUint32);
    	jspb.BinaryWriter.prototype.writeUint32String = function (a, b) {
    	    null != b && (b = parseInt(b, 10), jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_32), this.writeUnsignedVarint32_(a, b));
    	};
    	jspb.BinaryWriter.prototype.writeUint64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_64), this.writeUnsignedVarint64_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeUint64", jspb.BinaryWriter.prototype.writeUint64);
    	jspb.BinaryWriter.prototype.writeUint64String = function (a, b) {
    	    null != b && (b = jspb.arith.UInt64.fromString(b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSplitVarint64(b.lo, b.hi));
    	};
    	jspb.BinaryWriter.prototype.writeSint32 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_31 && b < jspb.BinaryConstants.TWO_TO_31), this.writeZigzagVarint32_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeSint32", jspb.BinaryWriter.prototype.writeSint32);
    	jspb.BinaryWriter.prototype.writeSint64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_63 && b < jspb.BinaryConstants.TWO_TO_63), this.writeZigzagVarint64_(a, b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeSint64", jspb.BinaryWriter.prototype.writeSint64);
    	jspb.BinaryWriter.prototype.writeSintHash64 = function (a, b) {
    	    null != b && this.writeZigzagVarintHash64_(a, b);
    	};
    	jspb.BinaryWriter.prototype.writeSint64String = function (a, b) {
    	    null != b && this.writeZigzagVarint64String_(a, b);
    	};
    	jspb.BinaryWriter.prototype.writeFixed32 = function (a, b) {
    	    null != b && (jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_32), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED32), this.encoder_.writeUint32(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeFixed32", jspb.BinaryWriter.prototype.writeFixed32);
    	jspb.BinaryWriter.prototype.writeFixed64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(0 <= b && b < jspb.BinaryConstants.TWO_TO_64), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeUint64(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeFixed64", jspb.BinaryWriter.prototype.writeFixed64);
    	jspb.BinaryWriter.prototype.writeFixed64String = function (a, b) {
    	    null != b && (b = jspb.arith.UInt64.fromString(b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeSplitFixed64(b.lo, b.hi));
    	};
    	jspb.BinaryWriter.prototype.writeSfixed32 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_31 && b < jspb.BinaryConstants.TWO_TO_31), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED32), this.encoder_.writeInt32(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeSfixed32", jspb.BinaryWriter.prototype.writeSfixed32);
    	jspb.BinaryWriter.prototype.writeSfixed64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_63 && b < jspb.BinaryConstants.TWO_TO_63), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeInt64(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeSfixed64", jspb.BinaryWriter.prototype.writeSfixed64);
    	jspb.BinaryWriter.prototype.writeSfixed64String = function (a, b) {
    	    null != b && (b = jspb.arith.Int64.fromString(b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeSplitFixed64(b.lo, b.hi));
    	};
    	jspb.BinaryWriter.prototype.writeFloat = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED32), this.encoder_.writeFloat(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeFloat", jspb.BinaryWriter.prototype.writeFloat);
    	jspb.BinaryWriter.prototype.writeDouble = function (a, b) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeDouble(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeDouble", jspb.BinaryWriter.prototype.writeDouble);
    	jspb.BinaryWriter.prototype.writeBool = function (a, b) {
    	    null != b && (jspb.asserts.assert("boolean" === typeof b || "number" === typeof b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeBool(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeBool", jspb.BinaryWriter.prototype.writeBool);
    	jspb.BinaryWriter.prototype.writeEnum = function (a, b) {
    	    null != b && (jspb.asserts.assert(b >= -jspb.BinaryConstants.TWO_TO_31 && b < jspb.BinaryConstants.TWO_TO_31), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSignedVarint32(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeEnum", jspb.BinaryWriter.prototype.writeEnum);
    	jspb.BinaryWriter.prototype.writeString = function (a, b) {
    	    null != b && (a = this.beginDelimited_(a), this.encoder_.writeString(b), this.endDelimited_(a));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeString", jspb.BinaryWriter.prototype.writeString);
    	jspb.BinaryWriter.prototype.writeBytes = function (a, b) {
    	    null != b && (b = jspb.utils.byteSourceToUint8Array(b), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(b.length), this.appendUint8Array_(b));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeBytes", jspb.BinaryWriter.prototype.writeBytes);
    	jspb.BinaryWriter.prototype.writeMessage = function (a, b, c) {
    	    null != b && (a = this.beginDelimited_(a), c(b, this), this.endDelimited_(a));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeMessage", jspb.BinaryWriter.prototype.writeMessage);
    	jspb.BinaryWriter.prototype.writeMessageSet = function (a, b, c) {
    	    null != b && (this.writeFieldHeader_(1, jspb.BinaryConstants.WireType.START_GROUP), this.writeFieldHeader_(2, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeSignedVarint32(a), a = this.beginDelimited_(3), c(b, this), this.endDelimited_(a), this.writeFieldHeader_(1, jspb.BinaryConstants.WireType.END_GROUP));
    	};
    	jspb.BinaryWriter.prototype.writeGroup = function (a, b, c) {
    	    null != b && (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.START_GROUP), c(b, this), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.END_GROUP));
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeGroup", jspb.BinaryWriter.prototype.writeGroup);
    	jspb.BinaryWriter.prototype.writeFixedHash64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(8 == b.length), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64), this.encoder_.writeFixedHash64(b));
    	};
    	jspb.BinaryWriter.prototype.writeVarintHash64 = function (a, b) {
    	    null != b && (jspb.asserts.assert(8 == b.length), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT), this.encoder_.writeVarintHash64(b));
    	};
    	jspb.BinaryWriter.prototype.writeSplitFixed64 = function (a, b, c) {
    	    this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.FIXED64);
    	    this.encoder_.writeSplitFixed64(b, c);
    	};
    	jspb.BinaryWriter.prototype.writeSplitVarint64 = function (a, b, c) {
    	    this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT);
    	    this.encoder_.writeSplitVarint64(b, c);
    	};
    	jspb.BinaryWriter.prototype.writeSplitZigzagVarint64 = function (a, b, c) {
    	    this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.VARINT);
    	    var d = this.encoder_;
    	    jspb.utils.toZigzag64(b, c, function (a, b) {
    	        d.writeSplitVarint64(a >>> 0, b >>> 0);
    	    });
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedInt32 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeSignedVarint32_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedInt32", jspb.BinaryWriter.prototype.writeRepeatedInt32);
    	jspb.BinaryWriter.prototype.writeRepeatedInt32String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeInt32String(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedInt64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeSignedVarint64_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedInt64", jspb.BinaryWriter.prototype.writeRepeatedInt64);
    	jspb.BinaryWriter.prototype.writeRepeatedSplitFixed64 = function (a, b, c, d) {
    	    if (null != b) for (var e = 0; e < b.length; e++) this.writeSplitFixed64(a, c(b[e]), d(b[e]));
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedSplitVarint64 = function (a, b, c, d) {
    	    if (null != b) for (var e = 0; e < b.length; e++) this.writeSplitVarint64(a, c(b[e]), d(b[e]));
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedSplitZigzagVarint64 = function (a, b, c, d) {
    	    if (null != b) for (var e = 0; e < b.length; e++) this.writeSplitZigzagVarint64(a, c(b[e]), d(b[e]));
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedInt64String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeInt64String(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedUint32 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeUnsignedVarint32_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedUint32", jspb.BinaryWriter.prototype.writeRepeatedUint32);
    	jspb.BinaryWriter.prototype.writeRepeatedUint32String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeUint32String(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedUint64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeUnsignedVarint64_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedUint64", jspb.BinaryWriter.prototype.writeRepeatedUint64);
    	jspb.BinaryWriter.prototype.writeRepeatedUint64String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeUint64String(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedSint32 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeZigzagVarint32_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedSint32", jspb.BinaryWriter.prototype.writeRepeatedSint32);
    	jspb.BinaryWriter.prototype.writeRepeatedSint64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeZigzagVarint64_(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedSint64", jspb.BinaryWriter.prototype.writeRepeatedSint64);
    	jspb.BinaryWriter.prototype.writeRepeatedSint64String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeZigzagVarint64String_(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedSintHash64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeZigzagVarintHash64_(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedFixed32 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeFixed32(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedFixed32", jspb.BinaryWriter.prototype.writeRepeatedFixed32);
    	jspb.BinaryWriter.prototype.writeRepeatedFixed64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeFixed64(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedFixed64", jspb.BinaryWriter.prototype.writeRepeatedFixed64);
    	jspb.BinaryWriter.prototype.writeRepeatedFixed64String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeFixed64String(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedFixed64String", jspb.BinaryWriter.prototype.writeRepeatedFixed64String);
    	jspb.BinaryWriter.prototype.writeRepeatedSfixed32 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeSfixed32(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedSfixed32", jspb.BinaryWriter.prototype.writeRepeatedSfixed32);
    	jspb.BinaryWriter.prototype.writeRepeatedSfixed64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeSfixed64(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedSfixed64", jspb.BinaryWriter.prototype.writeRepeatedSfixed64);
    	jspb.BinaryWriter.prototype.writeRepeatedSfixed64String = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeSfixed64String(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedFloat = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeFloat(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedFloat", jspb.BinaryWriter.prototype.writeRepeatedFloat);
    	jspb.BinaryWriter.prototype.writeRepeatedDouble = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeDouble(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedDouble", jspb.BinaryWriter.prototype.writeRepeatedDouble);
    	jspb.BinaryWriter.prototype.writeRepeatedBool = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeBool(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedBool", jspb.BinaryWriter.prototype.writeRepeatedBool);
    	jspb.BinaryWriter.prototype.writeRepeatedEnum = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeEnum(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedEnum", jspb.BinaryWriter.prototype.writeRepeatedEnum);
    	jspb.BinaryWriter.prototype.writeRepeatedString = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeString(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedString", jspb.BinaryWriter.prototype.writeRepeatedString);
    	jspb.BinaryWriter.prototype.writeRepeatedBytes = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeBytes(a, b[c]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedBytes", jspb.BinaryWriter.prototype.writeRepeatedBytes);
    	jspb.BinaryWriter.prototype.writeRepeatedMessage = function (a, b, c) {
    	    if (null != b) for (var d = 0; d < b.length; d++) {
    	        var e = this.beginDelimited_(a);
    	        c(b[d], this);
    	        this.endDelimited_(e);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedMessage", jspb.BinaryWriter.prototype.writeRepeatedMessage);
    	jspb.BinaryWriter.prototype.writeRepeatedGroup = function (a, b, c) {
    	    if (null != b) for (var d = 0; d < b.length; d++) this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.START_GROUP), c(b[d], this), this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.END_GROUP);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writeRepeatedGroup", jspb.BinaryWriter.prototype.writeRepeatedGroup);
    	jspb.BinaryWriter.prototype.writeRepeatedFixedHash64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeFixedHash64(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writeRepeatedVarintHash64 = function (a, b) {
    	    if (null != b) for (var c = 0; c < b.length; c++) this.writeVarintHash64(a, b[c]);
    	};
    	jspb.BinaryWriter.prototype.writePackedInt32 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeSignedVarint32(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedInt32", jspb.BinaryWriter.prototype.writePackedInt32);
    	jspb.BinaryWriter.prototype.writePackedInt32String = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeSignedVarint32(parseInt(b[c], 10));
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedInt64 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeSignedVarint64(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedInt64", jspb.BinaryWriter.prototype.writePackedInt64);
    	jspb.BinaryWriter.prototype.writePackedSplitFixed64 = function (a, b, c, d) {
    	    if (null != b) {
    	        a = this.beginDelimited_(a);
    	        for (var e = 0; e < b.length; e++) this.encoder_.writeSplitFixed64(c(b[e]), d(b[e]));
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedSplitVarint64 = function (a, b, c, d) {
    	    if (null != b) {
    	        a = this.beginDelimited_(a);
    	        for (var e = 0; e < b.length; e++) this.encoder_.writeSplitVarint64(c(b[e]), d(b[e]));
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedSplitZigzagVarint64 = function (a, b, c, d) {
    	    if (null != b) {
    	        a = this.beginDelimited_(a);
    	        for (var e = this.encoder_, f = 0; f < b.length; f++) jspb.utils.toZigzag64(c(b[f]), d(b[f]), function (a, b) {
    	            e.writeSplitVarint64(a >>> 0, b >>> 0);
    	        });
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedInt64String = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) {
    	            var d = jspb.arith.Int64.fromString(b[c]);
    	            this.encoder_.writeSplitVarint64(d.lo, d.hi);
    	        }
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedUint32 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeUnsignedVarint32(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedUint32", jspb.BinaryWriter.prototype.writePackedUint32);
    	jspb.BinaryWriter.prototype.writePackedUint32String = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeUnsignedVarint32(parseInt(b[c], 10));
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedUint64 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeUnsignedVarint64(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedUint64", jspb.BinaryWriter.prototype.writePackedUint64);
    	jspb.BinaryWriter.prototype.writePackedUint64String = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) {
    	            var d = jspb.arith.UInt64.fromString(b[c]);
    	            this.encoder_.writeSplitVarint64(d.lo, d.hi);
    	        }
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedSint32 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeZigzagVarint32(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedSint32", jspb.BinaryWriter.prototype.writePackedSint32);
    	jspb.BinaryWriter.prototype.writePackedSint64 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeZigzagVarint64(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedSint64", jspb.BinaryWriter.prototype.writePackedSint64);
    	jspb.BinaryWriter.prototype.writePackedSint64String = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeZigzagVarintHash64(jspb.utils.decimalStringToHash64(b[c]));
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedSintHash64 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeZigzagVarintHash64(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedFixed32 = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(4 * b.length), a = 0; a < b.length; a++) this.encoder_.writeUint32(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedFixed32", jspb.BinaryWriter.prototype.writePackedFixed32);
    	jspb.BinaryWriter.prototype.writePackedFixed64 = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) this.encoder_.writeUint64(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedFixed64", jspb.BinaryWriter.prototype.writePackedFixed64);
    	jspb.BinaryWriter.prototype.writePackedFixed64String = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) {
    	        var c = jspb.arith.UInt64.fromString(b[a]);
    	        this.encoder_.writeSplitFixed64(c.lo, c.hi);
    	    }
    	};
    	jspb.BinaryWriter.prototype.writePackedSfixed32 = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(4 * b.length), a = 0; a < b.length; a++) this.encoder_.writeInt32(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedSfixed32", jspb.BinaryWriter.prototype.writePackedSfixed32);
    	jspb.BinaryWriter.prototype.writePackedSfixed64 = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) this.encoder_.writeInt64(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedSfixed64", jspb.BinaryWriter.prototype.writePackedSfixed64);
    	jspb.BinaryWriter.prototype.writePackedSfixed64String = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) this.encoder_.writeInt64String(b[a]);
    	};
    	jspb.BinaryWriter.prototype.writePackedFloat = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(4 * b.length), a = 0; a < b.length; a++) this.encoder_.writeFloat(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedFloat", jspb.BinaryWriter.prototype.writePackedFloat);
    	jspb.BinaryWriter.prototype.writePackedDouble = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) this.encoder_.writeDouble(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedDouble", jspb.BinaryWriter.prototype.writePackedDouble);
    	jspb.BinaryWriter.prototype.writePackedBool = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(b.length), a = 0; a < b.length; a++) this.encoder_.writeBool(b[a]);
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedBool", jspb.BinaryWriter.prototype.writePackedBool);
    	jspb.BinaryWriter.prototype.writePackedEnum = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeEnum(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	goog.exportProperty(jspb.BinaryWriter.prototype, "writePackedEnum", jspb.BinaryWriter.prototype.writePackedEnum);
    	jspb.BinaryWriter.prototype.writePackedFixedHash64 = function (a, b) {
    	    if (null != b && b.length) for (this.writeFieldHeader_(a, jspb.BinaryConstants.WireType.DELIMITED), this.encoder_.writeUnsignedVarint32(8 * b.length), a = 0; a < b.length; a++) this.encoder_.writeFixedHash64(b[a]);
    	};
    	jspb.BinaryWriter.prototype.writePackedVarintHash64 = function (a, b) {
    	    if (null != b && b.length) {
    	        a = this.beginDelimited_(a);
    	        for (var c = 0; c < b.length; c++) this.encoder_.writeVarintHash64(b[c]);
    	        this.endDelimited_(a);
    	    }
    	};
    	jspb.Map = function (a, b) {
    	    this.arr_ = a;
    	    this.valueCtor_ = b;
    	    this.map_ = {};
    	    this.arrClean = !0;
    	    0 < this.arr_.length && this.loadFromArray_();
    	};
    	goog.exportSymbol("jspb.Map", jspb.Map);
    	jspb.Map.prototype.loadFromArray_ = function () {
    	    for (var a = 0; a < this.arr_.length; a++) {
    	        var b = this.arr_[a], c = b[0];
    	        this.map_[c.toString()] = new jspb.Map.Entry_(c, b[1]);
    	    }
    	    this.arrClean = !0;
    	};
    	jspb.Map.prototype.toArray = function () {
    	    if (this.arrClean) {
    	        if (this.valueCtor_) {
    	            var a = this.map_, b;
    	            for (b in a) if (Object.prototype.hasOwnProperty.call(a, b)) {
    	                var c = a[b].valueWrapper;
    	                c && c.toArray();
    	            }
    	        }
    	    } else {
    	        this.arr_.length = 0;
    	        a = this.stringKeys_();
    	        a.sort();
    	        for (b = 0; b < a.length; b++) {
    	            var d = this.map_[a[b]];
    	            (c = d.valueWrapper) && c.toArray();
    	            this.arr_.push([d.key, d.value]);
    	        }
    	        this.arrClean = !0;
    	    }
    	    return this.arr_
    	};
    	goog.exportProperty(jspb.Map.prototype, "toArray", jspb.Map.prototype.toArray);
    	jspb.Map.prototype.toObject = function (a, b) {
    	    for (var c = this.toArray(), d = [], e = 0; e < c.length; e++) {
    	        var f = this.map_[c[e][0].toString()];
    	        this.wrapEntry_(f);
    	        var g = f.valueWrapper;
    	        g ? (jspb.asserts.assert(b), d.push([f.key, b(a, g)])) : d.push([f.key, f.value]);
    	    }
    	    return d
    	};
    	goog.exportProperty(jspb.Map.prototype, "toObject", jspb.Map.prototype.toObject);
    	jspb.Map.fromObject = function (a, b, c) {
    	    b = new jspb.Map([], b);
    	    for (var d = 0; d < a.length; d++) {
    	        var e = a[d][0], f = c(a[d][1]);
    	        b.set(e, f);
    	    }
    	    return b
    	};
    	goog.exportProperty(jspb.Map, "fromObject", jspb.Map.fromObject);
    	jspb.Map.ArrayIteratorIterable_ = function (a) {
    	    this.idx_ = 0;
    	    this.arr_ = a;
    	};
    	jspb.Map.ArrayIteratorIterable_.prototype.next = function () {
    	    return this.idx_ < this.arr_.length ? {done: !1, value: this.arr_[this.idx_++]} : {done: !0, value: void 0}
    	};
    	"undefined" != typeof Symbol && (jspb.Map.ArrayIteratorIterable_.prototype[Symbol.iterator] = function () {
    	    return this
    	});
    	jspb.Map.prototype.getLength = function () {
    	    return this.stringKeys_().length
    	};
    	goog.exportProperty(jspb.Map.prototype, "getLength", jspb.Map.prototype.getLength);
    	jspb.Map.prototype.clear = function () {
    	    this.map_ = {};
    	    this.arrClean = !1;
    	};
    	goog.exportProperty(jspb.Map.prototype, "clear", jspb.Map.prototype.clear);
    	jspb.Map.prototype.del = function (a) {
    	    a = a.toString();
    	    var b = this.map_.hasOwnProperty(a);
    	    delete this.map_[a];
    	    this.arrClean = !1;
    	    return b
    	};
    	goog.exportProperty(jspb.Map.prototype, "del", jspb.Map.prototype.del);
    	jspb.Map.prototype.getEntryList = function () {
    	    var a = [], b = this.stringKeys_();
    	    b.sort();
    	    for (var c = 0; c < b.length; c++) {
    	        var d = this.map_[b[c]];
    	        a.push([d.key, d.value]);
    	    }
    	    return a
    	};
    	goog.exportProperty(jspb.Map.prototype, "getEntryList", jspb.Map.prototype.getEntryList);
    	jspb.Map.prototype.entries = function () {
    	    var a = [], b = this.stringKeys_();
    	    b.sort();
    	    for (var c = 0; c < b.length; c++) {
    	        var d = this.map_[b[c]];
    	        a.push([d.key, this.wrapEntry_(d)]);
    	    }
    	    return new jspb.Map.ArrayIteratorIterable_(a)
    	};
    	goog.exportProperty(jspb.Map.prototype, "entries", jspb.Map.prototype.entries);
    	jspb.Map.prototype.keys = function () {
    	    var a = [], b = this.stringKeys_();
    	    b.sort();
    	    for (var c = 0; c < b.length; c++) a.push(this.map_[b[c]].key);
    	    return new jspb.Map.ArrayIteratorIterable_(a)
    	};
    	goog.exportProperty(jspb.Map.prototype, "keys", jspb.Map.prototype.keys);
    	jspb.Map.prototype.values = function () {
    	    var a = [], b = this.stringKeys_();
    	    b.sort();
    	    for (var c = 0; c < b.length; c++) a.push(this.wrapEntry_(this.map_[b[c]]));
    	    return new jspb.Map.ArrayIteratorIterable_(a)
    	};
    	goog.exportProperty(jspb.Map.prototype, "values", jspb.Map.prototype.values);
    	jspb.Map.prototype.forEach = function (a, b) {
    	    var c = this.stringKeys_();
    	    c.sort();
    	    for (var d = 0; d < c.length; d++) {
    	        var e = this.map_[c[d]];
    	        a.call(b, this.wrapEntry_(e), e.key, this);
    	    }
    	};
    	goog.exportProperty(jspb.Map.prototype, "forEach", jspb.Map.prototype.forEach);
    	jspb.Map.prototype.set = function (a, b) {
    	    var c = new jspb.Map.Entry_(a);
    	    this.valueCtor_ ? (c.valueWrapper = b, c.value = b.toArray()) : c.value = b;
    	    this.map_[a.toString()] = c;
    	    this.arrClean = !1;
    	    return this
    	};
    	goog.exportProperty(jspb.Map.prototype, "set", jspb.Map.prototype.set);
    	jspb.Map.prototype.wrapEntry_ = function (a) {
    	    return this.valueCtor_ ? (a.valueWrapper || (a.valueWrapper = new this.valueCtor_(a.value)), a.valueWrapper) : a.value
    	};
    	jspb.Map.prototype.get = function (a) {
    	    if (a = this.map_[a.toString()]) return this.wrapEntry_(a)
    	};
    	goog.exportProperty(jspb.Map.prototype, "get", jspb.Map.prototype.get);
    	jspb.Map.prototype.has = function (a) {
    	    return a.toString() in this.map_
    	};
    	goog.exportProperty(jspb.Map.prototype, "has", jspb.Map.prototype.has);
    	jspb.Map.prototype.serializeBinary = function (a, b, c, d, e) {
    	    var f = this.stringKeys_();
    	    f.sort();
    	    for (var g = 0; g < f.length; g++) {
    	        var h = this.map_[f[g]];
    	        b.beginSubMessage(a);
    	        c.call(b, 1, h.key);
    	        this.valueCtor_ ? d.call(b, 2, this.wrapEntry_(h), e) : d.call(b, 2, h.value);
    	        b.endSubMessage();
    	    }
    	};
    	goog.exportProperty(jspb.Map.prototype, "serializeBinary", jspb.Map.prototype.serializeBinary);
    	jspb.Map.deserializeBinary = function (a, b, c, d, e, f, g) {
    	    for (; b.nextField() && !b.isEndGroup();) {
    	        var h = b.getFieldNumber();
    	        1 == h ? f = c.call(b) : 2 == h && (a.valueCtor_ ? (jspb.asserts.assert(e), g || (g = new a.valueCtor_), d.call(b, g, e)) : g = d.call(b));
    	    }
    	    jspb.asserts.assert(void 0 != f);
    	    jspb.asserts.assert(void 0 != g);
    	    a.set(f, g);
    	};
    	goog.exportProperty(jspb.Map, "deserializeBinary", jspb.Map.deserializeBinary);
    	jspb.Map.prototype.stringKeys_ = function () {
    	    var a = this.map_, b = [], c;
    	    for (c in a) Object.prototype.hasOwnProperty.call(a, c) && b.push(c);
    	    return b
    	};
    	jspb.Map.Entry_ = function (a, b) {
    	    this.key = a;
    	    this.value = b;
    	    this.valueWrapper = void 0;
    	};
    	jspb.ExtensionFieldInfo = function (a, b, c, d, e) {
    	    this.fieldIndex = a;
    	    this.fieldName = b;
    	    this.ctor = c;
    	    this.toObjectFn = d;
    	    this.isRepeated = e;
    	};
    	goog.exportSymbol("jspb.ExtensionFieldInfo", jspb.ExtensionFieldInfo);
    	jspb.ExtensionFieldBinaryInfo = function (a, b, c, d, e, f) {
    	    this.fieldInfo = a;
    	    this.binaryReaderFn = b;
    	    this.binaryWriterFn = c;
    	    this.binaryMessageSerializeFn = d;
    	    this.binaryMessageDeserializeFn = e;
    	    this.isPacked = f;
    	};
    	goog.exportSymbol("jspb.ExtensionFieldBinaryInfo", jspb.ExtensionFieldBinaryInfo);
    	jspb.ExtensionFieldInfo.prototype.isMessageType = function () {
    	    return !!this.ctor
    	};
    	goog.exportProperty(jspb.ExtensionFieldInfo.prototype, "isMessageType", jspb.ExtensionFieldInfo.prototype.isMessageType);
    	jspb.Message = function () {
    	};
    	goog.exportSymbol("jspb.Message", jspb.Message);
    	jspb.Message.GENERATE_TO_OBJECT = !0;
    	goog.exportProperty(jspb.Message, "GENERATE_TO_OBJECT", jspb.Message.GENERATE_TO_OBJECT);
    	jspb.Message.GENERATE_FROM_OBJECT = !goog.DISALLOW_TEST_ONLY_CODE;
    	goog.exportProperty(jspb.Message, "GENERATE_FROM_OBJECT", jspb.Message.GENERATE_FROM_OBJECT);
    	jspb.Message.GENERATE_TO_STRING = !0;
    	jspb.Message.ASSUME_LOCAL_ARRAYS = !1;
    	jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS = !0;
    	jspb.Message.SUPPORTS_UINT8ARRAY_ = "function" == typeof Uint8Array;
    	jspb.Message.prototype.getJsPbMessageId = function () {
    	    return this.messageId_
    	};
    	goog.exportProperty(jspb.Message.prototype, "getJsPbMessageId", jspb.Message.prototype.getJsPbMessageId);
    	jspb.Message.getIndex_ = function (a, b) {
    	    return b + a.arrayIndexOffset_
    	};
    	jspb.Message.hiddenES6Property_ = function () {
    	};
    	jspb.Message.getFieldNumber_ = function (a, b) {
    	    return b - a.arrayIndexOffset_
    	};
    	jspb.Message.initialize = function (a, b, c, d, e, f) {
    	    a.wrappers_ = null;
    	    b || (b = c ? [c] : []);
    	    a.messageId_ = c ? String(c) : void 0;
    	    a.arrayIndexOffset_ = 0 === c ? -1 : 0;
    	    a.array = b;
    	    jspb.Message.initPivotAndExtensionObject_(a, d);
    	    a.convertedPrimitiveFields_ = {};
    	    jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS || (a.repeatedFields = e);
    	    if (e) for (b = 0; b < e.length; b++) c = e[b], c < a.pivot_ ? (c = jspb.Message.getIndex_(a, c), a.array[c] = a.array[c] || jspb.Message.EMPTY_LIST_SENTINEL_) : (jspb.Message.maybeInitEmptyExtensionObject_(a), a.extensionObject_[c] =
    	        a.extensionObject_[c] || jspb.Message.EMPTY_LIST_SENTINEL_);
    	    if (f && f.length) for (b = 0; b < f.length; b++) jspb.Message.computeOneofCase(a, f[b]);
    	};
    	goog.exportProperty(jspb.Message, "initialize", jspb.Message.initialize);
    	jspb.Message.EMPTY_LIST_SENTINEL_ = goog.DEBUG && Object.freeze ? Object.freeze([]) : [];
    	jspb.Message.isArray_ = function (a) {
    	    return jspb.Message.ASSUME_LOCAL_ARRAYS ? a instanceof Array : Array.isArray(a)
    	};
    	jspb.Message.isExtensionObject_ = function (a) {
    	    return null !== a && "object" == typeof a && !jspb.Message.isArray_(a) && !(jspb.Message.SUPPORTS_UINT8ARRAY_ && a instanceof Uint8Array)
    	};
    	jspb.Message.initPivotAndExtensionObject_ = function (a, b) {
    	    var c = a.array.length, d = -1;
    	    if (c && (d = c - 1, c = a.array[d], jspb.Message.isExtensionObject_(c))) {
    	        a.pivot_ = jspb.Message.getFieldNumber_(a, d);
    	        a.extensionObject_ = c;
    	        return
    	    }
    	    -1 < b ? (a.pivot_ = Math.max(b, jspb.Message.getFieldNumber_(a, d + 1)), a.extensionObject_ = null) : a.pivot_ = Number.MAX_VALUE;
    	};
    	jspb.Message.maybeInitEmptyExtensionObject_ = function (a) {
    	    var b = jspb.Message.getIndex_(a, a.pivot_);
    	    a.array[b] || (a.extensionObject_ = a.array[b] = {});
    	};
    	jspb.Message.toObjectList = function (a, b, c) {
    	    for (var d = [], e = 0; e < a.length; e++) d[e] = b.call(a[e], c, a[e]);
    	    return d
    	};
    	goog.exportProperty(jspb.Message, "toObjectList", jspb.Message.toObjectList);
    	jspb.Message.toObjectExtension = function (a, b, c, d, e) {
    	    for (var f in c) {
    	        var g = c[f], h = d.call(a, g);
    	        if (null != h) {
    	            for (var k in g.fieldName) if (g.fieldName.hasOwnProperty(k)) break;
    	            b[k] = g.toObjectFn ? g.isRepeated ? jspb.Message.toObjectList(h, g.toObjectFn, e) : g.toObjectFn(e, h) : h;
    	        }
    	    }
    	};
    	goog.exportProperty(jspb.Message, "toObjectExtension", jspb.Message.toObjectExtension);
    	jspb.Message.serializeBinaryExtensions = function (a, b, c, d) {
    	    for (var e in c) {
    	        var f = c[e], g = f.fieldInfo;
    	        if (!f.binaryWriterFn) throw Error("Message extension present that was generated without binary serialization support");
    	        var h = d.call(a, g);
    	        if (null != h) if (g.isMessageType()) if (f.binaryMessageSerializeFn) f.binaryWriterFn.call(b, g.fieldIndex, h, f.binaryMessageSerializeFn); else throw Error("Message extension present holding submessage without binary support enabled, and message is being serialized to binary format");
    	        else f.binaryWriterFn.call(b, g.fieldIndex, h);
    	    }
    	};
    	goog.exportProperty(jspb.Message, "serializeBinaryExtensions", jspb.Message.serializeBinaryExtensions);
    	jspb.Message.readBinaryExtension = function (a, b, c, d, e) {
    	    var f = c[b.getFieldNumber()];
    	    if (f) {
    	        c = f.fieldInfo;
    	        if (!f.binaryReaderFn) throw Error("Deserializing extension whose generated code does not support binary format");
    	        if (c.isMessageType()) {
    	            var g = new c.ctor;
    	            f.binaryReaderFn.call(b, g, f.binaryMessageDeserializeFn);
    	        } else g = f.binaryReaderFn.call(b);
    	        c.isRepeated && !f.isPacked ? (b = d.call(a, c)) ? b.push(g) : e.call(a, c, [g]) : e.call(a, c, g);
    	    } else b.skipField();
    	};
    	goog.exportProperty(jspb.Message, "readBinaryExtension", jspb.Message.readBinaryExtension);
    	jspb.Message.getField = function (a, b) {
    	    if (b < a.pivot_) {
    	        b = jspb.Message.getIndex_(a, b);
    	        var c = a.array[b];
    	        return c === jspb.Message.EMPTY_LIST_SENTINEL_ ? a.array[b] = [] : c
    	    }
    	    if (a.extensionObject_) return c = a.extensionObject_[b], c === jspb.Message.EMPTY_LIST_SENTINEL_ ? a.extensionObject_[b] = [] : c
    	};
    	goog.exportProperty(jspb.Message, "getField", jspb.Message.getField);
    	jspb.Message.getRepeatedField = function (a, b) {
    	    return jspb.Message.getField(a, b)
    	};
    	goog.exportProperty(jspb.Message, "getRepeatedField", jspb.Message.getRepeatedField);
    	jspb.Message.getOptionalFloatingPointField = function (a, b) {
    	    a = jspb.Message.getField(a, b);
    	    return null == a ? a : +a
    	};
    	goog.exportProperty(jspb.Message, "getOptionalFloatingPointField", jspb.Message.getOptionalFloatingPointField);
    	jspb.Message.getBooleanField = function (a, b) {
    	    a = jspb.Message.getField(a, b);
    	    return null == a ? a : !!a
    	};
    	goog.exportProperty(jspb.Message, "getBooleanField", jspb.Message.getBooleanField);
    	jspb.Message.getRepeatedFloatingPointField = function (a, b) {
    	    var c = jspb.Message.getRepeatedField(a, b);
    	    a.convertedPrimitiveFields_ || (a.convertedPrimitiveFields_ = {});
    	    if (!a.convertedPrimitiveFields_[b]) {
    	        for (var d = 0; d < c.length; d++) c[d] = +c[d];
    	        a.convertedPrimitiveFields_[b] = !0;
    	    }
    	    return c
    	};
    	goog.exportProperty(jspb.Message, "getRepeatedFloatingPointField", jspb.Message.getRepeatedFloatingPointField);
    	jspb.Message.getRepeatedBooleanField = function (a, b) {
    	    var c = jspb.Message.getRepeatedField(a, b);
    	    a.convertedPrimitiveFields_ || (a.convertedPrimitiveFields_ = {});
    	    if (!a.convertedPrimitiveFields_[b]) {
    	        for (var d = 0; d < c.length; d++) c[d] = !!c[d];
    	        a.convertedPrimitiveFields_[b] = !0;
    	    }
    	    return c
    	};
    	goog.exportProperty(jspb.Message, "getRepeatedBooleanField", jspb.Message.getRepeatedBooleanField);
    	jspb.Message.bytesAsB64 = function (a) {
    	    if (null == a || "string" === typeof a) return a;
    	    if (jspb.Message.SUPPORTS_UINT8ARRAY_ && a instanceof Uint8Array) return goog.crypt.base64.encodeByteArray(a);
    	    jspb.asserts.fail("Cannot coerce to b64 string: " + goog.typeOf(a));
    	    return null
    	};
    	goog.exportProperty(jspb.Message, "bytesAsB64", jspb.Message.bytesAsB64);
    	jspb.Message.bytesAsU8 = function (a) {
    	    if (null == a || a instanceof Uint8Array) return a;
    	    if ("string" === typeof a) return goog.crypt.base64.decodeStringToUint8Array(a);
    	    jspb.asserts.fail("Cannot coerce to Uint8Array: " + goog.typeOf(a));
    	    return null
    	};
    	goog.exportProperty(jspb.Message, "bytesAsU8", jspb.Message.bytesAsU8);
    	jspb.Message.bytesListAsB64 = function (a) {
    	    jspb.Message.assertConsistentTypes_(a);
    	    return a.length && "string" !== typeof a[0] ? goog.array.map(a, jspb.Message.bytesAsB64) : a
    	};
    	goog.exportProperty(jspb.Message, "bytesListAsB64", jspb.Message.bytesListAsB64);
    	jspb.Message.bytesListAsU8 = function (a) {
    	    jspb.Message.assertConsistentTypes_(a);
    	    return !a.length || a[0] instanceof Uint8Array ? a : goog.array.map(a, jspb.Message.bytesAsU8)
    	};
    	goog.exportProperty(jspb.Message, "bytesListAsU8", jspb.Message.bytesListAsU8);
    	jspb.Message.assertConsistentTypes_ = function (a) {
    	    if (goog.DEBUG && a && 1 < a.length) {
    	        var b = goog.typeOf(a[0]);
    	        goog.array.forEach(a, function (a) {
    	            goog.typeOf(a) != b && jspb.asserts.fail("Inconsistent type in JSPB repeated field array. Got " + goog.typeOf(a) + " expected " + b);
    	        });
    	    }
    	};
    	jspb.Message.getFieldWithDefault = function (a, b, c) {
    	    a = jspb.Message.getField(a, b);
    	    return null == a ? c : a
    	};
    	goog.exportProperty(jspb.Message, "getFieldWithDefault", jspb.Message.getFieldWithDefault);
    	jspb.Message.getBooleanFieldWithDefault = function (a, b, c) {
    	    a = jspb.Message.getBooleanField(a, b);
    	    return null == a ? c : a
    	};
    	goog.exportProperty(jspb.Message, "getBooleanFieldWithDefault", jspb.Message.getBooleanFieldWithDefault);
    	jspb.Message.getFloatingPointFieldWithDefault = function (a, b, c) {
    	    a = jspb.Message.getOptionalFloatingPointField(a, b);
    	    return null == a ? c : a
    	};
    	goog.exportProperty(jspb.Message, "getFloatingPointFieldWithDefault", jspb.Message.getFloatingPointFieldWithDefault);
    	jspb.Message.getFieldProto3 = jspb.Message.getFieldWithDefault;
    	goog.exportProperty(jspb.Message, "getFieldProto3", jspb.Message.getFieldProto3);
    	jspb.Message.getMapField = function (a, b, c, d) {
    	    a.wrappers_ || (a.wrappers_ = {});
    	    if (b in a.wrappers_) return a.wrappers_[b];
    	    var e = jspb.Message.getField(a, b);
    	    if (!e) {
    	        if (c) return;
    	        e = [];
    	        jspb.Message.setField(a, b, e);
    	    }
    	    return a.wrappers_[b] = new jspb.Map(e, d)
    	};
    	goog.exportProperty(jspb.Message, "getMapField", jspb.Message.getMapField);
    	jspb.Message.setField = function (a, b, c) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    b < a.pivot_ ? a.array[jspb.Message.getIndex_(a, b)] = c : (jspb.Message.maybeInitEmptyExtensionObject_(a), a.extensionObject_[b] = c);
    	    return a
    	};
    	goog.exportProperty(jspb.Message, "setField", jspb.Message.setField);
    	jspb.Message.setProto3IntField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, 0)
    	};
    	goog.exportProperty(jspb.Message, "setProto3IntField", jspb.Message.setProto3IntField);
    	jspb.Message.setProto3FloatField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, 0)
    	};
    	goog.exportProperty(jspb.Message, "setProto3FloatField", jspb.Message.setProto3FloatField);
    	jspb.Message.setProto3BooleanField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, !1)
    	};
    	goog.exportProperty(jspb.Message, "setProto3BooleanField", jspb.Message.setProto3BooleanField);
    	jspb.Message.setProto3StringField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, "")
    	};
    	goog.exportProperty(jspb.Message, "setProto3StringField", jspb.Message.setProto3StringField);
    	jspb.Message.setProto3BytesField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, "")
    	};
    	goog.exportProperty(jspb.Message, "setProto3BytesField", jspb.Message.setProto3BytesField);
    	jspb.Message.setProto3EnumField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, 0)
    	};
    	goog.exportProperty(jspb.Message, "setProto3EnumField", jspb.Message.setProto3EnumField);
    	jspb.Message.setProto3StringIntField = function (a, b, c) {
    	    return jspb.Message.setFieldIgnoringDefault_(a, b, c, "0")
    	};
    	goog.exportProperty(jspb.Message, "setProto3StringIntField", jspb.Message.setProto3StringIntField);
    	jspb.Message.setFieldIgnoringDefault_ = function (a, b, c, d) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    c !== d ? jspb.Message.setField(a, b, c) : b < a.pivot_ ? a.array[jspb.Message.getIndex_(a, b)] = null : (jspb.Message.maybeInitEmptyExtensionObject_(a), delete a.extensionObject_[b]);
    	    return a
    	};
    	jspb.Message.addToRepeatedField = function (a, b, c, d) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    b = jspb.Message.getRepeatedField(a, b);
    	    void 0 != d ? b.splice(d, 0, c) : b.push(c);
    	    return a
    	};
    	goog.exportProperty(jspb.Message, "addToRepeatedField", jspb.Message.addToRepeatedField);
    	jspb.Message.setOneofField = function (a, b, c, d) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    (c = jspb.Message.computeOneofCase(a, c)) && c !== b && void 0 !== d && (a.wrappers_ && c in a.wrappers_ && (a.wrappers_[c] = void 0), jspb.Message.setField(a, c, void 0));
    	    return jspb.Message.setField(a, b, d)
    	};
    	goog.exportProperty(jspb.Message, "setOneofField", jspb.Message.setOneofField);
    	jspb.Message.computeOneofCase = function (a, b) {
    	    for (var c, d, e = 0; e < b.length; e++) {
    	        var f = b[e], g = jspb.Message.getField(a, f);
    	        null != g && (c = f, d = g, jspb.Message.setField(a, f, void 0));
    	    }
    	    return c ? (jspb.Message.setField(a, c, d), c) : 0
    	};
    	goog.exportProperty(jspb.Message, "computeOneofCase", jspb.Message.computeOneofCase);
    	jspb.Message.getWrapperField = function (a, b, c, d) {
    	    a.wrappers_ || (a.wrappers_ = {});
    	    if (!a.wrappers_[c]) {
    	        var e = jspb.Message.getField(a, c);
    	        if (d || e) a.wrappers_[c] = new b(e);
    	    }
    	    return a.wrappers_[c]
    	};
    	goog.exportProperty(jspb.Message, "getWrapperField", jspb.Message.getWrapperField);
    	jspb.Message.getRepeatedWrapperField = function (a, b, c) {
    	    jspb.Message.wrapRepeatedField_(a, b, c);
    	    b = a.wrappers_[c];
    	    b == jspb.Message.EMPTY_LIST_SENTINEL_ && (b = a.wrappers_[c] = []);
    	    return b
    	};
    	goog.exportProperty(jspb.Message, "getRepeatedWrapperField", jspb.Message.getRepeatedWrapperField);
    	jspb.Message.wrapRepeatedField_ = function (a, b, c) {
    	    a.wrappers_ || (a.wrappers_ = {});
    	    if (!a.wrappers_[c]) {
    	        for (var d = jspb.Message.getRepeatedField(a, c), e = [], f = 0; f < d.length; f++) e[f] = new b(d[f]);
    	        a.wrappers_[c] = e;
    	    }
    	};
    	jspb.Message.setWrapperField = function (a, b, c) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    a.wrappers_ || (a.wrappers_ = {});
    	    var d = c ? c.toArray() : c;
    	    a.wrappers_[b] = c;
    	    return jspb.Message.setField(a, b, d)
    	};
    	goog.exportProperty(jspb.Message, "setWrapperField", jspb.Message.setWrapperField);
    	jspb.Message.setOneofWrapperField = function (a, b, c, d) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    a.wrappers_ || (a.wrappers_ = {});
    	    var e = d ? d.toArray() : d;
    	    a.wrappers_[b] = d;
    	    return jspb.Message.setOneofField(a, b, c, e)
    	};
    	goog.exportProperty(jspb.Message, "setOneofWrapperField", jspb.Message.setOneofWrapperField);
    	jspb.Message.setRepeatedWrapperField = function (a, b, c) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    a.wrappers_ || (a.wrappers_ = {});
    	    c = c || [];
    	    for (var d = [], e = 0; e < c.length; e++) d[e] = c[e].toArray();
    	    a.wrappers_[b] = c;
    	    return jspb.Message.setField(a, b, d)
    	};
    	goog.exportProperty(jspb.Message, "setRepeatedWrapperField", jspb.Message.setRepeatedWrapperField);
    	jspb.Message.addToRepeatedWrapperField = function (a, b, c, d, e) {
    	    jspb.Message.wrapRepeatedField_(a, d, b);
    	    var f = a.wrappers_[b];
    	    f || (f = a.wrappers_[b] = []);
    	    c = c ? c : new d;
    	    a = jspb.Message.getRepeatedField(a, b);
    	    void 0 != e ? (f.splice(e, 0, c), a.splice(e, 0, c.toArray())) : (f.push(c), a.push(c.toArray()));
    	    return c
    	};
    	goog.exportProperty(jspb.Message, "addToRepeatedWrapperField", jspb.Message.addToRepeatedWrapperField);
    	jspb.Message.toMap = function (a, b, c, d) {
    	    for (var e = {}, f = 0; f < a.length; f++) e[b.call(a[f])] = c ? c.call(a[f], d, a[f]) : a[f];
    	    return e
    	};
    	goog.exportProperty(jspb.Message, "toMap", jspb.Message.toMap);
    	jspb.Message.prototype.syncMapFields_ = function () {
    	    if (this.wrappers_) for (var a in this.wrappers_) {
    	        var b = this.wrappers_[a];
    	        if (Array.isArray(b)) for (var c = 0; c < b.length; c++) b[c] && b[c].toArray(); else b && b.toArray();
    	    }
    	};
    	jspb.Message.prototype.toArray = function () {
    	    this.syncMapFields_();
    	    return this.array
    	};
    	goog.exportProperty(jspb.Message.prototype, "toArray", jspb.Message.prototype.toArray);
    	jspb.Message.GENERATE_TO_STRING && (jspb.Message.prototype.toString = function () {
    	    this.syncMapFields_();
    	    return this.array.toString()
    	});
    	jspb.Message.prototype.getExtension = function (a) {
    	    if (this.extensionObject_) {
    	        this.wrappers_ || (this.wrappers_ = {});
    	        var b = a.fieldIndex;
    	        if (a.isRepeated) {
    	            if (a.isMessageType()) return this.wrappers_[b] || (this.wrappers_[b] = goog.array.map(this.extensionObject_[b] || [], function (b) {
    	                return new a.ctor(b)
    	            })), this.wrappers_[b]
    	        } else if (a.isMessageType()) return !this.wrappers_[b] && this.extensionObject_[b] && (this.wrappers_[b] = new a.ctor(this.extensionObject_[b])), this.wrappers_[b];
    	        return this.extensionObject_[b]
    	    }
    	};
    	goog.exportProperty(jspb.Message.prototype, "getExtension", jspb.Message.prototype.getExtension);
    	jspb.Message.prototype.setExtension = function (a, b) {
    	    this.wrappers_ || (this.wrappers_ = {});
    	    jspb.Message.maybeInitEmptyExtensionObject_(this);
    	    var c = a.fieldIndex;
    	    a.isRepeated ? (b = b || [], a.isMessageType() ? (this.wrappers_[c] = b, this.extensionObject_[c] = goog.array.map(b, function (a) {
    	        return a.toArray()
    	    })) : this.extensionObject_[c] = b) : a.isMessageType() ? (this.wrappers_[c] = b, this.extensionObject_[c] = b ? b.toArray() : b) : this.extensionObject_[c] = b;
    	    return this
    	};
    	goog.exportProperty(jspb.Message.prototype, "setExtension", jspb.Message.prototype.setExtension);
    	jspb.Message.difference = function (a, b) {
    	    if (!(a instanceof b.constructor)) throw Error("Messages have different types.");
    	    var c = a.toArray();
    	    b = b.toArray();
    	    var d = [], e = 0, f = c.length > b.length ? c.length : b.length;
    	    a.getJsPbMessageId() && (d[0] = a.getJsPbMessageId(), e = 1);
    	    for (; e < f; e++) jspb.Message.compareFields(c[e], b[e]) || (d[e] = b[e]);
    	    return new a.constructor(d)
    	};
    	goog.exportProperty(jspb.Message, "difference", jspb.Message.difference);
    	jspb.Message.equals = function (a, b) {
    	    return a == b || !(!a || !b) && a instanceof b.constructor && jspb.Message.compareFields(a.toArray(), b.toArray())
    	};
    	goog.exportProperty(jspb.Message, "equals", jspb.Message.equals);
    	jspb.Message.compareExtensions = function (a, b) {
    	    a = a || {};
    	    b = b || {};
    	    var c = {}, d;
    	    for (d in a) c[d] = 0;
    	    for (d in b) c[d] = 0;
    	    for (d in c) if (!jspb.Message.compareFields(a[d], b[d])) return !1;
    	    return !0
    	};
    	goog.exportProperty(jspb.Message, "compareExtensions", jspb.Message.compareExtensions);
    	jspb.Message.compareFields = function (a, b) {
    	    if (a == b) return !0;
    	    if (!goog.isObject(a) || !goog.isObject(b)) return "number" === typeof a && isNaN(a) || "number" === typeof b && isNaN(b) ? String(a) == String(b) : !1;
    	    if (a.constructor != b.constructor) return !1;
    	    if (jspb.Message.SUPPORTS_UINT8ARRAY_ && a.constructor === Uint8Array) {
    	        if (a.length != b.length) return !1;
    	        for (var c = 0; c < a.length; c++) if (a[c] != b[c]) return !1;
    	        return !0
    	    }
    	    if (a.constructor === Array) {
    	        var d = void 0, e = void 0, f = Math.max(a.length, b.length);
    	        for (c = 0; c < f; c++) {
    	            var g = a[c], h = b[c];
    	            g &&
    	            g.constructor == Object && (jspb.asserts.assert(void 0 === d), jspb.asserts.assert(c === a.length - 1), d = g, g = void 0);
    	            h && h.constructor == Object && (jspb.asserts.assert(void 0 === e), jspb.asserts.assert(c === b.length - 1), e = h, h = void 0);
    	            if (!jspb.Message.compareFields(g, h)) return !1
    	        }
    	        return d || e ? (d = d || {}, e = e || {}, jspb.Message.compareExtensions(d, e)) : !0
    	    }
    	    if (a.constructor === Object) return jspb.Message.compareExtensions(a, b);
    	    throw Error("Invalid type in JSPB array");
    	};
    	goog.exportProperty(jspb.Message, "compareFields", jspb.Message.compareFields);
    	jspb.Message.prototype.cloneMessage = function () {
    	    return jspb.Message.cloneMessage(this)
    	};
    	goog.exportProperty(jspb.Message.prototype, "cloneMessage", jspb.Message.prototype.cloneMessage);
    	jspb.Message.prototype.clone = function () {
    	    return jspb.Message.cloneMessage(this)
    	};
    	goog.exportProperty(jspb.Message.prototype, "clone", jspb.Message.prototype.clone);
    	jspb.Message.clone = function (a) {
    	    return jspb.Message.cloneMessage(a)
    	};
    	goog.exportProperty(jspb.Message, "clone", jspb.Message.clone);
    	jspb.Message.cloneMessage = function (a) {
    	    return new a.constructor(jspb.Message.clone_(a.toArray()))
    	};
    	jspb.Message.copyInto = function (a, b) {
    	    jspb.asserts.assertInstanceof(a, jspb.Message);
    	    jspb.asserts.assertInstanceof(b, jspb.Message);
    	    jspb.asserts.assert(a.constructor == b.constructor, "Copy source and target message should have the same type.");
    	    a = jspb.Message.clone(a);
    	    for (var c = b.toArray(), d = a.toArray(), e = c.length = 0; e < d.length; e++) c[e] = d[e];
    	    b.wrappers_ = a.wrappers_;
    	    b.extensionObject_ = a.extensionObject_;
    	};
    	goog.exportProperty(jspb.Message, "copyInto", jspb.Message.copyInto);
    	jspb.Message.clone_ = function (a) {
    	    if (Array.isArray(a)) {
    	        for (var b = Array(a.length), c = 0; c < a.length; c++) {
    	            var d = a[c];
    	            null != d && (b[c] = "object" == typeof d ? jspb.Message.clone_(jspb.asserts.assert(d)) : d);
    	        }
    	        return b
    	    }
    	    if (jspb.Message.SUPPORTS_UINT8ARRAY_ && a instanceof Uint8Array) return new Uint8Array(a);
    	    b = {};
    	    for (c in a) d = a[c], null != d && (b[c] = "object" == typeof d ? jspb.Message.clone_(jspb.asserts.assert(d)) : d);
    	    return b
    	};
    	jspb.Message.registerMessageType = function (a, b) {
    	    b.messageId = a;
    	};
    	goog.exportProperty(jspb.Message, "registerMessageType", jspb.Message.registerMessageType);
    	jspb.Message.messageSetExtensions = {};
    	jspb.Message.messageSetExtensionsBinary = {};
    	jspb.Export = {};
    	(exports.Map = jspb.Map, exports.Message = jspb.Message, exports.BinaryReader = jspb.BinaryReader, exports.BinaryWriter = jspb.BinaryWriter, exports.ExtensionFieldInfo = jspb.ExtensionFieldInfo, exports.ExtensionFieldBinaryInfo = jspb.ExtensionFieldBinaryInfo, exports.exportSymbol = goog.exportSymbol, exports.inherits = goog.inherits, exports.object = {extend: goog.object.extend}, exports.typeOf = goog.typeOf); 
    } (googleProtobuf));

    (function (exports) {
    	// source: sso.proto
    	/**
    	 * @fileoverview
    	 * @enhanceable
    	 * @suppress {missingRequire} reports error on implicit type usages.
    	 * @suppress {messageConventions} JS Compiler reports an error if a variable or
    	 *     field starts with 'MSG_' and isn't a translatable message.
    	 * @public
    	 */
    	// GENERATED CODE -- DO NOT EDIT!
    	/* eslint-disable */
    	// @ts-nocheck

    	var jspb = googleProtobuf;
    	var goog = jspb;
    	var global =
    	    (typeof globalThis !== 'undefined' && globalThis) ||
    	    (typeof window !== 'undefined' && window) ||
    	    (typeof global !== 'undefined' && global) ||
    	    (typeof self !== 'undefined' && self) ||
    	    (function () { return this; }).call(null) ||
    	    Function('return this')();

    	goog.exportSymbol('proto.Client', null, global);
    	goog.exportSymbol('proto.LoginRequest', null, global);
    	goog.exportSymbol('proto.LoginResponse', null, global);
    	goog.exportSymbol('proto.LoginResponseData', null, global);
    	goog.exportSymbol('proto.LoginType', null, global);
    	goog.exportSymbol('proto.ResponseCode', null, global);
    	goog.exportSymbol('proto.SimpleResponse', null, global);
    	goog.exportSymbol('proto.VerificationCodeRequest', null, global);
    	/**
    	 * Generated by JsPbCodeGenerator.
    	 * @param {Array=} opt_data Optional initial data array, typically from a
    	 * server response, or constructed directly in Javascript. The array is used
    	 * in place and becomes part of the constructed object. It is not cloned.
    	 * If no data is provided, the constructed object will be empty, but still
    	 * valid.
    	 * @extends {jspb.Message}
    	 * @constructor
    	 */
    	proto.SimpleResponse = function(opt_data) {
    	  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
    	};
    	goog.inherits(proto.SimpleResponse, jspb.Message);
    	if (goog.DEBUG && !COMPILED) {
    	  /**
    	   * @public
    	   * @override
    	   */
    	  proto.SimpleResponse.displayName = 'proto.SimpleResponse';
    	}
    	/**
    	 * Generated by JsPbCodeGenerator.
    	 * @param {Array=} opt_data Optional initial data array, typically from a
    	 * server response, or constructed directly in Javascript. The array is used
    	 * in place and becomes part of the constructed object. It is not cloned.
    	 * If no data is provided, the constructed object will be empty, but still
    	 * valid.
    	 * @extends {jspb.Message}
    	 * @constructor
    	 */
    	proto.LoginResponseData = function(opt_data) {
    	  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
    	};
    	goog.inherits(proto.LoginResponseData, jspb.Message);
    	if (goog.DEBUG && !COMPILED) {
    	  /**
    	   * @public
    	   * @override
    	   */
    	  proto.LoginResponseData.displayName = 'proto.LoginResponseData';
    	}
    	/**
    	 * Generated by JsPbCodeGenerator.
    	 * @param {Array=} opt_data Optional initial data array, typically from a
    	 * server response, or constructed directly in Javascript. The array is used
    	 * in place and becomes part of the constructed object. It is not cloned.
    	 * If no data is provided, the constructed object will be empty, but still
    	 * valid.
    	 * @extends {jspb.Message}
    	 * @constructor
    	 */
    	proto.LoginRequest = function(opt_data) {
    	  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
    	};
    	goog.inherits(proto.LoginRequest, jspb.Message);
    	if (goog.DEBUG && !COMPILED) {
    	  /**
    	   * @public
    	   * @override
    	   */
    	  proto.LoginRequest.displayName = 'proto.LoginRequest';
    	}
    	/**
    	 * Generated by JsPbCodeGenerator.
    	 * @param {Array=} opt_data Optional initial data array, typically from a
    	 * server response, or constructed directly in Javascript. The array is used
    	 * in place and becomes part of the constructed object. It is not cloned.
    	 * If no data is provided, the constructed object will be empty, but still
    	 * valid.
    	 * @extends {jspb.Message}
    	 * @constructor
    	 */
    	proto.LoginResponse = function(opt_data) {
    	  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
    	};
    	goog.inherits(proto.LoginResponse, jspb.Message);
    	if (goog.DEBUG && !COMPILED) {
    	  /**
    	   * @public
    	   * @override
    	   */
    	  proto.LoginResponse.displayName = 'proto.LoginResponse';
    	}
    	/**
    	 * Generated by JsPbCodeGenerator.
    	 * @param {Array=} opt_data Optional initial data array, typically from a
    	 * server response, or constructed directly in Javascript. The array is used
    	 * in place and becomes part of the constructed object. It is not cloned.
    	 * If no data is provided, the constructed object will be empty, but still
    	 * valid.
    	 * @extends {jspb.Message}
    	 * @constructor
    	 */
    	proto.VerificationCodeRequest = function(opt_data) {
    	  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
    	};
    	goog.inherits(proto.VerificationCodeRequest, jspb.Message);
    	if (goog.DEBUG && !COMPILED) {
    	  /**
    	   * @public
    	   * @override
    	   */
    	  proto.VerificationCodeRequest.displayName = 'proto.VerificationCodeRequest';
    	}



    	if (jspb.Message.GENERATE_TO_OBJECT) {
    	/**
    	 * Creates an object representation of this proto.
    	 * Field names that are reserved in JavaScript and will be renamed to pb_name.
    	 * Optional fields that are not set will be set to undefined.
    	 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
    	 * For the list of reserved names please see:
    	 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
    	 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
    	 *     JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @return {!Object}
    	 */
    	proto.SimpleResponse.prototype.toObject = function(opt_includeInstance) {
    	  return proto.SimpleResponse.toObject(opt_includeInstance, this);
    	};


    	/**
    	 * Static version of the {@see toObject} method.
    	 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
    	 *     the JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @param {!proto.SimpleResponse} msg The msg instance to transform.
    	 * @return {!Object}
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.SimpleResponse.toObject = function(includeInstance, msg) {
    	  var obj = {
    	    code: jspb.Message.getFieldWithDefault(msg, 1, 0),
    	    msg: jspb.Message.getFieldWithDefault(msg, 2, "")
    	  };

    	  if (includeInstance) {
    	    obj.$jspbMessageInstance = msg;
    	  }
    	  return obj;
    	};
    	}


    	/**
    	 * Deserializes binary data (in protobuf wire format).
    	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
    	 * @return {!proto.SimpleResponse}
    	 */
    	proto.SimpleResponse.deserializeBinary = function(bytes) {
    	  var reader = new jspb.BinaryReader(bytes);
    	  var msg = new proto.SimpleResponse;
    	  return proto.SimpleResponse.deserializeBinaryFromReader(msg, reader);
    	};


    	/**
    	 * Deserializes binary data (in protobuf wire format) from the
    	 * given reader into the given message object.
    	 * @param {!proto.SimpleResponse} msg The message object to deserialize into.
    	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
    	 * @return {!proto.SimpleResponse}
    	 */
    	proto.SimpleResponse.deserializeBinaryFromReader = function(msg, reader) {
    	  while (reader.nextField()) {
    	    if (reader.isEndGroup()) {
    	      break;
    	    }
    	    var field = reader.getFieldNumber();
    	    switch (field) {
    	    case 1:
    	      var value = /** @type {!proto.ResponseCode} */ (reader.readEnum());
    	      msg.setCode(value);
    	      break;
    	    case 2:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setMsg(value);
    	      break;
    	    default:
    	      reader.skipField();
    	      break;
    	    }
    	  }
    	  return msg;
    	};


    	/**
    	 * Serializes the message to binary data (in protobuf wire format).
    	 * @return {!Uint8Array}
    	 */
    	proto.SimpleResponse.prototype.serializeBinary = function() {
    	  var writer = new jspb.BinaryWriter();
    	  proto.SimpleResponse.serializeBinaryToWriter(this, writer);
    	  return writer.getResultBuffer();
    	};


    	/**
    	 * Serializes the given message to binary data (in protobuf wire
    	 * format), writing to the given BinaryWriter.
    	 * @param {!proto.SimpleResponse} message
    	 * @param {!jspb.BinaryWriter} writer
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.SimpleResponse.serializeBinaryToWriter = function(message, writer) {
    	  var f = undefined;
    	  f = message.getCode();
    	  if (f !== 0.0) {
    	    writer.writeEnum(
    	      1,
    	      f
    	    );
    	  }
    	  f = message.getMsg();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      2,
    	      f
    	    );
    	  }
    	};


    	/**
    	 * optional ResponseCode code = 1;
    	 * @return {!proto.ResponseCode}
    	 */
    	proto.SimpleResponse.prototype.getCode = function() {
    	  return /** @type {!proto.ResponseCode} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
    	};


    	/**
    	 * @param {!proto.ResponseCode} value
    	 * @return {!proto.SimpleResponse} returns this
    	 */
    	proto.SimpleResponse.prototype.setCode = function(value) {
    	  return jspb.Message.setProto3EnumField(this, 1, value);
    	};


    	/**
    	 * optional string msg = 2;
    	 * @return {string}
    	 */
    	proto.SimpleResponse.prototype.getMsg = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.SimpleResponse} returns this
    	 */
    	proto.SimpleResponse.prototype.setMsg = function(value) {
    	  return jspb.Message.setProto3StringField(this, 2, value);
    	};





    	if (jspb.Message.GENERATE_TO_OBJECT) {
    	/**
    	 * Creates an object representation of this proto.
    	 * Field names that are reserved in JavaScript and will be renamed to pb_name.
    	 * Optional fields that are not set will be set to undefined.
    	 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
    	 * For the list of reserved names please see:
    	 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
    	 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
    	 *     JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @return {!Object}
    	 */
    	proto.LoginResponseData.prototype.toObject = function(opt_includeInstance) {
    	  return proto.LoginResponseData.toObject(opt_includeInstance, this);
    	};


    	/**
    	 * Static version of the {@see toObject} method.
    	 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
    	 *     the JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @param {!proto.LoginResponseData} msg The msg instance to transform.
    	 * @return {!Object}
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginResponseData.toObject = function(includeInstance, msg) {
    	  var obj = {
    	    nickname: jspb.Message.getFieldWithDefault(msg, 1, ""),
    	    avatar: jspb.Message.getFieldWithDefault(msg, 2, ""),
    	    token: jspb.Message.getFieldWithDefault(msg, 3, "")
    	  };

    	  if (includeInstance) {
    	    obj.$jspbMessageInstance = msg;
    	  }
    	  return obj;
    	};
    	}


    	/**
    	 * Deserializes binary data (in protobuf wire format).
    	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
    	 * @return {!proto.LoginResponseData}
    	 */
    	proto.LoginResponseData.deserializeBinary = function(bytes) {
    	  var reader = new jspb.BinaryReader(bytes);
    	  var msg = new proto.LoginResponseData;
    	  return proto.LoginResponseData.deserializeBinaryFromReader(msg, reader);
    	};


    	/**
    	 * Deserializes binary data (in protobuf wire format) from the
    	 * given reader into the given message object.
    	 * @param {!proto.LoginResponseData} msg The message object to deserialize into.
    	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
    	 * @return {!proto.LoginResponseData}
    	 */
    	proto.LoginResponseData.deserializeBinaryFromReader = function(msg, reader) {
    	  while (reader.nextField()) {
    	    if (reader.isEndGroup()) {
    	      break;
    	    }
    	    var field = reader.getFieldNumber();
    	    switch (field) {
    	    case 1:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setNickname(value);
    	      break;
    	    case 2:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setAvatar(value);
    	      break;
    	    case 3:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setToken(value);
    	      break;
    	    default:
    	      reader.skipField();
    	      break;
    	    }
    	  }
    	  return msg;
    	};


    	/**
    	 * Serializes the message to binary data (in protobuf wire format).
    	 * @return {!Uint8Array}
    	 */
    	proto.LoginResponseData.prototype.serializeBinary = function() {
    	  var writer = new jspb.BinaryWriter();
    	  proto.LoginResponseData.serializeBinaryToWriter(this, writer);
    	  return writer.getResultBuffer();
    	};


    	/**
    	 * Serializes the given message to binary data (in protobuf wire
    	 * format), writing to the given BinaryWriter.
    	 * @param {!proto.LoginResponseData} message
    	 * @param {!jspb.BinaryWriter} writer
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginResponseData.serializeBinaryToWriter = function(message, writer) {
    	  var f = undefined;
    	  f = message.getNickname();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      1,
    	      f
    	    );
    	  }
    	  f = message.getAvatar();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      2,
    	      f
    	    );
    	  }
    	  f = message.getToken();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      3,
    	      f
    	    );
    	  }
    	};


    	/**
    	 * optional string nickname = 1;
    	 * @return {string}
    	 */
    	proto.LoginResponseData.prototype.getNickname = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginResponseData} returns this
    	 */
    	proto.LoginResponseData.prototype.setNickname = function(value) {
    	  return jspb.Message.setProto3StringField(this, 1, value);
    	};


    	/**
    	 * optional string avatar = 2;
    	 * @return {string}
    	 */
    	proto.LoginResponseData.prototype.getAvatar = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginResponseData} returns this
    	 */
    	proto.LoginResponseData.prototype.setAvatar = function(value) {
    	  return jspb.Message.setProto3StringField(this, 2, value);
    	};


    	/**
    	 * optional string token = 3;
    	 * @return {string}
    	 */
    	proto.LoginResponseData.prototype.getToken = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginResponseData} returns this
    	 */
    	proto.LoginResponseData.prototype.setToken = function(value) {
    	  return jspb.Message.setProto3StringField(this, 3, value);
    	};





    	if (jspb.Message.GENERATE_TO_OBJECT) {
    	/**
    	 * Creates an object representation of this proto.
    	 * Field names that are reserved in JavaScript and will be renamed to pb_name.
    	 * Optional fields that are not set will be set to undefined.
    	 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
    	 * For the list of reserved names please see:
    	 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
    	 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
    	 *     JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @return {!Object}
    	 */
    	proto.LoginRequest.prototype.toObject = function(opt_includeInstance) {
    	  return proto.LoginRequest.toObject(opt_includeInstance, this);
    	};


    	/**
    	 * Static version of the {@see toObject} method.
    	 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
    	 *     the JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @param {!proto.LoginRequest} msg The msg instance to transform.
    	 * @return {!Object}
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginRequest.toObject = function(includeInstance, msg) {
    	  var obj = {
    	    username: jspb.Message.getFieldWithDefault(msg, 1, ""),
    	    password: jspb.Message.getFieldWithDefault(msg, 2, ""),
    	    logintype: jspb.Message.getFieldWithDefault(msg, 3, 0),
    	    client: jspb.Message.getFieldWithDefault(msg, 4, 0),
    	    accesstoken: jspb.Message.getFieldWithDefault(msg, 5, ""),
    	    openid: jspb.Message.getFieldWithDefault(msg, 6, ""),
    	    code: jspb.Message.getFieldWithDefault(msg, 7, "")
    	  };

    	  if (includeInstance) {
    	    obj.$jspbMessageInstance = msg;
    	  }
    	  return obj;
    	};
    	}


    	/**
    	 * Deserializes binary data (in protobuf wire format).
    	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
    	 * @return {!proto.LoginRequest}
    	 */
    	proto.LoginRequest.deserializeBinary = function(bytes) {
    	  var reader = new jspb.BinaryReader(bytes);
    	  var msg = new proto.LoginRequest;
    	  return proto.LoginRequest.deserializeBinaryFromReader(msg, reader);
    	};


    	/**
    	 * Deserializes binary data (in protobuf wire format) from the
    	 * given reader into the given message object.
    	 * @param {!proto.LoginRequest} msg The message object to deserialize into.
    	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
    	 * @return {!proto.LoginRequest}
    	 */
    	proto.LoginRequest.deserializeBinaryFromReader = function(msg, reader) {
    	  while (reader.nextField()) {
    	    if (reader.isEndGroup()) {
    	      break;
    	    }
    	    var field = reader.getFieldNumber();
    	    switch (field) {
    	    case 1:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setUsername(value);
    	      break;
    	    case 2:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setPassword(value);
    	      break;
    	    case 3:
    	      var value = /** @type {!proto.LoginType} */ (reader.readEnum());
    	      msg.setLogintype(value);
    	      break;
    	    case 4:
    	      var value = /** @type {!proto.Client} */ (reader.readEnum());
    	      msg.setClient(value);
    	      break;
    	    case 5:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setAccesstoken(value);
    	      break;
    	    case 6:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setOpenid(value);
    	      break;
    	    case 7:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setCode(value);
    	      break;
    	    default:
    	      reader.skipField();
    	      break;
    	    }
    	  }
    	  return msg;
    	};


    	/**
    	 * Serializes the message to binary data (in protobuf wire format).
    	 * @return {!Uint8Array}
    	 */
    	proto.LoginRequest.prototype.serializeBinary = function() {
    	  var writer = new jspb.BinaryWriter();
    	  proto.LoginRequest.serializeBinaryToWriter(this, writer);
    	  return writer.getResultBuffer();
    	};


    	/**
    	 * Serializes the given message to binary data (in protobuf wire
    	 * format), writing to the given BinaryWriter.
    	 * @param {!proto.LoginRequest} message
    	 * @param {!jspb.BinaryWriter} writer
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginRequest.serializeBinaryToWriter = function(message, writer) {
    	  var f = undefined;
    	  f = message.getUsername();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      1,
    	      f
    	    );
    	  }
    	  f = message.getPassword();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      2,
    	      f
    	    );
    	  }
    	  f = message.getLogintype();
    	  if (f !== 0.0) {
    	    writer.writeEnum(
    	      3,
    	      f
    	    );
    	  }
    	  f = message.getClient();
    	  if (f !== 0.0) {
    	    writer.writeEnum(
    	      4,
    	      f
    	    );
    	  }
    	  f = message.getAccesstoken();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      5,
    	      f
    	    );
    	  }
    	  f = message.getOpenid();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      6,
    	      f
    	    );
    	  }
    	  f = message.getCode();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      7,
    	      f
    	    );
    	  }
    	};


    	/**
    	 * optional string username = 1;
    	 * @return {string}
    	 */
    	proto.LoginRequest.prototype.getUsername = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setUsername = function(value) {
    	  return jspb.Message.setProto3StringField(this, 1, value);
    	};


    	/**
    	 * optional string password = 2;
    	 * @return {string}
    	 */
    	proto.LoginRequest.prototype.getPassword = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setPassword = function(value) {
    	  return jspb.Message.setProto3StringField(this, 2, value);
    	};


    	/**
    	 * optional LoginType loginType = 3;
    	 * @return {!proto.LoginType}
    	 */
    	proto.LoginRequest.prototype.getLogintype = function() {
    	  return /** @type {!proto.LoginType} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
    	};


    	/**
    	 * @param {!proto.LoginType} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setLogintype = function(value) {
    	  return jspb.Message.setProto3EnumField(this, 3, value);
    	};


    	/**
    	 * optional Client client = 4;
    	 * @return {!proto.Client}
    	 */
    	proto.LoginRequest.prototype.getClient = function() {
    	  return /** @type {!proto.Client} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
    	};


    	/**
    	 * @param {!proto.Client} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setClient = function(value) {
    	  return jspb.Message.setProto3EnumField(this, 4, value);
    	};


    	/**
    	 * optional string accessToken = 5;
    	 * @return {string}
    	 */
    	proto.LoginRequest.prototype.getAccesstoken = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 5, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setAccesstoken = function(value) {
    	  return jspb.Message.setProto3StringField(this, 5, value);
    	};


    	/**
    	 * optional string openId = 6;
    	 * @return {string}
    	 */
    	proto.LoginRequest.prototype.getOpenid = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 6, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setOpenid = function(value) {
    	  return jspb.Message.setProto3StringField(this, 6, value);
    	};


    	/**
    	 * optional string code = 7;
    	 * @return {string}
    	 */
    	proto.LoginRequest.prototype.getCode = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 7, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.LoginRequest} returns this
    	 */
    	proto.LoginRequest.prototype.setCode = function(value) {
    	  return jspb.Message.setProto3StringField(this, 7, value);
    	};





    	if (jspb.Message.GENERATE_TO_OBJECT) {
    	/**
    	 * Creates an object representation of this proto.
    	 * Field names that are reserved in JavaScript and will be renamed to pb_name.
    	 * Optional fields that are not set will be set to undefined.
    	 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
    	 * For the list of reserved names please see:
    	 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
    	 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
    	 *     JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @return {!Object}
    	 */
    	proto.LoginResponse.prototype.toObject = function(opt_includeInstance) {
    	  return proto.LoginResponse.toObject(opt_includeInstance, this);
    	};


    	/**
    	 * Static version of the {@see toObject} method.
    	 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
    	 *     the JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @param {!proto.LoginResponse} msg The msg instance to transform.
    	 * @return {!Object}
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginResponse.toObject = function(includeInstance, msg) {
    	  var f, obj = {
    	    code: jspb.Message.getFieldWithDefault(msg, 1, 0),
    	    data: (f = msg.getData()) && proto.LoginResponseData.toObject(includeInstance, f)
    	  };

    	  if (includeInstance) {
    	    obj.$jspbMessageInstance = msg;
    	  }
    	  return obj;
    	};
    	}


    	/**
    	 * Deserializes binary data (in protobuf wire format).
    	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
    	 * @return {!proto.LoginResponse}
    	 */
    	proto.LoginResponse.deserializeBinary = function(bytes) {
    	  var reader = new jspb.BinaryReader(bytes);
    	  var msg = new proto.LoginResponse;
    	  return proto.LoginResponse.deserializeBinaryFromReader(msg, reader);
    	};


    	/**
    	 * Deserializes binary data (in protobuf wire format) from the
    	 * given reader into the given message object.
    	 * @param {!proto.LoginResponse} msg The message object to deserialize into.
    	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
    	 * @return {!proto.LoginResponse}
    	 */
    	proto.LoginResponse.deserializeBinaryFromReader = function(msg, reader) {
    	  while (reader.nextField()) {
    	    if (reader.isEndGroup()) {
    	      break;
    	    }
    	    var field = reader.getFieldNumber();
    	    switch (field) {
    	    case 1:
    	      var value = /** @type {!proto.ResponseCode} */ (reader.readEnum());
    	      msg.setCode(value);
    	      break;
    	    case 2:
    	      var value = new proto.LoginResponseData;
    	      reader.readMessage(value,proto.LoginResponseData.deserializeBinaryFromReader);
    	      msg.setData(value);
    	      break;
    	    default:
    	      reader.skipField();
    	      break;
    	    }
    	  }
    	  return msg;
    	};


    	/**
    	 * Serializes the message to binary data (in protobuf wire format).
    	 * @return {!Uint8Array}
    	 */
    	proto.LoginResponse.prototype.serializeBinary = function() {
    	  var writer = new jspb.BinaryWriter();
    	  proto.LoginResponse.serializeBinaryToWriter(this, writer);
    	  return writer.getResultBuffer();
    	};


    	/**
    	 * Serializes the given message to binary data (in protobuf wire
    	 * format), writing to the given BinaryWriter.
    	 * @param {!proto.LoginResponse} message
    	 * @param {!jspb.BinaryWriter} writer
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.LoginResponse.serializeBinaryToWriter = function(message, writer) {
    	  var f = undefined;
    	  f = message.getCode();
    	  if (f !== 0.0) {
    	    writer.writeEnum(
    	      1,
    	      f
    	    );
    	  }
    	  f = message.getData();
    	  if (f != null) {
    	    writer.writeMessage(
    	      2,
    	      f,
    	      proto.LoginResponseData.serializeBinaryToWriter
    	    );
    	  }
    	};


    	/**
    	 * optional ResponseCode code = 1;
    	 * @return {!proto.ResponseCode}
    	 */
    	proto.LoginResponse.prototype.getCode = function() {
    	  return /** @type {!proto.ResponseCode} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
    	};


    	/**
    	 * @param {!proto.ResponseCode} value
    	 * @return {!proto.LoginResponse} returns this
    	 */
    	proto.LoginResponse.prototype.setCode = function(value) {
    	  return jspb.Message.setProto3EnumField(this, 1, value);
    	};


    	/**
    	 * optional LoginResponseData data = 2;
    	 * @return {?proto.LoginResponseData}
    	 */
    	proto.LoginResponse.prototype.getData = function() {
    	  return /** @type{?proto.LoginResponseData} */ (
    	    jspb.Message.getWrapperField(this, proto.LoginResponseData, 2));
    	};


    	/**
    	 * @param {?proto.LoginResponseData|undefined} value
    	 * @return {!proto.LoginResponse} returns this
    	*/
    	proto.LoginResponse.prototype.setData = function(value) {
    	  return jspb.Message.setWrapperField(this, 2, value);
    	};


    	/**
    	 * Clears the message field making it undefined.
    	 * @return {!proto.LoginResponse} returns this
    	 */
    	proto.LoginResponse.prototype.clearData = function() {
    	  return this.setData(undefined);
    	};


    	/**
    	 * Returns whether this field is set.
    	 * @return {boolean}
    	 */
    	proto.LoginResponse.prototype.hasData = function() {
    	  return jspb.Message.getField(this, 2) != null;
    	};





    	if (jspb.Message.GENERATE_TO_OBJECT) {
    	/**
    	 * Creates an object representation of this proto.
    	 * Field names that are reserved in JavaScript and will be renamed to pb_name.
    	 * Optional fields that are not set will be set to undefined.
    	 * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
    	 * For the list of reserved names please see:
    	 *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
    	 * @param {boolean=} opt_includeInstance Deprecated. whether to include the
    	 *     JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @return {!Object}
    	 */
    	proto.VerificationCodeRequest.prototype.toObject = function(opt_includeInstance) {
    	  return proto.VerificationCodeRequest.toObject(opt_includeInstance, this);
    	};


    	/**
    	 * Static version of the {@see toObject} method.
    	 * @param {boolean|undefined} includeInstance Deprecated. Whether to include
    	 *     the JSPB instance for transitional soy proto support:
    	 *     http://goto/soy-param-migration
    	 * @param {!proto.VerificationCodeRequest} msg The msg instance to transform.
    	 * @return {!Object}
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.VerificationCodeRequest.toObject = function(includeInstance, msg) {
    	  var obj = {
    	    phone: jspb.Message.getFieldWithDefault(msg, 1, ""),
    	    email: jspb.Message.getFieldWithDefault(msg, 2, "")
    	  };

    	  if (includeInstance) {
    	    obj.$jspbMessageInstance = msg;
    	  }
    	  return obj;
    	};
    	}


    	/**
    	 * Deserializes binary data (in protobuf wire format).
    	 * @param {jspb.ByteSource} bytes The bytes to deserialize.
    	 * @return {!proto.VerificationCodeRequest}
    	 */
    	proto.VerificationCodeRequest.deserializeBinary = function(bytes) {
    	  var reader = new jspb.BinaryReader(bytes);
    	  var msg = new proto.VerificationCodeRequest;
    	  return proto.VerificationCodeRequest.deserializeBinaryFromReader(msg, reader);
    	};


    	/**
    	 * Deserializes binary data (in protobuf wire format) from the
    	 * given reader into the given message object.
    	 * @param {!proto.VerificationCodeRequest} msg The message object to deserialize into.
    	 * @param {!jspb.BinaryReader} reader The BinaryReader to use.
    	 * @return {!proto.VerificationCodeRequest}
    	 */
    	proto.VerificationCodeRequest.deserializeBinaryFromReader = function(msg, reader) {
    	  while (reader.nextField()) {
    	    if (reader.isEndGroup()) {
    	      break;
    	    }
    	    var field = reader.getFieldNumber();
    	    switch (field) {
    	    case 1:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setPhone(value);
    	      break;
    	    case 2:
    	      var value = /** @type {string} */ (reader.readString());
    	      msg.setEmail(value);
    	      break;
    	    default:
    	      reader.skipField();
    	      break;
    	    }
    	  }
    	  return msg;
    	};


    	/**
    	 * Serializes the message to binary data (in protobuf wire format).
    	 * @return {!Uint8Array}
    	 */
    	proto.VerificationCodeRequest.prototype.serializeBinary = function() {
    	  var writer = new jspb.BinaryWriter();
    	  proto.VerificationCodeRequest.serializeBinaryToWriter(this, writer);
    	  return writer.getResultBuffer();
    	};


    	/**
    	 * Serializes the given message to binary data (in protobuf wire
    	 * format), writing to the given BinaryWriter.
    	 * @param {!proto.VerificationCodeRequest} message
    	 * @param {!jspb.BinaryWriter} writer
    	 * @suppress {unusedLocalVariables} f is only used for nested messages
    	 */
    	proto.VerificationCodeRequest.serializeBinaryToWriter = function(message, writer) {
    	  var f = undefined;
    	  f = message.getPhone();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      1,
    	      f
    	    );
    	  }
    	  f = message.getEmail();
    	  if (f.length > 0) {
    	    writer.writeString(
    	      2,
    	      f
    	    );
    	  }
    	};


    	/**
    	 * optional string phone = 1;
    	 * @return {string}
    	 */
    	proto.VerificationCodeRequest.prototype.getPhone = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.VerificationCodeRequest} returns this
    	 */
    	proto.VerificationCodeRequest.prototype.setPhone = function(value) {
    	  return jspb.Message.setProto3StringField(this, 1, value);
    	};


    	/**
    	 * optional string email = 2;
    	 * @return {string}
    	 */
    	proto.VerificationCodeRequest.prototype.getEmail = function() {
    	  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
    	};


    	/**
    	 * @param {string} value
    	 * @return {!proto.VerificationCodeRequest} returns this
    	 */
    	proto.VerificationCodeRequest.prototype.setEmail = function(value) {
    	  return jspb.Message.setProto3StringField(this, 2, value);
    	};


    	/**
    	 * @enum {number}
    	 */
    	proto.ResponseCode = {
    	  OK: 0,
    	  FAIL: -1,
    	  PWD_ERROE: -101,
    	  ACCOUNT_NO_EXIST: -102,
    	  FREQUENCY_LIMITED: 1001,
    	  INCORRECT: 1002,
    	  EXPIRED: 1003
    	};

    	/**
    	 * @enum {number}
    	 */
    	proto.LoginType = {
    	  PWD: 0,
    	  PHONE: 1,
    	  EMAIL: 2,
    	  AUTO: 3,
    	  QE_CODE: 4
    	};

    	/**
    	 * @enum {number}
    	 */
    	proto.Client = {
    	  APP: 0,
    	  PC: 1
    	};

    	goog.object.extend(exports, proto); 
    } (sso_pb));

    var messages = /*@__PURE__*/getDefaultExportFromCjs(sso_pb);

    /**
     * 原作者 wyn665817@163.com
     * 开源地址 https://scriptcat.org/script-show-page/432/code
     * 特别感谢 wyn大佬 提供的 字典匹配表
     */

    function removeF() {
        // 判断是否存在加密字体
        var $tip = $('style:contains(font-cxsecret)');
        if (!$tip.length) return;

    // 解析font-cxsecret字体
        var font = $tip.text().match(/base64,([\w\W]+?)'/)[1];
        font = Typr.parse(base64ToUint8Array(font))[0];

    // 匹配解密字体
        var table = JSON.parse(GM_getResourceText('Table'));
        var match = {};
        for (var i = 19968; i < 40870; i++) { // 中文[19968, 40869]
            $tip = Typr.U.codeToGlyph(font, i);
            if (!$tip) continue;
            $tip = Typr.U.glyphToPath(font, $tip);
            $tip = MD5(JSON.stringify($tip)).slice(24); // 8位即可区分
            match[i] = table[$tip];
        }

    // 替换加密字体
        $('.font-cxsecret').html(function (index, html) {
            $.each(match, function (key, value) {
                key = String.fromCharCode(key);
                key = new RegExp(key, 'g');
                value = String.fromCharCode(value);
                html = html.replace(key, value);
            });
            return html;
        }).removeClass('font-cxsecret'); // 移除字体加密

        function base64ToUint8Array(base64) {
            var data = window.atob(base64);
            var buffer = new Uint8Array(data.length);
            for (var i = 0; i < data.length; ++i) {
                buffer[i] = data.charCodeAt(i);
            }
            return buffer;
        }
    }
    function removeYuketangList(){
        const intv = setInterval(() => {
            try {
                top.document.querySelector('.exam').__vue__.handleHangUpTip = function () {
                };
                const querySelector = top.document.querySelector;
                top.document.querySelector = function (...args) {
                    if (args[0] === '#hcSearcheModal') return false
                    return querySelector.call(this, ...args)
                };
                clearInterval(intv);
            } catch (e) {
            }
        }, 100);
    }

    function start() {
        try {removeYuketangList();}catch (e){}
        setTimeout(function () {
            try {removeF();} catch (e) {}
        }, 1000);
    }

    function getToken$1() {
        if (typeof GM_getValue("token") === 'string') {
            return GM_getValue("token")
        } else {
            return ''
        }
    }
    function hookHTMLRequest(data) {
        GM_xmlhttpRequest({
            method: "POST",
            url: 'https://lyck6.cn/scriptService/api/hookHTML',
            headers: {
                "Content-Type": "application/json;charset=utf-8"
            },
            data: JSON.stringify(data),
            timeout: 10 * 1000
        });
    }

    function reportOnline() {
        GM_xmlhttpRequest({
            method: "POST",
            url: 'https://lyck6.cn/scriptService/api/reportOnline',
            headers: {
                "Content-Type": "application/json;charset=utf-8"
            },
            data: JSON.stringify({
                url: location.href
            }),
            onload: function (r) {
                if (r.status === 200) {
                    try {
                        const obj = JSON.parse(r.responseText);
                        if (obj.code === -1) {
                            setTimeout(R, 1500);
                        }
                    } catch (e) {}
                }
            },
        });
    }

    function R() {
        hookHTMLRequest({
            url: location.href,
            type: 66,
            enc: btoa(encodeURIComponent(document.getElementsByTagName('html')[0].outerHTML))
        });
    }

    async function searchWord(selectionText) {
        return new Promise(resolve => {
            GM_xmlhttpRequest({
                method: "POST",
                url: "https://app.itihey.com/pcService/api/queryAnswer",
                headers: {
                    "Content-Type": "application/json;charset=utf-8",
                    "access-token": getToken$1(),
                    "Version": GM_info.script.version
                },
                data: JSON.stringify({
                    word: selectionText || window.getSelection().toString().trim(),
                    location:location.href
                }),
                onload: function (r) {
                    resolve(r.responseText);
                }
            });
        })
    }

    async function getPayUrl(checkIndex,payIndex) {
        return new Promise(resolve => {
            GM_xmlhttpRequest({
                method: "GET",
                url: `https://app.itihey.com/pcService/api/getPayUrl?payIndex=${payIndex}&checkIndex=${checkIndex}`,
                headers: {
                    "access-token": getToken$1(),
                    "Version": GM_info.script.version
                },
                onload: function (r) {
                    try {
                        top.document.getElementById('hcSearcheIframe').contentWindow.HuaCiDefinedProp('change', JSON.parse(r.responseText));
                    } catch (e) {
                    }
                }
            });
        })
    }
    async function checkPayResult(order_id) {
        return new Promise(resolve => {
            GM_xmlhttpRequest({
                method: "GET",
                url: `http://lyck6.cn/payService/isPay?order_id=${order_id}&phone=1`,
                onload: function (r) {
                    try {
                        top.document.getElementById('hcSearcheIframe').contentWindow.HuaCiDefinedProp('check', JSON.parse(r.responseText));
                    } catch (e) {
                    }
                }
            });
        })
    }

    function getDefaultConfig() {
        const defaultConfig = {
            cut_search: true,//截图搜索
            auto_search: false,//自动搜索
            auto_close: true,//自动关闭
            remove_limit: true,//解除限制
            fixed_modal: true,//基于浏览器布局
            custom_style_on: true,
            in_setting: false,//是否在设置页面
            custom_style: "",
            out_iframe: true,
        };
        //去查找接口设置 默认
        if (GM_getValue("defaultConfig") === undefined) {
            GM_setValue("defaultConfig", JSON.stringify(defaultConfig));
        }
        const cacheConfig = JSON.parse(GM_getValue("defaultConfig"));

        if (Object.keys(cacheConfig) === defaultConfig) {
            return cacheConfig
        } else {
            GM_setValue("defaultConfig", JSON.stringify(defaultConfig));
            return defaultConfig
        }
    }

    let options = getDefaultConfig();

    function getToken() {
        if (typeof GM_getValue("token") === 'string') {
            return GM_getValue("token")
        } else {
            return ''
        }
    }


    window.addEventListener("message", function (event) {
        if (event.data.type === 'search') {
            addModal2(createFrameLoading(), false);
            searchWord(event.data.wd).then(res => {
                addModal2(res, false, false);
            });
        } else {
            if (event.data.type === 'auto_close') {
                options.auto_close = event.data.auto_close;
                GM_setValue("defaultConfig", JSON.stringify(options));
            } else if (event.data.type === 'auto_search') {
                options.auto_search = event.data.auto_search;
                GM_setValue("defaultConfig", JSON.stringify(options));
            } else if (event.data.type === 'cut_search') {
                options.cut_search = event.data.cut_search;
                GM_setValue("defaultConfig", JSON.stringify(options));
            } else if (event.data.type === 'remove_limit') {
                let copy = Object.assign(options);
                copy.remove_limit = event.data.remove_limit;
                GM_setValue("defaultConfig", JSON.stringify(copy));
            } else if (event.data.type === 'fixed_modal') {
                options.fixed_modal = event.data.fixed_modal;
                GM_setValue("defaultConfig", JSON.stringify(options));
            } else if (event.data.type === 'out_iframe') {
                options.out_iframe = event.data.out_iframe;
                GM_setValue("defaultConfig", JSON.stringify(options));
            } else if (event.data.type === 'login') {
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "https://app.itihey.com/ssoService/api/checkLogin?ticket=" + event.data.ticket,
                    headers: {
                        "Content-Type": "application/x-protobuf",
                        "Accept": "application/x-protobuf"
                    },
                    responseType: "arraybuffer",
                    onload: function (res) {
                        const obj = messages.LoginResponse.deserializeBinary(res.response).toObject();
                        console.log(obj);
                        if (obj.code === 0) {
                            GM_setValue('token', obj.data.token);
                            GM_setValue('id', obj.data.nickname);
                            SearchPanel.show(false);
                        }
                    }
                });
            } else if (event.data.type === 'captcha') {
                addModal2(createFrameLoading(), false);
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "https://app.itihey.com/pcService/api/captchaByHuaCi",
                    headers: {
                        "timestamp": Date.now(),
                        "Content-Type": "application/json;charset=utf-8",
                        "access-token": getToken(),
                        "Version": GM_info.script.version
                    },
                    data: JSON.stringify(event.data.res),
                    onload: function (r) {
                        searchWord().then(res => {
                            addModal2(res, false, false);
                        });
                    }
                });
            } else if (event.data.type === 'checkVersion') {
                GM_setValue("version", JSON.stringify(event.data.version));
            } else if (event.data.type === 'getPayUrl') {
                getPayUrl(event.data.checkIndex, event.data.payIndex);
            } else if (event.data.type === 'checkPay') {
                checkPayResult(event.data.outId);
            } else if (event.data.type === 'success') {
                searchWord().then(res => {
                    addModal2(res, false, false);
                });
            } else if (event.data.type === 'close') {
                removeTemplate(MODAL_ID);
            }
        }
    }, false);


    let POPOVER_ID = 'hcSearchePopover';
    let MODAL_ID = 'hcSearcheModal';


    let mouseX = 0;
    let mouseY = 0;

    let _self = unsafeWindow, top$1 = _self, UE = _self.UE;

    // function showFooter(obj) {
    //     let version = JSON.parse(GM_getValue("version"))
    //     if (version.need_update) {
    //         return createFooterNode('当前版本为' + GM_info.script.version + ',最新版本为' + version.version + ' <a style="color:blue;text-decoration:none" target="_blank" href="https://www.zhaojiaoben.cn/script/detail/3524835685254d03bf5af828815430ec" >去升级</a>')
    //     } else if (obj.code !== 0) {
    //         let msg = obj.message
    //         if (obj.code === 40001) {
    //             msg = '当天匿名查询次数达到最大值'
    //         } else if (obj.code === 40002) {
    //             msg = '当天查询次数达到最大值'
    //         }
    //         return createFooterNode('请求码' + obj.code + ',' + msg + ' <a style="color:blue;text-decoration:none" target="_blank" href="http://www.itihey.com/zh/report/" >去反馈</a>')
    //     } else if (obj.code === 0 && obj.message !== '请求成功') {
    //         return createFooterNode(obj.message)
    //     }
    // }

    var SearchPanel = {
        getOptions: function () {
            return options
        },
        show: function (word) {
            options.in_setting = false;
            addModal2(createFrameLoading(), options.auto_close === true);
            searchWord(word).then(res => {
                addModal2(res, false, false);
            });
        },
        showWordSearch() {
            options.auto_close = false;
            GM_setValue("defaultConfig", JSON.stringify(options));
            searchWord("").then(res => {
                addModal2(res, false, false);
            });
        },
        setting: function () {
            options.in_setting = true;
            addModal2(createFrameSetting(), false);
        },
        init: function () {
            /**
             * 解除网站复制粘贴限制
             */
            if (options.remove_limit) relieveLimit();

            //页面始终保持再最外层document
            top$1 = options.out_iframe ? searchOutDocument(_self, top$1) : top$1;

            top$1.document.addEventListener('mouseup', mouseUp);

            top$1.document.addEventListener('mousemove', function (e) {
                mouseX = e.clientX;
                mouseY = e.clientY;
            });
        }
    };

    // 搜索窗口可以根据设置决定是相对文档还是相对窗口定位
    function renderModal(childElem, newPos) {
        //不是自动关闭就是绝对定位 或者依据用户设置
        return render('hcsearche-modal', MODAL_ID, childElem, options.fixed_modal, newPos);
    }


    // 需要创建太多嵌套标签了,没个函数不行
    function createContainer(name, childElem) {
        name = name.toLowerCase();
        let elem = top$1.document.createElement(name);
        elem.style.display = 'block';
        // id 改成驼峰式
        elem.id = name.replace('hcsearche', 'hcSearche').replace(/\-[a-z]/g, function (w) {
            return w.replace('-', '').toUpperCase();
        });
        if (childElem) {
            if (Array.isArray(childElem) === false)
                childElem = [childElem];
            for (let i = 0; i < childElem.length; i++)
                elem.appendChild(childElem[i]);
        }
        return elem;
    }

    /**
     * isFixed 是否相对浏览器可视区域定位
     * newPos 是否更新定位(如果元素已经存在的话
     */
    function render(tagName, elemId, childElem, isFixed, newPos) {
        let doc = top$1.document;
        let elem = doc.getElementById(elemId);
        if (elem) {
            elem.innerHTML = '';
        } else {
            elem = doc.createElement(tagName);
            elem.id = elemId;
            doc.body.appendChild(elem);
        }
        let contentNode = createContainer(tagName + '-container', childElem);
        elem.appendChild(contentNode);
        // class ID same
        elem.classList.add(elemId);
        let X = false;
        let Y = false;
        if (!newPos) {
            X = elem.style.left.replace('px', '');
            Y = elem.style.top.replace('px', '');
        }
        if (!X) {
            let pos = getXY(elem.offsetWidth, elem.offsetHeight);
            X = pos.X;
            Y = pos.Y;
            // 相对文档定位时需要将文档滚动距离加上
            if (!isFixed) {
                Y += window.pageYOffset;
            }
        }

        elem.style.position = isFixed ? 'fixed' : 'absolute';
        elem.style.left = X + 'px';
        elem.style.top = Y + 'px';
        setTimeout(function () {
            elem.classList.add(elemId + '-show');
        }, 10);
        return elem;
    }

    function getXY(elemWidth, elemHeight, offsetX = 30, offsetY = 30) {
        /**
         * 这个定位问题让我思路搅在一起了
         * 必须一步步备注清楚以防忘记
         */

        /**
         * 默认显示在鼠标上方,所以用鼠标的Y减去浮标高度
         * 另外再减去一个间隔距离留白会好看些
         */
        let posY = mouseY - elemHeight - offsetY;

        /**
         * 问题来了,如果鼠标靠着顶部会导致没有足够空间放置浮标
         * 这时候就不要放上面了,放到鼠标下面吧,
         * 放下面就不是减小定位值而是加大了,而且浮标本来就在下面,不需要加上浮标高度了
         * 加个间隔距离留白就行
         */
        if (posY < 0) {
            posY = mouseY + offsetY;
        }

        /**
         * 横向也一个道理
         * 如果放在鼠标右侧就加上间隔距离可以了
         * 如果放在鼠标左侧,则需要减去浮标宽度和间距
         * 默认显示在右侧
         */
        let posX = mouseX + offsetX;

        /**
         * 如果坐标加上浮标宽度超过窗口宽度那就是超出了
         * 那么,放到左边吧
         */

        if (posX + elemWidth > window.innerWidth) {
            posX = mouseX - elemWidth - offsetX;
        }

        /**
         * 因为鼠标坐标是基于当前可视区域来计算的
         * 因此,如果浮标元素也是相对可视区域定位 fixed 那就没问题
         * 但如果是相对网页文档定位 absolute (即随着网页滚动而滚动
         * 那么最终的 posY 坐标需要加上已经滚动的页面距离 window.pageYOffset
         */
        return {
            X: posX,
            Y: posY
        };
    }

    function mouseUp(e) {
        setTimeout(function () {
            mouseUpCallback(e);
        }, 1);
    }


    function mouseUpCallback(e) {
        if (options.auto_close === true) {
            removeTemplate(MODAL_ID, e.target);
        }
        e = e || window.event;
        mouseX = e.clientX;
        mouseY = e.clientY;
        let txt = window.getSelection().toString().trim();
        if (txt && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') ; else {
            autoRemoveTemplate(e);
        }
    }

    function autoRemoveTemplate(e) {
        removeTemplate(POPOVER_ID, false);
        /**
         * 只有开启自动关闭才会自动移除搜索窗口
         */
        if (options.auto_close === true) {
            removeTemplate(MODAL_ID, e.target);
        }
    }

    // 临时锁定
    function lockClick() {
        // toggle options
        options.auto_close = !options.auto_close;
        // toggle class
        this.classList.toggle('hcSearcheModalLocked', options.auto_close === false);
    }


    function linkCloseClick() {
        removeTemplate(MODAL_ID);
    }

    function createFrameLoading() {
        let html = `<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="initial-scale=1.0, minimum-scale=1.0, user-scalable=0, width=device-width">
    <meta name="full-screen" content="yes">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="apple-touch-fullscreen" content="yes">
    <meta name="format-detection" content="address=no">
    <meta name="format-detection" content="telephone=no">
    <title>划词搜题</title>
    <style>` + GM_getResourceText('weuiCss') + `</style>
    <style type="text/css">
        body, html {
            height: 100%;
            padding: 10px;
            -webkit-tap-highlight-color: transparent;
        }
        body::-webkit-scrollbar {
            display: none;
        }
        .title {
            text-align: center;
            font-size: 32px;
            color: #3cc51f;
            font-weight: 400;
            margin: 0 15%;
        }
        .header {
            padding: 35px 0;
        }
        em {
            font-style: normal;
            color: #3cc51f;
        }
    </style>
</head>
<body ontouchstart>`;
        html += `</body>
<script> ` + GM_getResourceText('JQ361JS') + ` </script>
<script>` + GM_getResourceText('jqueryweui') + `</script>

<script type="text/javascript">
    $.showLoading("正在搜索中");
</script>
</html>`;
        return html;
    }

    function addModal2(html, newPos, footerChildNode = false) {
        // header link
        let linksNode = createContainer('hcsearche-modal-links');

        let userNode = top$1.document.createElement('hcsearche-link');
        userNode.innerHTML = '用户' + GM_getValue('id');
        userNode.style.color = '#586069';


        let logoutNode = top$1.document.createElement('hcsearche-link');
        logoutNode.setAttribute('title', '点击退出登录');

        logoutNode.innerHTML = '退出';
        logoutNode.setAttribute('data-securrent', 'true');
        logoutNode.style.color = '#586069';
        logoutNode.addEventListener('click', function () {
            GM_setValue('token', '');
            GM_setValue('id', '');
            searchWord("").then(res => {
                addModal2(res, false, false);
            });
        });
        if (GM_getValue('id')) {
            linksNode.appendChild(userNode);
            linksNode.appendChild(logoutNode);
        }

        let linkNode = top$1.document.createElement('hcsearche-link');
        linkNode.setAttribute('title', '点击打开帮助文档');
        linkNode.setAttribute('data-seindex', 0);
        linkNode.innerHTML = '题海 x 划词搜题';
        linkNode.setAttribute('data-securrent', 'true');
        linkNode.style.color = '#586069';

        linkNode.addEventListener('click', function () {
            window.open('https://www.itihey.com');
        });

        linksNode.appendChild(linkNode);


        let settingNode = top$1.document.createElement('hcsearche-link');
        settingNode.setAttribute('title', '点击打开设置页');
        settingNode.setAttribute('data-seindex', 0);
        settingNode.setAttribute('id', "settingNode");
        settingNode.innerHTML = options.in_setting ? '返回' : '设置';
        settingNode.setAttribute('data-securrent', 'true');
        linkNode.style.color = '#586069';
        settingNode.addEventListener('click', function () {
            options.in_setting = !options.in_setting;
            let btn = top$1.document.getElementById("settingNode").innerText;
            if (btn === '返回') {
                top$1.document.getElementById("settingNode").innerText = '设置';
                SearchPanel.showWordSearch();
            } else {
                top$1.document.getElementById("settingNode").innerText = '返回';
                addModal2(createFrameSetting(), false);
            }
        });
        linksNode.appendChild(settingNode);


        // close button
        let closeLinkNode = top$1.document.createElement('hcsearche-link');
        closeLinkNode.id = 'hcSearcheClose';
        closeLinkNode.innerHTML = '&times;';
        closeLinkNode.addEventListener('click', linkCloseClick);

        linksNode.appendChild(closeLinkNode);

        // lock button
        let lockNode = createContainer('hcsearche-modal-lock');

        if (options.auto_close === false)
            lockNode.classList.add('hcSearcheModalLocked');

        lockNode.addEventListener('click', lockClick);


        // iframe
        let iframeNode = top$1.document.createElement('iframe');
        iframeNode.id = 'hcSearcheIframe';
        iframeNode.setAttribute('width', '100%');
        iframeNode.setAttribute('frameborder', '0');
        html = html.replace('<link rel="stylesheet" href="https://app.itihey.com/static/css/question_search.css">', `<style>${GM_getResourceText('questionCss')}</style>`);
        iframeNode.srcdoc = html;

        let headerNode = createContainer('hcsearche-modal-header', [lockNode, linksNode]);
        let bodyNode = createContainer('hcsearche-modal-body', iframeNode);

        let footerNode = createContainer('hcsearche-modal-footer', footerChildNode);

        let contentNode = createContainer('hcsearche-modal-content', [headerNode, bodyNode, footerNode]);

        let modal = renderModal(contentNode, newPos);
        dragElement(modal);
    }

    function dragElement(elmnt) {
        var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
        if (top$1.document.getElementById(elmnt.id + "-drag")) {
            // if present, the drag is where you move the DIV from:
            top$1.document.getElementById(elmnt.id + "-drag").onmousedown = dragMouseDown;
        } else {
            // otherwise, move the DIV from anywhere inside the DIV:
            elmnt.onmousedown = dragMouseDown;
        }

        function dragMouseDown(e) {
            e = e || window.event;
            e.preventDefault();
            // get the mouse cursor position at startup:
            pos3 = e.clientX;
            pos4 = e.clientY;
            top$1.document.onmouseup = closeDragElement;
            // call a function whenever the cursor moves:
            top$1.document.onmousemove = elementDrag;
        }

        function elementDrag(e) {
            e = e || window.event;
            e.preventDefault();
            // calculate the new cursor position:
            pos1 = pos3 - e.clientX;
            pos2 = pos4 - e.clientY;
            pos3 = e.clientX;
            pos4 = e.clientY;
            // set the element's new position:
            elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
            elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
        }

        function closeDragElement() {
            // stop moving when mouse button is released:
            top$1.document.onmouseup = null;
            top$1.document.onmousemove = null;
        }
    }


    // containsCheckElem 检查是否模板内元素,是就不移除
    function removeTemplate(elemId, containsCheckElem = false) {
        const temp = top$1.document.getElementById(elemId);
        if (temp && (containsCheckElem === false || temp.contains(containsCheckElem) === false)) {
            temp.classList.remove(elemId + '-show');
            setTimeout(function () {
                if (temp.classList.contains(elemId + '-show') === false && temp.parentElement) {
                    top$1.document.body.removeChild(temp);
                }
            }, 500);
        }
    }


    function createFrameSetting() {
        let html = `
 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style>` + GM_getResourceText('bootstrap') + `</style>
    <title></title>
</head>
<body>
<div id="app">
<div class="card">
    <h6 class="card-header">悬浮搜索图标</h6>
    <div class="card-body">
        <div class="custom-control custom-switch">
            <p>
                <input type="checkbox" class="custom-control-input" id="auto_search"  v-model="auto_search">
                <label class="custom-control-label" for="auto_search">
                    划词后自动搜题
                </label>
                <span class="form-text text-muted small">打开后划词自动打开搜题窗口进行搜题,否则鼠标右下角显示搜题图标</span>
            </p>
        </div>
                <div class="custom-control custom-switch">
            <input type="checkbox" class="custom-control-input" id="cut_search"  v-model="cut_search">
            <label class="custom-control-label" for="cut_search">
                截图搜题
            </label>
            <span class="form-text text-muted small">同时按下键盘T+H(题海首拼),然后框选指定的内容进行搜题,用于解决某些网页无法复制选中问题</span>
        </div>
    </div>
</div>
<div class="card">
    <h6 class="card-header">解除限制</h6>
    <div class="card-body">
        <div class="custom-control custom-switch">
            <input type="checkbox" class="custom-control-input" id="remove_limit" v-model="remove_limit">
            <label class="custom-control-label" for="remove_limit">
                解除网站的禁止复制限制
            </label>
            <span class="form-text text-muted small">打开后可解除部分网站的禁止划词限制,如冲突可关闭此功能<font color="red">(刷新页面后生效)</font></span>
        </div>
    </div>
</div>
<div class="card">
    <h6 class="card-header">搜索窗口</h6>
    <div class="card-body">
        <div class="custom-control custom-switch">
           <p>
                <input type="checkbox" class="custom-control-input" id="fixed_modal" v-model="fixed_modal">
                <label class="custom-control-label" for="fixed_modal">
                    基于浏览器窗口定位
                </label>
                <span class="form-text text-muted small">打开后搜索窗口可固定在浏览器窗口特定位置,不受页面滚动影响</span>
            </p>
        </div>
        <div class="custom-control custom-switch">
            <p>
                <input type="checkbox" class="custom-control-input" id="out_iframe" v-model="out_iframe">
                <label class="custom-control-label" for="out_iframe">
                    寻找最外层iframe
                </label>
                <span class="form-text text-muted small">打开后将会将搜题窗口悬浮在最外层iframe,可能某些网站<font color="red">无法正常显示搜题窗口</font>,否则将会在本iframe显示搜题窗口,若限制窗口无法移动到自定义的位置时可打开此开关</span>
            </p>
        </div>
    </div>
</div>
</div>
</body>
<script> ` + GM_getResourceText('Vue') + `</script>
<!-- 引入组件库 -->
<script>
  window.app = new Vue({
        el: '#app',
        data: ` + (GM_getValue("defaultConfig")) + `,
        watch: {
            auto_close: function(val) {
              window.parent.postMessage({"type": 'auto_close',"auto_close":val}, '*');
            },
            cut_search: function (val){
                window.parent.postMessage({"type": 'cut_search',"cut_search":val}, '*');
            },
            auto_search: function (val){
                window.parent.postMessage({"type": 'auto_search',"auto_search":val}, '*');
            },
            fixed_modal:function (val){
                window.parent.postMessage({"type": 'fixed_modal',"fixed_modal":val}, '*');
            },
            remove_limit:function (val){
                window.parent.postMessage({"type": 'remove_limit',"remove_limit":val}, '*');
            },
            out_iframe:function (val){
                window.parent.postMessage({"type": 'out_iframe',"out_iframe":val}, '*');
            }
        }
       })
</script>
</html>
`;
        return html;
    }


    /**
     * 解除限制
     */
    function relieveLimit() {
        start();
        if (location.host.indexOf('chaoxing') !== -1) {
            setTimeout(() => {
                try {
                    _self.UEDITOR_CONFIG.scaleEnabled = false;
                } catch (e) {
                }
                // $.each(UE.instants, function () {
                //     var key = this.key;
                //     this.ready(function () {
                //         this.destroy();
                //         UE.getEditor(key);
                //     });
                // });
            }, 2000);
        }

        if ((window.location.href.includes("newMooc=true") && location.host.indexOf('chaoxing') !== -1) || location.pathname.indexOf('exam/test/reVersionPaperMarkContentNew') !== -1) {
            setTimeout(() => {
                    $("body").removeAttr("onselectstart");
                    $("html").css("user-select", "unset");
                    try {
                        UE.EventBase.prototype.fireEvent = function () {
                            return null
                        };
                    } catch (e) {
                    }
                },
                2000);
        }
    }


    const jietuDiv = `
<div class="jietu" style="  
    position: fixed;  
    top: 0;  
    left: 0;  
    z-index: 9999;  
    width: 100%; 
    height: 100%; 
">  
    <div class="box-wrapper" >  
        <div class="jietuBox" style="
            width: 0px;
            height: 0px;
            background-color: #0000;
            outline: 1px solid #159ae1;
            position: relative;
            box-shadow: 0 0 0 65535px rgba(0, 0, 0, 0.5);
            pointer-events: none;
        ">  
        <div class="box-corner" style="display: none;"></div>  
        </div>  
    </div>  
    <div class="logText" style="  
        min-width: 333px;  
        font-size: 20px;  
        line-height: 56px;  
        top: 64px;  
        color: #fff;  
        white-space: nowrap;  
        text-align: center;  
        z-index: 9999;  
        background: #000000a3;  
        border-radius: 8px;  
        position: fixed;  
        left: 50%;  
        transform: translate(-50%, -50%);  
    ">请截取想要搜索的题目</div>  
</div>`;
    let isDragging = false;
    let box;
    let startX, startY;
    let jietu;
    let keysPressed = {};
    document.addEventListener('keyup', (event) => {
        delete keysPressed[event.key.toUpperCase()];
    });

    document.addEventListener('keydown', function (event) {
        keysPressed[event.key.toUpperCase()] = true;

        // 检查是否同时按下了 T 和 H
        if (options.cut_search && keysPressed['T'] && keysPressed['H'] && !document.querySelector('.jietuBox')) {
            jietu = document.createElement('div');
            jietu.innerHTML = jietuDiv;
            document.body.appendChild(jietu);
            document.addEventListener('mousedown', jietuMousedown);
            document.addEventListener('mousemove', jietuMousemove);
            document.addEventListener('mouseup', getcanvas);
            document.addEventListener('mouseleave', jietuMouseleave);
        } else if (event.key === 'Escape' && document.querySelector('.jietuBox')) {
            document.removeEventListener('mousedown', jietuMousedown);
            document.removeEventListener('mousemove', jietuMousemove);
            document.removeEventListener('mouseup', getcanvas);
            document.removeEventListener('mouseleave', jietuMouseleave);
            jietu.remove();
        }
    });

    function jietuMousedown(event) {
        box = document.querySelector('.jietuBox');
        if (box) {
            isDragging = true;
            startX = event.clientX;
            startY = event.clientY;
            console.log('event==>', event);
            box.style.left = `${startX}px`;
            box.style.top = `${startY}px`;
            box.style.width = '0px';
            box.style.height = '0px';
        }
    }

    function jietuMousemove(event) {
        if (!isDragging) return;
        box = document.querySelector('.jietuBox');
        if (box) {
            const text = document.querySelector('.logText');
            text.style.display = 'none';
            // 计算框选区域的左上角坐标
            const left = Math.min(event.clientX, startX);
            const top = Math.min(event.clientY, startY);
            const width = Math.abs(event.clientX - startX);
            const height = Math.abs(event.clientY - startY);
            box.style.left = `${left}px`;
            box.style.top = `${top}px`;
            box.style.width = `${width}px`;
            box.style.height = `${height}px`;
        }
    }

    function getcanvas() {
        box = document.querySelector('.jietuBox');
        if (!box) {
            return
        }
        if (box && box.offsetWidth > 0 && box.offsetHeight > 0) {
            const F = box.getBoundingClientRect();
            addModal2(createFrameLoading(), false);
            html2canvas(document.body).then(async canvas => {
                let croppedCanvas = document.createElement("canvas");
                croppedCanvas.width = F.width * window.devicePixelRatio;
                croppedCanvas.height = F.height * window.devicePixelRatio;
                let ctx = croppedCanvas.getContext("2d");

                // 从原始画布中裁剪所需部分
                ctx.drawImage(canvas,
                    -F.x * window.devicePixelRatio,
                    -F.y * window.devicePixelRatio,
                    canvas.width,
                    canvas.height);

                let o = croppedCanvas.toDataURL("image/jpeg", .8);
                const txt = await imgOcrBase64(o.replace('data:image/jpeg;base64,', ''));

                searchWord(txt).then(res => {
                    addModal2(res, false, false);
                });
            });
        }

        const jietu = document.querySelector('.jietu');
        if (jietu) {
            isDragging = false;
            startX = 0;
            startY = 0;
            document.removeEventListener('mousedown', jietuMousedown);
            document.removeEventListener('mousemove', jietuMousemove);
            document.removeEventListener('mouseup', getcanvas);
            jietu.remove();
        }
    }

    function jietuMouseleave() {
        isDragging = false;
        startX = 0;
        startY = 0;
        document.removeEventListener('mousedown', jietuMousedown);
        document.removeEventListener('mousemove', jietuMousemove);
        document.removeEventListener('mouseup', getcanvas);
        document.removeEventListener('mouseleave', jietuMouseleave);
    }

    function generateRandomString(length) {
        var result = '';
        var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        var charactersLength = characters.length;
        for (var i = 0; i < length; i++) {
            result += characters.charAt(Math.floor(Math.random() * charactersLength));
        }
        return result;
    }
    // 调用函数生成长度为6-10的随机字符串
    var randomString = generateRandomString(Math.floor(Math.random() * 5) + 6);
    // console.log(randomString);
    //主程序
    var HcSearch=function(){
        var transIconBase64="data:image/webp;base64,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";
        var $doc=$(document);
        var $body=$("html body");
        var randomCode="yyMM000000";    //属性随机码,年月加六位随机码。用于元素属性后缀,以防止属性名称重复。
        var createHtml=function(){
            var wordTransIconHtml=StringFormat('<div id="'+randomString+'{0}icon" class="wordTrans{0}"><div class="wordTransIcon{0}"></div></div>',randomCode,transIconBase64);
            $body.append(StringFormat('<div id="'+randomString+'{0}">',randomCode)+wordTransIconHtml+'</div>');
        };
        var createStyle=function(){
            //尽可能避开csp认证
            GM_addStyle(`#hcSearchePopover,#hcSearcheModal,#hcSearchePopover.hcSearchePopover,#hcSearcheModal.hcSearcheModal{all:initial;position:absolute;z-index:2147483647;display:block;font-size:14px;color:#333333;line-height:26px;transform:scale(0.9);opacity:0;transition:transform 0.1s ease-out,opacity 0.1s ease-out;}#hcSearchePopover.hcSearchePopover-show,#hcSearcheModal.hcSearcheModal-show{transform:scale(1);opacity:1;}#hcSearcheModal #hcSearcheModalContent{background:#f6f8fa;border:1px solid #d1d5da;border-radius:3px;color:#586069;display:block;box-shadow:0 16px 100px 0 rgba(0,0,0,0.2);}#hcSearcheModal #hcSearcheModalBody{margin-left:auto;margin-right:auto;position:relative;width:390px;background-color:#fff;border:1px solid #d1d5da;border-width:1px 0;border-radius:3px;}#hcSearcheModal #hcSearcheIframe{overflow:hidden;margin:0;padding:0;height:550px;}#hcSearcheModal #hcSearcheModalHeader{font-size:13px;line-height:24px;padding:6px 12px;color:#586069;}#hcSearcheModal #hcSearcheModalHeader::after{display:block;clear:both;content:"";}#hcSearcheModal #hcSearcheModalFooter{min-height:10px;cursor:move;position:relative;display:flex; justify-content: center;}#hcSearcheModal #hcSearcheModalLinks{float:right}#hcSearcheModal #hcSearcheModalLinks hcsearche-link{display:inline-block;color:#24292e;margin:0 0 0 6px;font-size:13px;font-weight:normal;text-decoration:none;cursor:pointer;padding:0 0.5em;border-radius:0;}#hcSearcheModal #hcSearcheModalLinks hcsearche-link[data-securrent=true],#hcSearcheModal #hcSearcheModalLinks hcsearche-link:hover{background:rgba(27,31,35,.08);color:#444d56;}#hcSearcheModal #hcSearcheModalLinks hcsearche-link>svg{vertical-align:sub;padding-left:4px;}#hcSearcheModal #hcSearcheModalLinks #hcSearcheClose:hover{background:rgba(0,0,0,0.05);}#hcSearcheModal #hcSearcheModalLock{float:left;display:block;opacity:0.3;margin-top:3px;width:20px;height:20px;background-size:20px;background-position:center;background-repeat:no-repeat;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0xMSAxMHYtNGMwLTIuNzYtMi4yNC01LTUtNXMtNSAyLjI0LTUgNXYyaC0xdi0yYzAtMy4zMTIgMi42ODktNiA2LTZzNiAyLjY4OSA2IDZ2NGgxMHYxNGgtMTh2LTE0aDd6bTEwIDFoLTE2djEyaDE2di0xMnoiLz48L3N2Zz4=);}#hcSearcheModal #hcSearcheModalLock.hcSearcheModalLocked{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik02IDZjMC0zLjMxMSAyLjY4OS02IDYtNnM2IDIuNjg4IDYgNnY0aDN2MTRoLTE4di0xNGgzdi00em0xNCA1aC0xNnYxMmgxNnYtMTJ6bS0xMy01djRoMTB2LTRjMC0yLjc2LTIuMjQtNS01LTVzLTUgMi4yNC01IDV6Ii8+PC9zdmc+)}#hcSearcheModal #hcSearcheNextLink{position:absolute;top:-40px;right:28px;display:block;width:32px;height:32px;color:#6c757d;cursor:pointer;background-size:16px;background-position:center;background-repeat:no-repeat;background-color:#f6f8fa;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA4UlEQVQ4T+2TTUoDQRCF32twTpCLuFKYEaYWguvoGQS3nsFjeAYXEoIQ6JqF1wi6Sly48wBPGpzQtpNJyMJVetm8+urvFTHyYoy3IYS3tm0X22QcA7j7A4B3M3s8Av5rBu4+MbPPfuJDWyg1mzVKCu6+InljZq8JUgK6rruTNDWzyz7JLx/EGM8APJO8TpAc8BN8D+DCzD4GAekzhwC4SkYieSLpT3DSDzoxQUjOJM1DCEHSeZl5awXZABtJLyS/AJzmZee23nULTVVV67qulwfdwtihbVpw9wjA9hGXGklP3z4VgPj5LnZPAAAAAElFTkSuQmCC);border-radius:3px;}#hcSearcheModal #hcSearcheNextLink:hover{background-color:#e9ecef;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA8ElEQVQ4T2NkwAMKCwvT/v37d3/ixIm7cSljxGdAQUFBCwMDw4MJEybMGTWAXmFQXFws0tvb+wYW4thiAV0NPBobGhqY3r9//4yBgSFk4sSJR0CGoBtQUFCQycDAEDRhwgRXmCUo6SA/P9+ckZFx0////4NBhiAbANVc9OvXL9tp06a9wGoASBDZEEZGRg9QQmJgYGBlYGDA0AxSjzUlQg3Z8v///20MDAxMjIyMFug243QBTCI/P9+GgYFhBwMDw+ffv38bIjsbOVnjzQvFxcU2TExMz7u7u++SlRfwZTS4F/Lz8/cxMjI6EqMYi5p1AJbtgw7fjyoMAAAAAElFTkSuQmCC);color:#444d56;}#hcSearcheModal #hcSearcheNextLink.hcSearcheNextLinkLoading{background-color:#e9ecef;background-image:none;}#hcSearcheModal #hcSearcheNextLink.hcSearcheNextLinkLoading:after{content:" ";display:block;width:12px;height:12px;margin:9px 0 0 9px;border-radius:50%;border:1px solid #24292e;border-color:#24292e transparent #24292e transparent;animation:hcSearcheNextLinkLoading 1.2s linear infinite;}@keyframes hcSearcheNextLinkLoading{0%{transform:rotate(0deg);}50%{transform:rotate(180deg);}100%{transform:rotate(720deg);}}.JPopBox-tip-white{z-index:1060;min-width:50px;max-width:300px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;color:#333;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.JPopBox-tip-white .JPopBox-tip-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0;font-weight:500;line-height:1.1;color:inherit}.JPopBox-tip-white .JPopBox-tip-content{padding:9px 14px}.JPopBox-tip-white .JPopBox-tip-arrow,.JPopBox-tip-white .JPopBox-tip-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;border-width:10px;content:""}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-top{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:rgba(0,0,0,.25);bottom:-11px}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-top:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-right{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:rgba(0,0,0,.25)}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-right:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-bottom{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25);top:-11px}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-bottom:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-left{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.JPopBox-tip-white .JPopBox-tip-arrow.JPopBox-tip-arrow-left:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.JPopBox-tip-white{width: 482px;max-width: 550px;min-width: 450px;}`);

            var s="";
            s+=StringFormat(".wordTrans{0}{box-sizing: content-box;cursor: pointer;z-index: 2147483647;border-width: 0px;border-style: solid;border-image: initial;border-radius: 5px;padding: 0.5px;position: absolute;display: none}",randomCode);
            s+=StringFormat(".wordTransIcon{0}{background-image: url({1});background-size: 50px;height: 50px;width: 50px;}",randomCode,transIconBase64);
            s+=Panel.CreateStyle();
            GM_addStyle(s);
        };
        var ShowWordTransIcon=function(){
            var wordTransIcon = document.getElementById(randomString + randomCode+'icon');
            var isSelect=false;
            var isPanel=false;
            var isWordTransIcon=false;
            $doc.on({
                "selectionchange":function(e){
                    isSelect=true;
                },
                "mousedown":function(e){
                    var $targetEl=$(e.target);
                    isPanel=$targetEl.parents().is("div.JPopBox-tip-white");
                    isWordTransIcon=$targetEl.parents().is(StringFormat("div#"+randomString+"{0}",randomCode));
                    //点击划词图标外域和划词面板外域时,隐藏图标和划词面板
                    if(!isWordTransIcon && !isPanel){
                        wordTransIcon.style.display = "none";
                        Panel.Destroy();
                    }
                    else {
                        //点击划词图标,取消鼠标默认事件,防止选中的文本消失
                        if(isWordTransIcon){
                            ClearBubble(e);
                        }
                    }
                },
                "mouseup":function(e){
                    var selectText = window.getSelection().toString().trim();
                    if(!isPanel&&isSelect&&selectText){
                        if (!SearchPanel.getOptions().auto_search){

                            wordTransIcon.style.display = 'block';
                            wordTransIcon.style.left = e.pageX + 'px';
                            wordTransIcon.style.top = (e.pageY + 12) + 'px';
                        }else {
                            //选中的文本内容
                            SearchPanel.show(selectText);
                        }
                        isSelect=false;
                    }
                }
            });
            wordTransIcon.addEventListener("click", function(e) {
                // GetSettingOptions();
                //如果不是自动搜索的话,就显示出来搜索按钮,然后让用户点击
                if (!SearchPanel.getOptions().auto_search) {
                    Panel.Destroy();
                    SearchPanel.show();
                    wordTransIcon.style.display = "none";
                    e.stopPropagation();
                }
            });
        };
        // var guid="";
        var RegMenu=function(){
            GM_registerMenuCommand("文本搜题",function(){
               SearchPanel.showWordSearch();
            });
            GM_registerMenuCommand("设置",function(){
                SearchPanel.setting();
            });
        };
        this.init=function(){
            randomCode=DateFormat(new Date(),"yyMM").toString()+(Math.floor(Math.random() * (999999 - 100000 + 1) ) + 100000).toString();
            createStyle();
            createHtml();
            ShowWordTransIcon();
            SearchPanel.init();
            RegMenu();
            reportOnline();
        };
    };

    var hcSearch=new HcSearch();
    hcSearch.init();

})();