Commit abc82060 by chentianzhong

代码提交

parent 86de89bf
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"]
}
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true,
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: [
'vue'
],
// add your custom rules here
rules: {
// allow async-await
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
# vue2-gxca
> A Vue.js project
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
```
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
}
},
module: {
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const env = require('../config/prod.env')
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}
'use strict'
module.exports = {
NODE_ENV: '"production"'
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>vue2-gxca</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="./static/js/XTXSAB.js"></script>
</body>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "vue2-gxca",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "天气不坏 <674858232@qq.com>",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"lint": "eslint --ext .js,.vue src",
"build": "node build/build.js"
},
"dependencies": {
"vue": "^2.5.2"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"eslint": "^4.15.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-node": "^5.2.0",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.0.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
<template>
<div id="app">
<Login/>
</div>
</template>
<script>
import Login from './components/Login'
export default {
name: 'App',
components: {
Login
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
<template>
<div>
<span>用户</span> <select id="UserList"></select>
<br/>
<span>密码</span><input type="password" v-model="pin"/>
<button @click="doLogin()">登陆</button>
<br>
</div>
</template>
<script>
export default {
name: 'Login',
data () {
return {
pin: "",//用户证书密码
}
},
methods:{
//注意,由于方法都是异步的,所以需要在我们的回调方法中按步骤继续执行我们的回调,请不要改变方法位置和调用顺序
doLogin(){
//获取当前选中的用户的certid,双向数据绑定会有问题,所以通过元素获取
let strCertID = document.getElementById("UserList").options[0].value;
if(strCertID === "" || this.pin === ""){
alert('请插入ukey和输入PIN码');
return;
}
//1.通过ajax获取到后端传过来的 strServerSignedData,strServerRan和strServerCert,这步建议是在用户打开页面就自动获取,建议放在钩子函数中
//注意这里为了演示,直接写死,实际是必须从后台获取的
alert("通过ajax获取到后端传过来的 strServerSignedData,strServerRan和strServerCert---实际集成请去掉这个提示");
////后端返回的服务器签名值
let strServerSignedData = "MEUCIQCM+ewmele4KSNY7HmnYGQGXleZgDKVDtpGPeV8dvgQjAIgTnExY4GYQ9LuAD8MeWtXwT/hFHkBAqbp6xcxilB6Dpc=";
//后端返回的随机数
let strServerRan = "YPy8ujSXOcRKJ6NG5SCIK553kQGhx7TJ";
//后端返回的服务器证书
let strServerCert = "MIIEqTCCBE+gAwIBAgIKGhAAAAAAAO13RzAKBggqgRzPVQGDdTBEMQswCQYDVQQGEwJDTjENMAsGA1UECgwEQkpDQTENMAsGA1UECwwEQkpDQTEXMBUGA1UEAwwOQmVpamluZyBTTTIgQ0EwHhcNMTkwMjEzMTYwMDAwWhcNMjkwMjE0MTU1OTU5WjCBpTEbMBkGA1UEKQwSOTE0NTAwMDBNQTVONk4yRzZSMScwJQYDVQQDDB7mlbDlrZflub/opb/pm4blm6LmnInpmZDlhazlj7gxGDAWBgNVBAsMD0RTMjIzRzIxOTAxMDU5NTENMAsGA1UECgwEQkpDQTEnMCUGA1UECgwe5pWw5a2X5bm/6KW/6ZuG5Zui5pyJ6ZmQ5YWs5Y+4MQswCQYDVQQGDAJDTjBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABOUVr0Z8+Y94QFQ517F/isnioF0FDCrxDJ+qKqK20oINoH5kWbEJ79lPj0SBS0ZZ9pnAjmJYA72ArhTRb0kZlzajggLFMIICwTAfBgNVHSMEGDAWgBQf5s/Uj8UiKpdKKYoV5xbJkjTEtjAdBgNVHQ4EFgQU+1DevoKKaWEtTj/3gwhwDGQmHnwwCwYDVR0PBAQDAgbAMIGdBgNVHR8EgZUwgZIwYKBeoFykWjBYMQswCQYDVQQGEwJDTjENMAsGA1UECgwEQkpDQTENMAsGA1UECwwEQkpDQTEXMBUGA1UEAwwOQmVpamluZyBTTTIgQ0ExEjAQBgNVBAMTCWNhMjFjcmw3OTAuoCygKoYoaHR0cDovL2NybC5iamNhLm9yZy5jbi9jcmwvY2EyMWNybDc5LmNybDAkBgoqgRyG7zICAQEBBBYMFEpKOTE0NTAwMDBNQTVONk4yRzZSMGAGCCsGAQUFBwEBBFQwUjAjBggrBgEFBQcwAYYXT0NTUDovL29jc3AuYmpjYS5vcmcuY24wKwYIKwYBBQUHMAKGH2h0dHA6Ly9jcmwuYmpjYS5vcmcuY24vY2Fpc3N1ZXIwQAYDVR0gBDkwNzA1BgkqgRyG7zICAgEwKDAmBggrBgEFBQcCARYaaHR0cDovL3d3dy5iamNhLm9yZy5jbi9jcHMwEQYJYIZIAYb4QgEBBAQDAgD/MCIGCiqBHIbvMgIBAQgEFAwSOTE0NTAwMDBNQTVONk4yRzZSMCQGCiqBHIbvMgIBAgIEFgwUSko5MTQ1MDAwME1BNU42TjJHNlIwHwYKKoEchu8yAgEBDgQRDA8xMDIwODAwMDIyNzY3MDIwJAYKKoEchu8yAgEBBAQWDBRKSjkxNDUwMDAwTUE1TjZOMkc2UjAtBgoqgRyG7zICAQEXBB8MHTJAMjE1MDA5SkowOTE0NTAwMDBNQTVONk4yRzZSMCAGCCqBHNAUBAEEBBQMEjkxNDUwMDAwTUE1TjZOMkc2UjATBgoqgRyG7zICAQEeBAUMAzY1NDAKBggqgRzPVQGDdQNIADBFAiEAqclRpfLB92JYG7SUCGlxnQOpzengk2HYo9b8kXq6LxoCID0xO+vOVqmt1RzhWiB2t3+pVEDHqWONZUFmMHL/nV4e";
if(strServerSignedData === "" || strServerRan === "" || strServerCert === ""){
alert('连接CA服务器失败,请刷新页面重试!');
return;
}
//2.校验证书密码
VerifyUserPIN(strCertID, this.pin, function(retObj) {
if (!retObj.retVal) { //校验失败
//2.1获取PIN剩余次数
GetUserPINRetryCount(strCertID, function (retObj){
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
alert("校验证书密码失败!您还有" + retryCount + "次机会重试!");
return;
} else if (retryCount == 0) {
alert("您的证书密码已被锁死,请联系管理员进行解锁!");
return;
} else {
alert("登录失败!");
return;
}
});
} else{
//校验pin码成功,继续往下执行
//3、获取用户证书
GetSignCert(strCertID, function(retObj){
var UserCert = retObj.retVal;
if (UserCert == "") {
alert("获取签名证书失败!");
return;
}else {
//4.验证服务端签名
VerifySignedData(strServerCert,strServerRan,strServerSignedData,function(retObj){
if (!retObj.retVal) {
alert("验证服务端签名失败!");
return;
}else{
//5、客户端对服务器随机数签名
SignedData(strCertID, strServerRan, function(retObj){
if (retObj.retVal == "") {
alert("客户端签名失败!");
return;
}else{
var UserSignedData = retObj.retVal;
//在此处写你的代码,把UserCert,strServerRan,UserSignedData等传到后台验证
//6、通过ajax把 UserCert,strServerRan,UserSignedData传到后台,由后台解析验证,判断用户是否有权限登陆系统
alert("通过ajax把 UserCert,strServerRan,UserSignedData传到后台,由后台解析验证,判断用户是否有权限登陆系统");
}
});
}
});
}
});
}
});
}
},
mounted() {
//调用
SetUserCertList("UserList", CERT_TYPE_HARD);
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
components: { App },
template: '<App/>'
})
/* globals var */
var $_$softCertListID = ""; // Soft CertListID, Set by SetUserCertList
var $_$hardCertListID = ""; // USBKeyCertListID, Set by SetUserCertList
var $_$allCertListID = ""; // All CertListID, Set by SetUserCertList
var $_$loginCertID = ""; // logined CertID, Set by SetAutoLogoutParameter
var $_$logoutFunc = null; // logout Function, Set by SetAutoLogoutParameter
var $_$onUsbKeyChangeCallBackFunc = null; //custom onUsbkeyChange callback function
var $_$XTXAlert = null; // alert custom function
var $_$XTXAppObj = null; // XTXAppCOM class Object
var $_$SecXV2Obj = null; // SecCOMV2 class Object
var $_$SecXObj = null; // SecCOM class Object
var $_$WebSocketObj = null; // WebSocket class Object
var $_$CurrentObj = null; // Current use class Object
var $_$GetPicObj = null; // GetKeyPic class Object
// const var
var CERT_TYPE_HARD = 1;
var CERT_TYPE_SOFT = 2;
var CERT_TYPE_ALL = 3;
// const var
var CERT_OID_VERSION = 1;
var CERT_OID_SERIAL = 2;
var CERT_OID_SIGN_METHOD = 3;
var CERT_OID_ISSUER_C = 4;
var CERT_OID_ISSUER_O = 5;
var CERT_OID_ISSUER_OU = 6;
var CERT_OID_ISSUER_ST = 7;
var CERT_OID_ISSUER_CN = 8;
var CERT_OID_ISSUER_L = 9;
var CERT_OID_ISSUER_E = 10;
var CERT_OID_NOT_BEFORE = 11;
var CERT_OID_NOT_AFTER = 12;
var CERT_OID_SUBJECT_C = 13;
var CERT_OID_SUBJECT_O = 14;
var CERT_OID_SUBJECT_OU = 15;
var CERT_OID_SUBJECT_ST = 16;
var CERT_OID_SUBJECT_CN = 17;
var CERT_OID_SUBJECT_L = 18;
var CERT_OID_SUBJECT_E = 19;
var CERT_OID_PUBKEY = 20;
var CERT_OID_SUBJECT_DN = 33;
var CERT_OID_ISSUER_DN = 34;
var CERT_OID_DN = 35;
// set auto logout parameters
function SetAutoLogoutParameter(strCertID, logoutFunc)
{
$_$loginCertID = strCertID;
$_$logoutFunc = logoutFunc;
return;
}
function SetLoginCertID(strCertID)
{
$_$loginCertID = strCertID;
return;
}
function SetLogoutFunction(logoutFunc)
{
$_$logoutFunc = logoutFunc;
}
// set user cert list id
function SetUserCertList(strListID, certType)
{
if (arguments.length == 1) {
$_$hardCertListID = strListID;
} else {
if (certType == CERT_TYPE_HARD) {
$_$hardCertListID = strListID;
}
if (certType == CERT_TYPE_SOFT) {
$_$softCertListID = strListID;
}
if (certType == CERT_TYPE_ALL) {
$_$allCertListID = strListID;
}
}
GetUserList($pushAllDropListBox);
return;
}
// set custom usbkeychange callback
function SetOnUsbKeyChangeCallBack(callback)
{
$_$onUsbKeyChangeCallBackFunc = callback;
}
// set custom alert function
function SetAlertFunction(custom_alert)
{
$_$XTXAlert = custom_alert;
}
function $checkBrowserISIE()
{
return (!!window.ActiveXObject || 'ActiveXObject' in window) ? true : false;
}
function $popDropListBoxAll(strListID)
{
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i, n = objListID.length;
for(i = 0; i < n; i++) {
objListID.remove(0);
}
objListID = null;
}
function $pushOneDropListBox(userListArray, strListID)
{
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i;
for (i = 0; i < userListArray.length; i++) {
var certObj = userListArray[i];
var objItem = new Option(certObj.certName, certObj.certID);
objListID.options.add(objItem);
}
objListID = null;
return;
}
function $pushAllDropListBox(certUserListObj)
{
if ($_$hardCertListID != "") {
$popDropListBoxAll($_$hardCertListID);
}
if ($_$softCertListID != "") {
$popDropListBoxAll($_$softCertListID);
}
if ($_$allCertListID != "") {
$popDropListBoxAll($_$allCertListID);
}
var strUserList = certUserListObj.retVal;
var allListArray = []
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
allListArray.push({certName:strName, certID:strCertID});
if ($_$hardCertListID != "") {
GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == "HARD") {
$pushOneDropListBox([retObj.ctx], $_$hardCertListID);
}
}, {certName:strName, certID:strCertID});
}
if ($_$softCertListID != "") {
GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == "SOFT") {
$pushOneDropListBox([retObj.ctx], $_$softCertListID);
}
}, {certName:strName, certID:strCertID});
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3,len);
}
if ($_$allCertListID != "") {
$pushOneDropListBox(allListArray, $_$allCertListID);
}
}
function $myAutoLogoutCallBack(retObj)
{
if (retObj.retVal.indexOf($_$loginCertID) <= 0) {
$_$logoutFunc();
}
}
//usbkey change default callback function
function $OnUsbKeyChange()
{
GetUserList($pushAllDropListBox);
if (typeof $_$onUsbKeyChangeCallBackFunc == 'function') {
$_$onUsbKeyChangeCallBackFunc();
}
if ($_$loginCertID != "" && typeof $_$logoutFunc == 'function') {
GetUserList($myAutoLogoutCallBack);
}
}
// IE11 attach event
function $AttachIE11OnUSBKeychangeEvent(strObjName)
{
var handler = document.createElement("script");
handler.setAttribute("for", strObjName);
handler.setAttribute("event", "OnUsbKeyChange");
handler.appendChild(document.createTextNode("$OnUsbKeyChange()"));
document.body.appendChild(handler);
}
//load a control
function $LoadControl(CLSID, ctlName, testFuncName, addEvent)
{
var pluginDiv = document.getElementById("pluginDiv" + ctlName);
if (pluginDiv) {
return true;
}
pluginDiv = document.createElement("div");
pluginDiv.id = "pluginDiv" + ctlName;
document.body.appendChild(pluginDiv);
try {
if ($checkBrowserISIE()) { // IE
pluginDiv.innerHTML = '<object id="' + ctlName + '" classid="CLSID:' + CLSID + '" style="HEIGHT:0px; WIDTH:0px"></object>';
if (addEvent) {
var clt = eval(ctlName);
if (clt.attachEvent) {
clt.attachEvent("OnUsbKeyChange", $OnUsbKeyChange);
} else {// IE11 not support attachEvent, and addEventListener do not work well, so addEvent ourself
$AttachIE11OnUSBKeychangeEvent(ctlName);
}
}
} else {
var chromeVersion = window.navigator.userAgent.match(/Chrome\/(\d+)\./);
if (chromeVersion && chromeVersion[1]) {
if (parseInt(chromeVersion[1], 10) >= 42) { // not support npapi return false
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
if (addEvent) {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} event_OnUsbkeyChange=$OnUsbKeyChange width=0 height=0 />' ;
} else {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} width=0 height=0 />' ;
}
}
if (testFuncName != null && testFuncName != "" && eval(ctlName + "." + testFuncName) == undefined) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
return true;
} catch (e) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
function $XTXAlert(strMsg) {
if (typeof $_$XTXAlert == 'function') {
$_$XTXAlert(strMsg);
} else {
alert(strMsg);
}
}
function $myOKRtnFunc(retVal, cb, ctx)
{
if (typeof cb == 'function') {
var retObj = {retVal:retVal, ctx:ctx};
cb(retObj);
}
return retVal;
}
//XTXAppCOM class
function CreateXTXAppObject() {
var bOK = $LoadControl("3F367B74-92D9-4C5E-AB93-234F8A91D5E6", "XTXAPP", "SOF_GetVersion()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.ChangeAdminPass = function(sDeviceSN,sOldPass,sNewPass,cb,ctx){
var ret = XTXAPP.ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GenerateKeyPair = function(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
var ret = XTXAPP.GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ExportPKCS10 = function(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
var ret = XTXAPP.ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,sDN);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportSignCert = function(sDeviceSN,sContainerName,sCert,cb,ctx){
var ret = XTXAPP.ImportSignCert(sDeviceSN,sContainerName,sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportEncCert = function(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
var ret = XTXAPP.ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetUserConfig = function(type,strConfig,cb,ctx){
var ret = XTXAPP.SetUserConfig(type,strConfig);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetSignMethod = function(sign_algo,cb,ctx){
var ret = XTXAPP.SOF_SetSignMethod(sign_algo);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList = function(cb, ctx) {
var ret = XTXAPP.SOF_GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o._GetUserListByType = function(strType, cb, ctx) {
var strUserList = XTXAPP.SOF_GetUserList();
var ret = "";
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
if (XTXAPP.GetDeviceInfo(strCertID, 7) == strType) {
ret += (strOneUser + "&&&");
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList_USBKey = function(cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strUserCert = XTXAPP.SOF_ExportUserCert(strCertID);
var strUserExchCert = XTXAPP.SOF_ExportExChangeUserCert(strCertID);
/*if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}*/
ret = strUserCert;
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_ExportExChangeUserCert(strCertID)
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret = XTXAPP.SOF_Login(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret = XTXAPP.SOF_ChangePassWd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_GetPinRetryCount(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var ret = XTXAPP.SOF_GetCertEntity(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = XTXAPP.SOF_GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Logout = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_Logout(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
//base64编码
o.Base64Encode = function(sIndata,cb,ctx) {
var ret = XTXAPP.SOF_Base64Encode(sIndata);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var ret = XTXAPP.SOF_SignMessage(bFlag, strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedMessage(strP7Data, strPlainMsg);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_EncryptDataEx(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = XTXAPP.SOF_DecryptData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var r = XTXAPP.SOF_ValidateCert(strCert);
var ret;
if (ret == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function(strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_HashFile(2, strFilePath); //sha1 alg
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function(strCertID, cb, ctx) {
var ret = XTXAPP.GetDeviceInfo(strCertID, 7);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SignHashData = function(strCertID, strHashData, ulHashAlg, cb, ctx) {
var ret = XTXAPP.SOF_SignHashData(strCertID, strHashData, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
o.VerifySignedHashData = function(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedHashData(strCert, strHashData, strSignValue, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
return o;
}
//SecXV2 class
function CreateSecXV2Object() {
var bOK = $LoadControl("FCAA4851-9E71-4BFE-8E55-212B5373F040", "SecXV2", "GetUserList()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.GetUserList = function(cb, ctx) {
var ret = SecXV2.GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strUserCert = SecXV2.ExportUserCert(strCertID);
var strUserExchCert = SecXV2.ExportExChangeUserCert(strCertID);
if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var ret = SecXV2.ExportExChangeUserCert(strCertID);
if (typeof cb == 'function') {
var retObj = {retVal:ret, ctx:ctx};
cb(retObj);
}
return ret;
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret = SecXV2.UserLogin(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret = SecXV2.ChangePasswd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var strExtLib = SecXV2.GetUserInfo(strCertID, 15);
var ret = SecXV2.GetBjcaKeyParam(strExtLib, 8);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var ret = SecXV2.GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, "2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = SecXV2.GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = SecXV2.SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = SecXV2.PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = SecXV2.PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var ret = SecXV2.SignDataByP7(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret = SecXV2.VerifySignedDatabyP7(strP7Data);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = SecXV2.EncodeP7EnvelopedData(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = SecXV2.DecodeP7EnvelopedData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = SecXV2.SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = SecXV2.EncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = SecXV2.DecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.EncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.DecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var ret = SecXV2.ValidateCert(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//SecXV2 class
function CreateSecXObject() {
$LoadControl("02BE3F91-A9E1-4D12-A65B-1E0D500292A7", "oCert", "", false);
$LoadControl("4F763EC7-657A-43A8-96D0-BD3AD6D5E17E", "oCrypto", "", false);
$LoadControl("D57CD2CA-8FA1-440F-8614-B0A28F64F0BE", "oDevice", "", false);
var bOK = $LoadControl("BB7D3BAD-A402-4E98-B813-1C3C22481AE7", "oUtil", "getUserList()", false);
if (!bOK) {
return null;
}
bOK = $LoadControl("0CF5259B-A812-4B6E-9746-ACF7279FEF74", "USBKEY", "EnumUsbKey()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.CERT_SRC_BASE64 = 1; //证书来自Base64字符串
o.CERT_SRC_UNIQUEID = 2; //证书来自唯一表示
o.CERT_SRC_FILE = 3; //证书来自der文件
o.CERT_SRC_CONTAINER_UCA = 4; //证书来自UCA类型证书容器
o.CERT_SRC_CONTAINER_SIGN = 5; //证书来自容器下签名证书
o.CERT_SRC_CONTAINER_ENC = 6; //证书来自容器下加密证书
o.CERT_SRC_CONTAINER_BOTH = 7; //证书来自容器下签名加密证书
o.CERT_SRC_PKCS12 = 8; //证书来自PKCS12文件
o.CERT_DST_BASE64 = 1; //导出证书为Base64字符串
o.CERT_DST_DERFILE = 2; //导出证书为der文件
o.CERT_DST_P12 = 3; //到出证书为PKCS12文件
o.CERT_XML_SUBJECT = 1; //从XML配置文件取用户名
o.CERT_XML_UNIQUEID = 2; //从XML配置文件取用户唯一表识
o.CERT_XML_DEPT = 3; //从XML配置文件取用户所有者部门
o.CERT_XML_ISSUE = 4; //从XML配置文件取用户证书颁发者
o.CERT_XML_STATE = 5; //从XML配置文件取用户证书使用状态
o.CERT_XML_TRADETYPE = 6; //从XML配置文件取用户证书应用类型
o.CERT_XML_PASSWORD = 7; //从XML配置文件取用户证书私钥保护口令
o.CERT_XML_DEVICETYPE = 8; //从XML配置文件取用户证书介质类型
o.CERT_XML_CATYPE = 9; //从XML配置文件取用户证书CA类型
o.CERT_XML_KEYTYPE = 10; //从XML配置文件取用户证书密钥类型
o.CERT_XML_SIGNSN = 11; //从XML配置文件取用户签名证书序列号
o.CERT_XML_EXCHSN = 12; //从XML配置文件取用户加密证书序列号
o.CERT_XML_DEVICENAME = 13; //从XML配置文件取用户证书介质名称
o.CERT_XML_DEVICEPROVIDER = 14; //从XML配置文件取用户证书介质提供者
o.CERT_XML_DEVICEAFFIX = 15; //从XML配置文件取用户证书介质附加库
o.CERT_XML_SIGNPATH = 16; //从XML配置文件取用户签名证书路径
o.CERT_XML_EXCHPATH = 17; //从XML配置文件取用户加密证书路径
o.CERT_XML_SIGNPFXPATH = 18; //从XML配置文件取用户签名P12证书路径
o.CERT_XML_EXCHPFXPATH = 19; //从XML配置文件取用户加密P12证书路径
o.CERT_XML_CHAINPATH = 20; //从XML配置文件取用户证书链路径
o.CERT_XML_CRLPATH = 21; //从XML配置文件取用户证书作废列表路径
o.CERT_XML_UNIQUEIDOID = 22; //从XML配置文件取用户证书UniqueID的OID
o.CERT_XML_VERIFYTYPE = 23; //从XML配置文件取用户证书验证类型
o.CERT_XML_CACOUNTS = 24; //从XML配置文件取用户证书根证书个数
o.CERT_XML_CANUMTYPE = 25; //从XML配置文件取用户证书跟证书类型
o.CRYPT_CFGTYPE_UNSET = 0; //用户应用类型未定义
o.CRYPT_CFGTYPE_CSP = 1; //用户应用类型CSP
o.CRYPT_CFGTYPE_P11 = 2; //用户应用类型P11
o.CRYPT_CFGTYPE_P12 = 3; //用户应用类型软算法
o.ENVELOP_ENC = 1; //加密P7数字信封
o.ENVELOP_DEC = 0; //解密P7数字信封
o.GetUserList = function(cb, ctx) {
var ret = USBKEY.getUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var KeyType = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_KEYTYPE);
if (KeyType == 1) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else if (KeyType == 2) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_SIGN, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else {
ret = "";
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
var ret = oCert.exportCert(o.CERT_DST_BASE64);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.userLogin(strCSPName, strUserPIN);
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, strUserPIN);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.changeUserPin(strCSPName, strExtLib, oldPwd, newPwd)
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, newPwd);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var ret = oDevice.getKeyRetrys(strExtLib);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var SecXType;
switch (Type) {
case CERT_OID_ISSUER_CN:
SecXType = 4;
break;
case CERT_OID_NOT_BEFORE:
SecXType = 5;
break;
case CERT_OID_NOT_AFTER:
SecXType = 6;
break;
case CERT_OID_SUBJECT_C:
SecXType = 42;
break;
case CERT_OID_SUBJECT_O:
SecXType = 45;
break;
case CERT_OID_SUBJECT_OU:
SecXType = 46;
break;
case CERT_OID_SUBJECT_ST:
SecXType = 44;
break;
case CERT_OID_SUBJECT_CN:
SecXType = 41;
break;
case CERT_OID_SUBJECT_L:
SecXType = 43;
break;
case CERT_OID_PUBKEY:
SecXType = 43;
break;
default:
SecXType = Type;
break;
}
var ret = oCert.getBasicCertInfoByOID(SecXType);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID(strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID("2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = oCrypto.generateRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = oCrypto.signedData(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignedData(strSignValue, strCert, strInData);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = oCrypto.EncDataByCert(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = oCrypto.DecDataByRSA(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var ret = oCrypto.signedDataByP7(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret;
var r = oCrypto.verifySignedDataByP7(strP7Data);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = oCrypto.envelopedData(strInData, o.ENVELOP_ENC, strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = oCrypto.envelopedData(strP7Envlope, o.ENVELOP_DEC, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = oCrypto.signFile(strFilePath, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignFile(strFilePath, strCert, strSignValue);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = oCrypto.encryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = oCrypto.decryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.encryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.decryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var ret;
var r = oCert.validateCert("", "");
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function(strFilePath, cb, ctx) {
var ret = oCrypto.HashFile(strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//webSocket client class
function CreateWebSocketObject() {
var o = new Object();
o.ws_host = "ws://127.0.0.1:";
o.ws_port_array = ["21051/xtxapp","4044","5044", "6044", "7044", "8044"];
o.ws_port_use = 0;
o.ws_obj = null;
o.ws_heartbeat_id = 0;
o.ws_queue_id = 0; // call_cmd_id
o.ws_queue_list = {}; // call_cmd_id callback queue
o.ws_queue_ctx = {};
o.xtx_version = "";
o.load_websocket = function() {
if (o.ws_port_use >= o.ws_port_array.length) {
o.ws_port_use = 0;
// return false;
}
var ws_url = o.ws_host + o.ws_port_array[o.ws_port_use] + "/";
try {
o.ws_obj = new WebSocket(ws_url);
} catch (e) {
console.log(e);
return false;
}
o.ws_queue_list["onUsbkeyChange"] = $OnUsbKeyChange;
o.ws_obj.onopen = function(evt) {
clearInterval(o.ws_heartbeat_id);
o.callMethod("SOF_GetVersion", function(str){o.xtx_version = str.retVal;});
o.ws_heartbeat_id = setInterval(function () {
o.callMethod("SOF_GetVersion", function(str){});
}, 10 * 1000);
GetUserList($pushAllDropListBox);
};
o.ws_obj.onerror = function(evt) {
o.ws_port_use++;
o.load_websocket();
};
o.ws_obj.onclose = function(evt) {
};
o.ws_obj.onmessage = function(evt) {
var res = JSON.parse(evt.data);
if(res['set-cookie']){
document.cookie = res['set-cookie'];
}
//登录失败
if(res['loginError'])
{
alert(res['loginError']);
}
var call_cmd_id = res['call_cmd_id'];
if(!call_cmd_id)
{
return;
}
var execFunc = o.ws_queue_list[call_cmd_id];
if(typeof(execFunc) != 'function')
{
return;
}
var ctx = o.ws_queue_ctx[res['call_cmd_id']];
ctx = ctx || {returnType:"string"};
var ret;
if (ctx.returnType == "bool"){
ret = res.retVal == "true" ? true : false;
}
else if (ctx.returnType == "number"){
ret = Number(res.retVal);
}
else{
ret = res.retVal;
}
var retObj = {retVal:ret, ctx:ctx};
execFunc(retObj);
if (res['call_cmd_id'] != "onUsbkeyChange") {
delete o.ws_queue_list[res['call_cmd_id']];
}
delete o.ws_queue_ctx[res['call_cmd_id']];
};
return true;
};
o.sendMessage = function(sendMsg) {
if (o.ws_obj.readyState == WebSocket.OPEN) {
o.ws_obj.send(JSON.stringify(sendMsg));
} else {
setTimeout(function(){
if(sendMsg.count)
{
sendMsg.count++;
if(sendMsg.count===4)
{
return;
}
}
else
{
sendMsg.count = 1;
}
o.sendMessage(sendMsg);
},500);
console.log("Can't connect to WebSocket server!");
}
};
o.callMethod = function(strMethodName, cb, ctx, returnType, argsArray) {
o.ws_queue_id++;
if (typeof(cb) == 'function'){
o.ws_queue_list['i_' + o.ws_queue_id] = cb;
ctx = ctx || {};
ctx.returnType = returnType;
o.ws_queue_ctx['i_' + o.ws_queue_id] = ctx;
}
var sendArray = {};
sendArray['cookie'] = document.cookie;
sendArray['xtx_func_name'] = strMethodName;
sendArray['call_cmd_id'] = 'i_' + o.ws_queue_id ;
if (o.xtx_version >= "2.14") {
sendArray['URL'] = window.location.href;
}
if (arguments.length > 4) {
for (var i = 1; i <= argsArray.length; i++) {
var strParam = "param_" + i;
sendArray[strParam] = argsArray[i - 1];
}
sendArray["param"] = argsArray;
}
o.sendMessage(sendArray);
// console.log(o.ws_obj.readyState);
// if (o.ws_obj.readyState == WebSocket.OPEN && o.ws_obj.readyState != WebSocket.CONNECTING) {
// o.load_websocket();
// }
};
o.ChangeAdminPass = function(sDeviceSN,sOldPass,sNewPass,cb,ctx){
var paramArray = [sDeviceSN,sOldPass,sNewPass];
o.callMethod('ChangeAdminPass', cb, ctx, "bool", paramArray);
}
o.GenerateKeyPair = function(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
var paramArray = [sDeviceSN, sContainerName,iKeyType,bSign];
o.callMethod('GenerateKeyPair', cb, ctx, "bool", paramArray);
}
o.ExportPKCS10 = function(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sDN,bSign];
o.callMethod('ExportPKCS10', cb, ctx, "string", paramArray);
}
o.ImportSignCert = function(sDeviceSN,sContainerName,sCert,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sCert];
o.callMethod('ImportSignCert', cb, ctx, "bool", paramArray);
}
o.ImportEncCert = function(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sCert,sPriKeyCipher];
o.callMethod('ImportEncCert', cb, ctx, "bool", paramArray);
}
o.SetUserConfig = function(type,strConfig,cb,ctx){
var paramArray = [type,strConfig];
o.callMethod('SetUserConfig', cb, ctx, "bool", paramArray);
}
o.SetSignMethod = function(sign_algo,cb,ctx){
var paramArray = [sign_algo];
o.callMethod('SOF_SetSignMethod', cb, ctx, "number", paramArray);
}
o.GetUserList = function(cb, ctx) {
o.callMethod('SOF_GetUserList', cb, ctx, "string");
};
o._GetUserListByType = function(strType, cb, ctx) {
o.GetUserList(function(retObj) {
var strUserList = retObj.retVal;
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
o.GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == retObj.ctx.ctx.type) {
if (typeof retObj.ctx.ctx.cb == 'function') {
retObj.ctx.ctx.cb({retVal:retObj.ctx.userList, ctx:retObj.ctx.ctx.ctx})
}
}
}, {userList:strOneUser, ctx:retObj.ctx});
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
}, {type:strType, cb:cb, ctx:ctx});
}
o.GetUserList_USBKey = function(cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportUserCert', cb, ctx, "string", paramArray);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportExChangeUserCert', cb, ctx, "string", paramArray);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var paramArray = [strCertID, strUserPIN];
o.callMethod('SOF_Login', cb, ctx, "bool", paramArray);
};
o.Logout = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_Logout', cb, ctx, "bool", paramArray);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var paramArray = [strCertID, oldPwd, newPwd];
o.callMethod('SOF_ChangePassWd', cb, ctx, "bool", paramArray);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_GetPinRetryCount', cb, ctx, "number", paramArray);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var paramArray = [strCert, Type];
o.callMethod('SOF_GetCertInfo', cb, ctx, "string", paramArray);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var paramArray = [strCert, strOID];
o.callMethod('SOF_GetCertInfoByOid', cb, ctx, "string", paramArray);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_GetCertEntity', cb, ctx, "string", paramArray);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var paramArray = [RandomLen];
o.callMethod('SOF_GenRandom', cb, ctx, "string", paramArray);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_SignData', cb, ctx, "string", paramArray);
};
//base64编码
o.Base64Encode = function(sIndata,cb,ctx) {
var paramArray = [sIndata];
o.callMethod('SOF_Base64Encode', cb, ctx, "string", paramArray);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var paramArray = [strCert, strInData, strSignValue];
o.callMethod('SOF_VerifySignedData', cb, ctx, "bool", paramArray);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_PubKeyEncrypt', cb, ctx, "string", paramArray);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_PriKeyDecrypt', cb, ctx, "string", paramArray);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var paramArray = [bFlag,strCertID, strInData];
o.callMethod('SOF_SignMessage', cb, ctx, "string", paramArray);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var paramArray = [strP7Data, strPlainMsg];
o.callMethod('SOF_VerifySignedMessage', cb, ctx, "bool", paramArray);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_EncryptData', cb, ctx, "string", paramArray);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var paramArray = [strCertID, strP7Envlope];
o.callMethod('SOF_DecryptData', cb, ctx, "string", paramArray);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var paramArray = [strCertID, strFilePath];
o.callMethod('SOF_SignFile', cb, ctx, "string", paramArray);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var paramArray = [strCert, strFilePath, strSignValue];
o.callMethod('SOF_VerifySignedFile', cb, ctx, "bool", paramArray);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymEncryptData', cb, ctx, "string", paramArray);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymDecryptData', cb, ctx, "string", paramArray);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymEncryptFile', cb, ctx, "bool", paramArray);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymDecryptFile', cb, ctx, "bool", paramArray);
};
o.ValidateCert = function(strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_ValidateCert', cb, ctx, "bool", paramArray);
};
o.HashFile = function(strFilePath, cb, ctx) {
var paramArray = [2, strFilePath];
o.callMethod('SOF_HashFile', cb, ctx, "string", paramArray);
};
o.GetDateNotBefore = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function(strCertID, cb, ctx) {
var paramArray = [strCertID, 7];
o.callMethod('GetDeviceInfo', cb, ctx, "string", paramArray);
}
o.SignHashData = function(strCertID, strHashData, ulHashAlg, cb, ctx) {
var paramArray = [strCertID, strHashData, ulHashAlg];
o.callMethod('SOF_SignHashData', cb, ctx, "string", paramArray);
}
o.VerifySignedHashData = function(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var paramArray = [strCert, strHashData, ulHashAlg, strSignValue];
o.callMethod('SOF_VerifySignedHashData', cb, ctx, "bool", paramArray);
}
// getpic begin
o.GetPic = function(strContainerName, cb, ctx) {
var paramArray = [strContainerName];
o.callMethod('GetPic', cb, ctx, "string", paramArray);
};
o.Hash = function(strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('Hash', cb, ctx, "string", paramArray);
};
o.ConvertPicFormat = function(strInData, type, cb, ctx) {
var paramArray = [strInData, type];
o.callMethod('ConvertPicFormat', cb, ctx, "string", paramArray);
};
o.ConvertGif2Jpg = function(strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('ConvertGif2Jpg', cb, ctx, "string", paramArray);
};
o.ConvertPicSize = function(strInData, w, h, cb, ctx) {
var paramArray = [strInData, w, h];
o.callMethod('ConvertPicSize', cb, ctx, "string", paramArray);
};
// getpic end
if (!o.load_websocket()) {
return null;
}
return o;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////// 对外提供的接口
function GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.GenerateKeyPair) {
return $_$CurrentObj.GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ExportPKCS10) {
return $_$CurrentObj.ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportSignCert(sDeviceSN,sContainerName,sCert,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ImportSignCert) {
return $_$CurrentObj.ImportSignCert(sDeviceSN,sContainerName,sCert,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ImportEncCert) {
return $_$CurrentObj.ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetUserConfig(type,strConfig,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.SetUserConfig) {
return $_$CurrentObj.SetUserConfig(type,strConfig, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetSignMethod(sign_algo,cb,ctx)
{
if ($_$CurrentObj && $_$CurrentObj.SetSignMethod) {
return $_$CurrentObj.SetSignMethod(sign_algo, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function $myErrorRtnFunc(retVal, cb, ctx)
{
if (typeof cb == 'function') {
var retObj = {retVal:retVal, ctx:ctx};
cb(retObj);
}
return retVal;
}
//get user list
function GetUserList(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get usbKey user list
function GetUserList_USBKey(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_USBKey(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get soft user list
function GetUserList_Soft(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_Soft(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user signature cert
function GetSignCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserSignCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user exchange cert
function GetExchCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserExchangeCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify user pin
function VerifyUserPIN(strCertID, strUserPIN, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyUserPIN(strCertID, strUserPIN, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//modify user pin
function ChangeUserPassword(strCertID, oldPwd, newPwd, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ChangeUserPIN(strCertID, oldPwd, newPwd, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get user pin retry count
function GetUserPINRetryCount(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserPINRetryCount(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc(0, cb, ctx);
}
}
// get cert basic info
function GetCertBasicinfo(strCert, Type, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfo(strCert, Type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert extend info
function GetExtCertInfoByOID(strCert, strOID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfoByOID(strCert, strOID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert entity id
function GetCertEntity(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertEntity(strCert, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//generate random
function GenerateRandom(RandomLen, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GenRandom(RandomLen, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Logout(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.Logout) {
return $_$CurrentObj.Logout(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign data
function SignedData(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignData(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//Base64编码
function Base64Encode(sIndata,cb,ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.Base64Encode(sIndata,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed data
function VerifySignedData(strCert, strInData, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignedData(strCert, strInData, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//encrypt data by cert
function PubKeyEncrypt(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PubKeyEncrypt(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by private key(not support by gm key)
function PriKeyDecrypt(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PriKeyDecrypt(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign data with pkcs7 format
function SignByP7(strCertID, strInData, bDetach, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignDataByP7(strCertID, strInData, bDetach, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify pkcs7 signed data
function VerifyDatabyP7(strP7Data, strPlainMsg, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyDataByP7(strP7Data, strPlainMsg, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt pkcs7 envlope
function EncodeP7Enveloped(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.EncyptMessage(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt pkcs7 envlope
function DecodeP7Enveloped(strCertID, strP7Envlope, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.DecryptMessage(strCertID, strP7Envlope, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign file
function SignFile(strCertID, strFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignFile(strCertID, strFilePath, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed file
function VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get symmitric key length
//because xtx and secxv2 secx default symmitric alg is no equal
function GetSymKeyLength(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetSymKeyLength(cb, ctx);
} else {
return $myErrorRtnFunc(24, cb, ctx);
}
}
//encrypt data by symmitric key
function EncryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by symmitric key
function DecryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt file by symmitric key
function EncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//decrypt file by symmitric key
function DecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//validate cert
function ValidateCert(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ValidateCert(strCert, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get device type return SOFT or HARD
function GetDeviceType(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.GetDeviceType != undefined) {
return $_$CurrentObj.GetDeviceType(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("HARD", cb, ctx);
}
}
// calculate file's hash
function HashFile(strFilePath, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.HashFile != undefined) {
return $_$CurrentObj.HashFile(strFilePath, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// sign hash data only v2.0 or later support
function SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.SignHashData != undefined) {
return $_$CurrentObj.SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// verify signed hash data only v2.0 or later support
function VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.VerifySignedHashData != undefined) {
return $_$CurrentObj.VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx);
}
return $myErrorRtnFunc(false, cb, ctx);
}
function GetDateNotBefore(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotBefore(strCertValid);
}
return "";
}
function GetDateNotAfter(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotAfter(strCertValid);
}
return "";
}
function $loginSignRandomCallBack(retObj)
{
if (retObj.retVal == "") {
$XTXAlert("客户端签名失败!");
return;
}
var objForm = retObj.ctx.objForm;
var strAction = retObj.ctx.action;
objForm.UserSignedData.value = retObj.retVal;
objForm.action = strAction;
objForm.submit();
}
function $loginVerifyServerSignatureCallBack(retObj)
{
if (!retObj.retVal) {
$XTXAlert("验证服务器端信息失败!");
return;
}
var strCertID = retObj.ctx.certID;
SignedData(strCertID, strServerRan, $loginSignRandomCallBack, retObj.ctx);
}
function $loginCheckCertValidNotAfter(retObj)
{
var notAfterDate = GetDateNotAfter(retObj.retVal);
var milliseconds = notAfterDate.getTime() - new Date().getTime();
if (milliseconds < 0) {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
days = parseInt(milliseconds / (1000*60*60*24));
if (days > 0 && days <= 60) {
$XTXAlert("您的证书还有" + days + "天过期\n请您尽快到广西数字证书认证中心办理证书更新手续!");
} else if (days == 0) { // 证书有效期天数小于1天
var hours = parseInt(milliseconds / (1000*60*60));
if (hours > 0) {
$XTXAlert("您的证书还有" + hours + "小时过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
}
// 证书有效期小于1小时
var minutes = parseInt(milliseconds / (1000*60));
if (minutes > 1) {
$XTXAlert("您的证书还有" + minutes + "分钟过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
} else {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
}
VerifySignedData(strServerCert, strServerRan, strServerSignedData,
$loginVerifyServerSignatureCallBack, retObj.ctx);
}
function $loginCheckCertValidNotBefore(retObj)
{
var notBeforeDate = GetDateNotBefore(retObj.retVal);
var days = parseInt((notBeforeDate.getTime() - new Date().getTime()) / (1000*60*60*24));
if (days > 0) {
$XTXAlert("您的证书尚未生效!距离生效日期还剩" + days + "天!");
return;
}
var strUserCert = retObj.ctx.objForm.UserCert.value;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_AFTER, $loginCheckCertValidNotAfter, retObj.ctx);
}
function $loginGetSignCertCallBack(retObj)
{
var strUserCert = retObj.retVal;
if (strUserCert == "") {
$XTXAlert("导出用户证书失败!");
return;
}
retObj.ctx.objForm.UserCert.value = strUserCert;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_BEFORE, $loginCheckCertValidNotBefore, retObj.ctx);
}
function $loginGetPINRetryCallBack(retObj)
{
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
$XTXAlert("校验证书密码失败!您还有" + retryCount + "次机会重试!");
return;
} else if (retryCount == 0) {
$XTXAlert("您的证书密码已被锁死,请联系管理员进行解锁!");
return;
} else {
$XTXAlert("登录失败!");
return;
}
}
function $loginVerifyPINCallBack(retObj)
{
var strCertID = retObj.ctx.certID;
var objForm = retObj.ctx.objForm;
if (!retObj.retVal) {
GetUserPINRetryCount(strCertID, $loginGetPINRetryCallBack);
return;
}
objForm.ContainerName.value = strCertID;
GetSignCert(strCertID, $loginGetSignCertCallBack, retObj.ctx);
}
// function Logout(certid, cb, ctx) {
// if ($_$CurrentObj != null && $_$CurrentObj.Logout != undefined) {
// return $_$CurrentObj.Logout(certid, cb, ctx);
// }
// }
//Form login
function Login(formName, strCertID, strPin, strAction) {
var objForm = eval(formName);
if (objForm == null) {
$XTXAlert("表单错误!");
return;
}
if (strCertID == null || strCertID == "") {
$XTXAlert("请输入证书密码!");
return;
}
if (strPin == null || strPin == "") {
$XTXAlert("请输入证书密码!");
return;
}
//Add a hidden item ...
var strSignItem = "<input type=\"hidden\" name=\"UserSignedData\" value=\"\">";
if (objForm.UserSignedData == null) {
objForm.insertAdjacentHTML("BeforeEnd", strSignItem);
}
var strCertItem = "<input type=\"hidden\" name=\"UserCert\" value=\"\">";
if (objForm.UserCert == null) {
objForm.insertAdjacentHTML("BeforeEnd", strCertItem);
}
var strContainerItem = "<input type=\"hidden\" name=\"ContainerName\" value=\"\">";
if (objForm.ContainerName == null) {
objForm.insertAdjacentHTML("BeforeEnd", strContainerItem);
}
var ctx = {certID:strCertID, objForm:objForm, action:strAction};
VerifyUserPIN(strCertID, strPin, $loginVerifyPINCallBack, ctx);
return;
}
//说明: GetPic功能
/*
* GetKeyPic控件接口
*/
//GetPic class
function CreateGetPicObject() {
var bOK = $LoadControl("3BC3C868-95B5-47ED-8686-E0E3E94EF366", "OGetPic", "GetPic()", false);
if (!bOK) {
return null;
}
var o = new Object();
o.GetPic = function(strContainerName, cb, ctx) {
var ret = OGetPic.GetPic(strContainerName);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Hash = function(strInData, cb, ctx) {
var ret = OGetPic.Hash(strInData)
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicFormat = function(strInData, type, cb, ctx) {
var ret = OGetPic.ConvertPicFormat(strInData, type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertGif2Jpg = function(strInData, cb, ctx) {
var ret = OGetPic.ConvertGif2Jpg(strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicSize = function(strInData, w, h, cb, ctx) {
var ret = OGetPic.ConvertPicSize(strInData, w, h);
return $myOKRtnFunc(ret, cb, ctx);
};
return o;
}
function GetPic(strContainerName, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.GetPic != undefined) {
return $_$WebSocketObj.GetPic(strContainerName, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.GetPic != undefined) {
return $_$GetPicObj.GetPic(strContainerName, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Hash(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.Hash != undefined) {
return $_$WebSocketObj.Hash(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.Hash != undefined) {
return $_$GetPicObj.Hash(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicFormat(strInData, type, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicFormat != undefined) {
return $_$WebSocketObj.ConvertPicFormat(strInData, type, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicFormat != undefined) {
return $_$GetPicObj.ConvertPicFormat(strInData, type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertGif2Jpg(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertGif2Jpg != undefined) {
return $_$WebSocketObj.ConvertGif2Jpg(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertGif2Jpg != undefined) {
return $_$GetPicObj.ConvertGif2Jpg(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicSize(strInData, w, h, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicSize != undefined) {
return $_$WebSocketObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicSize != undefined) {
return $_$GetPicObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ChangeAdminPass) {
return $_$CurrentObj.ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
(function() {
//GetPic实例obj
$_$GetPicObj = CreateGetPicObject();
$_$XTXAppObj = CreateXTXAppObject();
if ($_$XTXAppObj != null) {
$_$CurrentObj = $_$XTXAppObj;
return;
}
$_$SecXV2Obj = CreateSecXV2Object();
if ($_$SecXV2Obj != null) {
$_$CurrentObj = $_$SecXV2Obj;
return;
}
$_$SecXObj = CreateSecXObject();
if ($_$SecXObj != null) {
$_$CurrentObj = $_$SecXObj;
return;
}
$_$WebSocketObj = CreateWebSocketObject();
if ($_$WebSocketObj != null) {
$_$CurrentObj = $_$WebSocketObj;
return;
}
$_$CurrentObj = null;
$XTXAlert("检查证书应用环境出错!");
return;
})();
\ No newline at end of file
var DSVSCaller = new function() {
var DSVSCaller = new function() {
// call dsvs
this.CallDSVS = function(plain, userCert, signedData, showResID) {
var xmlHttp = this.CreateXMLHtpp();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
var resID = document.getElementById(showResID);
if (xmlHttp.responseText == "true") {
resID.style.color = 'black';
resID.value = "服务端验证签名成功!";
} else if (xmlHttp.responseText == "false") {
resID.style.color = 'red';
resID.value = "服务端验证签名失败!";
}
}
}
var postParam = "";
postParam = this.addURLParam(postParam, "plain", plain);
postParam = this.addURLParam(postParam, "userCert", userCert);
postParam = this.addURLParam(postParam, "signedData", signedData);
postParam = encodeURI(postParam);
//alert(postParam);
xmlHttp.open("POST", "../DSVSCode.jsp", true);
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send(postParam);
}
//用于创建XMLHttpRequest对象
this.CreateXMLHtpp = function() {
var xmlHttp = null;
//根据window.XMLHttpRequest对象是否存在使用不同的创建方式
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest(); //FireFox、Opera等浏览器支持的创建方式
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
}
return xmlHttp;
}
this.addURLParam = function(url, name, value) {
//url += url.indexOf("?") == -1 ? "?" : "&";
if (url != "") {
url += "&";
}
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}
}
\ No newline at end of file
<%@page contentType="text/plain; charset=UTF-8"%>
<%@page contentType="text/plain; charset=UTF-8"%>
<%@include file="properties.jsp"%>
<%@ page language="java"%>
<%
out.clear();
request.setCharacterEncoding("UTF-8");
String plain = request.getParameter("plain"); //获取到签名原文
String userCert = request.getParameter("userCert"); //获取到ukey用户证书
String signedData = request.getParameter("signedData"); //获取到签名值
if (plain != null && plain != "") {
plain = java.net.URLDecoder.decode(plain);
}
if (userCert != null && userCert != "") {
userCert = java.net.URLDecoder.decode(userCert, "UTF-8");
}
if (signedData != null && signedData != "") {
signedData = java.net.URLDecoder.decode(signedData, "UTF-8");
}
String strRes = "";
try {
//验证签名
boolean bRet = sed.verifySignedData(userCert, plain.getBytes(), sed.base64Decode(signedData));
if (bRet) {
strRes = "true";
} else {
strRes = "false";
}
System.out.println("verifySignedData->Result:" + strRes);
out.print(strRes);
//验证签名成功之后,把 plain,userCert和signedData存到数据库中
} catch (Exception e) {
System.out.println("Exception..." + e.getMessage());
out.print("");
}
%>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<!-- Add packages here -->
</struts>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN"
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<class-loading java2ClassLoadingCompliance='true'>
<loader-repository>
com.example:archive=unique-archive-name
<loader-repository-config>
java2ParentDelegaton=true
</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
\ No newline at end of file
<?xml version="1.0" ?>
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA
Systems, Inc.//DTD Web Application 8.1//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
/* globals var */
/* globals var */
var $_$softCertListID = ""; // Soft CertListID, Set by SetUserCertList
var $_$hardCertListID = ""; // USBKeyCertListID, Set by SetUserCertList
var $_$allCertListID = ""; // All CertListID, Set by SetUserCertList
var $_$loginCertID = ""; // logined CertID, Set by SetAutoLogoutParameter
var $_$logoutFunc = null; // logout Function, Set by SetAutoLogoutParameter
var $_$onUsbKeyChangeCallBackFunc = null; //custom onUsbkeyChange callback function
var $_$XTXAlert = null; // alert custom function
var $_$XTXAppObj = null; // XTXAppCOM class Object
var $_$SecXV2Obj = null; // SecCOMV2 class Object
var $_$SecXObj = null; // SecCOM class Object
var $_$WebSocketObj = null; // WebSocket class Object
var $_$CurrentObj = null; // Current use class Object
var $_$GetPicObj = null; // GetKeyPic class Object
// const var
var CERT_TYPE_HARD = 1;
var CERT_TYPE_SOFT = 2;
var CERT_TYPE_ALL = 3;
// const var
var CERT_OID_VERSION = 1;
var CERT_OID_SERIAL = 2;
var CERT_OID_SIGN_METHOD = 3;
var CERT_OID_ISSUER_C = 4;
var CERT_OID_ISSUER_O = 5;
var CERT_OID_ISSUER_OU = 6;
var CERT_OID_ISSUER_ST = 7;
var CERT_OID_ISSUER_CN = 8;
var CERT_OID_ISSUER_L = 9;
var CERT_OID_ISSUER_E = 10;
var CERT_OID_NOT_BEFORE = 11;
var CERT_OID_NOT_AFTER = 12;
var CERT_OID_SUBJECT_C = 13;
var CERT_OID_SUBJECT_O = 14;
var CERT_OID_SUBJECT_OU = 15;
var CERT_OID_SUBJECT_ST = 16;
var CERT_OID_SUBJECT_CN = 17;
var CERT_OID_SUBJECT_L = 18;
var CERT_OID_SUBJECT_E = 19;
var CERT_OID_PUBKEY = 20;
var CERT_OID_SUBJECT_DN = 33;
var CERT_OID_ISSUER_DN = 34;
var CERT_OID_DN = 35;
// set auto logout parameters
function SetAutoLogoutParameter(strCertID, logoutFunc)
{
$_$loginCertID = strCertID;
$_$logoutFunc = logoutFunc;
return;
}
function SetLoginCertID(strCertID)
{
$_$loginCertID = strCertID;
return;
}
function SetLogoutFunction(logoutFunc)
{
$_$logoutFunc = logoutFunc;
}
// set user cert list id
function SetUserCertList(strListID, certType)
{
if (arguments.length == 1) {
$_$hardCertListID = strListID;
} else {
if (certType == CERT_TYPE_HARD) {
$_$hardCertListID = strListID;
}
if (certType == CERT_TYPE_SOFT) {
$_$softCertListID = strListID;
}
if (certType == CERT_TYPE_ALL) {
$_$allCertListID = strListID;
}
}
GetUserList($pushAllDropListBox);
return;
}
// set custom usbkeychange callback
function SetOnUsbKeyChangeCallBack(callback)
{
$_$onUsbKeyChangeCallBackFunc = callback;
}
// set custom alert function
function SetAlertFunction(custom_alert)
{
$_$XTXAlert = custom_alert;
}
function $checkBrowserISIE()
{
return (!!window.ActiveXObject || 'ActiveXObject' in window) ? true : false;
}
function $popDropListBoxAll(strListID)
{
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i, n = objListID.length;
for(i = 0; i < n; i++) {
objListID.remove(0);
}
objListID = null;
}
function $pushOneDropListBox(userListArray, strListID)
{
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i;
for (i = 0; i < userListArray.length; i++) {
var certObj = userListArray[i];
var objItem = new Option(certObj.certName, certObj.certID);
objListID.options.add(objItem);
}
objListID = null;
return;
}
function $pushAllDropListBox(certUserListObj)
{
if ($_$hardCertListID != "") {
$popDropListBoxAll($_$hardCertListID);
}
if ($_$softCertListID != "") {
$popDropListBoxAll($_$softCertListID);
}
if ($_$allCertListID != "") {
$popDropListBoxAll($_$allCertListID);
}
var strUserList = certUserListObj.retVal;
var allListArray = []
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
allListArray.push({certName:strName, certID:strCertID});
if ($_$hardCertListID != "") {
GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == "HARD") {
$pushOneDropListBox([retObj.ctx], $_$hardCertListID);
}
}, {certName:strName, certID:strCertID});
}
if ($_$softCertListID != "") {
GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == "SOFT") {
$pushOneDropListBox([retObj.ctx], $_$softCertListID);
}
}, {certName:strName, certID:strCertID});
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3,len);
}
if ($_$allCertListID != "") {
$pushOneDropListBox(allListArray, $_$allCertListID);
}
}
function $myAutoLogoutCallBack(retObj)
{
if (retObj.retVal.indexOf($_$loginCertID) <= 0) {
$_$logoutFunc();
}
}
//usbkey change default callback function
function $OnUsbKeyChange()
{
GetUserList($pushAllDropListBox);
if (typeof $_$onUsbKeyChangeCallBackFunc == 'function') {
$_$onUsbKeyChangeCallBackFunc();
}
if ($_$loginCertID != "" && typeof $_$logoutFunc == 'function') {
GetUserList($myAutoLogoutCallBack);
}
}
// IE11 attach event
function $AttachIE11OnUSBKeychangeEvent(strObjName)
{
var handler = document.createElement("script");
handler.setAttribute("for", strObjName);
handler.setAttribute("event", "OnUsbKeyChange");
handler.appendChild(document.createTextNode("$OnUsbKeyChange()"));
document.body.appendChild(handler);
}
//load a control
function $LoadControl(CLSID, ctlName, testFuncName, addEvent)
{
var pluginDiv = document.getElementById("pluginDiv" + ctlName);
if (pluginDiv) {
return true;
}
pluginDiv = document.createElement("div");
pluginDiv.id = "pluginDiv" + ctlName;
document.body.appendChild(pluginDiv);
try {
if ($checkBrowserISIE()) { // IE
pluginDiv.innerHTML = '<object id="' + ctlName + '" classid="CLSID:' + CLSID + '" style="HEIGHT:0px; WIDTH:0px"></object>';
if (addEvent) {
var clt = eval(ctlName);
if (clt.attachEvent) {
clt.attachEvent("OnUsbKeyChange", $OnUsbKeyChange);
} else {// IE11 not support attachEvent, and addEventListener do not work well, so addEvent ourself
$AttachIE11OnUSBKeychangeEvent(ctlName);
}
}
} else {
var chromeVersion = window.navigator.userAgent.match(/Chrome\/(\d+)\./);
if (chromeVersion && chromeVersion[1]) {
if (parseInt(chromeVersion[1], 10) >= 42) { // not support npapi return false
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
if (addEvent) {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} event_OnUsbkeyChange=$OnUsbKeyChange width=0 height=0 />' ;
} else {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} width=0 height=0 />' ;
}
}
if (testFuncName != null && testFuncName != "" && eval(ctlName + "." + testFuncName) == undefined) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
return true;
} catch (e) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
function $XTXAlert(strMsg) {
if (typeof $_$XTXAlert == 'function') {
$_$XTXAlert(strMsg);
} else {
alert(strMsg);
}
}
function $myOKRtnFunc(retVal, cb, ctx)
{
if (typeof cb == 'function') {
var retObj = {retVal:retVal, ctx:ctx};
cb(retObj);
}
return retVal;
}
//XTXAppCOM class
function CreateXTXAppObject() {
var bOK = $LoadControl("3F367B74-92D9-4C5E-AB93-234F8A91D5E6", "XTXAPP", "SOF_GetVersion()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.ChangeAdminPass = function(sDeviceSN,sOldPass,sNewPass,cb,ctx){
var ret = XTXAPP.ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GenerateKeyPair = function(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
var ret = XTXAPP.GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ExportPKCS10 = function(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
var ret = XTXAPP.ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,sDN);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportSignCert = function(sDeviceSN,sContainerName,sCert,cb,ctx){
var ret = XTXAPP.ImportSignCert(sDeviceSN,sContainerName,sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportEncCert = function(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
var ret = XTXAPP.ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetUserConfig = function(type,strConfig,cb,ctx){
var ret = XTXAPP.SetUserConfig(type,strConfig);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetSignMethod = function(sign_algo,cb,ctx){
var ret = XTXAPP.SOF_SetSignMethod(sign_algo);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList = function(cb, ctx) {
var ret = XTXAPP.SOF_GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o._GetUserListByType = function(strType, cb, ctx) {
var strUserList = XTXAPP.SOF_GetUserList();
var ret = "";
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
if (XTXAPP.GetDeviceInfo(strCertID, 7) == strType) {
ret += (strOneUser + "&&&");
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList_USBKey = function(cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strUserCert = XTXAPP.SOF_ExportUserCert(strCertID);
var strUserExchCert = XTXAPP.SOF_ExportExChangeUserCert(strCertID);
/*if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}*/
ret = strUserCert;
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_ExportExChangeUserCert(strCertID)
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret = XTXAPP.SOF_Login(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret = XTXAPP.SOF_ChangePassWd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_GetPinRetryCount(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var ret = XTXAPP.SOF_GetCertEntity(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = XTXAPP.SOF_GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Logout = function(strCertID, cb, ctx) {
var ret = XTXAPP.SOF_Logout(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var ret = XTXAPP.SOF_SignMessage(bFlag, strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedMessage(strP7Data, strPlainMsg);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_EncryptDataEx(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = XTXAPP.SOF_DecryptData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var r = XTXAPP.SOF_ValidateCert(strCert);
var ret;
if (ret == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function(strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_HashFile(2, strFilePath); //sha1 alg
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function(strCertID, cb, ctx) {
var ret = XTXAPP.GetDeviceInfo(strCertID, 7);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SignHashData = function(strCertID, strHashData, ulHashAlg, cb, ctx) {
var ret = XTXAPP.SOF_SignHashData(strCertID, strHashData, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
o.VerifySignedHashData = function(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedHashData(strCert, strHashData, strSignValue, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
return o;
}
//SecXV2 class
function CreateSecXV2Object() {
var bOK = $LoadControl("FCAA4851-9E71-4BFE-8E55-212B5373F040", "SecXV2", "GetUserList()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.GetUserList = function(cb, ctx) {
var ret = SecXV2.GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strUserCert = SecXV2.ExportUserCert(strCertID);
var strUserExchCert = SecXV2.ExportExChangeUserCert(strCertID);
if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var ret = SecXV2.ExportExChangeUserCert(strCertID);
if (typeof cb == 'function') {
var retObj = {retVal:ret, ctx:ctx};
cb(retObj);
}
return ret;
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret = SecXV2.UserLogin(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret = SecXV2.ChangePasswd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var strExtLib = SecXV2.GetUserInfo(strCertID, 15);
var ret = SecXV2.GetBjcaKeyParam(strExtLib, 8);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var ret = SecXV2.GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, "2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = SecXV2.GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = SecXV2.SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = SecXV2.PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = SecXV2.PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var ret = SecXV2.SignDataByP7(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret = SecXV2.VerifySignedDatabyP7(strP7Data);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = SecXV2.EncodeP7EnvelopedData(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = SecXV2.DecodeP7EnvelopedData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = SecXV2.SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = SecXV2.EncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = SecXV2.DecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.EncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.DecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var ret = SecXV2.ValidateCert(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//SecXV2 class
function CreateSecXObject() {
$LoadControl("02BE3F91-A9E1-4D12-A65B-1E0D500292A7", "oCert", "", false);
$LoadControl("4F763EC7-657A-43A8-96D0-BD3AD6D5E17E", "oCrypto", "", false);
$LoadControl("D57CD2CA-8FA1-440F-8614-B0A28F64F0BE", "oDevice", "", false);
var bOK = $LoadControl("BB7D3BAD-A402-4E98-B813-1C3C22481AE7", "oUtil", "getUserList()", false);
if (!bOK) {
return null;
}
bOK = $LoadControl("0CF5259B-A812-4B6E-9746-ACF7279FEF74", "USBKEY", "EnumUsbKey()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.CERT_SRC_BASE64 = 1; //证书来自Base64字符串
o.CERT_SRC_UNIQUEID = 2; //证书来自唯一表示
o.CERT_SRC_FILE = 3; //证书来自der文件
o.CERT_SRC_CONTAINER_UCA = 4; //证书来自UCA类型证书容器
o.CERT_SRC_CONTAINER_SIGN = 5; //证书来自容器下签名证书
o.CERT_SRC_CONTAINER_ENC = 6; //证书来自容器下加密证书
o.CERT_SRC_CONTAINER_BOTH = 7; //证书来自容器下签名加密证书
o.CERT_SRC_PKCS12 = 8; //证书来自PKCS12文件
o.CERT_DST_BASE64 = 1; //导出证书为Base64字符串
o.CERT_DST_DERFILE = 2; //导出证书为der文件
o.CERT_DST_P12 = 3; //到出证书为PKCS12文件
o.CERT_XML_SUBJECT = 1; //从XML配置文件取用户名
o.CERT_XML_UNIQUEID = 2; //从XML配置文件取用户唯一表识
o.CERT_XML_DEPT = 3; //从XML配置文件取用户所有者部门
o.CERT_XML_ISSUE = 4; //从XML配置文件取用户证书颁发者
o.CERT_XML_STATE = 5; //从XML配置文件取用户证书使用状态
o.CERT_XML_TRADETYPE = 6; //从XML配置文件取用户证书应用类型
o.CERT_XML_PASSWORD = 7; //从XML配置文件取用户证书私钥保护口令
o.CERT_XML_DEVICETYPE = 8; //从XML配置文件取用户证书介质类型
o.CERT_XML_CATYPE = 9; //从XML配置文件取用户证书CA类型
o.CERT_XML_KEYTYPE = 10; //从XML配置文件取用户证书密钥类型
o.CERT_XML_SIGNSN = 11; //从XML配置文件取用户签名证书序列号
o.CERT_XML_EXCHSN = 12; //从XML配置文件取用户加密证书序列号
o.CERT_XML_DEVICENAME = 13; //从XML配置文件取用户证书介质名称
o.CERT_XML_DEVICEPROVIDER = 14; //从XML配置文件取用户证书介质提供者
o.CERT_XML_DEVICEAFFIX = 15; //从XML配置文件取用户证书介质附加库
o.CERT_XML_SIGNPATH = 16; //从XML配置文件取用户签名证书路径
o.CERT_XML_EXCHPATH = 17; //从XML配置文件取用户加密证书路径
o.CERT_XML_SIGNPFXPATH = 18; //从XML配置文件取用户签名P12证书路径
o.CERT_XML_EXCHPFXPATH = 19; //从XML配置文件取用户加密P12证书路径
o.CERT_XML_CHAINPATH = 20; //从XML配置文件取用户证书链路径
o.CERT_XML_CRLPATH = 21; //从XML配置文件取用户证书作废列表路径
o.CERT_XML_UNIQUEIDOID = 22; //从XML配置文件取用户证书UniqueID的OID
o.CERT_XML_VERIFYTYPE = 23; //从XML配置文件取用户证书验证类型
o.CERT_XML_CACOUNTS = 24; //从XML配置文件取用户证书根证书个数
o.CERT_XML_CANUMTYPE = 25; //从XML配置文件取用户证书跟证书类型
o.CRYPT_CFGTYPE_UNSET = 0; //用户应用类型未定义
o.CRYPT_CFGTYPE_CSP = 1; //用户应用类型CSP
o.CRYPT_CFGTYPE_P11 = 2; //用户应用类型P11
o.CRYPT_CFGTYPE_P12 = 3; //用户应用类型软算法
o.ENVELOP_ENC = 1; //加密P7数字信封
o.ENVELOP_DEC = 0; //解密P7数字信封
o.GetUserList = function(cb, ctx) {
var ret = USBKEY.getUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var KeyType = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_KEYTYPE);
if (KeyType == 1) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else if (KeyType == 2) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_SIGN, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else {
ret = "";
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
var ret = oCert.exportCert(o.CERT_DST_BASE64);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.userLogin(strCSPName, strUserPIN);
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, strUserPIN);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.changeUserPin(strCSPName, strExtLib, oldPwd, newPwd)
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, newPwd);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var ret = oDevice.getKeyRetrys(strExtLib);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var SecXType;
switch (Type) {
case CERT_OID_ISSUER_CN:
SecXType = 4;
break;
case CERT_OID_NOT_BEFORE:
SecXType = 5;
break;
case CERT_OID_NOT_AFTER:
SecXType = 6;
break;
case CERT_OID_SUBJECT_C:
SecXType = 42;
break;
case CERT_OID_SUBJECT_O:
SecXType = 45;
break;
case CERT_OID_SUBJECT_OU:
SecXType = 46;
break;
case CERT_OID_SUBJECT_ST:
SecXType = 44;
break;
case CERT_OID_SUBJECT_CN:
SecXType = 41;
break;
case CERT_OID_SUBJECT_L:
SecXType = 43;
break;
case CERT_OID_PUBKEY:
SecXType = 43;
break;
default:
SecXType = Type;
break;
}
var ret = oCert.getBasicCertInfoByOID(SecXType);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID(strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function(strCert, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID("2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var ret = oCrypto.generateRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var ret = oCrypto.signedData(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignedData(strSignValue, strCert, strInData);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var ret = oCrypto.EncDataByCert(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var ret = oCrypto.DecDataByRSA(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var ret = oCrypto.signedDataByP7(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var ret;
var r = oCrypto.verifySignedDataByP7(strP7Data);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var ret = oCrypto.envelopedData(strInData, o.ENVELOP_ENC, strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var ret = oCrypto.envelopedData(strP7Envlope, o.ENVELOP_DEC, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var ret = oCrypto.signFile(strFilePath, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignFile(strFilePath, strCert, strSignValue);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var ret = oCrypto.encryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var ret = oCrypto.decryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.encryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.decryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function(strCert, cb, ctx) {
var ret;
var r = oCert.validateCert("", "");
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function(strFilePath, cb, ctx) {
var ret = oCrypto.HashFile(strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//webSocket client class
function CreateWebSocketObject() {
var o = new Object();
o.ws_host = "ws://127.0.0.1:";
o.ws_port_array = ["21051/xtxapp","4044","5044", "6044", "7044", "8044"];
o.ws_port_use = 0;
o.ws_obj = null;
o.ws_heartbeat_id = 0;
o.ws_queue_id = 0; // call_cmd_id
o.ws_queue_list = {}; // call_cmd_id callback queue
o.ws_queue_ctx = {};
o.xtx_version = "";
o.load_websocket = function() {
if (o.ws_port_use >= o.ws_port_array.length) {
o.ws_port_use = 0;
// return false;
}
var ws_url = o.ws_host + o.ws_port_array[o.ws_port_use] + "/";
try {
o.ws_obj = new WebSocket(ws_url);
} catch (e) {
console.log(e);
return false;
}
o.ws_queue_list["onUsbkeyChange"] = $OnUsbKeyChange;
o.ws_obj.onopen = function(evt) {
clearInterval(o.ws_heartbeat_id);
o.callMethod("SOF_GetVersion", function(str){o.xtx_version = str.retVal;});
o.ws_heartbeat_id = setInterval(function () {
o.callMethod("SOF_GetVersion", function(str){});
}, 10 * 1000);
GetUserList($pushAllDropListBox);
};
o.ws_obj.onerror = function(evt) {
o.ws_port_use++;
o.load_websocket();
};
o.ws_obj.onclose = function(evt) {
};
o.ws_obj.onmessage = function(evt) {
var res = JSON.parse(evt.data);
if(res['set-cookie']){
document.cookie = res['set-cookie'];
}
//登录失败
if(res['loginError'])
{
alert(res['loginError']);
}
var call_cmd_id = res['call_cmd_id'];
if(!call_cmd_id)
{
return;
}
var execFunc = o.ws_queue_list[call_cmd_id];
if(typeof(execFunc) != 'function')
{
return;
}
var ctx = o.ws_queue_ctx[res['call_cmd_id']];
ctx = ctx || {returnType:"string"};
var ret;
if (ctx.returnType == "bool"){
ret = res.retVal == "true" ? true : false;
}
else if (ctx.returnType == "number"){
ret = Number(res.retVal);
}
else{
ret = res.retVal;
}
var retObj = {retVal:ret, ctx:ctx};
execFunc(retObj);
if (res['call_cmd_id'] != "onUsbkeyChange") {
delete o.ws_queue_list[res['call_cmd_id']];
}
delete o.ws_queue_ctx[res['call_cmd_id']];
};
return true;
};
o.sendMessage = function(sendMsg) {
if (o.ws_obj.readyState == WebSocket.OPEN) {
o.ws_obj.send(JSON.stringify(sendMsg));
} else {
setTimeout(function(){
if(sendMsg.count)
{
sendMsg.count++;
if(sendMsg.count===4)
{
return;
}
}
else
{
sendMsg.count = 1;
}
o.sendMessage(sendMsg);
},500);
console.log("Can't connect to WebSocket server!");
}
};
o.callMethod = function(strMethodName, cb, ctx, returnType, argsArray) {
o.ws_queue_id++;
if (typeof(cb) == 'function'){
o.ws_queue_list['i_' + o.ws_queue_id] = cb;
ctx = ctx || {};
ctx.returnType = returnType;
o.ws_queue_ctx['i_' + o.ws_queue_id] = ctx;
}
var sendArray = {};
sendArray['cookie'] = document.cookie;
sendArray['xtx_func_name'] = strMethodName;
sendArray['call_cmd_id'] = 'i_' + o.ws_queue_id ;
if (o.xtx_version >= "2.14") {
sendArray['URL'] = window.location.href;
}
if (arguments.length > 4) {
for (var i = 1; i <= argsArray.length; i++) {
var strParam = "param_" + i;
sendArray[strParam] = argsArray[i - 1];
}
sendArray["param"] = argsArray;
}
o.sendMessage(sendArray);
// console.log(o.ws_obj.readyState);
// if (o.ws_obj.readyState == WebSocket.OPEN && o.ws_obj.readyState != WebSocket.CONNECTING) {
// o.load_websocket();
// }
};
o.ChangeAdminPass = function(sDeviceSN,sOldPass,sNewPass,cb,ctx){
var paramArray = [sDeviceSN,sOldPass,sNewPass];
o.callMethod('ChangeAdminPass', cb, ctx, "bool", paramArray);
}
o.GenerateKeyPair = function(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
var paramArray = [sDeviceSN, sContainerName,iKeyType,bSign];
o.callMethod('GenerateKeyPair', cb, ctx, "bool", paramArray);
}
o.ExportPKCS10 = function(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sDN,bSign];
o.callMethod('ExportPKCS10', cb, ctx, "string", paramArray);
}
o.ImportSignCert = function(sDeviceSN,sContainerName,sCert,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sCert];
o.callMethod('ImportSignCert', cb, ctx, "bool", paramArray);
}
o.ImportEncCert = function(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
var paramArray = [sDeviceSN,sContainerName,sCert,sPriKeyCipher];
o.callMethod('ImportEncCert', cb, ctx, "bool", paramArray);
}
o.SetUserConfig = function(type,strConfig,cb,ctx){
var paramArray = [type,strConfig];
o.callMethod('SetUserConfig', cb, ctx, "bool", paramArray);
}
o.SetSignMethod = function(sign_algo,cb,ctx){
var paramArray = [sign_algo];
o.callMethod('SOF_SetSignMethod', cb, ctx, "number", paramArray);
}
o.GetUserList = function(cb, ctx) {
o.callMethod('SOF_GetUserList', cb, ctx, "string");
};
o._GetUserListByType = function(strType, cb, ctx) {
o.GetUserList(function(retObj) {
var strUserList = retObj.retVal;
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0 ) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
o.GetDeviceType(strCertID, function(retObj) {
if (retObj.retVal == retObj.ctx.ctx.type) {
if (typeof retObj.ctx.ctx.cb == 'function') {
retObj.ctx.ctx.cb({retVal:retObj.ctx.userList, ctx:retObj.ctx.ctx.ctx})
}
}
}, {userList:strOneUser, ctx:retObj.ctx});
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
}, {type:strType, cb:cb, ctx:ctx});
}
o.GetUserList_USBKey = function(cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function(cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportUserCert', cb, ctx, "string", paramArray);
};
o.ExportUserExchangeCert = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportExChangeUserCert', cb, ctx, "string", paramArray);
};
o.VerifyUserPIN = function(strCertID, strUserPIN, cb, ctx) {
var paramArray = [strCertID, strUserPIN];
o.callMethod('SOF_Login', cb, ctx, "bool", paramArray);
};
o.Logout = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_Logout', cb, ctx, "bool", paramArray);
};
o.ChangeUserPIN = function(strCertID, oldPwd, newPwd, cb, ctx) {
var paramArray = [strCertID, oldPwd, newPwd];
o.callMethod('SOF_ChangePassWd', cb, ctx, "bool", paramArray);
};
o.GetUserPINRetryCount = function(strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_GetPinRetryCount', cb, ctx, "number", paramArray);
};
o.GetCertInfo = function(strCert, Type, cb, ctx) {
var paramArray = [strCert, Type];
o.callMethod('SOF_GetCertInfo', cb, ctx, "string", paramArray);
};
o.GetCertInfoByOID = function(strCert, strOID, cb, ctx) {
var paramArray = [strCert, strOID];
o.callMethod('SOF_GetCertInfoByOid', cb, ctx, "string", paramArray);
};
o.GetCertEntity = function(strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_GetCertEntity', cb, ctx, "string", paramArray);
};
o.GenRandom = function(RandomLen, cb, ctx) {
var paramArray = [RandomLen];
o.callMethod('SOF_GenRandom', cb, ctx, "string", paramArray);
};
o.SignData = function(strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_SignData', cb, ctx, "string", paramArray);
};
o.VerifySignedData = function(strCert, strInData, strSignValue, cb, ctx) {
var paramArray = [strCert, strInData, strSignValue];
o.callMethod('SOF_VerifySignedData', cb, ctx, "bool", paramArray);
};
o.PubKeyEncrypt = function(strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_PubKeyEncrypt', cb, ctx, "string", paramArray);
};
o.PriKeyDecrypt = function(strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_PriKeyDecrypt', cb, ctx, "string", paramArray);
};
o.SignDataByP7 = function(strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var paramArray = [bFlag,strCertID, strInData];
o.callMethod('SOF_SignMessage', cb, ctx, "string", paramArray);
};
o.VerifyDataByP7 = function(strP7Data, strPlainMsg, cb, ctx) {
var paramArray = [strP7Data, strPlainMsg];
o.callMethod('SOF_VerifySignedMessage', cb, ctx, "bool", paramArray);
};
o.EncyptMessage = function(strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_EncryptData', cb, ctx, "string", paramArray);
};
o.DecryptMessage = function(strCertID, strP7Envlope, cb, ctx) {
var paramArray = [strCertID, strP7Envlope];
o.callMethod('SOF_DecryptData', cb, ctx, "string", paramArray);
};
o.SignFile = function(strCertID, strFilePath, cb, ctx) {
var paramArray = [strCertID, strFilePath];
o.callMethod('SOF_SignFile', cb, ctx, "string", paramArray);
};
o.VerifySignFile = function(strCert, strFilePath, strSignValue, cb, ctx) {
var paramArray = [strCert, strFilePath, strSignValue];
o.callMethod('SOF_VerifySignedFile', cb, ctx, "bool", paramArray);
};
o.GetSymKeyLength = function(cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function(strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymEncryptData', cb, ctx, "string", paramArray);
};
o.SymDecryptData = function(strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymDecryptData', cb, ctx, "string", paramArray);
};
o.SymEncryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymEncryptFile', cb, ctx, "bool", paramArray);
};
o.SymDecryptFile = function(strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymDecryptFile', cb, ctx, "bool", paramArray);
};
o.ValidateCert = function(strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_ValidateCert', cb, ctx, "bool", paramArray);
};
o.HashFile = function(strFilePath, cb, ctx) {
var paramArray = [2, strFilePath];
o.callMethod('SOF_HashFile', cb, ctx, "string", paramArray);
};
o.GetDateNotBefore = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function(strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function(strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function(strCertID, cb, ctx) {
var paramArray = [strCertID, 7];
o.callMethod('GetDeviceInfo', cb, ctx, "string", paramArray);
}
o.SignHashData = function(strCertID, strHashData, ulHashAlg, cb, ctx) {
var paramArray = [strCertID, strHashData, ulHashAlg];
o.callMethod('SOF_SignHashData', cb, ctx, "string", paramArray);
}
o.VerifySignedHashData = function(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var paramArray = [strCert, strHashData, ulHashAlg, strSignValue];
o.callMethod('SOF_VerifySignedHashData', cb, ctx, "bool", paramArray);
}
// getpic begin
o.GetPic = function(strContainerName, cb, ctx) {
var paramArray = [strContainerName];
o.callMethod('GetPic', cb, ctx, "string", paramArray);
};
o.Hash = function(strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('Hash', cb, ctx, "string", paramArray);
};
o.ConvertPicFormat = function(strInData, type, cb, ctx) {
var paramArray = [strInData, type];
o.callMethod('ConvertPicFormat', cb, ctx, "string", paramArray);
};
o.ConvertGif2Jpg = function(strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('ConvertGif2Jpg', cb, ctx, "string", paramArray);
};
o.ConvertPicSize = function(strInData, w, h, cb, ctx) {
var paramArray = [strInData, w, h];
o.callMethod('ConvertPicSize', cb, ctx, "string", paramArray);
};
// getpic end
if (!o.load_websocket()) {
return null;
}
return o;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////// 对外提供的接口
function GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.GenerateKeyPair) {
return $_$CurrentObj.GenerateKeyPair(sDeviceSN, sContainerName,iKeyType,bSign, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ExportPKCS10) {
return $_$CurrentObj.ExportPKCS10(sDeviceSN,sContainerName,sDN,bSign,cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportSignCert(sDeviceSN,sContainerName,sCert,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ImportSignCert) {
return $_$CurrentObj.ImportSignCert(sDeviceSN,sContainerName,sCert,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ImportEncCert) {
return $_$CurrentObj.ImportEncCert(sDeviceSN,sContainerName,sCert,sPriKeyCipher,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetUserConfig(type,strConfig,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.SetUserConfig) {
return $_$CurrentObj.SetUserConfig(type,strConfig, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetSignMethod(sign_algo,cb,ctx)
{
if ($_$CurrentObj && $_$CurrentObj.SetSignMethod) {
return $_$CurrentObj.SetSignMethod(sign_algo, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function $myErrorRtnFunc(retVal, cb, ctx)
{
if (typeof cb == 'function') {
var retObj = {retVal:retVal, ctx:ctx};
cb(retObj);
}
return retVal;
}
//get user list
function GetUserList(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get usbKey user list
function GetUserList_USBKey(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_USBKey(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get soft user list
function GetUserList_Soft(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_Soft(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user signature cert
function GetSignCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserSignCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user exchange cert
function GetExchCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserExchangeCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify user pin
function VerifyUserPIN(strCertID, strUserPIN, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyUserPIN(strCertID, strUserPIN, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//modify user pin
function ChangeUserPassword(strCertID, oldPwd, newPwd, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ChangeUserPIN(strCertID, oldPwd, newPwd, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get user pin retry count
function GetUserPINRetryCount(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserPINRetryCount(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc(0, cb, ctx);
}
}
// get cert basic info
function GetCertBasicinfo(strCert, Type, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfo(strCert, Type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert extend info
function GetExtCertInfoByOID(strCert, strOID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfoByOID(strCert, strOID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert entity id
function GetCertEntity(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertEntity(strCert, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//generate random
function GenerateRandom(RandomLen, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GenRandom(RandomLen, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Logout(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.Logout) {
return $_$CurrentObj.Logout(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
};
//sign data
function SignedData(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignData(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed data
function VerifySignedData(strCert, strInData, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignedData(strCert, strInData, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//encrypt data by cert
function PubKeyEncrypt(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PubKeyEncrypt(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by private key(not support by gm key)
function PriKeyDecrypt(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PriKeyDecrypt(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign data with pkcs7 format
function SignByP7(strCertID, strInData, bDetach, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignDataByP7(strCertID, strInData, bDetach, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify pkcs7 signed data
function VerifyDatabyP7(strP7Data, strPlainMsg, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyDataByP7(strP7Data, strPlainMsg, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt pkcs7 envlope
function EncodeP7Enveloped(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.EncyptMessage(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt pkcs7 envlope
function DecodeP7Enveloped(strCertID, strP7Envlope, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.DecryptMessage(strCertID, strP7Envlope, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign file
function SignFile(strCertID, strFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignFile(strCertID, strFilePath, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed file
function VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get symmitric key length
//because xtx and secxv2 secx default symmitric alg is no equal
function GetSymKeyLength(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetSymKeyLength(cb, ctx);
} else {
return $myErrorRtnFunc(24, cb, ctx);
}
}
//encrypt data by symmitric key
function EncryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by symmitric key
function DecryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt file by symmitric key
function EncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//decrypt file by symmitric key
function DecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//validate cert
function ValidateCert(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ValidateCert(strCert, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get device type return SOFT or HARD
function GetDeviceType(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.GetDeviceType != undefined) {
return $_$CurrentObj.GetDeviceType(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("HARD", cb, ctx);
}
}
// calculate file's hash
function HashFile(strFilePath, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.HashFile != undefined) {
return $_$CurrentObj.HashFile(strFilePath, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// sign hash data only v2.0 or later support
function SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.SignHashData != undefined) {
return $_$CurrentObj.SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// verify signed hash data only v2.0 or later support
function VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.VerifySignedHashData != undefined) {
return $_$CurrentObj.VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx);
}
return $myErrorRtnFunc(false, cb, ctx);
}
function GetDateNotBefore(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotBefore(strCertValid);
}
return "";
}
function GetDateNotAfter(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotAfter(strCertValid);
}
return "";
}
function $loginSignRandomCallBack(retObj)
{
if (retObj.retVal == "") {
$XTXAlert("客户端签名失败!");
return;
}
var objForm = retObj.ctx.objForm;
var strAction = retObj.ctx.action;
objForm.UserSignedData.value = retObj.retVal;
objForm.action = strAction;
objForm.submit();
}
function $loginVerifyServerSignatureCallBack(retObj)
{
if (!retObj.retVal) {
$XTXAlert("验证服务器端信息失败!");
return;
}
var strCertID = retObj.ctx.certID;
SignedData(strCertID, strServerRan, $loginSignRandomCallBack, retObj.ctx);
}
function $loginCheckCertValidNotAfter(retObj)
{
var notAfterDate = GetDateNotAfter(retObj.retVal);
var milliseconds = notAfterDate.getTime() - new Date().getTime();
if (milliseconds < 0) {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
days = parseInt(milliseconds / (1000*60*60*24));
if (days > 0 && days <= 60) {
$XTXAlert("您的证书还有" + days + "天过期\n请您尽快到广西数字证书认证中心办理证书更新手续!");
} else if (days == 0) { // 证书有效期天数小于1天
var hours = parseInt(milliseconds / (1000*60*60));
if (hours > 0) {
$XTXAlert("您的证书还有" + hours + "小时过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
}
// 证书有效期小于1小时
var minutes = parseInt(milliseconds / (1000*60));
if (minutes > 1) {
$XTXAlert("您的证书还有" + minutes + "分钟过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
} else {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
}
VerifySignedData(strServerCert, strServerRan, strServerSignedData,
$loginVerifyServerSignatureCallBack, retObj.ctx);
}
function $loginCheckCertValidNotBefore(retObj)
{
var notBeforeDate = GetDateNotBefore(retObj.retVal);
var days = parseInt((notBeforeDate.getTime() - new Date().getTime()) / (1000*60*60*24));
if (days > 0) {
$XTXAlert("您的证书尚未生效!距离生效日期还剩" + days + "天!");
return;
}
var strUserCert = retObj.ctx.objForm.UserCert.value;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_AFTER, $loginCheckCertValidNotAfter, retObj.ctx);
}
function $loginGetSignCertCallBack(retObj)
{
var strUserCert = retObj.retVal;
if (strUserCert == "") {
$XTXAlert("导出用户证书失败!");
return;
}
retObj.ctx.objForm.UserCert.value = strUserCert;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_BEFORE, $loginCheckCertValidNotBefore, retObj.ctx);
}
function $loginGetPINRetryCallBack(retObj)
{
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
$XTXAlert("校验证书密码失败!您还有" + retryCount + "次机会重试!");
return;
} else if (retryCount == 0) {
$XTXAlert("您的证书密码已被锁死,请联系管理员进行解锁!");
return;
} else {
$XTXAlert("登录失败!");
return;
}
}
function $loginVerifyPINCallBack(retObj)
{
var strCertID = retObj.ctx.certID;
var objForm = retObj.ctx.objForm;
if (!retObj.retVal) {
GetUserPINRetryCount(strCertID, $loginGetPINRetryCallBack);
return;
}
objForm.ContainerName.value = strCertID;
GetSignCert(strCertID, $loginGetSignCertCallBack, retObj.ctx);
}
function Logout(certid, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.Logout != undefined) {
return $_$CurrentObj.Logout(certid, cb, ctx);
}
}
//Form login
function Login(formName, strCertID, strPin, strAction) {
var objForm = eval(formName);
if (objForm == null) {
$XTXAlert("表单错误!");
return;
}
if (strCertID == null || strCertID == "") {
$XTXAlert("请输入证书密码!");
return;
}
if (strPin == null || strPin == "") {
$XTXAlert("请输入证书密码!");
return;
}
//Add a hidden item ...
var strSignItem = "<input type=\"hidden\" name=\"UserSignedData\" value=\"\">";
if (objForm.UserSignedData == null) {
objForm.insertAdjacentHTML("BeforeEnd", strSignItem);
}
var strCertItem = "<input type=\"hidden\" name=\"UserCert\" value=\"\">";
if (objForm.UserCert == null) {
objForm.insertAdjacentHTML("BeforeEnd", strCertItem);
}
var strContainerItem = "<input type=\"hidden\" name=\"ContainerName\" value=\"\">";
if (objForm.ContainerName == null) {
objForm.insertAdjacentHTML("BeforeEnd", strContainerItem);
}
var ctx = {certID:strCertID, objForm:objForm, action:strAction};
VerifyUserPIN(strCertID, strPin, $loginVerifyPINCallBack, ctx);
return;
}
//说明: GetPic功能
/*
* GetKeyPic控件接口
*/
//GetPic class
function CreateGetPicObject() {
var bOK = $LoadControl("3BC3C868-95B5-47ED-8686-E0E3E94EF366", "OGetPic", "GetPic()", false);
if (!bOK) {
return null;
}
var o = new Object();
o.GetPic = function(strContainerName, cb, ctx) {
var ret = OGetPic.GetPic(strContainerName);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Hash = function(strInData, cb, ctx) {
var ret = OGetPic.Hash(strInData)
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicFormat = function(strInData, type, cb, ctx) {
var ret = OGetPic.ConvertPicFormat(strInData, type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertGif2Jpg = function(strInData, cb, ctx) {
var ret = OGetPic.ConvertGif2Jpg(strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicSize = function(strInData, w, h, cb, ctx) {
var ret = OGetPic.ConvertPicSize(strInData, w, h);
return $myOKRtnFunc(ret, cb, ctx);
};
return o;
}
function GetPic(strContainerName, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.GetPic != undefined) {
return $_$WebSocketObj.GetPic(strContainerName, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.GetPic != undefined) {
return $_$GetPicObj.GetPic(strContainerName, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Hash(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.Hash != undefined) {
return $_$WebSocketObj.Hash(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.Hash != undefined) {
return $_$GetPicObj.Hash(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicFormat(strInData, type, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicFormat != undefined) {
return $_$WebSocketObj.ConvertPicFormat(strInData, type, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicFormat != undefined) {
return $_$GetPicObj.ConvertPicFormat(strInData, type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertGif2Jpg(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertGif2Jpg != undefined) {
return $_$WebSocketObj.ConvertGif2Jpg(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertGif2Jpg != undefined) {
return $_$GetPicObj.ConvertGif2Jpg(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicSize(strInData, w, h, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicSize != undefined) {
return $_$WebSocketObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicSize != undefined) {
return $_$GetPicObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,cb,ctx){
if ($_$CurrentObj && $_$CurrentObj.ChangeAdminPass) {
return $_$CurrentObj.ChangeAdminPass(sDeviceSN,sOldPass,sNewPass,cb,ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
(function() {
//GetPic实例obj
$_$GetPicObj = CreateGetPicObject();
$_$XTXAppObj = CreateXTXAppObject();
if ($_$XTXAppObj != null) {
$_$CurrentObj = $_$XTXAppObj;
return;
}
$_$SecXV2Obj = CreateSecXV2Object();
if ($_$SecXV2Obj != null) {
$_$CurrentObj = $_$SecXV2Obj;
return;
}
$_$SecXObj = CreateSecXObject();
if ($_$SecXObj != null) {
$_$CurrentObj = $_$SecXObj;
return;
}
$_$WebSocketObj = CreateWebSocketObject();
if ($_$WebSocketObj != null) {
$_$CurrentObj = $_$WebSocketObj;
return;
}
$_$CurrentObj = null;
$XTXAlert("检查证书应用环境出错!");
return;
})();
\ No newline at end of file
<table width="958" border="0" align="center" cellpadding="0"
<table width="958" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td height="10" bgcolor="#FEFDFB">
&nbsp;
</td>
</tr>
<tr>
<td height="2" bgcolor="#E19FA3"></td>
</tr>
<tr>
<td width="958" height="30" align="center" class="font2">
</td>
</tr>
</table>
\ No newline at end of file
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@include file="../properties.jsp"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0"cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">
&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
数据加密功能演示
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr height="2">
<td></td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td align="left" valign="top">
<form method="post" ID="TestForm">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<td style="font-size:14px;" width="35%">
需要加密的数据:
</td>
<td style="font-size:14px;">
<textarea name=plainData id=plainData cols="40" rows="6" >写入需要加密的数据!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" value="加密" class="button" style="width:50px;" onClick="pubicKeyEncData();">
</td>
<td style="font-size:14px;">
<textarea name=cipherData id=cipherData cols="40" rows="6">加密后的结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="解密" style="width:50px;" class="button"
width="55" height="28" onClick="prikeyDecryptData();return false;">
</td>
<td style="font-size:14px;">
<textarea name=decryptData id=decryptData cols="40" rows="6">解密后结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="比较" style="width:50px;" class="button"
width="55" height="28" onClick="CompareData();return false;">
</td>
<td style="font-size:14px;">
<textarea name=result id=result cols="40" rows="2">比较结果显示!</textarea>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js" charset="UTF-8"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
</SCRIPT>
<Script Language="JavaScript">
var strCertID = "<%=strCertID%>";
function pubKeyEncryptCallBack(retObj) {
if (retObj.retVal == "") {
TestForm.cipherData.value = "";
alert("加密数据失败!");
return false;
}
TestForm.cipherData.value = retObj.retVal;
}
function pubicKeyEncData()
{
if (TestForm.plainData.value == "") {
alert("请输入待加密的数据!");
TestForm.plainData.focus();
return ;
}
GetExchCert(strCertID, function(retObj) {
var strEncCert = retObj.retVal;
if (strEncCert == "") {
alert("导出加密证书失败!\n");
return;
}
PubKeyEncrypt(strEncCert, TestForm.plainData.value, pubKeyEncryptCallBack);
});
}
function prikeyDecryptCallBack(retObj) {
var strPlainData = retObj.retVal;
if (strPlainData == "") {
alert("解密数据失败!\n");
TestForm.decryptData.style.color = 'red';
TestForm.decryptData.value = "解密数据失败\n";
} else {
TestForm.decryptData.style.color = 'black';
TestForm.decryptData.value = strPlainData;
}
}
function prikeyDecryptData()
{
PriKeyDecrypt(strCertID, TestForm.cipherData.value, prikeyDecryptCallBack);
}
function CompareData()
{
var o = TestForm.plainData.value;
var t = TestForm.decryptData.value;
if (o == t) {
TestForm.result.style.color = 'black';
TestForm.result.value = "解密后的数据和原文一致!";
} else {
TestForm.result.style.color = 'red';
TestForm.result.value = "解密后的数据和原文不一致!";
}
}
</Script>
</body>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">
&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
数据P7数字信封功能演示
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr height="2">
<td></td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td align="left" valign="top">
<form method="post" ID="TestForm" action="sign.jsp">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<td style="font-size:14px;" width="35%">
需要加密的数据:
</td>
<td style="font-size:14px;">
<textarea name=plainData id=plainData cols="40" rows="6" >写入需要加密的数据!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" value="加密" class="button" style="width:50px;" onClick="EncryptMessage();">
</td>
<td style="font-size:14px;">
<textarea name=envlopeData id=envlopeData cols="40" rows="6">数字信封结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="解密" style="width:50px;" class="button"
width="55" height="28" onClick="DecryptMessage();return false;">
</td>
<td style="font-size:14px;">
<textarea name=decryptData id=decryptData cols="40" rows="6">解密后结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="比较" style="width:50px;" class="button"
width="55" height="28" onClick="CompareData();return false;">
</td>
<td style="font-size:14px;">
<textarea name=compareRes id=compareRes cols="40" rows="2">比较结果显示!</textarea>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
</SCRIPT>
<Script Language="JavaScript">
var strCertID = "<%=strCertID%>";
function EncryptMessage()
{
if (TestForm.plainData.value == "") {
alert("请输入待加密的数据!");
TestForm.plainData.focus();
return ;
}
GetExchCert(strCertID, function(retEncCertObj) {
var strEncCert = retEncCertObj.retVal;
if (strEncCert == "") {
alert("导出加密证书失败!\n");
return false;
}
EncodeP7Enveloped(strEncCert, TestForm.plainData.value, function(retCipherObj) {
if (retCipherObj.retVal == ""){
TestForm.envlopeData.value = "";
alert("数字信封加密失败!");
return false;
}
TestForm.envlopeData.value = retCipherObj.retVal;
});
});
}
function DecryptMessage()
{
DecodeP7Enveloped(strCertID, TestForm.envlopeData.value, function(retObj) {
if (retObj.retVal == "") {
alert("数字信封解密失败!\n");
TestForm.decryptData.style.color = 'red';
TestForm.decryptData.value = "数字信封解密失败!\n";
} else {
TestForm.decryptData.style.color = 'black';
TestForm.decryptData.value = retObj.retVal;
}
});
}
function CompareData()
{
var o = TestForm.plainData.value;
var t = TestForm.decryptData.value;
if (o == t) {
TestForm.compareRes.style.color = 'black';
TestForm.compareRes.value = "解密后的数据和原文一致!";
} else {
TestForm.compareRes.style.color = 'red';
TestForm.compareRes.value = "解密后的数据和原文不一致!";
}
}
</Script>
</body>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">
&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
数据对称加密功能演示
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr height="2">
<td></td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td align="left" valign="top">
<form method="post" ID="TestForm" action="sign.jsp">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<td style="font-size:14px;" width="35%">
需要加密的数据:
</td>
<td style="font-size:14px;">
<textarea name=plainData id=plainData cols="40" rows="6" >写入需要加密的数据!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" value="加密" class="button" style="width:50px;" onClick="EncryptMessage();">
</td>
<td style="font-size:14px;">
<textarea name=cipherData id=cipherData cols="40" rows="6">对称加密结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="解密" style="width:50px;" class="button"
width="55" height="28" onClick="DecryptMessage();return false;">
</td>
<td style="font-size:14px;">
<textarea name=decryptData id=decryptData cols="40" rows="6">解密后结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="比较" style="width:50px;" class="button"
width="55" height="28" onClick="CompareData();return false;">
</td>
<td style="font-size:14px;">
<textarea name=compareRes id=compareRes cols="40" rows="2">比较结果显示!</textarea>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
</SCRIPT>
<Script Language="JavaScript">
var strCertID = "<%=strCertID%>";
var strKeyLen = 0;
var strKey = "";
function EncryptMessage()
{
if (TestForm.plainData.value == "") {
alert("请输入待加密的数据!");
TestForm.plainData.focus();
return ;
}
if (strKeyLen == 0) {
strKeyLen = 24;
}
//通过生成随机数接口生成对称密钥
GenerateRandom(strKeyLen, function(retObj) {
strKey = retObj.retVal;
if(strKey == "") {
alert("生成对称密钥失败!")
return;
}
//对称加密数据
EncryptData(strKey, TestForm.plainData.value, function(retCipherObj) {
if (retCipherObj.retVal == ""){
TestForm.cipherData.value = "";
alert("对称加密数据失败!");
return false;
}
TestForm.cipherData.value = retCipherObj.retVal;
});
});
}
function DecryptMessage()
{
DecryptData(strKey, TestForm.cipherData.value, function(retObj) {
if(retObj.retVal == "") {
TestForm.decryptData.style.color = 'red';
TestForm.decryptData.value = "对称解密数据失败";
} else {
TestForm.decryptData.style.color = 'black';
TestForm.decryptData.value = retObj.retVal;
}
});
}
function CompareData()
{
var o = TestForm.plainData.value;
var t = TestForm.decryptData.value;
if (o == t) {
TestForm.compareRes.style.color = 'black';
TestForm.compareRes.value = "解密后的数据和原文一致!";
} else {
TestForm.compareRes.style.color = 'red';
TestForm.compareRes.value = "解密后的数据和原文不一致!";
}
}
</Script>
</body>
</html>
<%
<%
String fpath = request.getContextPath();
%>
<table width="98%" border="0" align="center" cellpadding="0" cellspacing="0" class="boder" style="line-height:30px;">
<tr>
<td width="10">&nbsp;</td>
<td class="font3">其他功能</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=fpath%>/other/signData.jsp">数字签名</A>
</td>
</tr>
<tr>
<!--
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=fpath%>/other/getKeyPic.jsp">获取印章图片</A>
</td>
</tr>
<!--
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=fpath%>/encdec/encData.jsp">非对称加解密</A>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=fpath%>/encdec/p7Envlope.jsp">数字信封加解密</A>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=fpath%>/encdec/symEncData.jsp">数据对称加解密</A>
</td>
</tr>
-->
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=fpath%>/images/wb.gif" width="13" height="14" /> 
<a href="javascript:;" onclick="MyLogout('<%=strCertID%>','<%=fpath%>/logout.jsp')">退出</a>
</td>
</tr>
</table>
<script language=javascript>
function MyLogout(strCertID,fpath) {
//alert(strCertID+fpath);
Logout(strCertID);
window.location.href = fpath;
}
</script>
\ No newline at end of file
BODY { FONT-SIZE: 12px}
BODY { FONT-SIZE: 12px}
TD { FONT-SIZE: 12px}
A.map:link { COLOR: #FF6600; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.map:visited { COLOR: #FF6600; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.map:hover { COLOR: #FFCC00; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.g:link { COLOR: #666600; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.g:visited { COLOR: #666600; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.g:hover { COLOR: #FF9900; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A:link { COLOR: #0600ee; FONT-SIZE: 12px; TEXT-DECORATION: none}
A:visited { COLOR: #0600ee; FONT-SIZE: 12px; TEXT-DECORATION: none}
A:hover { COLOR: #CC0000; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.title:link { COLOR: #ffffff; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.title:visited { COLOR: #ffffff; FONT-SIZE: 12px; TEXT-DECORATION: none}
A.title:hover { COLOR: #ffffff; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line:link { COLOR: #3300FF; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line:visited { COLOR: #3300FF; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line:hover { COLOR: #0066FF; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line1:link { COLOR: #666666; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line1:visited { COLOR: #666666; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.line1:hover { COLOR: #CC0000; FONT-SIZE: 12px; TEXT-DECORATION: underline}
A.big:link { COLOR: #cc0000; FONT-SIZE: 12px; font-weight: 900; TEXT-DECORATION: underline }
A.big:visited { COLOR: #cc0000; FONT-SIZE: 12px; font-weight: 900; TEXT-DECORATION: underline}
A.big:hover { COLOR: #cc0000; FONT-SIZE: 12px; font-weight: 900; TEXT-DECORATION: underline}
.f1 {BORDER-BOTTOM: 1px inset; BORDER-LEFT: 1px inset; BORDER-RIGHT: 1px inset; BORDER-TOP: 1px inset; height: 14pt; font-size: 12px}
.f2 {BACKGROUND-COLOR: #cccccc; BORDER-BOTTOM: 1px ridge; BORDER-LEFT: #ffffff 1px ridge; BORDER-RIGHT: 1px ridge; BORDER-TOP: #ffffff 1px ridge; height: 14pt; font-size: 12px}
.L { COLOR: #ffffff; FONT-SIZE: 13px; font-weight: bold}
.L14 { LINE-HEIGHT: 140%}
.L15 { LINE-HEIGHT: 150%}
.L16 { LINE-HEIGHT: 160%}
.L17 { LINE-HEIGHT: 170%}
.L18 { LINE-HEIGHT: 180%}
.td2 { color: #CC0000; line-height: 150%}
.zs {border-top: 1px solid #000000; border-right: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000;}
.l13 { line-height: 120%}
\ No newline at end of file
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@include file="properties.jsp"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
%>
<%
String strServerCert = sed.getServerCertificate();
String strRandom = sed.genRandom(24);
String strSignedData = sed.signData(strRandom.getBytes());
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="957" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td height="60">
<img src="images/logo.gif" width="245" height="38" />
</td>
</tr>
</table>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width="64"><img src="images/z1.gif" width="64" height="221" /></td>
<td width="304"><img src="images/z2.gif" width="304" height="221" /></td>
<td width="338"><img src="images/z3.gif" width="338" height="221" /></td>
<td><img src="images/z4.gif" width="251" height="221" /></td>
</tr>
<tr>
<td valign="top"><img src="images/m1.gif" width="64" height="151" /></td>
<td valign="top"><img src="images/m2.gif" width="304" height="151" /></td>
<td valign="top" height="151">
<form method="post" ID="LoginForm" name="LoginForm" action="login.jsp">
<table id="bs" width="90%" border="0" align="center"
cellpadding="0" cellspacing="0">
<tr>
<td height="15" colspan="2"></td>
</tr>
<tr>
<td width="90" class="font1">
选择证书
</td>
<td>
<select id="UserList" name="UserList"></select>
</td>
</tr>
<tr>
<td >
&nbsp;
</td>
<td>
&nbsp;
</td>
</tr>
<tr>
<td class="font1">
证书密码
</td>
<td>
<input type="password" name="pwd1" id="UserPwd" size="16" maxlength="16">
</td>
</tr>
<tr>
<td >
&nbsp;
</td>
<td>
&nbsp;
</td>
</tr>
<tr>
<td width="65">
<input type="button"
style="border: none; background: url(images/submit.gif) left top no-repeat; width: 58px; height: 30px;"
value="" name="B1" onclick="login();">
</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="logout.jsp"><img src="images/repe.gif"
width="88" height="30" border="0" /> </a>
</td>
</tr>
</table>
<input type="hidden" ID="UserSignedData" name="UserSignedData">
<input type="hidden" ID="UserCert" name="UserCert">
<input type="hidden" ID="ContainerName" name="ContainerName">
<input type="hidden" ID="strRandom" name="strRandom">
</form>
</td>
<td valign="top"><img src="images/m4.gif" width="251" height="151" /></td>
</tr>
<tr>
<td><img src="images/b1.gif" width="64" height="20" /></td>
<td><img src="images/b2.gif" width="304" height="20" /></td>
<td><img src="images/b3.gif" width="338" height="20" /></td>
<td><img src="images/b4.gif" width="251" height="20" /></td>
</tr>
<tr>
<td colspan="4" height="110"></td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="bottom.jsp"%>
</body>
<SCRIPT type="text/javascript" src="XTXSAB.js"></SCRIPT>
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
//注意我们的接口都是异步的,所以需要在回调方法内调用其他的方法,不能随意更改调用顺序和流程
function login()
{
var strCertID = LoginForm.UserList.value;
var strPin = LoginForm.UserPwd.value;
if(strCertID == ""){
alert("请插入ukey!");
return false;
}
if(strPin == ""){
alert("请输入PIN码!");
return false;
}
//打开登陆页面时,后台返回的签名服务器相关信息
var strServerSignedData = "<%=strSignedData%>";
var strServerRan = "<%=strRandom%>";
var strServerCert = "<%=strServerCert%>";
if(strServerSignedData == "" || strServerRan == "" || strServerCert == ""){
alert("签名服务器返回信息为空!请刷新页面重试!");
return false;
}
//执行校验
verifyPIN(strCertID, strPin,strServerCert,strServerRan,strServerSignedData);
}
//第1步.校验证书Pin码,入口函数,此方法的调用流程请不要动
// strCertID 是证书操作标识,strPin是ukey Pin码,strServerCert是服务器返回的服务器证书
// strServerRan是服务器返回的随机数,strServerSignedData是服务器返回的随机数签名值
function verifyPIN(strCertID, strPin,strServerCert,strServerRan,strServerSignedData) {
VerifyUserPIN(strCertID, strPin, function(retObj) {
//校验结果
var res = retObj.retVal;
if(!res){ //校验失败
//1.1获取PIN剩余次数
GetUserPINRetryCount(strCertID, function (retObj){
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
alert("校验证书密码失败!您还有" + retryCount + "次机会重试!");
return false;
} else if (retryCount == 0) {
alert("您的证书密码已被锁死,请联系管理员进行解锁!");
return false;
} else {
alert("登录失败!");
return false;
}
});
}else { //校验成功
//第2步.调用获取用户证书接口
getCert(strCertID,strServerCert,strServerRan,strServerSignedData);
}
});
}
//第2步.获取用户证书,此方法的调用流程请不要动
function getCert(strCertID,strServerCert,strServerRan,strServerSignedData){
GetSignCert(strCertID, function(retObj){
//获取用户证书
var UserCert = retObj.retVal;
if (UserCert == "") {
alert("获取签名证书失败!");
return false;
}else{
//第3步,校验Ukey证书有效期
checkCertValid(strCertID,strServerCert,strServerRan,strServerSignedData,UserCert);
}
});
}
//第3步,校验Ukey证书有效期,此方法的调用流程请不要动
function checkCertValid(strCertID,strServerCert,strServerRan,strServerSignedData,UserCert){
//获取证书有效期
GetCertBasicinfo(UserCert, CERT_OID_NOT_AFTER,function(retObj){
var certDate = retObj.retVal;
if(certDate == ""){
alert("获取Ukey证书有效期失败!");
return false;
}else {
var notAfterDate = GetDateNotAfter(certDate);
var milliseconds = notAfterDate.getTime() - new Date().getTime();
if (milliseconds < 0) {
alert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return false;
}
days = parseInt(milliseconds / (1000*60*60*24));
if (days > 0 && days <= 60) {
alert("您的证书还有" + days + "天过期\n请您尽快到广西数字证书认证中心办理证书更新手续!");
} else if (days == 0) { // 证书有效期天数小于1
var hours = parseInt(milliseconds / (1000*60*60));
if (hours > 0) {
alert("您的证书还有" + hours + "小时过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
}
// 证书有效期小于1小时
var minutes = parseInt(milliseconds / (1000*60));
if (minutes > 1) {
alert("您的证书还有" + minutes + "分钟过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
} else {
alert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return false;
}
}
//第4步,验证服务端签名
verifyServerSign(strCertID,strServerCert,strServerRan,strServerSignedData,UserCert);
}
});
}
//第4步,验证服务端签名,此方法的调用流程请不要动
function verifyServerSign(strCertID,strServerCert,strServerRan,strServerSignedData,UserCert){
VerifySignedData(strServerCert,strServerRan,strServerSignedData,function(retObj){
if (!retObj.retVal) {
alert("验证服务端签名失败!");
return false;
}else{
//第5步,客户端对服务器随机数签名
ukeySignedData(strCertID,strServerRan,UserCert);
}
});
}
//第5步,客户端对服务器随机数签名,此方法的调用流程请不要动
function ukeySignedData(strCertID,strServerRan,UserCert) {
SignedData(strCertID, strServerRan, function(retObj){
var UserSignedData = retObj.retVal;
if (UserSignedData == "") {
alert("客户端签名失败!");
return false;
}else{
//第6步,这里执行自己的操作,如登陆
myAction(strCertID,UserCert,strServerRan,UserSignedData);
}
});
}
//第6步,自己操作,修改这个方法就行,上面的1-5方法请不要修改
function myAction(strCertID,UserCert,strServerRan,UserSignedData){
//6.在此处写你的代码,把UserCert,strServerRan,UserSignedData等传到后台验证
//给表单隐藏元素赋值
LoginForm.UserCert.value = UserCert;
LoginForm.strRandom.value = strServerRan;
LoginForm.UserSignedData.value = UserSignedData;
LoginForm.ContainerName.value = strCertID;
//控件的方法都是异步的,所以在这里写自己的代码,比如提交表单
LoginForm.submit();
}
</SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
//这里实现插拔key自动识别显示在页面
SetUserCertList("LoginForm.UserList");
</SCRIPT>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@include file="properties.jsp"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
String strRandom = (String)request.getParameter("strRandom");
String strPath = request.getContextPath();
//获得登陆用户cert
String strClientCert = request.getParameter("UserCert");
String strClientSignedData = request.getParameter("UserSignedData");
String strCertID = request.getParameter("ContainerName");
String strCertIssuer = sed.getCertInfo(strClientCert, 8);
System.out.println("strClientCert:" + strClientCert);
System.out.println("strClientSignedData:" + strClientSignedData);
System.out.println("strCertID:" + strCertID);
System.out.println("strCertIssuer:" + strCertIssuer);
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">
<table width="70%" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td height="30" colspan="3">
&nbsp;
</td>
</tr>
<tr>
<td width="50" align="right">
<img src="images/cc.gif" width="43" height="62" />
</td>
<td width="20">
&nbsp;
</td>
<td>
<%
System.out.println("strClientCert=" + strClientCert);
System.out.println("strRandom=" + strRandom);
System.out.println("strClientSignedData=" + strClientSignedData);
byte[] signedByte = sed.base64Decode(strClientSignedData);
try {
//证书登陆,第一步,验证客户端签名(涉及方法)
if (sed.verifySignedData(strClientCert, strRandom.getBytes(), signedByte)) {
out.println("<h3>验证客户端签名成功!</h3>");
} else {
out.println("<h3>验证客户端签名错误!</h3>");
return;
}
} catch (Exception e) {
out.println("<p><h3>验证客户端签名错误:" + e.getMessage() + "</h3><p>");
return;
}
try {
//第二步,验证客户端证书
int retValue = sed.validateCert(strClientCert);
if (retValue == 1) {
session.setAttribute("CertID", strCertID); //把certi设置到全局变量,后面签名会用到
String strCertName = "";
try {
strCertName = sed.getCertInfo(strClientCert, 17);
} catch (Exception e) {
out.println("<p><h3>客户端证书验证失败(getCertInfo:17):" + e.getMessage()
+ "</h3><p>");
}
session.setAttribute("CertName", strCertName);
//第三步,获取唯一标识判断用户
String strCertEntityID = "";
try {
//获得登陆用户唯一实体ID,个人证书为身份证号SF+身份证号,单位证书为 JJ+统一社会信用代码,截取掉前面2个字母剩下就是身份证号或统一社会信用代码
strCertEntityID = sed.getCertInfoByOid(strClientCert, "2.16.840.1.113732.2");
strCertEntityID = strCertEntityID.substring(2);
//用这个strCertEntityID绑定用户,以便判断用户是否有权限登陆系统
} catch (Exception e) {
out.println("<p><h3>客户端证书验证失败(getCertInfoByOid):" + e.getMessage()
+ "</h3><p>");
}
out.println("<h3>欢迎您使用本系统!</h3>");
out.println("<h3>主题通用名:");
out.println(strCertName);
out.println("<br/>证书颁发者(颁发者通用名): ");
out.println(strCertIssuer);
out.println("<br/>证书唯一标识:");
out.println(strCertEntityID);
out.println("<br/><font color='red'>(实际集成时,会将唯一标识与数据库比对,判断是否为合法用户)</font>");
out.println("</h3><br/>");
} else {
if (retValue == -1) {
out.println("登录证书的根不被信任");
} else if (retValue == -2) {
out.println("登录证书超过有效期");
} else if (retValue == -3) {
out.println("登录证书为作废证书");
} else if (retValue == -4) {
out.println("登录证书被临时冻结");
}
out.println("</font></h3>");
return;
}
} catch (Exception ex) {
out.println("<p><h3>客户端证书验证失败(-):" + ex.getMessage() + "</h3><p>");
return;
}
%>
</td>
</tr>
<tr>
<td height="30" colspan="3"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#FEFDFB">
<table width="70%" border="0" align="center" cellpadding="1" cellspacing="1" class="table1">
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=strPath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=strPath%>/other/signData.jsp">数字签名</A>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td align="left">
<img src="<%=strPath%>/images/wb.gif" width="13" height="14" /> 
<A href="<%=strPath%>/logout.jsp">退出系统</A>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="4" height="50"></td>
</tr>
</table>
<%@include file="bottom.jsp"%>
<SCRIPT type="text/javascript" src="XTXSAB.js" charset="UTF-8"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
//这里实现拔掉key自动退出到登陆页面
SetAutoLogoutParameter("<%=strCertID%>", Logout);
//key插拔回调函数
function Logout() {
alert("你拔掉了ukey!");
window.location.href = "logout.jsp"
}
</SCRIPT>
</body>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
session.invalidate();
response.sendRedirect("index.jsp");
%>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">
&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
获取Key签章图片
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td>
<p align="center">
<font color="#cc3333" size="3"><b>JS脚本自动处理显示证书列表</b> </font>
</p>
<p>
<form method="post" ID="TestForm1">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<th colspan="2">
<font color="#FF0000" style="font-size:14px;">获取图片后请按照对应格式保存在本地验证是否正确(注意Base64解码)
</th>
</tr>
<tr>
<td style="font-size:14px;" width="35%">
证书列表:
</td>
<td style="font-size:14px;">
<select id="UserList" name="UserList"></select>
</td>
</tr>
<tr>
<td style="font-size:14px;">
<input type="button" value="获取签章图片" class="button" style="width:100px;" onClick="myGetPic();">
</td>
<td style="font-size:14px;">
<textarea name=pic_key id=pic_key cols="40" rows="6">签章图片结果显示!</textarea>
</td>
</tr>
<tr>
<td style="font-size:14px;">
<input type="button" value="印章图片" class="button" style="width:100px;"/>
</td>
<td style="font-size:14px;">
<img id="picImg"/>
</td>
</tr>
</table>
</form>
</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js"></SCRIPT>
<Script Language="JavaScript">
SetUserCertList("TestForm1.UserList");
function myGetPic()
{
var strCertID = TestForm1.UserList.value;
GetPic(strCertID, function(retObj) {
if (retObj.retVal == "") {
TestForm1.pic_key.value = "";
alert("获取签章图片失败!\n");
return false;
}
TestForm1.pic_key.value = retObj.retVal;
var picImg = document.getElementById("picImg");
picImg.src = "data:image/gif;base64," + retObj.retVal;
});
}
</Script>
</body>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
本地数据签名功能演示
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr height="2">
<td></td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td align="left" valign="top">
<form method="post" ID="TestForm">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<td style="font-size:14px;" width="35%">
需要签名的数据:
</td>
<td style="font-size:14px;">
<textarea name=plainData id=plainData cols="40" rows="6" >写入需要签名的数据!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" value="签名" class="button" style="width:50px;" onClick="Sign();">
</td>
<td style="font-size:14px;">
<textarea name=signatureData id=signatureData cols="40" rows="6">签名结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="验签" style="width:50px;" class="button"
width="55" height="28" onClick="VerifySign();return false;">
<div align="center">
<font color="#FF0000" style="font-size:14px;">如果修改了明文或签名数据,<br>则验证失败!</font>
</div>
</td>
<td style="font-size:14px;">
<textarea name=verifySign id=verifySign cols="40" rows="6">验证签名结果显示!</textarea>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js" charset="UTF-8"></SCRIPT>
<SCRIPT type="text/javascript" src="../DSVSCaller.js" charset="UTF-8"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
//这里实现拔掉key后自动退出系统
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
</SCRIPT>
<Script Language="JavaScript">
var strCertID = "<%=strCertID%>";
function SignCallBack(retObj) {
if (retObj.retVal == "") {
TestForm.signatureData.value = "";
alert("签名失败!");
return;
}
TestForm.signatureData.value = retObj.retVal;
}
//签名方法
function Sign() {
var plain = TestForm.plainData.value
if (plain == "") {
alert("请输入待签名的数据!");
return ;
}
//对原文进行base64编码之后再签名
Base64Encode(plain,function (retObj){
var base64Plain = retObj.retVal;
if (base64Plain == "") {
alert("Base64编码失败!");
return;
}
//把base64签名后的值赋给表单显示
TestForm.plainData.value = base64Plain;
//对base64编码之后的原文进行签名
SignedData(strCertID, base64Plain, SignCallBack);
});
}
//验证签名
function VerifySign()
{
//获取到签名证书
GetSignCert(strCertID, function(retObj) {
var userCert = retObj.retVal;
var plain = TestForm.plainData.value;
var signedData = TestForm.signatureData.value;
if (userCert == "") {
alert("导出签名证书失败!");
return;
}
//传到后台用服务器验证签名
DSVSCaller.CallDSVS(plain,userCert,signedData,"verifySign");
});
}
</Script>
</body>
</html>
<%@page contentType="text/html; charset=UTF-8"%>
<%@page contentType="text/html; charset=UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.flushBuffer();
//判断session是否失效
String strCertName = (String) session.getAttribute("CertName");
if (strCertName == null || strCertName.equals("")) {
response.sendRedirect("../index.jsp");
}
//获得登陆用户CertID
String strCertID = (String) session.getAttribute("CertID");
%>
<html>
<head>
<title>证书应用演示环境</title>
<style type="text/css">
</style>
<link href="../style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@include file="../top.jsp"%>
<table width="957" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#FEFDFB">&nbsp;
</td>
</tr>
<tr>
<td width="267" align="left" valign="top">
<%@include file="../form.jsp"%>
</td>
<td align="left" valign="top" bgcolor="#FEFDFB">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
&nbsp;
</td>
<td class="font1">
<img src="../images/jt.gif" width="12" height="12" />
本地数据签名功能演示
</td>
</tr>
<tr>
<td height="5"></td>
</tr>
<tr height="2">
<td></td>
<td>
<table width="100%" height="2" border="0" cellpadding="0"
cellspacing="0">
<tr>
<td height="2" bgcolor="#CCCCCC"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="10"></td>
</tr>
<tr>
<td>
&nbsp;
</td>
<td align="left" valign="top">
<form method="post" ID="TestForm">
<table width="98%" border="0" align="center" cellpadding="5"
cellspacing="1" class="table1">
<tr>
<td style="font-size:14px;" width="35%">
需要签名的数据:
</td>
<td style="font-size:14px;">
<textarea name=plainData id=plainData cols="40" rows="6" >写入需要签名的数据!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" value="签名" class="button" style="width:50px;" onClick="Sign();">
</td>
<td style="font-size:14px;">
<textarea name=signatureData id=signatureData cols="40" rows="6">签名结果显示!</textarea>
</td>
</tr>
<tr>
<td>
<input type="button" name="B13" value="验签" style="width:50px;" class="button"
width="55" height="28" onClick="VerifySign();return false;">
<div align="center">
<font color="#FF0000" style="font-size:14px;">如果修改了明文或签名数据,<br>则验证失败!</font>
</div>
</td>
<td style="font-size:14px;">
<textarea name=verifySign id=verifySign cols="40" rows="6">验证签名结果显示!</textarea>
</td>
</tr
<tr>
<td style="font-size:14px;">
<input type="button" value="印章图片" class="button" style="width:100px;"/>
</td>
<td style="font-size:14px;">
<img id="picImg"/>
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<%@include file="../bottom.jsp"%>
<SCRIPT type="text/javascript" src="../XTXSAB.js" charset="UTF-8"></SCRIPT>
<SCRIPT type="text/javascript" src="../DSVSCaller.js" charset="UTF-8"></SCRIPT>
<SCRIPT LANGUAGE=JAVASCRIPT>
//这里实现拔掉key后自动退出系统
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
</SCRIPT>
<Script Language="JavaScript">
var strCertID = "<%=strCertID%>";
//function SignCallBack(retObj) {
// if (retObj.retVal == "") {
// TestForm.signatureData.value = "";
// alert("签名失败!");
// return;
// }
// TestForm.signatureData.value = retObj.retVal;
//这里调用
// }
//签名方法
function Sign() {
var plain = TestForm.plainData.value
if (plain == "") {
alert("请输入待签名的数据!");
return ;
}
//第一步,对原文进行base64编码之后再签名
Base64Encode(plain,function (retObj){
//base64后的签名原文
var base64Plain = retObj.retVal;
if (base64Plain == "") {
alert("Base64编码失败!");
return;
}
//把base64签名后的值赋给表单显示,这里是为了演示从而在表单展示,实际集成不需要在表单展示base64原文和签名结果
TestForm.plainData.value = base64Plain;
//第二步,对base64编码之后的原文进行签名
SignedData(strCertID, base64Plain, function(retObj){
//签名后结果
var signedDataRes = retObj.retVal;
if (signedDataRes == "") {
TestForm.signatureData.value = "";
alert("签名失败!");
return;
}
//这里是为了演示从而在表单展示,实际集成不需要在表单展示base64原文和签名结果
TestForm.signatureData.value = signedDataRes;
//第三步,签名成功后,获取用户证书,以便传到后台验证
GetSignCert(strCertID, function(retObj) {
var userCert = retObj.retVal;
var b64plain = base64Plain;
var signedData = signedDataRes;
if (userCert == "") {
alert("导出签名证书失败!");
return;
}
//第四步,传到base64原文、签名值和用户到后台用服务器验证签名
//DSVSCaller.CallDSVS(plain,userCert,signedData,"verifySign");
//以ajax传输为例子
// $.ajax({
// type:"POST",//请求方式
// url:"",//发送请求地址
// dataType:"json",
// data:{b64plain:b64plain,signedData:signedData,userCert:userCert}, //参数
// success:function(data){
// //这里获取到服务器返回的验证结果值
// if (data.res == true){//即验证签名通过并且数据保存到数据库
//第五步,获取印章图片,在页面展示
GetPic(strCertID, function(retObj) {
var pic = retObj.retVal;
if (pic == "") {
alert("获取签章图片失败!\n");
return false;
}
//TestForm1.pic_key.value = pic;
var picImg = document.getElementById("picImg");
picImg.src = "data:image/gif;base64," + pic; //展示印章图片
//第6步,印章展示完成后,需要做其他事情(如果涉及到印章数据的),请必须在这里调用,防止印章数据为空
});
// }
// }
//});
});
});
});
}
//验证签名
function VerifySign()
{
//获取到签名证书
GetSignCert(strCertID, function(retObj) {
var userCert = retObj.retVal;
var plain = TestForm.plainData.value;
var signedData = TestForm.signatureData.value;
if (userCert == "") {
alert("导出签名证书失败!");
return;
}
//传到后台用服务器验证签名
DSVSCaller.CallDSVS(plain,userCert,signedData,"verifySign");
});
}
</Script>
<SCRIPT LANGUAGE=JAVASCRIPT>
//这里实现拔掉key自动退出到登陆页面
SetAutoLogoutParameter("<%=strCertID%>", demoLogout);
//自己写的退出函数
function demoLogout(){
alert("专家拔掉key了,应该退出系统到登陆界面!")
}
</SCRIPT>
</body>
</html>
<%@page import="java.util.*,java.io.FileInputStream"%>
<%@page import="java.util.*,java.io.FileInputStream"%>
<%@page import = "cn.org.bjca.client.security.SecurityEngineDeal"%>
<%
request.setCharacterEncoding("UTF-8");
//指定签名验证服务器配置文件所在路径
SecurityEngineDeal.setProfilePath("C:/DSVSROOT");
SecurityEngineDeal sed = null;
sed = SecurityEngineDeal.getInstance("SVSDefault"); //指定应用名称,测试环境使用这个,生产环境上线时会提供正式的应用名称
%>
\ No newline at end of file
/* CSS Document */
/* CSS Document */
.font1{ font-size:13px;color:#6a6a6a; font-weight:bold;}
.font2{ font-size:13px; color:#999999;}
.font3{ font-size:13px;color:#7b0006; font-weight:bold;}
select{ font-size:13px;color:#6a6a6a; font-weight:bold;}
input{font-size:13px;color:#6a6a6a; font-weight:bold;}
.tableboder{ border:1px solid #CCCCCC }
.table1{ background:#cccccc; line-height:25px;text-align:center;}
.table1 tr{ background:#FFFFFF;}
.boder{ border:
border: 2px solid #c6c6c6;
border: 2px solid #c6c6c6;
background-color: #FFFFFF;
}
.button{
font-family:Arial, Helvetica, sans-serif;
font-size:13px;
font-weight:bold;
color: #FFFFFF;
text-align:center;
border: 0px solid #c02947;
background-image: url(images/buttonn.gif);
height:24px;
}
\ No newline at end of file
<%
<%
String tpath = request.getContextPath();
%>
<table width="957" border="0" align="center" cellpadding="0"
cellspacing="0">
<tr>
<td height="60">
<img src="<%=tpath%>/images/logo.gif" width="245" height="38" />
</td>
</tr>
<tr>
<td>
<img src="<%=tpath%>/images/banner.gif" width="957" height="68" />
</td>
</tr>
</table>
<script language=javascript>
function demoLogout() {
window.location.href = '<%=tpath%>/logout.jsp';
}
</script>
\ No newline at end of file
##############################################
##############################################
##语法说明:
#1 以 #开头的行为注释行;
#2 每行只能有一条语句;
#3 每行最多字符数目256个,包括空格;
#4 可以有任意多的空行;
#5 以[开始和以]结尾表示开始一个段落
#6 属于同一个段的内容必须放在同一个段内;
#7 =号前的为项目名称,其后为项目的值
#8 所能支持的段名与项目名称为内部定义好的,不能随意扩展
##################################################
#服务器个数
serverNum=1
#高院正式使用生产环境地址
address1=147.2.3.88
port1=8000
#最小链接数
minConnNum=20
#最大链接数
maxConnNum=50
#超时时间(毫秒)
timeout=5000
#是否开启DEBUG
isDebug=false
#客户端默认字符集
encoding=GBK
#连接模式(1为短连接,0为长连接)
connectionMode=1
#连接超时时间,可选
connectionTimeout=3000
\ No newline at end of file
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* reset */
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; }
body { line-height: 1; }
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; }
nav ul { list-style: none; }
blockquote, q { quotes: none; }
blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; }
a { margin: 0; padding: 0; font-size: 100%; vertical-align: baseline; background: transparent; }
/* change colours to suit your needs */
ins { background-color: #ff9; color: #000; text-decoration: none; }
/* change colours to suit your needs */
mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
del { text-decoration: line-through; }
abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
table { border-collapse: collapse; border-spacing: 0; }
/* change border colour to suit your needs */
hr { display: block; height: 1px; border: 0; border-top: 1px solid #cccccc; margin: 1em 0; padding: 0; }
input, select { vertical-align: middle; }
/* general page */
body { font-family: Verdana, sans-serif; font-size: 11px; line-height: 1.4em; }
#cas { background: #eee; }
#cas .flc-screenNavigator-view-container { width: 95%; margin: 0 auto; }
#cas .flc-screenNavigator-view-container #header, #cas .flc-screenNavigator-view-container #content { background: #fff; -webkit-box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.1); }
#cas .flc-screenNavigator-view-container #content { -webkit-border-bottom-right-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; }
@media only screen and (max-width: 960px) { #cas .flc-screenNavigator-view-container { width: 100%; }
#cas .flc-screenNavigator-view-container #content { -webkit-border-bottom-right-radius: 0px; -webkit-border-bottom-left-radius: 0px; -moz-border-radius-bottomright: 0px; -moz-border-radius-bottomleft: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } }
/* header */
#cas #header { padding-top: 10px; }
#cas #header #company-name { width: 118px; height: 31px; text-indent: -999em; background: url(../images/ja-sig-logo.gif) no-repeat; margin: 0 0 10px 10px; }
#cas #header #app-name { background: #210F7A; color: white; padding: 1.4em 1.4em; font-size: 2em; font-weight: normal; }
/* content */
#cas #content { padding: 10px; overflow: hidden; }
#cas #content #msg { padding: 20px; margin-bottom: 10px; }
#cas #content #msg h2 { font-size: 1.4em; margin-bottom: 0.5em; }
#cas #content #msg.errors { border: 1px dotted #BB0000; color: #BB0000; padding-left: 100px; background: url(../images/error.gif) no-repeat 20px center; }
#cas #content #msg.success { border: 1px dotted #390; color: #390; padding-left: 100px; background: url(../images/confirm.gif) no-repeat 20px center; }
#cas #content #msg.info { border: 1px dotted #008; color: #008; padding-left: 100px; background: url(../images/info.gif) no-repeat 20px center; }
#cas #content #login { width: 320px; float: left; margin-right: 20px; }
#cas #content #login #fm1 { padding: 20px; background: #eee; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; }
#cas #content #login #fm1 h2 { font-size: 1.4em; font-weight: normal; padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px solid #DDDDDD; }
#cas #content #login #fm1 .row { margin-bottom: 10px; }
#cas #content #login #fm1 .row .fl-label { display: block; color: #777777; }
#cas #content #login #fm1 .row input[type=text], #cas #content #login #fm1 .row input[type=password] { padding: 6px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; border: 1px solid #DDDDDD; background: #FFFFDD; }
#cas #content #login #fm1 .row.check { padding-bottom: 10px; margin-bottom: 10px; border-bottom: 1px solid #DDDDDD; color: #777; font-size: 11px; }
#cas #content #login #fm1 .row .btn-submit { border-width: 2px; padding: 3px; margin-right: 4px; }
#cas #content #login #fm1 .row .btn-reset { border: 0; background: none; color: #777; text-transform: lowercase; border-left: 1px solid #ddd; }
#cas #content #login #fm1 .row .btn-submit:hover, #cas #content #login #fm1 .row .btn-reset:hover { cursor: pointer; }
#cas #content #sidebar { width: auto; }
#cas #content #sidebar .sidebar-content { padding-left: 20px; }
#cas #content #sidebar .sidebar-content p { margin-bottom: 1.4em; }
#cas #content #sidebar .sidebar-content #list-languages ul { list-style: none; }
#cas #content #sidebar .sidebar-content #list-languages ul li { display: inline-block; padding: 0px 10px; border-right: 1px solid #e2e2e2; }
#cas #content #sidebar .sidebar-content #list-languages ul li:last-child { border: 0; line-height: 1.4em; }
/* footer */
#cas #footer { color: #999; margin: 20px 0; }
/* < 960 */
@media only screen and (max-width: 960px) { #cas #footer { padding-left: 10px; } }
/* < 799 */
@media only screen and (max-width: 799px) { #cas #header #app-name { font-size: 1em; }
#cas #content #login { float: none; width: 100%; }
#cas #content #login #fm1 .row .fl-label { margin-left: -10px; }
#cas #content #login #fm1 .row input[type=text], #cas #content #login #fm1 .row input[type=password] { width: 100%; margin-left: -10px; padding: 10px; }
#cas #content #login #fm1 .row .btn-submit { outline: none; -webkit-appearance: none; -webkit-border-radius: 0; border: 0; background: #210F7A; color: white; font-weight: bold; width: 100%; padding: 10px 20px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; }
#cas #content #login #fm1 .row .btn-reset { display: none; }
#cas #content #sidebar { margin-top: 20px; }
#cas #content #sidebar .sidebar-content { padding: 0; } }
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/***************************************/
/* general styles */
html {
background: -webkit-gradient(linear, left top, right top,
from(#c5ccd3),
to(#cfd5dd),
color-stop(0.80, #c5ccd3),
color-stop(0.80, #cfd5dd));
}
.fl-theme-uportal .fl-bevel-black {
text-shadow: rgba(0,0,0,0.35) 0px -1px 0px;
}
.fl-theme-uportal .fl-bevel-white {
text-shadow: rgba(255,255,255,1) 0px 1px 0px;
}
.fl-theme-uportal a {
-webkit-touch-callout:none; /* prevents iphone popup menu to copy / follow / bookmark a particular link */
-webkit-tap-highlight-color: rgba(0,0,0,0);
text-decoration:none;
color:#000;
}
/***************************************/
/* Navigation Bar */
body::before {
border-top-color:#ccd6e2;
border-bottom-color:#000;
background-image: -webkit-gradient(linear, left top, left bottom,
from(#B0BCCD),
color-stop(0.5, #889BB3),
color-stop(0.50, #6D84A2),
to(#6D84A2)
);
}
.fl-theme-uportal .fl-navbar {
color:#fff;
text-shadow: rgba(0,0,0,0.5) 0px -1px 0px;
}
.fl-theme-uportal .fl-navbar h1 {
color:#fff;
}
.fl-theme-uportal .fl-navbar a {
color: #fff;
}
.fl-theme-uportal .fl-navbar [class*=fl-button] {
background-image: -webkit-gradient(linear, left top, left bottom,
from(#9aafca),
color-stop(0.5, #6d8cb3),
color-stop(0.50, #4b6b90),
to(#4b6b90)
);
-webkit-border-image:none;
}
.fl-theme-uportal .fl-navbar [class*=fl-button]:active {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(149, 184, 239,1)),
to(rgba(35,109,229,1)),
color-stop(0.5, rgba(149, 184, 239,1)),
color-stop(0.50, rgba(75,148,244,1))
);
}
.fl-theme-uportal .fl-navbar .fl-backButton {
/* See mobile layout for details */
-webkit-border-image: url(images/iphone/navbar_back_button_insetShadow.png) 0 15 stretch;
-webkit-mask-box-image: url(images/iphone/backbutton_mask.png) 0 15 stretch;
}
.fl-theme-uportal .fl-navbar .fl-button-inner {
-webkit-border-image: url(images/iphone/navbar_normal_button_insetShadow.png) 5 5 5 5 stretch;
}
/***************************************/
/* iPhone general purpose gel buttons */
/* effect is applied anywhere but the navbar, which has its own button look */
.fl-theme-uportal .fl-button {
text-decoration:none;
font-weight:bold;
-webkit-border-image: url(images/iphone/button_bg_insetShadow.png) 10 stretch;
}
.fl-theme-uportal .fl-button.fl-bevel-white {
color:#333333;
}
.fl-theme-uportal .fl-button.fl-bevel-black {
color:#FFFFFF;
}
.fl-theme-uportal .fl-button-white {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(240,240,240,0.25)),
to(rgba(220,220,220,0.75)),
color-stop(0.5, rgba(240,240,240,1)),
color-stop(0.50, rgba(200,200,200,0.8))
);
}
.fl-theme-uportal .fl-button-black {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(106,106,106,0.25)),
to(rgba(00,00,00,0.75)),
color-stop(0.5, rgba(130,130,130,1)),
color-stop(0.50, rgba(75,75,75,0.8))
);
}
.fl-theme-uportal .fl-button-green {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(120,190,130,0.2)),
to(rgba(50,170,60,0.75)),
color-stop(0.5, rgba(120,190,130,1)),
color-stop(0.50, rgba(0,150,10,0.8))
);
}
.fl-theme-uportal .fl-button-blue {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(149, 184, 239,0.2)),
to(rgba(35,109,229,0.75)),
color-stop(0.5, rgba(149, 184, 239,1)),
color-stop(0.50, rgba(75,148,244,0.8))
);
}
/***************************************/
/* iPhone tabs 1: small general purpose content dividers */
.fl-theme-uportal .fl-tabs li {
background-image: -webkit-gradient(linear, left top, left bottom,
from(#9aafca),
color-stop(0.5, #6d8cb3),
color-stop(0.50, #4b6b90),
to(#4b6b90)
);
-webkit-border-image: url(images/iphone/navbar_normal_button_insetShadow.png) 5 5 5 5 stretch;
-webkit-border-left-image: none;
-webkit-background-origin: border;
-webkit-background-clip: border;
}
.fl-theme-uportal .fl-tabs .fl-tabs-active {
background-image: -webkit-gradient(linear, left top, left bottom,
from(rgba(149, 184, 239,1)),
to(rgba(35,109,229,1)),
color-stop(0.5, rgba(149, 184, 239,1)),
color-stop(0.50, rgba(75,148,244,1))
);
}
.fl-theme-uportal .fl-tabs li a,
.fl-theme-uportal .fl-tabs .fl-tabs-active a {
color:#fff;
border-right-color:rgba(255,255,255,0.35);
border-left-color:rgba(0,0,0,0.35);
}
/*************************************************/
/* iPhone list menu styles: Ordered lists, Unordererd lists, Thumbnail lists, Icon lists, Definition lists */
/*************************************************/
/* Default list system setup */
.fl-theme-uportal .fl-listmenu li a {
-webkit-tap-highlight-color: -webkit-gradient(linear, left top, left bottom, from(#4a94f4), to(#236de5));
background:#fff url(images/iphone/listmenu_arrow.png) no-repeat right 5px;
}
.fl-theme-uportal [class*=fl-list] > li {
color: #000;
border-color: rgb(169,173,176);
background-color:#fff;
}
/* A simulation for a:active on the device, requires JS */
.fl-theme-uportal [class*=fl-list]:not(.fl-list) a:active,
.fl-theme-uportal [class*=fl-list] .fl-link-hilight {
color: #fff;
background: url(images/iphone/listmenu_arrow.png) no-repeat right -25px,
-webkit-gradient(linear, left top, left bottom, from(#4a94f4), to(#236de5));
}
.fl-theme-uportal [class*=fl-list] .fl-link-loading {
color: #fff !important;
background: url(images/iphone/listmenu_loader.gif) no-repeat 97% center,
-webkit-gradient(linear, left top, left bottom, from(#4a94f4), to(#236de5));
}
.fl-theme-uportal [class*=fl-list]:not(.fl-list) a:active,
.fl-theme-uportal [class*=fl-list] a:active .fl-link-secondary,
.fl-theme-uportal [class*=fl-list] a:active .fl-link-summary,
.fl-theme-uportal [class*=fl-list] .fl-link-loading * {
color: #fff !important;
}
/* secondary link info behaviour */
.fl-theme-uportal [class*=fl-list] > li .fl-link-secondary {
color: rgb(50, 79, 133);
}
/* summary link info ehaviour */
.fl-theme-uportal [class*=fl-list] > li .fl-link-summary {
color:#999;
}
.fl-theme-uportal .fl-list a {
color:#4a94f4;
}
/***************************************/
/* instructional text (usually embossed too)*/
.fl-theme-uportal .fl-note {
color:#4C566C;
}
/****************************/
/* Collapsing and expanding panels */
.fl-theme-uportal .fl-panel-autoHeading > *:first-child {
color:#fff;
background: -webkit-gradient(linear, left top, left bottom, from(#999), to(#000));
}
.fl-theme-uportal .fl-panel-autoHeading > *:first-child:focus {
color:#000;
background: -webkit-gradient(linear, left top, left bottom, from(#FFF), to(#CCC));
}
/****************************/
/* Gloss tint for glossy icons/thumbnails */
.fl-theme-uportal .fl-list-glossy > li a::before {
background-image: -webkit-gradient(radial, 50% -15%, 10, 50% -50%, 45, from(rgba(255,255,255,1)), to(rgba(255,255,255,0)), color-stop(90%, rgba(255,255,255,.65)));
}
/*
------------------------------------
Overrides to jqueryui css.
------------------------------------
*/
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button,
.ui-widget {font-size: 1em; font-family:arial,helvetica,clean,sans-serif;}
.ui-tabs .ui-tabs-nav li a {
font-size: 0.8em;
padding:0.2em 0.5em;
}
.ui-tabs .ui-tabs-nav {
padding:0.2em 0.1em 0;
}
/* jQuery tooltip */
#tooltip {background-color: #fffbbf; color: #344461; border: thin solid #b1c6f2;}
/*
*/
#portalWelcome { text-align: right; padding-right: 10px; }
.portlet-content-container { background-color: #fff; padding: 5px; margin: 5px; }
/* Fluid pager component styles */
.fl-theme-uportal .fl-pager ul.fl-pager-ui {text-align:right}
.fl-theme-uportal .fl-pager .fl-pager-ui li {list-style-type:none; display:inline; padding-left:5px}
.fl-theme-uportal .fl-pager .fl-pager-ui a.fl-pager-disabled,
.fl-theme-uportal .fl-pager .fl-pager-ui .fl-pager-disabled a { color: #777777; border: 0; text-decoration: none; cursor: default; }
.fl-theme-uportal .fl-pager .fl-pager-ui a.fl-pager-currentPage,
.fl-theme-uportal .fl-pager .fl-pager-ui .fl-pager-currentPage a { color: #000000; border: 0; text-decoration: none; cursor: default;}
.fl-theme-uportal a { color:#4b6b90; }
.up-mobile-navigation-container a { color:#000; }
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Percents could work for IE, but for backCompat purposes, we are using keywords.
* x-small is for IE6/7 quirks mode.
*/
body {}
table {font-size:inherit;font:100%;}
/**
* Bump up IE to get to 13px equivalent
*/
pre,code,kbd,samp,tt {font-family:monospace;*font-size:108%;line-height:100%;}
html{color:#000;background:#FFF;}
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
table{border-collapse:collapse;border-spacing:0;}
fieldset,img{border:0;}
address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
li{list-style:none;}
caption,th{text-align:left;}
h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
q:before,q:after{content:'';}
abbr,acronym {border:0;font-variant:normal;}
/* to preserve line-height and selector appearance */
sup {vertical-align:text-top;}
sub {vertical-align:text-bottom;}
/*because legend doesn't inherit in IE */
legend{color:#000;}
/* base.css, part of YUI's CSS Foundation */
h1 {
/*18px via YUI Fonts CSS foundation*/
font-size:138.5%;
}
h2 {
/*16px via YUI Fonts CSS foundation*/
font-size:123.1%;
}
h3 {
/*14px via YUI Fonts CSS foundation*/
font-size:108%;
}
h1,h2,h3 {
/* top & bottom margin based on font size */
margin:1em 0;
}
h1,h2,h3,h4,h5,h6,strong {
/*bringing boldness back to headers and the strong element*/
font-weight:bold;
}
abbr,acronym {
/*indicating to users that more info is available */
border-bottom:1px dotted #000;
cursor:help;
}
em {
/*bringing italics back to the em element*/
font-style:italic;
}
blockquote,ul,ol,dl {
/*giving blockquotes and lists room to breath*/
margin:1em;
}
ol,ul,dl {
/*bringing lists on to the page with breathing room */
margin-left:2em;
}
ol li {
/*giving OL's LIs generated numbers*/
list-style: decimal outside;
}
ul li {
/*giving UL's LIs generated disc markers*/
list-style: disc outside;
}
dl dd {
/*giving UL's LIs generated numbers*/
margin-left:1em;
}
th,td {
/*borders and padding to make the table readable*/
border:1px solid #000;
padding:.5em;
}
th {
/*distinguishing table headers from data cells*/
font-weight:bold;
text-align:center;
}
caption {
/*coordinated margin to match cell's padding*/
margin-bottom:.5em;
/*centered so it doesn't blend in to other content*/
text-align:center;
}
p,fieldset,table,pre {
/*so things don't run into each other*/
margin-bottom:1em;
}
/* setting a consistent width, 160px;
control of type=file still not possible */
input[type=text],input[type=password],textarea{width:12.25em;*width:11.9em;}
input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}
/*************************************************************************************/
/* Prevent unecessary scrollbars in IE */
/* Put font data on the HTML element to allow overrides on the body */
/* IE6 cant zoom text properly, so text size reset is a rough approximation */
html {overflow:auto; font:13px/1.231 arial,helvetica,clean,sans-serif; *font-size:small;}
/*to enable resizing for IE*/
input,textarea,select{
*font-size:100%;
*font-family:sans-serif;
}
/* IE rendering fix for extra padding on buttons. Padding can now be set safely */
input {
*overflow:visible; *padding:0 1em;
}
/* custom default focus indicator - theme overwrites this */
:focus {
outline: 2px solid black;
}
/*
Generic containers for columns and layouts
=============================================
*/
/* Container Utilities*/
.fl-fix {overflow: auto; zoom:1;}
.fl-push {clear:both;}
/* Container alignment */
/* IE 6 needs inline display to prevent double margin bug (other browsers ignore it) */
.fl-force-right {float:right; display:inline;}
.fl-force-left {float:left; display:inline;}
.fl-centered {margin-left:auto; margin-right:auto; display:block;}
/* Generic container, proxy for other container effects */
.fl-container {}
/* Fixed width containers */
.fl-container-50 {width: 50px;}
.fl-container-100 {width: 100px;}
.fl-container-150 {width: 150px;}
.fl-container-200 {width: 200px;}
.fl-container-250 {width: 250px;}
.fl-container-300 {width: 300px;}
.fl-container-350 {width: 350px;}
.fl-container-400 {width: 400px;}
.fl-container-450 {width: 450px;}
.fl-container-500 {width: 500px;}
.fl-container-550 {width: 550px;}
.fl-container-600 {width: 600px;}
.fl-container-650 {width: 650px;}
.fl-container-700 {width: 700px;}
.fl-container-750 {width: 750px;}
.fl-container-800 {width: 800px;}
.fl-container-850 {width: 850px;}
.fl-container-900 {width: 900px;}
.fl-container-950 {width: 950px;}
.fl-container-1000 {width: 1000px;}
/* Flex width containers */
.fl-container-auto {width: auto;}
.fl-container-flex {width: 100%; clear:both;}
.fl-container-flex10 {width: 10%;}
.fl-container-flex20 {width: 20%;}
.fl-container-flex25 {width: 25%;}
.fl-container-flex30 {width: 30%;}
.fl-container-flex33 {width: 33%;}
.fl-container-flex40 {width: 40%;}
.fl-container-flex50 {width: 50%;}
.fl-container-flex60 {width: 60%;}
.fl-container-flex66 {width: 66%;}
.fl-container-flex75 {width: 75%;}
/* linearizable containers & columns */
.fl-layout-linear *,
.fl-layout-linear .fl-linearEnabled {
overflow:visible !important;
clear: both !important;
float:none !important;
margin-left:0 !important;
margin-right:0 !important;
}
.fl-layout-linear .fl-container,
.fl-layout-linear .fl-container-100,
.fl-layout-linear .fl-container-150,
.fl-layout-linear .fl-container-200,
.fl-layout-linear .fl-container-250,
.fl-layout-linear .fl-container-300,
.fl-layout-linear .fl-container-400,
.fl-layout-linear .fl-container-750,
.fl-layout-linear .fl-container-950,
.fl-layout-linear .fl-container-auto,
.fl-layout-linear .fl-container-flex25,
.fl-layout-linear .fl-container-flex30,
.fl-layout-linear .fl-container-flex33,
.fl-layout-linear .fl-container-flex50,
.fl-layout-linear .fl-col,
.fl-layout-linear .fl-col-side,
.fl-layout-linear .fl-col-flex,
.fl-layout-linear .fl-col-main,
.fl-layout-linear .fl-col-fixed,
.fl-layout-linear .fl-col-justified {width:100% !important; margin:auto; padding:0 !important;}
.fl-layout-linear .fl-force-left,
.fl-layout-linear .fl-force-right,
.fl-layout-linear li {display:block !important; float:none !important;}
.fl-layout-linear .fl-linearEnabled {width:100% !important; /*position:relative;*/ display:block;} /* linearization opt in for special cases */
.fl-layout-linear .fl-button-left,
.fl-layout-linear .fl-button-right {padding:1em;}
/*
Layout Helpers
=============================================
*/
/* Columns: A quick column grid system */
/* Flex width columns (containers with margins and padding) */
.fl-col-justified {float:left; display:inline; overflow:auto; text-align:justify;} /* redundant: text alignment now in fluid.text.css */
.fl-col-flex2, .fl-col-flex3, .fl-col-flex4, .fl-col-flex5 {overflow:auto; zoom:1;}
.fl-col {float:left; display:inline;}
.fl-col-flex5 .fl-col {width:18.95%; margin-left:0.25%;margin-right:0.25%; padding-left:0.25%; padding-right:0.25%}
.fl-col-flex4 .fl-col {width:24%; margin-left:0.25%;margin-right:0.25%; padding-left:0.25%; padding-right:0.25%}
.fl-col-flex3 .fl-col {width:32.33%; margin-left:0.25%;margin-right:0.25%; padding-left:0.25%; padding-right:0.25%}
.fl-col-flex2 .fl-col {width:48.85%; margin-left:0.25%;margin-right:0.25%; padding-left:0.25%; padding-right:0.25%}
/* CHANGE TO LAYOUT not COL since this will become a layout helper */
.fl-col-mixed,
.fl-col-mixed2,
.fl-col-mixed3 {overflow:auto; zoom:1;}
/* Old System */
.fl-col-mixed .fl-col-side {width:200px;}
.fl-col-mixed .fl-col-side,
.fl-col-mixed .fl-col-main {padding:0 10px;}
.fl-col-mixed2 .fl-col-side {width:200px; padding:0 10px; float:left;}
.fl-col-mixed2 .fl-col-main {margin-left:220px; padding:0 10px;} /* margin goes on whichever side the fixed column goes */
.fl-col-mixed3 .fl-col-main {margin:0 220px;} /* margin goes on whichever side the fixed column goes */
/* New System, requires fl-force-XX on the fixed column, provides some basic numbers to start with */
.fl-col-fixed, .fl-col-flex {padding:0 10px;}
.fl-col-mixed .fl-col-fixed {width:200px; padding:0 10px;}
.fl-col-mixed .fl-col-flex {margin-left:220px; padding:0 10px;}
.fl-col-mixed-100 .fl-col-fixed {width:100px;}
.fl-col-mixed-100 .fl-col-flex {margin-left:120px;}
.fl-col-mixed-150 .fl-col-fixed {width:150px;}
.fl-col-mixed-150 .fl-col-flex {margin-left:170px;}
.fl-col-mixed-200 .fl-col-fixed {width:200px;}
.fl-col-mixed-200 .fl-col-flex {margin-left:220px;}
.fl-col-mixed-250 .fl-col-fixed {width:250px;}
.fl-col-mixed-250 .fl-col-flex {margin-left:270px;}
.fl-col-mixed-300 .fl-col-fixed {width:300px;}
.fl-col-mixed-300 .fl-col-flex {margin-left:320px;}
/*
* Tabs: a quick tab system
* Dependency: list-based markup ?
*/
.fl-tabs {margin:10px 0 0 0; border-bottom:1px solid #000; text-align:center; padding-bottom:2px;}
.fl-tabs li {list-style-type:none; display:inline;}
/* star hack to get IE 6+7 to behave perfectly */
.fl-tabs li a {padding:3px 16px 2px; background-color:#fff; margin-left:-5px; *margin-bottom:-6px; zoom:1; border:1px solid #000; color:#999;}
.fl-tabs li a:hover {}
.fl-tabs-center {text-align:center;}
.fl-tabs-left {text-align:left; padding-left:10px;}
.fl-tabs-right {text-align:right; padding-right:15px;}
.fl-tabs .fl-reorderer-dropMarker {padding:0 3px; background-color:#c00;margin:0 5px 0 -5px; zoom:1;}
.fl-tabs .fl-tabs-active a {padding:3px 16px; border-bottom:none; color:#000;}
.fl-tabs-content {padding:5px;}
/* get webkit to behave perfectly -
* unfortunately, Chrome gets caught in this too even though it applied the original padding values fine
*/
@media screen and (-webkit-min-device-pixel-ratio:0){
.fl-tabs li a {padding:3px 16px 3px;}
.fl-tabs .fl-tabs-active a {padding:3px 16px 4px;}
}
/*
* Menus: quick horizontal and vertical menu
* Requires list items with anchors
*/
.fl-listmenu {padding:0px; margin:0; border-bottom-width:1px; border-bottom-style:solid;}
.fl-listmenu li {margin:0; padding:0; list-style-type:none; border-width:1px; border-style:solid; border-bottom:none;}
.fl-listmenu a {padding:5px 5px; display:block; zoom:1;} /* list item needs layout (http://www.brunildo.org/test/IEWlispace.php) */
.fl-vert-menu {
}
.fl-horz-menu {
}
/*
* Picture Grid: a quick picture grid layout
* Dependency: list-based markup
*/
ul.fl-grid, .fl-grid ul {padding:0; margin:0;}
.fl-grid li {list-style-type:none; display:inline;}
.fl-grid li {float:left; width:19%; margin:0.5%; height:150px; overflow:hidden; position:relative; display:inline;}
.fl-grid li img {display:block; margin:5px auto;}
.fl-grid li .caption {position:absolute; left:0px; bottom:0px; width:100%; text-align:center; height:1em; padding:3px 0;}
/*
* Icons: quick accessible icon helper
*/
.fl-icon {
text-indent:-5000px;
overflow:hidden;
cursor:pointer;
display:block;
height:16px;
width:16px;
margin-left:5px;
margin-right:5px;
background-position:center center;
background-repeat:no-repeat;
}
input.fl-icon {padding-left:16px;}
/*
* Buttons: quick sliding door buttons
* requires a container with a sub container
*/
.fl-button-left {float:left; margin-right:10px; padding:0 0 0 16px; background-position:left center; background-repeat:no-repeat;}
.fl-button-right {float:right; margin-left:10px; padding:0 0 0 16px; background-position:left center; background-repeat:no-repeat;}
.fl-button-inner {float:left; padding:5px 16px 5px 0; cursor:pointer; background-position:right center; background-repeat:no-repeat;}
/*
* Widgets: modelled after the mycamtools widget model
*/
.fl-widget {padding:5px; margin-bottom:10px;}
.fl-widget .button {margin:0 5px;}
.fl-grabbable .fl-widget-titlebar {background-position:center top; background-repeat:no-repeat; cursor:move;}
.fl-widget .fl-widget-titlebar {}
.fl-widget .fl-widget-titlebar h2 {padding:0; margin:0; font-size:105%;}
.fl-widget .fl-widget-titlebar .fl-button-inner {
font-size:0.8em;
padding-bottom:0.2em;
padding-top:0.2em;
}
.fl-widget .fl-widget-controls {margin:-1.3em 0 1.5em 0;}
.fl-widget .fl-widget-options {margin-top:5px; padding:0px 10px;}
.fl-widget .fl-widget-options ul {margin:0; padding:0; overflow:hidden; zoom:1;}
.fl-widget .fl-widget-options li {list-style-type:none; float:left; display:inline; padding:0 5px 0 5px; margin-left:-5px;}
.fl-widget .fl-widget-options a {margin-right:5px;}
.fl-widget .fl-widget-content {zoom:1; margin:5px 0 0 0; overflow: auto;}
.fl-widget .fl-widget-content ul {}
.fl-widget .empty * {padding-top:10px; margin-left:auto; margin-right:auto; text-align:center;}
/* Common widget sub-components */
.fl-widget .menu {margin:0;}
.fl-widget .toggle {width:32px;}
.fl-widget .on {background-position:left top;}
.fl-widget .off {background-position:left bottom;}
/*
* Forms and Form Controls
* Common arrangements for form inputs in a list
* Alignment requires list of fl-label elements placed before the control
*/
.fl-controls-left li {list-style-type:none; text-align:left;}
.fl-controls-left .fl-label {float:left; text-align:left; width:50%; margin-right:5px;}
.fl-controls-right li {list-style-type:none; display:block; text-align:left;}
.fl-controls-right .fl-label {float:left; text-align:right; width:50%; margin-right:5px;}
.fl-controls-centered li {list-style-type:none; display:block; text-align:left;}
.fl-controls-centered .fl-label {float:left; text-align:center; width:50%; margin-right:5px;}
/**
* Knockout Background Images
*/
.fl-noBackgroundImages, .fl-noBackgroundImages * {
background-image:none !important;
}
.fl-noBackgroundImages .fl-icon {
text-indent:0 !important;
width:auto !important;
background-color:transparent !important;
}
/* Progressive Enhancement: JS will reverse the display setup if it is enabled */
.fl-ProgEnhance-enhanced, /* << syntax breaks conventions and is Deprecated*/
.fl-progEnhance-enhanced {display:none}
.fl-ProgEnhance-basic, /* << syntax breaks conventions and is Deprecated*/
.fl-progEnhance-basic {}
/* hide text for screen readers. */
.fl-offScreen-hidden {position:absolute; left:-10000px; top:auto; width:1px; height:1px; overflow:hidden;}
.fl-font-size-70,
.fl-font-size-70 body,
.fl-font-size-70 input,
.fl-font-size-70 select,
.fl-font-size-70 textarea {font-size:0.7em !important; line-height:1em !important;}
.fl-font-size-80,
.fl-font-size-80 body,
.fl-font-size-80 input,
.fl-font-size-80 select,
.fl-font-size-80 textarea {font-size:0.8em !important; line-height:1.1em !important;}
.fl-font-size-90,
.fl-font-size-90 body,
.fl-font-size-90 input,
.fl-font-size-90 select,
.fl-font-size-90 textarea {font-size:0.9em !important; line-height:1.2em !important;}
.fl-font-size-100,
.fl-font-size-100 body,
.fl-font-size-100 input,
.fl-font-size-100 select,
.fl-font-size-100 textarea {font-size:1em !important; line-height:1.3em !important;}
.fl-font-size-110,
.fl-font-size-110 body,
.fl-font-size-110 input,
.fl-font-size-110 select,
.fl-font-size-110 textarea {font-size:1.1em !important; line-height:1.4em !important;}
.fl-font-size-120,
.fl-font-size-120 body,
.fl-font-size-120 input,
.fl-font-size-120 select,
.fl-font-size-120 textarea {font-size:1.2em !important; line-height:1.5em !important;}
.fl-font-size-130,
.fl-font-size-130 body,
.fl-font-size-130 input,
.fl-font-size-130 select,
.fl-font-size-130 textarea {font-size:1.3em !important; line-height:1.6em !important;}
.fl-font-size-140,
.fl-font-size-140 body,
.fl-font-size-140 input,
.fl-font-size-140 select,
.fl-font-size-140 textarea {font-size:1.4em !important; line-height:1.7em !important;}
.fl-font-size-150,
.fl-font-size-150 body,
.fl-font-size-150 input,
.fl-font-size-150 select,
.fl-font-size-150 textarea {font-size:1.5em !important; line-height:1.8em !important;}
/* fix for Safari 3 ignoring input font size */
@media screen and (-webkit-min-device-pixel-ratio:0) {
[class~='fl-font-size-70'] input[type=submit],
[class~='fl-font-size-70'] input[type=button] {padding:0 1em}
[class~='fl-font-size-80'] input[type=submit],
[class~='fl-font-size-80'] input[type=button] {font-size:0.8em !important; padding:0 1em}
[class~='fl-font-size-90'] input[type=submit],
[class~='fl-font-size-90'] input[type=button] {font-size:0.9em !important; padding:0 1em}
[class~='fl-font-size-100'] input[type=submit],
[class~='fl-font-size-100'] input[type=button] {font-size:1em !important; padding:0 1em}
[class~='fl-font-size-110'] input[type=submit],
input[type=submit][class~='fl-font-size-110'],
[class~='fl-font-size-110'] input[type=button] {background-color:#fff; font-size:1.1em !important; padding:0 1em}
[class~='fl-font-size-120'] input[type=submit],
input[type=submit][class~='fl-font-size-120'],
[class~='fl-font-size-120'] input[type=button] {background-color:#fff; font-size:1.2em !important; padding:0 1em}
[class~='fl-font-size-130'] input[type=submit],
input[type=submit][class~='fl-font-size-130'],
[class~='fl-font-size-130'] input[type=button] {background-color:#fff; font-size:1.3em !important; padding:0 1em}
[class~='fl-font-size-140'] input[type=submit],
input[type=submit][class~='fl-font-size-140'],
[class~='fl-font-size-140'] input[type=button] {background-color:#fff; font-size:1.4em !important; padding:0 1em}
[class~='fl-font-size-150'] input[type=submit],
input[type=submit][class~='fl-font-size-150'],
[class~='fl-font-size-150'] input[type=button] {background-color:#fff; font-size:1.5em !important; padding:0 1em}
[class~='fl-font-serif'] input[type=submit],
[class~='fl-font-sans'] input[type=submit],
[class~='fl-font-monospace'] input[type=submit],
[class~='fl-font-arial'] input[type=submit],
[class~='fl-font-verdana'] input[type=submit],
[class~='fl-font-times'] input[type=submit],
[class~='fl-font-courier'] input[type=submit] {background-color:#fff; padding:0 1em}
}
.fl-font-serif, .fl-font-serif * {font-family: Georgia, Times, "Times New Roman", "Book Antiqua", serif !important;}
.fl-font-sans, .fl-font-sans * {font-family: Tahoma, Verdana, Helvetica, sans-serif !important;}
.fl-font-monospace, .fl-font-monospace * {font-family: "Courier New, Courier", monospace !important;}
.fl-font-arial, .fl-font-arial * {font-family: "Arial" !important;}
.fl-font-verdana, .fl-font-verdana * {font-family: "Verdana" !important;}
.fl-font-times, .fl-font-times * {font-family: Georgia, Times, "Times New Roman", serif !important;}
.fl-font-courier, .fl-font-courier * {font-family: "Courier New", Courier, monospace !important;}
.fl-text-align-left {
text-align:left;
}
.fl-text-align-right {
text-align:right;
}
.fl-text-align-center {
text-align:center;
}
.fl-text-align-justify {
text-align:justify;
}
.fl-font-spacing-0,
.fl-font-spacing-0 body,
.fl-font-spacing-0 input,
.fl-font-spacing-0 select,
.fl-font-spacing-0 textarea {letter-spacing:0em}
.fl-font-spacing-1,
.fl-font-spacing-1 body,
.fl-font-spacing-1 input,
.fl-font-spacing-1 select,
.fl-font-spacing-1 textarea {letter-spacing:0.1em}
.fl-font-spacing-2,
.fl-font-spacing-2 body,
.fl-font-spacing-2 input,
.fl-font-spacing-2 select,
.fl-font-spacing-2 textarea {letter-spacing:0.2em}
.fl-font-spacing-3,
.fl-font-spacing-3 body,
.fl-font-spacing-3 input,
.fl-font-spacing-3 select,
.fl-font-spacing-3 textarea {letter-spacing:0.3em}
.fl-font-spacing-4,
.fl-font-spacing-4 body,
.fl-font-spacing-4 input,
.fl-font-spacing-4 select,
.fl-font-spacing-4 textarea {letter-spacing:0.4em}
.fl-font-spacing-5,
.fl-font-spacing-5 body,
.fl-font-spacing-5 input,
.fl-font-spacing-5 select,
.fl-font-spacing-5 textarea {letter-spacing:0.5em}
.fl-font-spacing-6,
.fl-font-spacing-6 body,
.fl-font-spacing-6 input,
.fl-font-spacing-6 select,
.fl-font-spacing-6 textarea {letter-spacing:0.6em}
/* UI Enhancer "Esier to Find" link options */
/* First pass strategy: apply classnames directky on the elements of interest, usually via JS */
.fl-text-aqua {color: aqua !important;}
.fl-text-black {color: black !important;}
.fl-text-blue {color: blue !important;}
.fl-text-fuchsia {color: fuchsia !important;}
.fl-text-gray {color: gray !important;}
.fl-text-green {color: green !important;}
.fl-text-lime {color: lime !important;}
.fl-text-maroon {color: maroon !important;}
.fl-text-navy {color: navy !important;}
.fl-text-olive {color: olive !important;}
.fl-text-purple {color: purple !important;}
.fl-text-red {color: red !important;}
.fl-text-silver {color: silver !important;}
.fl-text-teal {color: teal !important;}
.fl-text-white {color:white !important;}
.fl-text-yellow {color: yellow !important;}
.fl-text-underline {text-decoration:underline !important;}
.fl-text-bold {font-weight:bold !important;}
.fl-text-larger {font-size:125% !important;}
.fl-input-outline {border:2px solid;} /* leave out color? */
.fl-highlight-yellow, .fl-highlight-hover-yellow:hover, .fl-highlight-focus-yellow:focus {background-color:#FF0 !important; background-image:none !important;}
.fl-highlight-green, .fl-highlight-hover-green:hover, .fl-highlight-focus-green:focus {background-color:#0F0 !important; background-image:none !important;}
.fl-highlight-blue, .fl-highlight-hover-blue:hover, .fl-highlight-focus-blue:focus {background-color:#00F !important; background-image:none !important;}
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
:root {
-webkit-background-origin: padding-box;
-webkit-background-clip: content-box;
-webkit-background-size: 10px 1px;
}
body {
margin:0;
padding:0;
font:normal 17px Helvetica, sans-serif; /* Base font rules */
-webkit-user-select: none; /* prevents child elements content from being selected - desired? */
-webkit-text-size-adjust:none; /* http://website-engineering.blogspot.com/2009/07/stop-adjusting-text-size-in-iphone-when.html */
}
h1, h2, h3, h4, h5, h6 {margin:0.25em;}
h1 {font-size:1.5em;}
h2 {font-size:1.1em;}
h3 {font-size:1em;}
h4 {}
h5 {}
h6 {}
img {border:none;}
/***************************************/
/**
* Basic overrides for fss layout
*/
.fl-icon {
width:30px;
height:30px;
margin-top:-5px;
-webkit-border-radius: 5px;
}
.fl-label {
width:25%;
}
/***************************************/
/* to override any widths for a mobile device.
* This eliminates the width, allowing for device specific screen settings
*/
.fl-panel {
width:auto;
}
/***************************************/
/* iPhone general purpose gel buttons */
/* effect is applied anywhere but the navbar, which has its own button look */
.fl-button {
border-width: 10px;
text-align:center;
-webkit-border-radius:10px;
-webkit-background-origin: border;
-webkit-background-clip: border;
}
/*************************************************/
/* Navigation Bar
*/
body::before, .fl-navbar {
width:100%;
height:43px;
text-align:center;
}
body::before {
content:" ";
margin-bottom:-43px;
display:block;
border-style:solid;
border-width:1px 0;
-webkit-background-origin: padding-box;
-webkit-background-clip: content-box;
}
.fl-navbar .fl-table-cell:not(h1) {
width:1px;
white-space:nowrap;
}
.fl-navbar .fl-table-cell:first-child {
padding-left:5px;
}
.fl-navbar .fl-table-cell:last-child {
padding-right:5px;
}
.fl-navbar h1 {
padding:0;
text-align:center;
font-size:1.17em;
font-weight: bold;
}
.fl-navbar a {
text-decoration:none;
font-size: 0.7em;
font-weight:bold;
}
.fl-navbar [class*=fl-button] {
-webkit-border-radius:5px;
padding:0;
}
.fl-navbar .fl-backButton {
padding:10px 0;
/*
* To create the oddly shaped back button with fully customizable CSS colors, there are 2 main things:
* 1) The stencil for the shadow and hilights along the angled edge
* 2) The mask to crop the background along the angled edge
*/
/* Angled effect is just a single border with a transaprent stencil image */
border-width:0 0 0 15px;
-webkit-border-top-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-webkit-background-origin: border;
-webkit-background-clip: border;
-webkit-mask-repeat: no-repeat;
-webkit-mask-origin: border;
-webkit-mask-clip: border;
}
.fl-navbar .fl-backButton .fl-button-inner {
margin-left:-3px; /* close tiny gap between angled border + button-inner on Mobile Safari */
border-left-width:0;
}
.fl-navbar .fl-button-inner {
float:none;
padding:5px;
border-width:5px;
-webkit-background-origin: border;
-webkit-background-clip: border;
}
/*************************************************/
/* iPhone tabs: general purpose dividers, or fixed to the bottom of the screen
*/
/*************************************************/
.fl-tabs {
margin:0;
padding:0;
border:none;
text-align:center;
}
.fl-tabs li {
display:inline-block;
margin-right:-5px;
border-width:5px 0;
text-align:center;
}
.fl-tabs li:first-child {
border-left-width:5px;
-webkit-border-top-left-radius:5px;
-webkit-border-bottom-left-radius:5px;
}
.fl-tabs li:last-child {
margin-right:0;
border-right-width:5px;
-webkit-border-top-right-radius:5px;
-webkit-border-bottom-right-radius:5px;
}
.fl-tabs li.fl-tabs-active a,
.fl-tabs li a {
display:block;
margin:-4px 0;
text-decoration:none;
padding:0.35em 0.5em;
font-weight:bold;
background:none;
border-width:0 1px;
border-style:solid;
}
.fl-tabs li:last-child a {
border-right:none;
}
.fl-tabs li:first-child a {
border-left:none;
}
.fl-tabs.fl-tabs-functionBar {
}
/*************************************************/
/* iPhone list menu styles: Ordered lists, Unordererd lists, Thumbnail lists, Icon lists, Definition lists
* By default, all list formats fit to width
* When nested within a fl-panel element, they are indented and therefore contain rounded corners
*/
/*************************************************/
/* Default list system setup */
[class*=fl-list] {
border: none;
list-style:none;
margin:0 0 10px;
padding:0;
}
[class*=fl-list] > li {
display:block;
padding: 12px 0px 12px 12px;
text-decoration: none;
font-weight: bold;
outline: none;
border-style:solid;
border-width:1px 1px 0 1px;
overflow:auto; /* to encapsulate floating elements within */
}
[class*=fl-list] > li:last-child {
border-bottom-width:1px;
}
[class*=fl-list] .fl-link-loading .fl-link-secondary {
display:none;
}
/* secondary link info behaviour */
[class*=fl-list] > li .fl-link-secondary {
float:right;
margin-right:25px;
font-weight:normal;
font-size:.9em;
}
/* summary link info ehaviour */
[class*=fl-list] > li .fl-link-summary {
display:block;
clear:right;
margin:0 25px 0 0px;
font-weight:normal;
font-size:0.8em;
}
[class*=fl-list] li .fl-icon ~ .fl-link-summary {
margin-left:30px; /* default size of fl-icon */
}
/* icon behaviour */
[class*=fl-list] li .fl-icon {
float:left;
margin-left:-6px;
}
.fl-panel [class*=fl-list] > li:first-child,
.fl-panel [class*=fl-list] > li:first-child a {
-webkit-border-top-left-radius: 8px;
-webkit-border-top-right-radius: 8px;
}
.fl-panel [class*=fl-list] > li:last-child,
.fl-panel [class*=fl-list] > li:last-child a {
-webkit-border-bottom-left-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
}
/*************************************************/
/**
* fl-listmenu is now the way to create a link list
* The links create a hotspot over the entire list item, just like how it was by default
*/
.fl-listmenu {
}
.fl-listmenu li {
padding:0;
}
.fl-listmenu li a {
display:block;
padding: 12px 0px 12px 12px;
text-decoration: none;
font-weight: bold;
outline: none;
}
/*************************************************/
/* Thumbnail and Expanded Thumbnails list features */
.fl-list-thumbnails > li {
margin-bottom:5px;
}
.fl-list-thumbnails > li a {
border-bottom-width:1px;
padding-top:6px;
overflow:auto;
}
/* summary behaviour */
.fl-list-thumbnails > li a > .fl-icon ~ .fl-link-summary {
margin:0 25px -12px 42px;
}
.fl-list-thumbnails:not(.fl-thumbnails-expanded):not(.fl-list-brief) > li a > .fl-icon ~ .fl-link-summary {
padding-bottom:10px;
}
/* icon behaviour */
.fl-list-thumbnails > li a > .fl-icon {
width:44px;
height:44px;
margin:-6px 10px -12px -12px;
-webkit-border-radius:0;
}
.fl-panel .fl-list-thumbnails > li a {
-webkit-border-radius:8px;
}
.fl-panel .fl-list-thumbnails > li a > .fl-icon {
-webkit-border-bottom-left-radius: 8px;
-webkit-border-top-left-radius: 8px;
}
.fl-list-thumbnails.fl-thumbnails-expanded li {
margin:0;
}
.fl-list-thumbnails.fl-thumbnails-expanded > li a {
border-bottom-width:0;
-webkit-border-radius:0;
padding:10px;
}
.fl-list-thumbnails.fl-thumbnails-expanded > li a > .fl-icon {
width:60px;
height:60px;
margin:-5px 5px -5px -5px;
-webkit-border-radius:0;
}
.fl-list-thumbnails.fl-thumbnails-expanded > li:last-child a {
border-bottom-width:1px;
}
.fl-list-thumbnails.fl-thumbnails-expanded > li a > .fl-icon ~ .fl-link-summary {
margin: 0px 0px -5px 60px;
}
.fl-list-thumbnails.fl-thumbnails-expanded > li a > .fl-link-secondary {
padding-top:0;
}
/*************************************************/
/* Brief lists auto trim summary content + add ellipsis if necessary */
.fl-list-brief > li a {
padding-bottom:6px;
}
.fl-list-brief > li a > .fl-link-summary {
height:1.3em;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
}
.fl-list-brief > li a > .fl-link-secondary {
padding-top:6px;
}
.fl-list-brief > li a > .fl-icon ~ .fl-link-summary {
margin-left:0;
}
.fl-list-brief.fl-list-thumbnails:not(.fl-thumbnails-expanded) > li a > .fl-icon {
margin:-6px 10px -6px -12px;
}
.fl-list-brief.fl-list-thumbnails:not(.fl-thumbnails-expanded) > li a > .fl-link-secondary {
padding-top:0px;
}
/*************************************************/
/* Glossy icons (and thumbnails?) */
/* Glossiness for 30x30 icons */
.fl-list-glossy > li a::before {
position:absolute;
content:" ";
float:left;
width:28px;
height:28px;
margin:-4px 0 0 -5px;
-webkit-border-radius:3px;
-webkit-background-size: 30px 60px;
background-repeat:no-repeat;
}
/* Glossiness for 44x44 thumbnails */
.fl-list-thumbnails.fl-list-glossy > li a::before {
width:42px;
height:42px;
margin:-11px;
-webkit-border-radius:0px;
-webkit-background-size: 44px 50px;
}
/* Glossiness for 60x60 thumbnails */
.fl-list-thumbnails.fl-thumbnails-expanded.fl-list-glossy > li a::before {
width:58px;
height:58px;
margin:-4px;
-webkit-border-radius:0px;
-webkit-background-size: 60px 40px;
}
/*************************************************/
/* Content Panels */
/*************************************************/
[class*=fl-panel] {
margin:10px;
}
/* Panel Auto Headings */
/* The first element found becomes the "heading" */
.fl-panel-autoHeading > *:first-child {
padding:10px;
margin:0;
-webkit-border-top-left-radius: 8px;
-webkit-border-top-right-radius: 8px;
}
/* The last element found becomes the "content" - list or otherwise */
.fl-panel-autoHeading > *:last-child {
margin:0;
-webkit-border-radius:0;
-webkit-border-bottom-left-radius:8px;
-webkit-border-bottom-right-radius:8px;
}
.fl-panel-autoHeading [class*=fl-list] > li {
margin:0;
}
.fl-panel-autoHeading [class*=fl-list] > li:first-child,
.fl-panel-autoHeading [class*=fl-list] > li:first-child a {
-webkit-border-radius:0;
}
.fl-panel-autoHeading [class*=fl-list] > li:first-child:last-child,
.fl-panel-autoHeading [class*=fl-list] > li:first-child:last-child a {
-webkit-border-bottom-left-radius:8px;
-webkit-border-bottom-right-radius:8px;
}
.fl-panel-autoHeading .fl-list-thumbnails > li a {
/*padding:5px;*/
/*overflow:auto;*/
}
/* Collapsing and expanding panels */
.fl-panel-collapsable {
max-height:900px;
overflow:hidden;
-webkit-border-radius:8px;
}
/***************************/
.fl-table {
display:table;
border-collapse:collapse;
border:none;
}
.fl-table-row {
display:table-row;
border:none;
}
.fl-table-cell {
display:table-cell;
vertical-align:middle;
border:none;
}
/***************************/
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#header, #content, #footer, .clearfix, #student .row, #student .col {zoom:1;} /* needs to be seen by IE7 to trigger hasLayout */
/* FOOTER --------------------------------- */
#footer {padding-bottom:1em;}
/* lt IE6 */
* html #cas #login .btn-submit {background:#ffd;}
* html #cas #login .btn-row {top:5px;}
* html #sidebar {display:inline;} /* double margin on float bug */
* html input.btn-submit {padding:2px .25em; width:0; overflow:visible;} /* extra width fix */
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/* $Id$ */
/* GLOBAL/UTILITIES
--------------------------------- */
/* reset margins and padding for all elements since defaults are not crossbrowser */
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
* {
margin:0;
padding:0;
font-size:1em;
}
/* browser default font-size is 16px which is too big so we make it 16px x 62.5% = 10px */
body {
font:normal 62.5%/1 Verdana,Arial,Helvetica,sans-serif;
min-width:992px;
}
form {
float:left;
margin:0 1%;
padding:0;
width:77%;
}
/* general positioning styles */
.ac {text-align:center !important;}
/* HEADER
--------------------------------- */
#header #nav-system {
float:right;
padding:0;
}
#header #nav-system ul {
list-style:none;
margin:0;
padding:0;
}
#header #nav-system li {
float:left;
margin:0;
padding:0;
}
#header #nav-system li a {
float:left;
margin:0 0 0 1px;
padding:2px 10px;
font:normal 1.1em/1.5 Verdana,Arial,Helvetica,sans-serif;
text-decoration:none;
background-color:#323265;
color:#fff;
white-space:nowrap;
}
#header #nav-system li a:hover,
#header #nav-system li a:focus {
background-color:#fff;
color:#323265;
}
#header p#tagline {
padding:0 0 2px 3px;
background: #323265;
color:#fff;
font-size:1.2em;
line-height:1.6;
}
#header h1#app-name {
clear:both;
padding:0 0 0 15px;
background:#323265;
color:#fff;
font:2.4em/2em Arial,Helvetica,sans-serif;
}
/* MAIN MENU
--------------------------------- */
#nav-main {
float: left;
width: 100%;
background: #999;
font-size: 1.1em;
line-height: normal;
padding: 0;
xmargin:0 0 1.5em 0;
color:#eee;
}
#nav-main ul {
margin: 0;
padding: 0;
list-style: none;
line-height: 1.4em;
}
#nav-main li {
display: inline;
margin: 0;
padding: 0;
}
#nav-main a {
float: left;
margin: 0;
padding: 0;
text-decoration: none;
}
#nav-main a span {
float:left;
display:block;
padding:5px 10px;
background:transparent;
color:#eee;
}
/* Hide from IE5Mac only \*/
#nav-main a span {float:none;}
/* End hack */
#nav-main a:hover {background:#eee;}
#nav-main a:hover span {
background:#eee;
color:#333;
}
.highlightBottom td {background:#FFEFF3; color:#666; font-weight:400;}
.highlightBottom td a {display:inline; background:#fff; padding:5px 10px; color:#666; font-weight: normal;}
.highlightBottom a:hover {background:#b00; color:#fff;}
/* CONTENT
--------------------------------- */
#content {
clear:both;
width:auto;
padding:1px 0;
margin:0 2% 2em;
}
#content h1 {
margin:15px 0;
font:normal 2.2em "Times New Roman",serif;
color:#333;
background:transparent;
text-transform:capitalize;
}
#content p {margin:1em 0;}
/* FOOTER
---------------------------------------------------------- */
#footer {
color:#999;
background:transparent;
clear:both;
margin:0 2% 2em;
padding:0 0 1px 0;
border-top:1px solid #ccc;
position:relative;
}
#footer div {
margin:1em 5px .5em;
clear:left;
overflow:hidden;
}
#footer h4 {
font:normal 1em/1.2 Verdana,Arial,Helvetica,sans-serif;
clear:left;
margin:0;
padding:0;
float:left;
}
#footer a#jasig {
position:relative;
float:right;
clear:both;
display: block;
background-image: url(../../images/ja-sig-logo.gif);
width: 118px;
height: 31px;
margin:1em 5px .5em;
}
#footer #nav-campus-sites {
list-style:none;
float:left;
margin:0 0 0 5px;
padding:0;
}
#footer #nav-campus-sites li {
display:inline;
padding:0;
margin:0;
font:normal 1em/1.2 Verdana,Arial,Helvetica,sans-serif;
}
#footer #nav-campus-sites li:before {} /* content: " | " */
#footer #nav-campus-sites li:first-child:before {}
/* All IE browsers */
* html #footer {height:1px;}
* html #footer #nav-campus-sites {
padding:0 0.4em 0 0;
margin:0;
}
/* Win IE browsers - hide from Mac IE\*/
* html #footer #nav-campus-sites {height:1px; }
* html #footer #nav-campus-sites li {
display:block;
float:left;
}
/* End hide from Mac IE 5 */
* html #footer #nav-campus-sites li:first-child {border-left:0px none;}
/*
_______________________________
--- CONTENT FRAGMENTS ---
_______________________________
*/
/* MESSAGES
--------------------------------- */
.errors, .success {
clear:both;
padding:20px 20px 20px 85px; /* bg */
margin:0 0 1em;
font-weight:bold;
font-size:1.3em;
line-height:1.5;
}
.success {
border:1px dotted #390;
color:#390;
background:#dfa url('../../images/services/success.gif') no-repeat 2em 50%;
}
.errors {
border:1px dotted #b00;
color:#e71708; /* bg */
background:#fed url('../../images/services/error.gif') no-repeat 2em 50%;
}
/* FORMS
--------------------------------- */
fieldset {
border-left:0px solid #ddd; border-right:0px solid #ddd; border-top:1px solid #ddd; border-bottom:0px solid #ddd; margin:2em 0; padding:10px;
}
legend {
margin:1em 5px;
color:#b00;
font-size:1.1em;
font-weight:bold;
text-transform:uppercase;
}
label {
cursor:pointer;
font-size:1em;
color:#666;
}
input, select, textarea, option {font:normal 1.1em sans-serif;}
input, textarea {padding:0px 2px;}
select option {margin:auto .5em 0 0;}
/* vertically aligned form*/
input.check { margin:0 0 0 .5em; width:13px; height:13px; vertical-align:middle;}
/* highlight errors */
.required {background:#ff9;}
.formError {
background: #fafafa url('../../images/services/alert2.gif') no-repeat 0 50%;
/* bg */
color:#b00; /* bg */
margin-left:.5em; /* bg */
font-size:1.4em;
line-height:20px; padding-left:24px; padding-right:0; padding-top:0; padding-bottom:0
}
/* TABLES
--------------------------------- */
/* table row highlighting (does not work in IE - JavaScript workaround) */
table.highlight tr:hover td, table.highlight tr.over td {background:#ffc !important;}
table.highlight tr.highlightBottom:hover td {background: #ffeff3 !important;}
table {
border:0px none;
border-collapse:collapse;
empty-cells:show;
background-color:#fff;
font-size:1.1em;
border-collapse:separate;
border-spacing: 0px;
}
.large {width:100%;}
th {
background:#eee;
color:#666;
padding:3px 5px;
text-align:left;
font-weight:normal;
line-height: 24px;
}
tr.added {
background-color: #ff3;
}
td {
padding:3px 5px;
border-bottom:1px solid #eee;
height:38px;
}
td a {
padding:10px 0pt 10px 35px;
text-decoration: none;
display:inline;
line-height:32px;
color:#c1c1c0;
font-weight:400;
}
.add {
min-width:952px;
line-height:32px;
height:32px;
border-top: 5px solid #eee;
color:#000;
width:100%;
text-indent:5px;
padding-top: 5px;
font-size:1.1em;
}
.add a {background: url('../../images/services/add_service.gif') no-repeat left center;
text-decoration: none;
display: inline;
line-height:32px;
color:#c1c1c0;
font-weight:900; padding-left:35px; padding-right:0; padding-top:10px; padding-bottom:10px
}
.add a:hover {color:#b00;}
td a.edit {background: url('../../images/services/edit_service.gif') no-repeat left center;}
td a.del {background: url('../../images/services/delete_service.gif') no-repeat left center;}
td a:hover {color:#b00;}
p.instructions {
margin:1em 0;
font-size:1.2em;
background:url('../../images/services/info.gif') no-repeat left center; padding-left:2em; padding-right:0; padding-top:5px; padding-bottom:5px
}
fieldset {
padding:15px 10px;
background-color:#fafafa;
margin:20px 0;
position:relative;
border:1px solid #ddd;
}
legend {
padding:2px 5px;
color:#b00;
font-size:1.3em;
font-weight:900;
background:#fff;
}
label.preField, .label {
display:block;
width:8em;
float:left;
font-size:1.1em;
color:#666; /* + bg */
line-height:20px; /* + bg */
}
label.postField {
margin-right:1em;
font-size:1.1em;
vertical-align:middle; /*- bg */
line-height:20px; /* + bg */
}
.check {border:0px none;}
input,
textarea,
select {
border:1px solid #ccc;
border-color:#999 #eee #eee #999;
padding:2px;
margin-left:.5em; /* + bg */
}
input {
/* margin-left:.5em; - bg */
font-size:1.1em;
vertical-align:top;
}
span.oneField {
display:block;
margin:1em 0; /* bg */
padding:0;
}
button {font-size:1em;}
.primaryAction {
padding:.5em;
color:green;
font-weight:900;
}
@media screen {
div#container {
width:100%;
min-width:952px;
margin:0;
padding:0;
}
table#headerTable {
width:100%;
min-width:952px;
background:#999;
margin:0;
padding:0;
border:0;
border-collapse:collapse;
}
div.tableWrapper {
width:100%;
min-width:952px;
max-height:250px;
overflow:auto;
overflow-x:hidden;
}
table#scrollTable {
width:100%;
min-width:935px;
}
table#scrollTable thead {display:none;}
table#headerTable th, table#scrollTable td {padding:0 5px; border:0;}
table#scrollTable td {text-align:left; border-bottom:1px solid #eee;}
table#headerTable th {height:38px; border:0 !important;}
th.th1, td.td1 {width:200px; overflow:hidden;}
th.th2, td.td2 {overflow:hidden;}
th.th3, td.td3 {width:50px;}
th.th4, td.td4 {width:70px;}
th.th5, td.td5 {width:50px;}
th.th6, td.td6 {width:70px;}
th.th7, td.td7 {width:102px;}
th.th8, td.td8 {width:70px}
th.th9, td.td9 {width:70px; text-align:right !important;}
th.th10, td.td10 {width:102px; text-align:right !important;}
.hint {margin-left:9.5em; margin-bottom:1em; line-height:1.5;}
.actions {margin:1.5em 0;}
#allowedAttributes {height:150px;}
}
/* Container that holds the error messages on the services manage page
* This will be hidden by default and through JS calls, will be displayed
* when appropriate.
*/
#errorsDiv {
display: none;
}
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* IE Pick-a-boo bug fix */
form {height: expression('1%');}
/* Fixes Display: Block issue in IE5.5 and 6x */
div,
form,
fieldset,
#navlist li a,
td a {height:1px;}
/* Fixes IE problem with fieldset+legend boundaries */
fieldset {position: expression('relative');}
legend {
position: expression('absolute');
top: expression('-9px'); /* Fixes IE problem with fieldset+legend boundaries */
}
/* double float margin bug */
form,
#navcontainer {display:inline;}
/* button width fix */
button {
overflow:visible;
width:1px;
padding-left:0.5em;
padding-right:0.5em;
font-size:1.1em;
}
/* miscellaneous */
input {margin-left:0;}
ol li {line-height:1.0;}
input.check {width:13px; height:13px;}
span a {display:inline-block;}
label.top {margin-left:0;}
label.ieFix {margin-top:.5em;}
fieldset fieldset {padding-bottom:0;}
\ No newline at end of file
/*
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
.fl-reorderer-instructions{
background-color:#F5FFB0;
border:1px solid #FFE390;
margin:5px;
padding:10px;
}
.fl-reorderer-instructions strong{
display:block;
}
.fl-reorderer-movable-default{
cursor:move;
}
.fl-reorderer-movable-selected{
background-color:yellow;
}
.fl-reorderer-movable-hover{
background-color:yellow;
}
.fl-reorderer-movable-dragging{
background:#ccc;
}
.fl-reorderer-avatar {
cursor:move;
list-style-type:none;
filter:alpha(opacity=75);
opacity:.75;
}
.fl-reorderer-dropWarning{
display:none;
padding:5px 25px;
color:#fff;opacity:1;
filter:alpha(opacity=100);
background:#900 url('../../images/services/error.gif')
no-repeat 5px center;
}
.fl-reorderer-verticalLayout .fl-reorderer-dropMarker,.fluid-vertical-order .fl-reorderer-dropMarker{
background-color:#F00;
height:0;
padding:2px 0 0 0;
border-width:0;
margin:-2px 0 0 0;
list-style-type:none;
font-size:0;
line-height:0;
overflow:hidden;
}
.fl-reorderer-horizontalLayout .fl-reorderer-dropMarker,.fluid-horizontal-order .fl-reorderer-dropMarker{
background-color:#F00;
padding:0 3px;
border-width:0;
margin:0 -3px!important;
list-style-type:none;
overflow:hidden;
width:0!important;
}
\ No newline at end of file
function memcpy(szOut,szIn,nStart,nLen){for(var i=0;i<nLen;i++)szOut[nStart+i]=szIn[nStart+i];return szOut;}function MixString(szIn,szOut,nStart,nLen,nBase){var nCount=parseInt(nLen/nBase);var nR=parseInt(nLen%nBase);for(var i=0;i<nCount;i++){for(var j=0;j<nBase;j++){szOut[nStart+nCount*j+i]=szIn[nStart+nBase*i+j];}}if(nR>0)return memcpy(szOut,szIn,nStart+nCount*nBase,nR);return szOut;}function encodeParam(params){params = encodeURIComponent(params); params = params.replace(/\%/g, "^" );var bEncode=true;var nTimes=3;var nLen=params.length;var lpData=params.split("");var nCount=parseInt(nLen/nTimes);var nR=parseInt(nLen%nTimes);var szTemp=new Array(nLen+1);if(bEncode){szTemp=MixString(lpData,szTemp,0,nLen,nTimes);for(var i=0;i<nTimes;i++)lpData=MixString(szTemp,lpData,nCount*i,nCount,nTimes);if(nR>0)lpData=memcpy(lpData,szTemp,nCount*nTimes,nR);}else{for(var i=0;i<nTimes;i++)szTemp=MixString(lpData,szTemp,nCount*i,nCount,nCount/nTimes);if(nR>0)szTemp=memcpy(szTemp,lpData,nCount*nTimes,nR);lpData=MixString(szTemp,lpData,0,nLen,nLen/nTimes);}return lpData.join("");}
\ No newline at end of file
/**
*create by 2012-08-25 pm 17:48
*@author hexinglun@gmail.com
*BASE64 Encode and Decode By UTF-8 unicode
*可以和java的BASE64编码和解码互相转化
*/
(function(){
var BASE64_MAPPING = [
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
];
/**
*ascii convert to binary
*/
var _toBinary = function(ascii){
var binary = new Array();
while(ascii > 0){
var b = ascii%2;
ascii = Math.floor(ascii/2);
binary.push(b);
}
/*
var len = binary.length;
if(6-len > 0){
for(var i = 6-len ; i > 0 ; --i){
binary.push(0);
}
}*/
binary.reverse();
return binary;
};
/**
*binary convert to decimal
*/
var _toDecimal = function(binary){
var dec = 0;
var p = 0;
for(var i = binary.length-1 ; i >= 0 ; --i){
var b = binary[i];
if(b == 1){
dec += Math.pow(2 , p);
}
++p;
}
return dec;
};
/**
*unicode convert to utf-8
*/
var _toUTF8Binary = function(c , binaryArray){
var mustLen = (8-(c+1)) + ((c-1)*6);
var fatLen = binaryArray.length;
var diff = mustLen - fatLen;
while(--diff >= 0){
binaryArray.unshift(0);
}
var binary = [];
var _c = c;
while(--_c >= 0){
binary.push(1);
}
binary.push(0);
var i = 0 , len = 8 - (c+1);
for(; i < len ; ++i){
binary.push(binaryArray[i]);
}
for(var j = 0 ; j < c-1 ; ++j){
binary.push(1);
binary.push(0);
var sum = 6;
while(--sum >= 0){
binary.push(binaryArray[i++]);
}
}
return binary;
};
var __BASE64 = {
/**
*BASE64 Encode
*/
encoder:function(str){
var base64_Index = [];
var binaryArray = [];
for(var i = 0 , len = str.length ; i < len ; ++i){
var unicode = str.charCodeAt(i);
var _tmpBinary = _toBinary(unicode);
if(unicode < 0x80){
var _tmpdiff = 8 - _tmpBinary.length;
while(--_tmpdiff >= 0){
_tmpBinary.unshift(0);
}
binaryArray = binaryArray.concat(_tmpBinary);
}else if(unicode >= 0x80 && unicode <= 0x7FF){
binaryArray = binaryArray.concat(_toUTF8Binary(2 , _tmpBinary));
}else if(unicode >= 0x800 && unicode <= 0xFFFF){//UTF-8 3byte
binaryArray = binaryArray.concat(_toUTF8Binary(3 , _tmpBinary));
}else if(unicode >= 0x10000 && unicode <= 0x1FFFFF){//UTF-8 4byte
binaryArray = binaryArray.concat(_toUTF8Binary(4 , _tmpBinary));
}else if(unicode >= 0x200000 && unicode <= 0x3FFFFFF){//UTF-8 5byte
binaryArray = binaryArray.concat(_toUTF8Binary(5 , _tmpBinary));
}else if(unicode >= 4000000 && unicode <= 0x7FFFFFFF){//UTF-8 6byte
binaryArray = binaryArray.concat(_toUTF8Binary(6 , _tmpBinary));
}
}
var extra_Zero_Count = 0;
for(var i = 0 , len = binaryArray.length ; i < len ; i+=6){
var diff = (i+6)-len;
if(diff == 2){
extra_Zero_Count = 2;
}else if(diff == 4){
extra_Zero_Count = 4;
}
//if(extra_Zero_Count > 0){
// len += extra_Zero_Count+1;
//}
var _tmpExtra_Zero_Count = extra_Zero_Count;
while(--_tmpExtra_Zero_Count >= 0){
binaryArray.push(0);
}
base64_Index.push(_toDecimal(binaryArray.slice(i , i+6)));
}
var base64 = '';
for(var i = 0 , len = base64_Index.length ; i < len ; ++i){
base64 += BASE64_MAPPING[base64_Index[i]];
}
for(var i = 0 , len = extra_Zero_Count/2 ; i < len ; ++i){
base64 += '=';
}
return base64;
},
/**
*BASE64 Decode for UTF-8
*/
decoder : function(_base64Str){
var _len = _base64Str.length;
var extra_Zero_Count = 0;
/**
*计算在进行BASE64编码的时候,补了几个0
*/
if(_base64Str.charAt(_len-1) == '='){
//alert(_base64Str.charAt(_len-1));
//alert(_base64Str.charAt(_len-2));
if(_base64Str.charAt(_len-2) == '='){//两个等号说明补了4个0
extra_Zero_Count = 4;
_base64Str = _base64Str.substring(0 , _len-2);
}else{//一个等号说明补了2个0
extra_Zero_Count = 2;
_base64Str = _base64Str.substring(0 , _len - 1);
}
}
var binaryArray = [];
for(var i = 0 , len = _base64Str.length; i < len ; ++i){
var c = _base64Str.charAt(i);
for(var j = 0 , size = BASE64_MAPPING.length ; j < size ; ++j){
if(c == BASE64_MAPPING[j]){
var _tmp = _toBinary(j);
/*不足6位的补0*/
var _tmpLen = _tmp.length;
if(6-_tmpLen > 0){
for(var k = 6-_tmpLen ; k > 0 ; --k){
_tmp.unshift(0);
}
}
binaryArray = binaryArray.concat(_tmp);
break;
}
}
}
if(extra_Zero_Count > 0){
binaryArray = binaryArray.slice(0 , binaryArray.length - extra_Zero_Count);
}
var unicode = [];
var unicodeBinary = [];
for(var i = 0 , len = binaryArray.length ; i < len ; ){
if(binaryArray[i] == 0){
unicode=unicode.concat(_toDecimal(binaryArray.slice(i,i+8)));
i += 8;
}else{
var sum = 0;
while(i < len){
if(binaryArray[i] == 1){
++sum;
}else{
break;
}
++i;
}
unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+1 , i+8-sum));
i += 8 - sum;
while(sum > 1){
unicodeBinary = unicodeBinary.concat(binaryArray.slice(i+2 , i+8));
i += 8;
--sum;
}
unicode = unicode.concat(_toDecimal(unicodeBinary));
unicodeBinary = [];
}
}
return unicode;
}
};
window.BASE64 = __BASE64;
})();
\ No newline at end of file
/* globals var */
var $_$softCertListID = ""; // Soft CertListID, Set by SetUserCertList
var $_$hardCertListID = ""; // USBKeyCertListID, Set by SetUserCertList
var $_$allCertListID = ""; // All CertListID, Set by SetUserCertList
var $_$loginCertID = ""; // logined CertID, Set by SetAutoLogoutParameter
var $_$logoutFunc = null; // logout Function, Set by SetAutoLogoutParameter
var $_$onUsbKeyChangeCallBackFunc = null; //custom onUsbkeyChange callback function
var $_$XTXAlert = null; // alert custom function
var $_$XTXAppObj = null; // XTXAppCOM class Object
var $_$SecXV2Obj = null; // SecCOMV2 class Object
var $_$SecXObj = null; // SecCOM class Object
var $_$WebSocketObj = null; // WebSocket class Object
var $_$CurrentObj = null; // Current use class Object
var $_$GetPicObj = null; // GetKeyPic class Object
// const var
var CERT_TYPE_HARD = 1;
var CERT_TYPE_SOFT = 2;
var CERT_TYPE_ALL = 3;
// const var
var CERT_OID_VERSION = 1;
var CERT_OID_SERIAL = 2;
var CERT_OID_SIGN_METHOD = 3;
var CERT_OID_ISSUER_C = 4;
var CERT_OID_ISSUER_O = 5;
var CERT_OID_ISSUER_OU = 6;
var CERT_OID_ISSUER_ST = 7;
var CERT_OID_ISSUER_CN = 8;
var CERT_OID_ISSUER_L = 9;
var CERT_OID_ISSUER_E = 10;
var CERT_OID_NOT_BEFORE = 11;
var CERT_OID_NOT_AFTER = 12;
var CERT_OID_SUBJECT_C = 13;
var CERT_OID_SUBJECT_O = 14;
var CERT_OID_SUBJECT_OU = 15;
var CERT_OID_SUBJECT_ST = 16;
var CERT_OID_SUBJECT_CN = 17;
var CERT_OID_SUBJECT_L = 18;
var CERT_OID_SUBJECT_E = 19;
var CERT_OID_PUBKEY = 20;
var CERT_OID_SUBJECT_DN = 33;
var CERT_OID_ISSUER_DN = 34;
var CERT_OID_DN = 35;
// set auto logout parameters
function SetAutoLogoutParameter(strCertID, logoutFunc) {
$_$loginCertID = strCertID;
$_$logoutFunc = logoutFunc;
return;
}
function SetLoginCertID(strCertID) {
$_$loginCertID = strCertID;
return;
}
function SetLogoutFunction(logoutFunc) {
$_$logoutFunc = logoutFunc;
}
// set user cert list id
function SetUserCertList(strListID, certType) {
if (arguments.length == 1) {
$_$hardCertListID = strListID;
} else {
if (certType == CERT_TYPE_HARD) {
$_$hardCertListID = strListID;
}
if (certType == CERT_TYPE_SOFT) {
$_$softCertListID = strListID;
}
if (certType == CERT_TYPE_ALL) {
$_$allCertListID = strListID;
}
}
GetUserList($pushAllDropListBox);
return;
}
// set custom usbkeychange callback
function SetOnUsbKeyChangeCallBack(callback) {
$_$onUsbKeyChangeCallBackFunc = callback;
}
// set custom alert function
function SetAlertFunction(custom_alert) {
$_$XTXAlert = custom_alert;
}
function $checkBrowserISIE() {
return (!!window.ActiveXObject || 'ActiveXObject' in window) ? true : false;
}
function $popDropListBoxAll(strListID) {
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i, n = objListID.length;
for (i = 0; i < n; i++) {
objListID.remove(0);
}
objListID = null;
}
function $pushOneDropListBox(userListArray, strListID) {
var objListID = eval(strListID);
if (objListID == undefined) {
return;
}
var i;
for (i = 0; i < userListArray.length; i++) {
var certObj = userListArray[i];
var objItem = new Option(certObj.certName, certObj.certID);
objListID.options.add(objItem);
}
objListID = null;
return;
}
function $pushAllDropListBox(certUserListObj) {
if ($_$hardCertListID != "") {
$popDropListBoxAll($_$hardCertListID);
}
if ($_$softCertListID != "") {
$popDropListBoxAll($_$softCertListID);
}
if ($_$allCertListID != "") {
$popDropListBoxAll($_$allCertListID);
}
var strUserList = certUserListObj.retVal;
var allListArray = []
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
allListArray.push({certName: strName, certID: strCertID});
if ($_$hardCertListID != "") {
GetDeviceType(strCertID, function (retObj) {
if (retObj.retVal == "HARD") {
$pushOneDropListBox([retObj.ctx], $_$hardCertListID);
}
}, {certName: strName, certID: strCertID});
}
if ($_$softCertListID != "") {
GetDeviceType(strCertID, function (retObj) {
if (retObj.retVal == "SOFT") {
$pushOneDropListBox([retObj.ctx], $_$softCertListID);
}
}, {certName: strName, certID: strCertID});
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
if ($_$allCertListID != "") {
$pushOneDropListBox(allListArray, $_$allCertListID);
}
}
function $myAutoLogoutCallBack(retObj) {
if (retObj.retVal.indexOf($_$loginCertID) <= 0) {
$_$logoutFunc();
}
}
//usbkey change default callback function
function $OnUsbKeyChange() {
GetUserList($pushAllDropListBox);
if (typeof $_$onUsbKeyChangeCallBackFunc == 'function') {
$_$onUsbKeyChangeCallBackFunc();
}
if ($_$loginCertID != "" && typeof $_$logoutFunc == 'function') {
GetUserList($myAutoLogoutCallBack);
}
}
// IE11 attach event
function $AttachIE11OnUSBKeychangeEvent(strObjName) {
var handler = document.createElement("script");
handler.setAttribute("for", strObjName);
handler.setAttribute("event", "OnUsbKeyChange");
handler.appendChild(document.createTextNode("$OnUsbKeyChange()"));
document.body.appendChild(handler);
}
//load a control
function $LoadControl(CLSID, ctlName, testFuncName, addEvent) {
var pluginDiv = document.getElementById("pluginDiv" + ctlName);
if (pluginDiv) {
return true;
}
pluginDiv = document.createElement("div");
pluginDiv.id = "pluginDiv" + ctlName;
document.body.appendChild(pluginDiv);
try {
if ($checkBrowserISIE()) { // IE
pluginDiv.innerHTML = '<object id="' + ctlName + '" classid="CLSID:' + CLSID + '" style="HEIGHT:0px; WIDTH:0px"></object>';
if (addEvent) {
var clt = eval(ctlName);
if (clt.attachEvent) {
clt.attachEvent("OnUsbKeyChange", $OnUsbKeyChange);
} else {// IE11 not support attachEvent, and addEventListener do not work well, so addEvent ourself
$AttachIE11OnUSBKeychangeEvent(ctlName);
}
}
} else {
var chromeVersion = window.navigator.userAgent.match(/Chrome\/(\d+)\./);
if (chromeVersion && chromeVersion[1]) {
if (parseInt(chromeVersion[1], 10) >= 42) { // not support npapi return false
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
if (addEvent) {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} event_OnUsbkeyChange=$OnUsbKeyChange width=0 height=0 />';
} else {
pluginDiv.innerHTML = '<embed id=' + ctlName + ' type=application/x-xtx-axhost clsid={' + CLSID + '} width=0 height=0 />';
}
}
if (testFuncName != null && testFuncName != "" && eval(ctlName + "." + testFuncName) == undefined) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
return true;
} catch (e) {
document.body.removeChild(pluginDiv);
pluginDiv.innerHTML = "";
pluginDiv = null;
return false;
}
}
function $XTXAlert(strMsg) {
if (typeof $_$XTXAlert == 'function') {
$_$XTXAlert(strMsg);
} else {
alert(strMsg);
}
}
function $myOKRtnFunc(retVal, cb, ctx) {
if (typeof cb == 'function') {
var retObj = {retVal: retVal, ctx: ctx};
cb(retObj);
}
return retVal;
}
//XTXAppCOM class
function CreateXTXAppObject() {
var bOK = $LoadControl("3F367B74-92D9-4C5E-AB93-234F8A91D5E6", "XTXAPP", "SOF_GetVersion()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.ChangeAdminPass = function (sDeviceSN, sOldPass, sNewPass, cb, ctx) {
var ret = XTXAPP.ChangeAdminPass(sDeviceSN, sOldPass, sNewPass, sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GenerateKeyPair = function (sDeviceSN, sContainerName, iKeyType, bSign, cb, ctx) {
var ret = XTXAPP.GenerateKeyPair(sDeviceSN, sContainerName, iKeyType, bSign);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ExportPKCS10 = function (sDeviceSN, sContainerName, sDN, bSign, cb, ctx) {
var ret = XTXAPP.ExportPKCS10(sDeviceSN, sContainerName, sDN, bSign, sDN);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportSignCert = function (sDeviceSN, sContainerName, sCert, cb, ctx) {
var ret = XTXAPP.ImportSignCert(sDeviceSN, sContainerName, sCert);
return $myOKRtnFunc(ret, cb, ctx);
}
o.ImportEncCert = function (sDeviceSN, sContainerName, sCert, sPriKeyCipher, cb, ctx) {
var ret = XTXAPP.ImportEncCert(sDeviceSN, sContainerName, sCert, sPriKeyCipher);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetUserConfig = function (type, strConfig, cb, ctx) {
var ret = XTXAPP.SetUserConfig(type, strConfig);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SetSignMethod = function (sign_algo, cb, ctx) {
var ret = XTXAPP.SOF_SetSignMethod(sign_algo);
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList = function (cb, ctx) {
var ret = XTXAPP.SOF_GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o._GetUserListByType = function (strType, cb, ctx) {
var strUserList = XTXAPP.SOF_GetUserList();
var ret = "";
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
if (XTXAPP.GetDeviceInfo(strCertID, 7) == strType) {
ret += (strOneUser + "&&&");
}
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
return $myOKRtnFunc(ret, cb, ctx);
}
o.GetUserList_USBKey = function (cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function (cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function (strCertID, cb, ctx) {
var ret;
var strUserCert = XTXAPP.SOF_ExportUserCert(strCertID);
var strUserExchCert = XTXAPP.SOF_ExportExChangeUserCert(strCertID);
/*if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}*/
ret = strUserCert;
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function (strCertID, cb, ctx) {
var ret = XTXAPP.SOF_ExportExChangeUserCert(strCertID)
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function (strCertID, strUserPIN, cb, ctx) {
var ret = XTXAPP.SOF_Login(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function (strCertID, oldPwd, newPwd, cb, ctx) {
var ret = XTXAPP.SOF_ChangePassWd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function (strCertID, cb, ctx) {
var ret = XTXAPP.SOF_GetPinRetryCount(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function (strCert, Type, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function (strCert, strOID, cb, ctx) {
var ret = XTXAPP.SOF_GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function (strCert, cb, ctx) {
var ret = XTXAPP.SOF_GetCertEntity(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function (RandomLen, cb, ctx) {
var ret = XTXAPP.SOF_GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Logout = function (strCertID, cb, ctx) {
var ret = XTXAPP.SOF_Logout(strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function (strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function (strCert, strInData, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function (strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function (strCertID, strInData, cb, ctx) {
var ret = XTXAPP.SOF_PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function (strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var ret = XTXAPP.SOF_SignMessage(bFlag, strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function (strP7Data, strPlainMsg, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedMessage(strP7Data, strPlainMsg);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function (strCert, strInData, cb, ctx) {
var ret = XTXAPP.SOF_EncryptDataEx(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function (strCertID, strP7Envlope, cb, ctx) {
var ret = XTXAPP.SOF_DecryptData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function (strCertID, strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function (strCert, strFilePath, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function (cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function (strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function (strKey, strInData, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymEncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = XTXAPP.SOF_SymDecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function (strCert, cb, ctx) {
var r = XTXAPP.SOF_ValidateCert(strCert);
var ret;
if (ret == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function (strFilePath, cb, ctx) {
var ret = XTXAPP.SOF_HashFile(2, strFilePath); //sha1 alg
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function (strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function (strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function (strCertID, cb, ctx) {
var ret = XTXAPP.GetDeviceInfo(strCertID, 7);
return $myOKRtnFunc(ret, cb, ctx);
}
o.SignHashData = function (strCertID, strHashData, ulHashAlg, cb, ctx) {
var ret = XTXAPP.SOF_SignHashData(strCertID, strHashData, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
o.VerifySignedHashData = function (strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var ret = XTXAPP.SOF_VerifySignedHashData(strCert, strHashData, strSignValue, ulHashAlg);
return $myOKRtnFunc(ret, cb, ctx);
}
return o;
}
//SecXV2 class
function CreateSecXV2Object() {
var bOK = $LoadControl("FCAA4851-9E71-4BFE-8E55-212B5373F040", "SecXV2", "GetUserList()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.GetUserList = function (cb, ctx) {
var ret = SecXV2.GetUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function (cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function (cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function (strCertID, cb, ctx) {
var ret;
var strUserCert = SecXV2.ExportUserCert(strCertID);
var strUserExchCert = SecXV2.ExportExChangeUserCert(strCertID);
if (strUserCert == strUserExchCert) {
ret = "";
} else {
ret = strUserCert;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function (strCertID, cb, ctx) {
var ret = SecXV2.ExportExChangeUserCert(strCertID);
if (typeof cb == 'function') {
var retObj = {retVal: ret, ctx: ctx};
cb(retObj);
}
return ret;
};
o.VerifyUserPIN = function (strCertID, strUserPIN, cb, ctx) {
var ret = SecXV2.UserLogin(strCertID, strUserPIN);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function (strCertID, oldPwd, newPwd, cb, ctx) {
var ret = SecXV2.ChangePasswd(strCertID, oldPwd, newPwd);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function (strCertID, cb, ctx) {
var strExtLib = SecXV2.GetUserInfo(strCertID, 15);
var ret = SecXV2.GetBjcaKeyParam(strExtLib, 8);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function (strCert, Type, cb, ctx) {
var ret = SecXV2.GetCertInfo(strCert, Type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function (strCert, strOID, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function (strCert, cb, ctx) {
var ret = SecXV2.GetCertInfoByOid(strCert, "2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function (RandomLen, cb, ctx) {
var ret = SecXV2.GenRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function (strCertID, strInData, cb, ctx) {
var ret = SecXV2.SignData(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function (strCert, strInData, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedData(strCert, strInData, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function (strCert, strInData, cb, ctx) {
var ret = SecXV2.PubKeyEncrypt(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function (strCertID, strInData, cb, ctx) {
var ret = SecXV2.PriKeyDecrypt(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function (strCertID, strInData, bDetach, cb, ctx) {
var ret = SecXV2.SignDataByP7(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function (strP7Data, strPlainMsg, cb, ctx) {
var ret = SecXV2.VerifySignedDatabyP7(strP7Data);
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function (strCert, strInData, cb, ctx) {
var ret = SecXV2.EncodeP7EnvelopedData(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function (strCertID, strP7Envlope, cb, ctx) {
var ret = SecXV2.DecodeP7EnvelopedData(strCertID, strP7Envlope);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function (strCertID, strFilePath, cb, ctx) {
var ret = SecXV2.SignFile(strCertID, strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function (strCert, strFilePath, strSignValue, cb, ctx) {
var ret = SecXV2.VerifySignedFile(strCert, strFilePath, strSignValue);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function (cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function (strKey, strInData, cb, ctx) {
var ret = SecXV2.EncryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function (strKey, strInData, cb, ctx) {
var ret = SecXV2.DecryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.EncryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret = SecXV2.DecryptFile(strKey, strInFilePath, strOutFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function (strCert, cb, ctx) {
var ret = SecXV2.ValidateCert(strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//SecXV2 class
function CreateSecXObject() {
$LoadControl("02BE3F91-A9E1-4D12-A65B-1E0D500292A7", "oCert", "", false);
$LoadControl("4F763EC7-657A-43A8-96D0-BD3AD6D5E17E", "oCrypto", "", false);
$LoadControl("D57CD2CA-8FA1-440F-8614-B0A28F64F0BE", "oDevice", "", false);
var bOK = $LoadControl("BB7D3BAD-A402-4E98-B813-1C3C22481AE7", "oUtil", "getUserList()", false);
if (!bOK) {
return null;
}
bOK = $LoadControl("0CF5259B-A812-4B6E-9746-ACF7279FEF74", "USBKEY", "EnumUsbKey()", true);
if (!bOK) {
return null;
}
var o = new Object();
o.CERT_SRC_BASE64 = 1; //证书来自Base64字符串
o.CERT_SRC_UNIQUEID = 2; //证书来自唯一表示
o.CERT_SRC_FILE = 3; //证书来自der文件
o.CERT_SRC_CONTAINER_UCA = 4; //证书来自UCA类型证书容器
o.CERT_SRC_CONTAINER_SIGN = 5; //证书来自容器下签名证书
o.CERT_SRC_CONTAINER_ENC = 6; //证书来自容器下加密证书
o.CERT_SRC_CONTAINER_BOTH = 7; //证书来自容器下签名加密证书
o.CERT_SRC_PKCS12 = 8; //证书来自PKCS12文件
o.CERT_DST_BASE64 = 1; //导出证书为Base64字符串
o.CERT_DST_DERFILE = 2; //导出证书为der文件
o.CERT_DST_P12 = 3; //到出证书为PKCS12文件
o.CERT_XML_SUBJECT = 1; //从XML配置文件取用户名
o.CERT_XML_UNIQUEID = 2; //从XML配置文件取用户唯一表识
o.CERT_XML_DEPT = 3; //从XML配置文件取用户所有者部门
o.CERT_XML_ISSUE = 4; //从XML配置文件取用户证书颁发者
o.CERT_XML_STATE = 5; //从XML配置文件取用户证书使用状态
o.CERT_XML_TRADETYPE = 6; //从XML配置文件取用户证书应用类型
o.CERT_XML_PASSWORD = 7; //从XML配置文件取用户证书私钥保护口令
o.CERT_XML_DEVICETYPE = 8; //从XML配置文件取用户证书介质类型
o.CERT_XML_CATYPE = 9; //从XML配置文件取用户证书CA类型
o.CERT_XML_KEYTYPE = 10; //从XML配置文件取用户证书密钥类型
o.CERT_XML_SIGNSN = 11; //从XML配置文件取用户签名证书序列号
o.CERT_XML_EXCHSN = 12; //从XML配置文件取用户加密证书序列号
o.CERT_XML_DEVICENAME = 13; //从XML配置文件取用户证书介质名称
o.CERT_XML_DEVICEPROVIDER = 14; //从XML配置文件取用户证书介质提供者
o.CERT_XML_DEVICEAFFIX = 15; //从XML配置文件取用户证书介质附加库
o.CERT_XML_SIGNPATH = 16; //从XML配置文件取用户签名证书路径
o.CERT_XML_EXCHPATH = 17; //从XML配置文件取用户加密证书路径
o.CERT_XML_SIGNPFXPATH = 18; //从XML配置文件取用户签名P12证书路径
o.CERT_XML_EXCHPFXPATH = 19; //从XML配置文件取用户加密P12证书路径
o.CERT_XML_CHAINPATH = 20; //从XML配置文件取用户证书链路径
o.CERT_XML_CRLPATH = 21; //从XML配置文件取用户证书作废列表路径
o.CERT_XML_UNIQUEIDOID = 22; //从XML配置文件取用户证书UniqueID的OID
o.CERT_XML_VERIFYTYPE = 23; //从XML配置文件取用户证书验证类型
o.CERT_XML_CACOUNTS = 24; //从XML配置文件取用户证书根证书个数
o.CERT_XML_CANUMTYPE = 25; //从XML配置文件取用户证书跟证书类型
o.CRYPT_CFGTYPE_UNSET = 0; //用户应用类型未定义
o.CRYPT_CFGTYPE_CSP = 1; //用户应用类型CSP
o.CRYPT_CFGTYPE_P11 = 2; //用户应用类型P11
o.CRYPT_CFGTYPE_P12 = 3; //用户应用类型软算法
o.ENVELOP_ENC = 1; //加密P7数字信封
o.ENVELOP_DEC = 0; //解密P7数字信封
o.GetUserList = function (cb, ctx) {
var ret = USBKEY.getUserList();
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserList_USBKey = function (cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.GetUserList_Soft = function (cb, ctx) {
return o.GetUserList(cb, ctx);
};
o.ExportUserSignCert = function (strCertID, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var KeyType = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_KEYTYPE);
if (KeyType == 1) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else if (KeyType == 2) {
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_SIGN, strCSPName);
ret = oCert.exportCert(o.CERT_DST_BASE64);
} else {
ret = "";
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ExportUserExchangeCert = function (strCertID, cb, ctx) {
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
oCert.importCert(strCertID, o.CERT_SRC_CONTAINER_ENC, strCSPName);
var ret = oCert.exportCert(o.CERT_DST_BASE64);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyUserPIN = function (strCertID, strUserPIN, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.userLogin(strCSPName, strUserPIN);
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, strUserPIN);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ChangeUserPIN = function (strCertID, oldPwd, newPwd, cb, ctx) {
var ret;
var strCSPName = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEPROVIDER);
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var r = oDevice.changeUserPin(strCSPName, strExtLib, oldPwd, newPwd)
if (r == 0) {
oCrypto.setUserCfg(o.CRYPT_CFGTYPE_CSP, strCSPName, strExtLib, newPwd);
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetUserPINRetryCount = function (strCertID, cb, ctx) {
var strExtLib = USBKEY.getUserInfoByContainer(strCertID, o.CERT_XML_DEVICEAFFIX);
var ret = oDevice.getKeyRetrys(strExtLib);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfo = function (strCert, Type, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var SecXType;
switch (Type) {
case CERT_OID_ISSUER_CN:
SecXType = 4;
break;
case CERT_OID_NOT_BEFORE:
SecXType = 5;
break;
case CERT_OID_NOT_AFTER:
SecXType = 6;
break;
case CERT_OID_SUBJECT_C:
SecXType = 42;
break;
case CERT_OID_SUBJECT_O:
SecXType = 45;
break;
case CERT_OID_SUBJECT_OU:
SecXType = 46;
break;
case CERT_OID_SUBJECT_ST:
SecXType = 44;
break;
case CERT_OID_SUBJECT_CN:
SecXType = 41;
break;
case CERT_OID_SUBJECT_L:
SecXType = 43;
break;
case CERT_OID_PUBKEY:
SecXType = 43;
break;
default:
SecXType = Type;
break;
}
var ret = oCert.getBasicCertInfoByOID(SecXType);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertInfoByOID = function (strCert, strOID, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID(strOID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetCertEntity = function (strCert, cb, ctx) {
oCert.importCert(strCert, o.CERT_SRC_BASE64);
var ret = oCert.getExtCertInfoByOID("2.16.840.1.113732.2");
return $myOKRtnFunc(ret, cb, ctx);
};
o.GenRandom = function (RandomLen, cb, ctx) {
var ret = oCrypto.generateRandom(RandomLen);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignData = function (strCertID, strInData, cb, ctx) {
var ret = oCrypto.signedData(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignedData = function (strCert, strInData, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignedData(strSignValue, strCert, strInData);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.PubKeyEncrypt = function (strCert, strInData, cb, ctx) {
var ret = oCrypto.EncDataByCert(strCert, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.PriKeyDecrypt = function (strCertID, strInData, cb, ctx) {
var ret = oCrypto.DecDataByRSA(strCertID, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignDataByP7 = function (strCertID, strInData, bDetach, cb, ctx) {
var ret = oCrypto.signedDataByP7(strInData, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifyDataByP7 = function (strP7Data, strPlainMsg, cb, ctx) {
var ret;
var r = oCrypto.verifySignedDataByP7(strP7Data);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.EncyptMessage = function (strCert, strInData, cb, ctx) {
var ret = oCrypto.envelopedData(strInData, o.ENVELOP_ENC, strCert);
return $myOKRtnFunc(ret, cb, ctx);
};
o.DecryptMessage = function (strCertID, strP7Envlope, cb, ctx) {
var ret = oCrypto.envelopedData(strP7Envlope, o.ENVELOP_DEC, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SignFile = function (strCertID, strFilePath, cb, ctx) {
var ret = oCrypto.signFile(strFilePath, strCertID);
return $myOKRtnFunc(ret, cb, ctx);
};
o.VerifySignFile = function (strCert, strFilePath, strSignValue, cb, ctx) {
var ret;
var r = oCrypto.verifySignFile(strFilePath, strCert, strSignValue);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetSymKeyLength = function (cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function (strKey, strInData, cb, ctx) {
var ret = oCrypto.encryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptData = function (strKey, strInData, cb, ctx) {
var ret = oCrypto.decryptData(strKey, strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.encryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymDecryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var ret;
var r = oCrypto.decryptFile(strInFilePath, strOutFilePath, strKey);
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.ValidateCert = function (strCert, cb, ctx) {
var ret;
var r = oCert.validateCert("", "");
if (r == 0) {
ret = true;
} else {
ret = false;
}
return $myOKRtnFunc(ret, cb, ctx);
};
o.HashFile = function (strFilePath, cb, ctx) {
var ret = oCrypto.HashFile(strFilePath);
return $myOKRtnFunc(ret, cb, ctx);
};
o.GetDateNotBefore = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(0);
RtnDate.setMinutes(0);
RtnDate.setSeconds(0);
return RtnDate;
};
o.GetDateNotAfter = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(5, 7);
var strDay = strCertValid.substring(8, 10);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(23);
RtnDate.setMinutes(59);
RtnDate.setSeconds(59);
return RtnDate;
};
return o;
}
//webSocket client class
function CreateWebSocketObject() {
var o = new Object();
o.ws_host = "ws://127.0.0.1:";
o.ws_port_array = ["21051/xtxapp", "4044", "5044", "6044", "7044", "8044"];
o.ws_port_use = 0;
o.ws_obj = null;
o.ws_heartbeat_id = 0;
o.ws_queue_id = 0; // call_cmd_id
o.ws_queue_list = {}; // call_cmd_id callback queue
o.ws_queue_ctx = {};
o.xtx_version = "";
o.load_websocket = function () {
if (o.ws_port_use >= o.ws_port_array.length) {
o.ws_port_use = 0;
// return false;
}
var ws_url = o.ws_host + o.ws_port_array[o.ws_port_use] + "/";
try {
o.ws_obj = new WebSocket(ws_url);
} catch (e) {
console.log(e);
return false;
}
o.ws_queue_list["onUsbkeyChange"] = $OnUsbKeyChange;
o.ws_obj.onopen = function (evt) {
clearInterval(o.ws_heartbeat_id);
o.callMethod("SOF_GetVersion", function (str) {
o.xtx_version = str.retVal;
});
o.ws_heartbeat_id = setInterval(function () {
o.callMethod("SOF_GetVersion", function (str) {
});
}, 10 * 1000);
GetUserList($pushAllDropListBox);
};
o.ws_obj.onerror = function (evt) {
console.log("=====异常:websocket连接打开或关闭失败!请安装CA证书助手!");
o.ws_port_use++;
o.load_websocket();
};
o.ws_obj.onclose = function (evt) {
};
o.ws_obj.onmessage = function (evt) {
var res = JSON.parse(evt.data);
if (res['set-cookie']) {
document.cookie = res['set-cookie'];
}
//登录失败
if (res['loginError']) {
alert(res['loginError']);
}
var call_cmd_id = res['call_cmd_id'];
if (!call_cmd_id) {
return;
}
var execFunc = o.ws_queue_list[call_cmd_id];
if (typeof (execFunc) != 'function') {
return;
}
var ctx = o.ws_queue_ctx[res['call_cmd_id']];
ctx = ctx || {returnType: "string"};
var ret;
if (ctx.returnType == "bool") {
ret = res.retVal == "true" ? true : false;
} else if (ctx.returnType == "number") {
ret = Number(res.retVal);
} else {
ret = res.retVal;
}
var retObj = {retVal: ret, ctx: ctx};
execFunc(retObj);
if (res['call_cmd_id'] != "onUsbkeyChange") {
delete o.ws_queue_list[res['call_cmd_id']];
}
delete o.ws_queue_ctx[res['call_cmd_id']];
};
return true;
};
o.sendMessage = function (sendMsg) {
if (o.ws_obj.readyState == WebSocket.OPEN) {
o.ws_obj.send(JSON.stringify(sendMsg));
} else {
setTimeout(function () {
if (sendMsg.count) {
sendMsg.count++;
if (sendMsg.count === 4) {
return;
}
} else {
sendMsg.count = 1;
}
o.sendMessage(sendMsg);
}, 500);
console.log("Can't connect to WebSocket server!");
}
};
o.callMethod = function (strMethodName, cb, ctx, returnType, argsArray) {
o.ws_queue_id++;
if (typeof (cb) == 'function') {
o.ws_queue_list['i_' + o.ws_queue_id] = cb;
ctx = ctx || {};
ctx.returnType = returnType;
o.ws_queue_ctx['i_' + o.ws_queue_id] = ctx;
}
var sendArray = {};
sendArray['cookie'] = document.cookie;
sendArray['xtx_func_name'] = strMethodName;
sendArray['call_cmd_id'] = 'i_' + o.ws_queue_id;
if (o.xtx_version >= "2.14") {
sendArray['URL'] = window.location.href;
}
if (arguments.length > 4) {
for (var i = 1; i <= argsArray.length; i++) {
var strParam = "param_" + i;
sendArray[strParam] = argsArray[i - 1];
}
sendArray["param"] = argsArray;
}
o.sendMessage(sendArray);
// console.log(o.ws_obj.readyState);
// if (o.ws_obj.readyState == WebSocket.OPEN && o.ws_obj.readyState != WebSocket.CONNECTING) {
// o.load_websocket();
// }
};
o.ChangeAdminPass = function (sDeviceSN, sOldPass, sNewPass, cb, ctx) {
var paramArray = [sDeviceSN, sOldPass, sNewPass];
o.callMethod('ChangeAdminPass', cb, ctx, "bool", paramArray);
}
o.GenerateKeyPair = function (sDeviceSN, sContainerName, iKeyType, bSign, cb, ctx) {
var paramArray = [sDeviceSN, sContainerName, iKeyType, bSign];
o.callMethod('GenerateKeyPair', cb, ctx, "bool", paramArray);
}
o.ExportPKCS10 = function (sDeviceSN, sContainerName, sDN, bSign, cb, ctx) {
var paramArray = [sDeviceSN, sContainerName, sDN, bSign];
o.callMethod('ExportPKCS10', cb, ctx, "string", paramArray);
}
o.ImportSignCert = function (sDeviceSN, sContainerName, sCert, cb, ctx) {
var paramArray = [sDeviceSN, sContainerName, sCert];
o.callMethod('ImportSignCert', cb, ctx, "bool", paramArray);
}
o.ImportEncCert = function (sDeviceSN, sContainerName, sCert, sPriKeyCipher, cb, ctx) {
var paramArray = [sDeviceSN, sContainerName, sCert, sPriKeyCipher];
o.callMethod('ImportEncCert', cb, ctx, "bool", paramArray);
}
o.SetUserConfig = function (type, strConfig, cb, ctx) {
var paramArray = [type, strConfig];
o.callMethod('SetUserConfig', cb, ctx, "bool", paramArray);
}
o.SetSignMethod = function (sign_algo, cb, ctx) {
var paramArray = [sign_algo];
o.callMethod('SOF_SetSignMethod', cb, ctx, "number", paramArray);
}
o.GetUserList = function (cb, ctx) {
o.callMethod('SOF_GetUserList', cb, ctx, "string");
};
o._GetUserListByType = function (strType, cb, ctx) {
o.GetUserList(function (retObj) {
var strUserList = retObj.retVal;
while (true) {
var i = strUserList.indexOf("&&&");
if (i <= 0) {
break;
}
var strOneUser = strUserList.substring(0, i);
var strName = strOneUser.substring(0, strOneUser.indexOf("||"));
var strCertID = strOneUser.substring(strOneUser.indexOf("||") + 2, strOneUser.length);
o.GetDeviceType(strCertID, function (retObj) {
if (retObj.retVal == retObj.ctx.ctx.type) {
if (typeof retObj.ctx.ctx.cb == 'function') {
retObj.ctx.ctx.cb({retVal: retObj.ctx.userList, ctx: retObj.ctx.ctx.ctx})
}
}
}, {userList: strOneUser, ctx: retObj.ctx});
var len = strUserList.length;
strUserList = strUserList.substring(i + 3, len);
}
}, {type: strType, cb: cb, ctx: ctx});
}
o.GetUserList_USBKey = function (cb, ctx) {
return o._GetUserListByType("HARD", cb, ctx);
};
o.GetUserList_Soft = function (cb, ctx) {
return o._GetUserListByType("SOFT", cb, ctx);
};
o.ExportUserSignCert = function (strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportUserCert', cb, ctx, "string", paramArray);
};
o.ExportUserExchangeCert = function (strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_ExportExChangeUserCert', cb, ctx, "string", paramArray);
};
o.VerifyUserPIN = function (strCertID, strUserPIN, cb, ctx) {
var paramArray = [strCertID, strUserPIN];
o.callMethod('SOF_Login', cb, ctx, "bool", paramArray);
};
o.Logout = function (strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_Logout', cb, ctx, "bool", paramArray);
};
o.ChangeUserPIN = function (strCertID, oldPwd, newPwd, cb, ctx) {
var paramArray = [strCertID, oldPwd, newPwd];
o.callMethod('SOF_ChangePassWd', cb, ctx, "bool", paramArray);
};
o.GetUserPINRetryCount = function (strCertID, cb, ctx) {
var paramArray = [strCertID];
o.callMethod('SOF_GetPinRetryCount', cb, ctx, "number", paramArray);
};
o.GetCertInfo = function (strCert, Type, cb, ctx) {
var paramArray = [strCert, Type];
o.callMethod('SOF_GetCertInfo', cb, ctx, "string", paramArray);
};
o.GetCertInfoByOID = function (strCert, strOID, cb, ctx) {
var paramArray = [strCert, strOID];
o.callMethod('SOF_GetCertInfoByOid', cb, ctx, "string", paramArray);
};
o.GetCertEntity = function (strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_GetCertEntity', cb, ctx, "string", paramArray);
};
o.GenRandom = function (RandomLen, cb, ctx) {
var paramArray = [RandomLen];
o.callMethod('SOF_GenRandom', cb, ctx, "string", paramArray);
};
o.SignData = function (strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_SignData', cb, ctx, "string", paramArray);
};
o.VerifySignedData = function (strCert, strInData, strSignValue, cb, ctx) {
var paramArray = [strCert, strInData, strSignValue];
o.callMethod('SOF_VerifySignedData', cb, ctx, "bool", paramArray);
};
o.PubKeyEncrypt = function (strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_PubKeyEncrypt', cb, ctx, "string", paramArray);
};
o.PriKeyDecrypt = function (strCertID, strInData, cb, ctx) {
var paramArray = [strCertID, strInData];
o.callMethod('SOF_PriKeyDecrypt', cb, ctx, "string", paramArray);
};
o.SignDataByP7 = function (strCertID, strInData, bDetach, cb, ctx) {
var bFlag = 0;
if (bDetach) {
bFlag = 1;
}
var paramArray = [bFlag, strCertID, strInData];
o.callMethod('SOF_SignMessage', cb, ctx, "string", paramArray);
};
o.VerifyDataByP7 = function (strP7Data, strPlainMsg, cb, ctx) {
var paramArray = [strP7Data, strPlainMsg];
o.callMethod('SOF_VerifySignedMessage', cb, ctx, "bool", paramArray);
};
o.EncyptMessage = function (strCert, strInData, cb, ctx) {
var paramArray = [strCert, strInData];
o.callMethod('SOF_EncryptData', cb, ctx, "string", paramArray);
};
o.DecryptMessage = function (strCertID, strP7Envlope, cb, ctx) {
var paramArray = [strCertID, strP7Envlope];
o.callMethod('SOF_DecryptData', cb, ctx, "string", paramArray);
};
o.SignFile = function (strCertID, strFilePath, cb, ctx) {
var paramArray = [strCertID, strFilePath];
o.callMethod('SOF_SignFile', cb, ctx, "string", paramArray);
};
o.VerifySignFile = function (strCert, strFilePath, strSignValue, cb, ctx) {
var paramArray = [strCert, strFilePath, strSignValue];
o.callMethod('SOF_VerifySignedFile', cb, ctx, "bool", paramArray);
};
o.GetSymKeyLength = function (cb, ctx) {
var ret = 24;
return $myOKRtnFunc(ret, cb, ctx);
};
o.SymEncryptData = function (strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymEncryptData', cb, ctx, "string", paramArray);
};
o.SymDecryptData = function (strKey, strInData, cb, ctx) {
var paramArray = [strKey, strInData];
o.callMethod('SOF_SymDecryptData', cb, ctx, "string", paramArray);
};
o.SymEncryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymEncryptFile', cb, ctx, "bool", paramArray);
};
o.SymDecryptFile = function (strKey, strInFilePath, strOutFilePath, cb, ctx) {
var paramArray = [strKey, strInFilePath, strOutFilePath];
o.callMethod('SOF_SymDecryptFile', cb, ctx, "bool", paramArray);
};
o.ValidateCert = function (strCert, cb, ctx) {
var paramArray = [strCert];
o.callMethod('SOF_ValidateCert', cb, ctx, "bool", paramArray);
};
o.HashFile = function (strFilePath, cb, ctx) {
var paramArray = [2, strFilePath];
o.callMethod('SOF_HashFile', cb, ctx, "string", paramArray);
};
o.GetDateNotBefore = function (strCertValid) {
return o._GetDateFormate(strCertValid);
};
o.GetDateNotAfter = function (strCertValid) {
return o._GetDateFormate(strCertValid);
};
o._GetDateFormate = function (strCertValid) {
var strYear = strCertValid.substring(0, 4);
var strMonth = strCertValid.substring(4, 6);
var strDay = strCertValid.substring(6, 8);
var strHour = strCertValid.substring(8, 10);
var strMin = strCertValid.substring(10, 12);
var strSecond = strCertValid.substring(12, 14);
var RtnDate = new Date();
RtnDate.setFullYear(Number(strYear), Number(strMonth) - 1, Number(strDay));
RtnDate.setHours(Number(strHour));
RtnDate.setMinutes(Number(strMin));
RtnDate.setSeconds(Number(strSecond));
return RtnDate;
};
o.GetDeviceType = function (strCertID, cb, ctx) {
var paramArray = [strCertID, 7];
o.callMethod('GetDeviceInfo', cb, ctx, "string", paramArray);
}
o.SignHashData = function (strCertID, strHashData, ulHashAlg, cb, ctx) {
var paramArray = [strCertID, strHashData, ulHashAlg];
o.callMethod('SOF_SignHashData', cb, ctx, "string", paramArray);
}
o.VerifySignedHashData = function (strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
var paramArray = [strCert, strHashData, ulHashAlg, strSignValue];
o.callMethod('SOF_VerifySignedHashData', cb, ctx, "bool", paramArray);
}
// getpic begin
o.GetPic = function (strContainerName, cb, ctx) {
var paramArray = [strContainerName];
o.callMethod('GetPic', cb, ctx, "string", paramArray);
};
o.Hash = function (strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('Hash', cb, ctx, "string", paramArray);
};
o.ConvertPicFormat = function (strInData, type, cb, ctx) {
var paramArray = [strInData, type];
o.callMethod('ConvertPicFormat', cb, ctx, "string", paramArray);
};
o.ConvertGif2Jpg = function (strInData, cb, ctx) {
var paramArray = [strInData];
o.callMethod('ConvertGif2Jpg', cb, ctx, "string", paramArray);
};
o.ConvertPicSize = function (strInData, w, h, cb, ctx) {
var paramArray = [strInData, w, h];
o.callMethod('ConvertPicSize', cb, ctx, "string", paramArray);
};
// getpic end
if (!o.load_websocket()) {
return null;
}
return o;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////// 对外提供的接口
function GenerateKeyPair(sDeviceSN, sContainerName, iKeyType, bSign, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.GenerateKeyPair) {
return $_$CurrentObj.GenerateKeyPair(sDeviceSN, sContainerName, iKeyType, bSign, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ExportPKCS10(sDeviceSN, sContainerName, sDN, bSign, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.ExportPKCS10) {
return $_$CurrentObj.ExportPKCS10(sDeviceSN, sContainerName, sDN, bSign, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportSignCert(sDeviceSN, sContainerName, sCert, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.ImportSignCert) {
return $_$CurrentObj.ImportSignCert(sDeviceSN, sContainerName, sCert, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ImportEncCert(sDeviceSN, sContainerName, sCert, sPriKeyCipher, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.ImportEncCert) {
return $_$CurrentObj.ImportEncCert(sDeviceSN, sContainerName, sCert, sPriKeyCipher, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetUserConfig(type, strConfig, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.SetUserConfig) {
return $_$CurrentObj.SetUserConfig(type, strConfig, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function SetSignMethod(sign_algo, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.SetSignMethod) {
return $_$CurrentObj.SetSignMethod(sign_algo, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function $myErrorRtnFunc(retVal, cb, ctx) {
if (typeof cb == 'function') {
var retObj = {retVal: retVal, ctx: ctx};
cb(retObj);
}
return retVal;
}
//get user list
function GetUserList(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get usbKey user list
function GetUserList_USBKey(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_USBKey(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//get soft user list
function GetUserList_Soft(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserList_Soft(cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user signature cert
function GetSignCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserSignCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//export user exchange cert
function GetExchCert(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ExportUserExchangeCert(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify user pin
function VerifyUserPIN(strCertID, strUserPIN, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyUserPIN(strCertID, strUserPIN, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//modify user pin
function ChangeUserPassword(strCertID, oldPwd, newPwd, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ChangeUserPIN(strCertID, oldPwd, newPwd, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get user pin retry count
function GetUserPINRetryCount(strCertID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetUserPINRetryCount(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc(0, cb, ctx);
}
}
// get cert basic info
function GetCertBasicinfo(strCert, Type, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfo(strCert, Type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert extend info
function GetExtCertInfoByOID(strCert, strOID, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertInfoByOID(strCert, strOID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
// get cert entity id
function GetCertEntity(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetCertEntity(strCert, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//generate random
function GenerateRandom(RandomLen, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GenRandom(RandomLen, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Logout(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.Logout) {
return $_$CurrentObj.Logout(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
};
//sign data
function SignedData(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignData(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed data
function VerifySignedData(strCert, strInData, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignedData(strCert, strInData, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//encrypt data by cert
function PubKeyEncrypt(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PubKeyEncrypt(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by private key(not support by gm key)
function PriKeyDecrypt(strCertID, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.PriKeyDecrypt(strCertID, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign data with pkcs7 format
function SignByP7(strCertID, strInData, bDetach, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignDataByP7(strCertID, strInData, bDetach, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify pkcs7 signed data
function VerifyDatabyP7(strP7Data, strPlainMsg, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifyDataByP7(strP7Data, strPlainMsg, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt pkcs7 envlope
function EncodeP7Enveloped(strCert, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.EncyptMessage(strCert, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt pkcs7 envlope
function DecodeP7Enveloped(strCertID, strP7Envlope, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.DecryptMessage(strCertID, strP7Envlope, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//sign file
function SignFile(strCertID, strFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SignFile(strCertID, strFilePath, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//verify signed file
function VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.VerifySignFile(strCert, strFilePath, strSignValue, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get symmitric key length
//because xtx and secxv2 secx default symmitric alg is no equal
function GetSymKeyLength(cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetSymKeyLength(cb, ctx);
} else {
return $myErrorRtnFunc(24, cb, ctx);
}
}
//encrypt data by symmitric key
function EncryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//decrypt data by symmitric key
function DecryptData(strKey, strInData, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptData(strKey, strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
//encrypt file by symmitric key
function EncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymEncryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//decrypt file by symmitric key
function DecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.SymDecryptFile(strKey, strInFilePath, strOutFilePath, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//validate cert
function ValidateCert(strCert, cb, ctx) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.ValidateCert(strCert, cb, ctx);
} else {
return $myErrorRtnFunc(false, cb, ctx);
}
}
//get device type return SOFT or HARD
function GetDeviceType(strCertID, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.GetDeviceType != undefined) {
return $_$CurrentObj.GetDeviceType(strCertID, cb, ctx);
} else {
return $myErrorRtnFunc("HARD", cb, ctx);
}
}
// calculate file's hash
function HashFile(strFilePath, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.HashFile != undefined) {
return $_$CurrentObj.HashFile(strFilePath, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// sign hash data only v2.0 or later support
function SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.SignHashData != undefined) {
return $_$CurrentObj.SignHashData(strCertID, strHashData, ulHashAlg, cb, ctx);
}
return $myErrorRtnFunc("", cb, ctx);
}
// verify signed hash data only v2.0 or later support
function VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.VerifySignedHashData != undefined) {
return $_$CurrentObj.VerifySignedHashData(strCert, strHashData, ulHashAlg, strSignValue, cb, ctx);
}
return $myErrorRtnFunc(false, cb, ctx);
}
function GetDateNotBefore(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotBefore(strCertValid);
}
return "";
}
function GetDateNotAfter(strCertValid) {
if ($_$CurrentObj != null) {
return $_$CurrentObj.GetDateNotAfter(strCertValid);
}
return "";
}
function $loginSignRandomCallBack(retObj) {
if (retObj.retVal == "") {
$XTXAlert("客户端签名失败!");
return;
}
var objForm = retObj.ctx.objForm;
var strAction = retObj.ctx.action;
objForm.UserSignedData.value = retObj.retVal;
objForm.action = strAction;
objForm.submit();
}
function $loginVerifyServerSignatureCallBack(retObj) {
if (!retObj.retVal) {
$XTXAlert("验证服务器端信息失败!");
return;
}
var strCertID = retObj.ctx.certID;
SignedData(strCertID, strServerRan, $loginSignRandomCallBack, retObj.ctx);
}
function $loginCheckCertValidNotAfter(retObj) {
var notAfterDate = GetDateNotAfter(retObj.retVal);
var milliseconds = notAfterDate.getTime() - new Date().getTime();
if (milliseconds < 0) {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
days = parseInt(milliseconds / (1000 * 60 * 60 * 24));
if (days > 0 && days <= 60) {
$XTXAlert("您的证书还有" + days + "天过期\n请您尽快到广西数字证书认证中心办理证书更新手续!");
} else if (days == 0) { // 证书有效期天数小于1天
var hours = parseInt(milliseconds / (1000 * 60 * 60));
if (hours > 0) {
$XTXAlert("您的证书还有" + hours + "小时过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
}
// 证书有效期小于1小时
var minutes = parseInt(milliseconds / (1000 * 60));
if (minutes > 1) {
$XTXAlert("您的证书还有" + minutes + "分钟过期\n您尽快到广西数字证书认证中心办理证书更新手续!");
} else {
$XTXAlert("您的证书已过期,请尽快到广西数字证书认证中心办理证书更新手续!");
return;
}
}
VerifySignedData(strServerCert, strServerRan, strServerSignedData,
$loginVerifyServerSignatureCallBack, retObj.ctx);
}
function $loginCheckCertValidNotBefore(retObj) {
var notBeforeDate = GetDateNotBefore(retObj.retVal);
var days = parseInt((notBeforeDate.getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24));
if (days > 0) {
$XTXAlert("您的证书尚未生效!距离生效日期还剩" + days + "天!");
return;
}
var strUserCert = retObj.ctx.objForm.UserCert.value;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_AFTER, $loginCheckCertValidNotAfter, retObj.ctx);
}
function $loginGetSignCertCallBack(retObj) {
var strUserCert = retObj.retVal;
if (strUserCert == "") {
$XTXAlert("导出用户证书失败!");
return;
}
retObj.ctx.objForm.UserCert.value = strUserCert;
GetCertBasicinfo(strUserCert, CERT_OID_NOT_BEFORE, $loginCheckCertValidNotBefore, retObj.ctx);
}
function $loginGetPINRetryCallBack(retObj) {
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
$XTXAlert("校验证书密码失败!您还有" + retryCount + "次机会重试!");
return;
} else if (retryCount == 0) {
$XTXAlert("您的证书密码已被锁死,请联系管理员进行解锁!");
return;
} else {
$XTXAlert("登录失败!");
return;
}
}
function $loginVerifyPINCallBack(retObj) {
var strCertID = retObj.ctx.certID;
var objForm = retObj.ctx.objForm;
if (!retObj.retVal) {
GetUserPINRetryCount(strCertID, $loginGetPINRetryCallBack);
return;
}
objForm.ContainerName.value = strCertID;
GetSignCert(strCertID, $loginGetSignCertCallBack, retObj.ctx);
}
function Logout(certid, cb, ctx) {
if ($_$CurrentObj != null && $_$CurrentObj.Logout != undefined) {
return $_$CurrentObj.Logout(certid, cb, ctx);
}
}
//Form login
function Login(formName, strCertID, strPin, strAction) {
var objForm = eval(formName);
if (objForm == null) {
$XTXAlert("表单错误!");
return;
}
if (strCertID == null || strCertID == "") {
$XTXAlert("请输入证书密码!");
return;
}
if (strPin == null || strPin == "") {
$XTXAlert("请输入证书密码!");
return;
}
//Add a hidden item ...
var strSignItem = "<input type=\"hidden\" name=\"UserSignedData\" value=\"\">";
if (objForm.UserSignedData == null) {
objForm.insertAdjacentHTML("BeforeEnd", strSignItem);
}
var strCertItem = "<input type=\"hidden\" name=\"UserCert\" value=\"\">";
if (objForm.UserCert == null) {
objForm.insertAdjacentHTML("BeforeEnd", strCertItem);
}
var strContainerItem = "<input type=\"hidden\" name=\"ContainerName\" value=\"\">";
if (objForm.ContainerName == null) {
objForm.insertAdjacentHTML("BeforeEnd", strContainerItem);
}
var ctx = {certID: strCertID, objForm: objForm, action: strAction};
VerifyUserPIN(strCertID, strPin, $loginVerifyPINCallBack, ctx);
return;
}
//说明: GetPic功能
/*
* GetKeyPic控件接口
*/
//GetPic class
function CreateGetPicObject() {
var bOK = $LoadControl("3BC3C868-95B5-47ED-8686-E0E3E94EF366", "OGetPic", "GetPic()", false);
if (!bOK) {
return null;
}
var o = new Object();
o.GetPic = function (strContainerName, cb, ctx) {
var ret = OGetPic.GetPic(strContainerName);
return $myOKRtnFunc(ret, cb, ctx);
};
o.Hash = function (strInData, cb, ctx) {
var ret = OGetPic.Hash(strInData)
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicFormat = function (strInData, type, cb, ctx) {
var ret = OGetPic.ConvertPicFormat(strInData, type);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertGif2Jpg = function (strInData, cb, ctx) {
var ret = OGetPic.ConvertGif2Jpg(strInData);
return $myOKRtnFunc(ret, cb, ctx);
};
o.ConvertPicSize = function (strInData, w, h, cb, ctx) {
var ret = OGetPic.ConvertPicSize(strInData, w, h);
return $myOKRtnFunc(ret, cb, ctx);
};
return o;
}
function GetPic(strContainerName, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.GetPic != undefined) {
return $_$WebSocketObj.GetPic(strContainerName, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.GetPic != undefined) {
return $_$GetPicObj.GetPic(strContainerName, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function Hash(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.Hash != undefined) {
return $_$WebSocketObj.Hash(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.Hash != undefined) {
return $_$GetPicObj.Hash(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicFormat(strInData, type, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicFormat != undefined) {
return $_$WebSocketObj.ConvertPicFormat(strInData, type, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicFormat != undefined) {
return $_$GetPicObj.ConvertPicFormat(strInData, type, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertGif2Jpg(strInData, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertGif2Jpg != undefined) {
return $_$WebSocketObj.ConvertGif2Jpg(strInData, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertGif2Jpg != undefined) {
return $_$GetPicObj.ConvertGif2Jpg(strInData, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ConvertPicSize(strInData, w, h, cb, ctx) {
if ($_$WebSocketObj != null && $_$WebSocketObj.ConvertPicSize != undefined) {
return $_$WebSocketObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else if ($_$GetPicObj != null && $_$GetPicObj.ConvertPicSize != undefined) {
return $_$GetPicObj.ConvertPicSize(strInData, w, h, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
function ChangeAdminPass(sDeviceSN, sOldPass, sNewPass, cb, ctx) {
if ($_$CurrentObj && $_$CurrentObj.ChangeAdminPass) {
return $_$CurrentObj.ChangeAdminPass(sDeviceSN, sOldPass, sNewPass, cb, ctx);
} else {
return $myErrorRtnFunc("", cb, ctx);
}
}
(function () {
//GetPic实例obj
$_$GetPicObj = CreateGetPicObject();
$_$XTXAppObj = CreateXTXAppObject();
if ($_$XTXAppObj != null) {
$_$CurrentObj = $_$XTXAppObj;
return;
}
$_$SecXV2Obj = CreateSecXV2Object();
if ($_$SecXV2Obj != null) {
$_$CurrentObj = $_$SecXV2Obj;
return;
}
$_$SecXObj = CreateSecXObject();
if ($_$SecXObj != null) {
$_$CurrentObj = $_$SecXObj;
return;
}
$_$WebSocketObj = CreateWebSocketObject();
if ($_$WebSocketObj != null) {
$_$CurrentObj = $_$WebSocketObj;
return;
}
$_$CurrentObj = null;
$XTXAlert("检查证书应用环境出错!");
return;
})();
\ No newline at end of file
/*
@desc
Base64 encoder and decoder write by JavaScript. This code was a plugin of
jQeury, you must load jQuery library first if you want to use this code.
- After encode, you can decode it with PHP, and vice versa
- Support Unicode library
This code was collected from the network, I just rewrite it as the plugin
of jQuery, the copyright belongs to original work(s).
@Version 1.0 build 20080908
@Author Hpyer <hpyer@yahoo.cn>
@Home http://www.hpyer.cn/jquery-plugin-base64-encode-and-decode.html
@Usage
Whether or not to use UNICODE library: $.base64.is_unicode = false/true;
Encode: $.base64.encode('$.base64');
Decode: $.base64.decode('JC5iYXNlNjQ=');
@License Free
*/
jQuery.base64 = {
is_unicode: false,
encode: function(input){
if (this.is_unicode) input = this._u2a(input);
var output = '';
var chr1, chr2, chr3 = '';
var enc1, enc2, enc3, enc4 = '';
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)){
enc3 = enc4 = 64;
} else if (isNaN(chr3)){
enc4 = 64;
}
output = output+this._keys.charAt(enc1)+this._keys.charAt(enc2)+this._keys.charAt(enc3)+this._keys.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
},
decode: function(input){
var output = '';
var chr1, chr2, chr3 = '';
var enc1, enc2, enc3, enc4 = '';
var i = 0;
if (input.length%4!=0){
return '';
}
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)){
return '';
}
do {
enc1 = this._keys.indexOf(input.charAt(i++));
enc2 = this._keys.indexOf(input.charAt(i++));
enc3 = this._keys.indexOf(input.charAt(i++));
enc4 = this._keys.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64){
output+=String.fromCharCode(chr2);
}
if (enc4 != 64){
output+=String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
if (this.is_unicode) output = this._a2u(output);
return output;
},
_keys: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
_unicode: function(){
return '00A4,00A7,00A8,00B0,00B1,00B7,00D7,00E0,00E1,00E8,00E9,00EA,00EC,00ED,00F2,00F3,00F7,00F9,00FA,00FC,0101,0113,011B,012B,014D,016B,01CE,01D0,01D2,01D4,01D6,01D8,01DA,01DC,02C7,02C9,0391,0392,0393,0394,0395,0396,0397,0398,0399,039A,039B,039C,039D,039E,039F,03A0,03A1,03A3,03A4,03A5,03A6,03A7,03A8,03A9,03B1,03B2,03B3,03B4,03B5,03B6,03B7,03B8,03B9,03BA,03BB,03BC,03BD,03BE,03BF,03C0,03C1,03C3,03C4,03C5,03C6,03C7,03C8,03C9,0401,0410,0411,0412,0413,0414,0415,0416,0417,0418,0419,041A,041B,041C,041D,041E,041F,0420,0421,0422,0423,0424,0425,0426,0427,0428,0429,042A,042B,042C,042D,042E,042F,0430,0431,0432,0433,0434,0435,0436,0437,0438,0439,043A,043B,043C,043D,043E,043F,0440,0441,0442,0443,0444,0445,0446,0447,0448,0449,044A,044B,044C,044D,044E,044F,0451,2014,2016,2018,2019,201C,201D,2026,2030,2032,2033,203B,2103,2116,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,216A,216B,2190,2191,2192,2193,2208,220F,2211,221A,221D,221E,2220,2225,2227,2228,2229,222A,222B,222E,2234,2235,2236,2237,223D,2248,224C,2260,2261,2264,2265,226E,226F,2299,22A5,2312,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2474,2475,2476,2477,2478,2479,247A,247B,247C,247D,247E,247F,2480,2481,2482,2483,2484,2485,2486,2487,2488,2489,248A,248B,248C,248D,248E,248F,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,249A,249B,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,250A,250B,250C,250D,250E,250F,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,251A,251B,251C,251D,251E,251F,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,252A,252B,252C,252D,252E,252F,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,253A,253B,253C,253D,253E,253F,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,254A,254B,25A0,25A1,25B2,25B3,25C6,25C7,25CB,25CE,25CF,2605,2606,2640,2642,3000,3001,3002,3003,3005,3008,3009,300A,300B,300C,300D,300E,300F,3010,3011,3013,3014,3015,3016,3017,3041,3042,3043,3044,3045,3046,3047,3048,3049,304A,304B,304C,304D,304E,304F,3050,3051,3052,3053,3054,3055,3056,3057,3058,3059,305A,305B,305C,305D,305E,305F,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,306A,306B,306C,306D,306E,306F,3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,307A,307B,307C,307D,307E,307F,3080,3081,3082,3083,3084,3085,3086,3087,3088,3089,308A,308B,308C,308D,308E,308F,3090,3091,3092,3093,30A1,30A2,30A3,30A4,30A5,30A6,30A7,30A8,30A9,30AA,30AB,30AC,30AD,30AE,30AF,30B0,30B1,30B2,30B3,30B4,30B5,30B6,30B7,30B8,30B9,30BA,30BB,30BC,30BD,30BE,30BF,30C0,30C1,30C2,30C3,30C4,30C5,30C6,30C7,30C8,30C9,30CA,30CB,30CC,30CD,30CE,30CF,30D0,30D1,30D2,30D3,30D4,30D5,30D6,30D7,30D8,30D9,30DA,30DB,30DC,30DD,30DE,30DF,30E0,30E1,30E2,30E3,30E4,30E5,30E6,30E7,30E8,30E9,30EA,30EB,30EC,30ED,30EE,30EF,30F0,30F1,30F2,30F3,30F4,30F5,30F6,3105,3106,3107,3108,3109,310A,310B,310C,310D,310E,310F,3110,3111,3112,3113,3114,3115,3116,3117,3118,3119,311A,311B,311C,311D,311E,311F,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,4E00,4E01,4E03,4E07,4E08,4E09,4E0A,4E0B,4E0C,4E0D,4E0E,4E10,4E11,4E13,4E14,4E15,4E16,4E18,4E19,4E1A,4E1B,4E1C,4E1D,4E1E,4E22,4E24,4E25,4E27,4E28,4E2A,4E2B,4E2C,4E2D,4E30,4E32,4E34,4E36,4E38,4E39,4E3A,4E3B,4E3D,4E3E,4E3F,4E43,4E45,4E47,4E48,4E49,4E4B,4E4C,4E4D,4E4E,4E4F,4E50,4E52,4E53,4E54,4E56,4E58,4E59,4E5C,4E5D,4E5E,4E5F,4E60,4E61,4E66,4E69,4E70,4E71,4E73,4E7E,4E86,4E88,4E89,4E8B,4E8C,4E8D,4E8E,4E8F,4E91,4E92,4E93,4E94,4E95,4E98,4E9A,4E9B,4E9F,4EA0,4EA1,4EA2,4EA4,4EA5,4EA6,4EA7,4EA8,4EA9,4EAB,4EAC,4EAD,4EAE,4EB2,4EB3,4EB5,4EBA,4EBB,4EBF,4EC0,4EC1,4EC2,4EC3,4EC4,4EC5,4EC6,4EC7,4EC9,4ECA,4ECB,4ECD,4ECE,4ED1,4ED3,4ED4,4ED5,4ED6,4ED7,4ED8,4ED9,4EDD,4EDE,4EDF,4EE1,4EE3,4EE4,4EE5,4EE8,4EEA,4EEB,4EEC,4EF0,4EF2,4EF3,4EF5,4EF6,4EF7,4EFB,4EFD,4EFF,4F01,4F09,4F0A,4F0D,4F0E,4F0F,4F10,4F11,4F17,4F18,4F19,4F1A,4F1B,4F1E,4F1F,4F20,4F22,4F24,4F25,4F26,4F27,4F2A,4F2B,4F2F,4F30,4F32,4F34,4F36,4F38,4F3A,4F3C,4F3D,4F43,4F46,4F4D,4F4E,4F4F,4F50,4F51,4F53,4F55,4F57,4F58,4F59,4F5A,4F5B,4F5C,4F5D,4F5E,4F5F,4F60,4F63,4F64,4F65,4F67,4F69,4F6C,4F6F,4F70,4F73,4F74,4F76,4F7B,4F7C,4F7E,4F7F,4F83,4F84,4F88,4F89,4F8B,4F8D,4F8F,4F91,4F94,4F97,4F9B,4F9D,4FA0,4FA3,4FA5,4FA6,4FA7,4FA8,4FA9,4FAA,4FAC,4FAE,4FAF,4FB5,4FBF,4FC3,4FC4,4FC5,4FCA,4FCE,4FCF,4FD0,4FD1,4FD7,4FD8,4FDA,4FDC,4FDD,4FDE,4FDF,4FE1,4FE3,4FE6,4FE8,4FE9,4FEA,4FED,4FEE,4FEF,4FF1,4FF3,4FF8,4FFA,4FFE,500C,500D,500F,5012,5014,5018,5019,501A,501C,501F,5021,5025,5026,5028,5029,502A,502C,502D,502E,503A,503C,503E,5043,5047,5048,504C,504E,504F,5055,505A,505C,5065,506C,5076,5077,507B,507E,507F,5080,5085,5088,508D,50A3,50A5,50A7,50A8,50A9,50AC,50B2,50BA,50BB,50CF,50D6,50DA,50E6,50E7,50EC,50ED,50EE,50F3,50F5,50FB,5106,5107,510B,5112,5121,513F,5140,5141,5143,5144,5145,5146,5148,5149,514B,514D,5151,5154,5155,5156,515A,515C,5162,5165,5168,516B,516C,516D,516E,5170,5171,5173,5174,5175,5176,5177,5178,5179,517B,517C,517D,5180,5181,5182,5185,5188,5189,518C,518D,5192,5195,5196,5197,5199,519B,519C,51A0,51A2,51A4,51A5,51AB,51AC,51AF,51B0,51B1,51B2,51B3,51B5,51B6,51B7,51BB,51BC,51BD,51C0,51C4,51C6,51C7,51C9,51CB,51CC,51CF,51D1,51DB,51DD,51E0,51E1,51E4,51EB,51ED,51EF,51F0,51F3,51F5,51F6,51F8,51F9,51FA,51FB,51FC,51FD,51FF,5200,5201,5202,5203,5206,5207,5208,520A,520D,520E,5211,5212,5216,5217,5218,5219,521A,521B,521D,5220,5224,5228,5229,522B,522D,522E,5230,5233,5236,5237,5238,5239,523A,523B,523D,523F,5240,5241,5242,5243,524A,524C,524D,5250,5251,5254,5256,525C,525E,5261,5265,5267,5269,526A,526F,5272,527D,527F,5281,5282,5288,5290,5293,529B,529D,529E,529F,52A0,52A1,52A2,52A3,52A8,52A9,52AA,52AB,52AC,52AD,52B1,52B2,52B3,52BE,52BF,52C3,52C7,52C9,52CB,52D0,52D2,52D6,52D8,52DF,52E4,52F0,52F9,52FA,52FE,52FF,5300,5305,5306,5308,530D,530F,5310,5315,5316,5317,5319,531A,531D,5320,5321,5323,5326,532A,532E,5339,533A,533B,533E,533F,5341,5343,5345,5347,5348,5349,534A,534E,534F,5351,5352,5353,5355,5356,5357,535A,535C,535E,535F,5360,5361,5362,5363,5364,5366,5367,5369,536B,536E,536F,5370,5371,5373,5374,5375,5377,5378,537A,537F,5382,5384,5385,5386,5389,538B,538C,538D,5395,5398,539A,539D,539F,53A2,53A3,53A5,53A6,53A8,53A9,53AE,53B6,53BB,53BF,53C1,53C2,53C8,53C9,53CA,53CB,53CC,53CD,53D1,53D4,53D6,53D7,53D8,53D9,53DB,53DF,53E0,53E3,53E4,53E5,53E6,53E8,53E9,53EA,53EB,53EC,53ED,53EE,53EF,53F0,53F1,53F2,53F3,53F5,53F6,53F7,53F8,53F9,53FB,53FC,53FD,5401,5403,5404,5406,5408,5409,540A,540C,540D,540E,540F,5410,5411,5412,5413,5415,5416,5417,541B,541D,541E,541F,5420,5421,5423,5426,5427,5428,5429,542B,542C,542D,542E,542F,5431,5432,5434,5435,5438,5439,543B,543C,543E,5440,5443,5446,5448,544A,544B,5450,5452,5453,5454,5455,5456,5457,5458,5459,545B,545C,5462,5464,5466,5468,5471,5472,5473,5475,5476,5477,5478,547B,547C,547D,5480,5482,5484,5486,548B,548C,548E,548F,5490,5492,5494,5495,5496,5499,549A,549B,549D,54A3,54A4,54A6,54A7,54A8,54A9,54AA,54AB,54AC,54AD,54AF,54B1,54B3,54B4,54B8,54BB,54BD,54BF,54C0,54C1,54C2,54C4,54C6,54C7,54C8,54C9,54CC,54CD,54CE,54CF,54D0,54D1,54D2,54D3,54D4,54D5,54D7,54D9,54DA,54DC,54DD,54DE,54DF,54E5,54E6,54E7,54E8,54E9,54EA,54ED,54EE,54F2,54F3,54FA,54FC,54FD,54FF,5501,5506,5507,5509,550F,5510,5511,5514,551B,5520,5522,5523,5524,5527,552A,552C,552E,552F,5530,5531,5533,5537,553C,553E,553F,5541,5543,5544,5546,5549,554A,5550,5555,5556,555C,5561,5564,5565,5566,5567,556A,556C,556D,556E,5575,5576,5577,5578,557B,557C,557E,5580,5581,5582,5583,5584,5587,5588,5589,558A,558B,558F,5591,5594,5598,5599,559C,559D,559F,55A7,55B1,55B3,55B5,55B7,55B9,55BB,55BD,55BE,55C4,55C5,55C9,55CC,55CD,55D1,55D2,55D3,55D4,55D6,55DC,55DD,55DF,55E1,55E3,55E4,55E5,55E6,55E8,55EA,55EB,55EC,55EF,55F2,55F3,55F5,55F7,55FD,55FE,5600,5601,5608,5609,560C,560E,560F,5618,561B,561E,561F,5623,5624,5627,562C,562D,5631,5632,5634,5636,5639,563B,563F,564C,564D,564E,5654,5657,5658,5659,565C,5662,5664,5668,5669,566A,566B,566C,5671,5676,567B,567C,5685,5686,568E,568F,5693,56A3,56AF,56B7,56BC,56CA,56D4,56D7,56DA,56DB,56DD,56DE,56DF,56E0,56E1,56E2,56E4,56EB,56ED,56F0,56F1,56F4,56F5,56F9,56FA,56FD,56FE,56FF,5703,5704,5706,5708,5709,570A,571C,571F,5723,5728,5729,572A,572C,572D,572E,572F,5730,5733,5739,573A,573B,573E,5740,5742,5747,574A,574C,574D,574E,574F,5750,5751,5757,575A,575B,575C,575D,575E,575F,5760,5761,5764,5766,5768,5769,576A,576B,576D,576F,5773,5776,5777,577B,577C,5782,5783,5784,5785,5786,578B,578C,5792,5793,579B,57A0,57A1,57A2,57A3,57A4,57A6,57A7,57A9,57AB,57AD,57AE,57B2,57B4,57B8,57C2,57C3,57CB,57CE,57CF,57D2,57D4,57D5,57D8,57D9,57DA,57DD,57DF,57E0,57E4,57ED,57EF,57F4,57F8,57F9,57FA,57FD,5800,5802,5806,5807,580B,580D,5811,5815,5819,581E,5820,5821,5824,582A,5830,5835,5844,584C,584D,5851,5854,5858,585E,5865,586B,586C,587E,5880,5881,5883,5885,5889,5892,5893,5899,589A,589E,589F,58A8,58A9,58BC,58C1,58C5,58D1,58D5,58E4,58EB,58EC,58EE,58F0,58F3,58F6,58F9,5902,5904,5907,590D,590F,5914,5915,5916,5919,591A,591C,591F,5924,5925,5927,5929,592A,592B,592D,592E,592F,5931,5934,5937,5938,5939,593A,593C,5941,5942,5944,5947,5948,5949,594B,594E,594F,5951,5954,5955,5956,5957,5958,595A,5960,5962,5965,5973,5974,5976,5978,5979,597D,5981,5982,5983,5984,5986,5987,5988,598A,598D,5992,5993,5996,5997,5999,599E,59A3,59A4,59A5,59A8,59A9,59AA,59AB,59AE,59AF,59B2,59B9,59BB,59BE,59C6,59CA,59CB,59D0,59D1,59D2,59D3,59D4,59D7,59D8,59DA,59DC,59DD,59E3,59E5,59E8,59EC,59F9,59FB,59FF,5A01,5A03,5A04,5A05,5A06,5A07,5A08,5A09,5A0C,5A11,5A13,5A18,5A1C,5A1F,5A20,5A23,5A25,5A29,5A31,5A32,5A34,5A36,5A3C,5A40,5A46,5A49,5A4A,5A55,5A5A,5A62,5A67,5A6A,5A74,5A75,5A76,5A77,5A7A,5A7F,5A92,5A9A,5A9B,5AAA,5AB2,5AB3,5AB5,5AB8,5ABE,5AC1,5AC2,5AC9,5ACC,5AD2,5AD4,5AD6,5AD8,5ADC,5AE0,5AE1,5AE3,5AE6,5AE9,5AEB,5AF1,5B09,5B16,5B17,5B32,5B34,5B37,5B40,5B50,5B51,5B53,5B54,5B55,5B57,5B58,5B59,5B5A,5B5B,5B5C,5B5D,5B5F,5B62,5B63,5B64,5B65,5B66,5B69,5B6A,5B6C,5B70,5B71,5B73,5B75,5B7A,5B7D,5B80,5B81,5B83,5B84,5B85,5B87,5B88,5B89,5B8B,5B8C,5B8F,5B93,5B95,5B97,5B98,5B99,5B9A,5B9B,5B9C,5B9D,5B9E,5BA0,5BA1,5BA2,5BA3,5BA4,5BA5,5BA6,5BAA,5BAB,5BB0,5BB3,5BB4,5BB5,5BB6,5BB8,5BB9,5BBD,5BBE,5BBF,5BC2,5BC4,5BC5,5BC6,5BC7,5BCC,5BD0,5BD2,5BD3,5BDD,5BDE,5BDF,5BE1,5BE4,5BE5,5BE8,5BEE,5BF0,5BF8,5BF9,5BFA,5BFB,5BFC,5BFF,5C01,5C04,5C06,5C09,5C0A,5C0F,5C11,5C14,5C15,5C16,5C18,5C1A,5C1C,5C1D,5C22,5C24,5C25,5C27,5C2C,5C31,5C34,5C38,5C39,5C3A,5C3B,5C3C,5C3D,5C3E,5C3F,5C40,5C41,5C42,5C45,5C48,5C49,5C4A,5C4B,5C4E,5C4F,5C50,5C51,5C55,5C59,5C5E,5C60,5C61,5C63,5C65,5C66,5C6E,5C6F,5C71,5C79,5C7A,5C7F,5C81,5C82,5C88,5C8C,5C8D,5C90,5C91,5C94,5C96,5C97,5C98,5C99,5C9A,5C9B,5C9C,5CA2,5CA3,5CA9,5CAB,5CAC,5CAD,5CB1,5CB3,5CB5,5CB7,5CB8,5CBD,5CBF,5CC1,5CC4,5CCB,5CD2,5CD9,5CE1,5CE4,5CE5,5CE6,5CE8,5CEA,5CED,5CF0,5CFB,5D02,5D03,5D06,5D07,5D0E,5D14,5D16,5D1B,5D1E,5D24,5D26,5D27,5D29,5D2D,5D2E,5D34,5D3D,5D3E,5D47,5D4A,5D4B,5D4C,5D58,5D5B,5D5D,5D69,5D6B,5D6C,5D6F,5D74,5D82,5D99,5D9D,5DB7,5DC5,5DCD,5DDB,5DDD,5DDE,5DE1,5DE2,5DE5,5DE6,5DE7,5DE8,5DE9,5DEB,5DEE,5DEF,5DF1,5DF2,5DF3,5DF4,5DF7,5DFD,5DFE,5E01,5E02,5E03,5E05,5E06,5E08,5E0C,5E0F,5E10,5E11,5E14,5E15,5E16,5E18,5E19,5E1A,5E1B,5E1C,5E1D,5E26,5E27,5E2D,5E2E,5E31,5E37,5E38,5E3B,5E3C,5E3D,5E42,5E44,5E45,5E4C,5E54,5E55,5E5B,5E5E,5E61,5E62,5E72,5E73,5E74,5E76,5E78,5E7A,5E7B,5E7C,5E7D,5E7F,5E80,5E84,5E86,5E87,5E8A,5E8B,5E8F,5E90,5E91,5E93,5E94,5E95,5E96,5E97,5E99,5E9A,5E9C,5E9E,5E9F,5EA0,5EA5,5EA6,5EA7,5EAD,5EB3,5EB5,5EB6,5EB7,5EB8,5EB9,5EBE,5EC9,5ECA,5ED1,5ED2,5ED3,5ED6,5EDB,5EE8,5EEA,5EF4,5EF6,5EF7,5EFA,5EFE,5EFF,5F00,5F01,5F02,5F03,5F04,5F08,5F0A,5F0B,5F0F,5F11,5F13,5F15,5F17,5F18,5F1B,5F1F,5F20,5F25,5F26,5F27,5F29,5F2A,5F2D,5F2F,5F31,5F39,5F3A,5F3C,5F40,5F50,5F52,5F53,5F55,5F56,5F57,5F58,5F5D,5F61,5F62,5F64,5F66,5F69,5F6A,5F6C,5F6D,5F70,5F71,5F73,5F77,5F79,5F7B,5F7C,5F80,5F81,5F82,5F84,5F85,5F87,5F88,5F89,5F8A,5F8B,5F8C,5F90,5F92,5F95,5F97,5F98,5F99,5F9C,5FA1,5FA8,5FAA,5FAD,5FAE,5FB5,5FB7,5FBC,5FBD,5FC3,5FC4,5FC5,5FC6,5FC9,5FCC,5FCD,5FCF,5FD0,5FD1,5FD2,5FD6,5FD7,5FD8,5FD9,5FDD,5FE0,5FE1,5FE4,5FE7,5FEA,5FEB,5FED,5FEE,5FF1,5FF5,5FF8,5FFB,5FFD,5FFE,5FFF,6000,6001,6002,6003,6004,6005,6006,600A,600D,600E,600F,6012,6014,6015,6016,6019,601B,601C,601D,6020,6021,6025,6026,6027,6028,6029,602A,602B,602F,6035,603B,603C,603F,6041,6042,6043,604B,604D,6050,6052,6055,6059,605A,605D,6062,6063,6064,6067,6068,6069,606A,606B,606C,606D,606F,6070,6073,6076,6078,6079,607A,607B,607C,607D,607F,6083,6084,6089,608C,608D,6092,6094,6096,609A,609B,609D,609F,60A0,60A3,60A6,60A8,60AB,60AC,60AD,60AF,60B1,60B2,60B4,60B8,60BB,60BC,60C5,60C6,60CA,60CB,60D1,60D5,60D8,60DA,60DC,60DD,60DF,60E0,60E6,60E7,60E8,60E9,60EB,60EC,60ED,60EE,60EF,60F0,60F3,60F4,60F6,60F9,60FA,6100,6101,6106,6108,6109,610D,610E,610F,6115,611A,611F,6120,6123,6124,6126,6127,612B,613F,6148,614A,614C,614E,6151,6155,615D,6162,6167,6168,6170,6175,6177,618B,618E,6194,619D,61A7,61A8,61A9,61AC,61B7,61BE,61C2,61C8,61CA,61CB,61D1,61D2,61D4,61E6,61F5,61FF,6206,6208,620A,620B,620C,620D,620E,620F,6210,6211,6212,6215,6216,6217,6218,621A,621B,621F,6221,6222,6224,6225,622A,622C,622E,6233,6234,6237,623D,623E,623F,6240,6241,6243,6247,6248,6249,624B,624C,624D,624E,6251,6252,6253,6254,6258,625B,6263,6266,6267,6269,626A,626B,626C,626D,626E,626F,6270,6273,6276,6279,627C,627E,627F,6280,6284,6289,628A,6291,6292,6293,6295,6296,6297,6298,629A,629B,629F,62A0,62A1,62A2,62A4,62A5,62A8,62AB,62AC,62B1,62B5,62B9,62BB,62BC,62BD,62BF,62C2,62C4,62C5,62C6,62C7,62C8,62C9,62CA,62CC,62CD,62CE,62D0,62D2,62D3,62D4,62D6,62D7,62D8,62D9,62DA,62DB,62DC,62DF,62E2,62E3,62E5,62E6,62E7,62E8,62E9,62EC,62ED,62EE,62EF,62F1,62F3,62F4,62F6,62F7,62FC,62FD,62FE,62FF,6301,6302,6307,6308,6309,630E,6311,6316,631A,631B,631D,631E,631F,6320,6321,6322,6323,6324,6325,6328,632A,632B,632F,6332,6339,633A,633D,6342,6343,6345,6346,6349,634B,634C,634D,634E,634F,6350,6355,635E,635F,6361,6362,6363,6367,6369,636D,636E,6371,6376,6377,637A,637B,6380,6382,6387,6388,6389,638A,638C,638E,638F,6390,6392,6396,6398,63A0,63A2,63A3,63A5,63A7,63A8,63A9,63AA,63AC,63AD,63AE,63B0,63B3,63B4,63B7,63B8,63BA,63BC,63BE,63C4,63C6,63C9,63CD,63CE,63CF,63D0,63D2,63D6,63DE,63E0,63E1,63E3,63E9,63EA,63ED,63F2,63F4,63F6,63F8,63FD,63FF,6400,6401,6402,6405,640B,640C,640F,6410,6413,6414,641B,641C,641E,6420,6421,6426,642A,642C,642D,6434,643A,643D,643F,6441,6444,6445,6446,6447,6448,644A,6452,6454,6458,645E,6467,6469,646D,6478,6479,647A,6482,6484,6485,6487,6491,6492,6495,6496,6499,649E,64A4,64A9,64AC,64AD,64AE,64B0,64B5,64B7,64B8,64BA,64BC,64C0,64C2,64C5,64CD,64CE,64D0,64D2,64D7,64D8,64DE,64E2,64E4,64E6,6500,6509,6512,6518,6525,652B,652E,652F,6534,6535,6536,6538,6539,653B,653E,653F,6545,6548,6549,654C,654F,6551,6555,6556,6559,655B,655D,655E,6562,6563,6566,656B,656C,6570,6572,6574,6577,6587,658B,658C,6590,6591,6593,6597,6599,659B,659C,659F,65A1,65A4,65A5,65A7,65A9,65AB,65AD,65AF,65B0,65B9,65BC,65BD,65C1,65C3,65C4,65C5,65C6,65CB,65CC,65CE,65CF,65D2,65D6,65D7,65E0,65E2,65E5,65E6,65E7,65E8,65E9,65EC,65ED,65EE,65EF,65F0,65F1,65F6,65F7,65FA,6600,6602,6603,6606,660A,660C,660E,660F,6613,6614,6615,6619,661D,661F,6620,6625,6627,6628,662D,662F,6631,6634,6635,6636,663C,663E,6641,6643,664B,664C,664F,6652,6653,6654,6655,6656,6657,665A,665F,6661,6664,6666,6668,666E,666F,6670,6674,6676,6677,667A,667E,6682,6684,6687,668C,6691,6696,6697,669D,66A7,66A8,66AE,66B4,66B9,66BE,66D9,66DB,66DC,66DD,66E6,66E9,66F0,66F2,66F3,66F4,66F7,66F9,66FC,66FE,66FF,6700,6708,6709,670A,670B,670D,6710,6714,6715,6717,671B,671D,671F,6726,6728,672A,672B,672C,672D,672F,6731,6734,6735,673A,673D,6740,6742,6743,6746,6748,6749,674C,674E,674F,6750,6751,6753,6756,675C,675E,675F,6760,6761,6765,6768,6769,676A,676D,676F,6770,6772,6773,6775,6777,677C,677E,677F,6781,6784,6787,6789,678B,6790,6795,6797,6798,679A,679C,679D,679E,67A2,67A3,67A5,67A7,67A8,67AA,67AB,67AD,67AF,67B0,67B3,67B5,67B6,67B7,67B8,67C1,67C3,67C4,67CF,67D0,67D1,67D2,67D3,67D4,67D8,67D9,67DA,67DC,67DD,67DE,67E0,67E2,67E5,67E9,67EC,67EF,67F0,67F1,67F3,67F4,67FD,67FF,6800,6805,6807,6808,6809,680A,680B,680C,680E,680F,6811,6813,6816,6817,681D,6821,6829,682A,6832,6833,6837,6838,6839,683C,683D,683E,6840,6841,6842,6843,6844,6845,6846,6848,6849,684A,684C,684E,6850,6851,6853,6854,6855,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,686B,6874,6876,6877,6881,6883,6885,6886,688F,6893,6897,68A2,68A6,68A7,68A8,68AD,68AF,68B0,68B3,68B5,68C0,68C2,68C9,68CB,68CD,68D2,68D5,68D8,68DA,68E0,68E3,68EE,68F0,68F1,68F5,68F9,68FA,68FC,6901,6905,690B,690D,690E,6910,6912,691F,6920,6924,692D,6930,6934,6939,693D,693F,6942,6954,6957,695A,695D,695E,6960,6963,6966,696B,696E,6971,6977,6978,6979,697C,6980,6982,6984,6986,6987,6988,6989,698D,6994,6995,6998,699B,699C,69A7,69A8,69AB,69AD,69B1,69B4,69B7,69BB,69C1,69CA,69CC,69CE,69D0,69D4,69DB,69DF,69E0,69ED,69F2,69FD,69FF,6A0A,6A17,6A18,6A1F,6A21,6A28,6A2A,6A2F,6A31,6A35,6A3D,6A3E,6A44,6A47,6A50,6A58,6A59,6A5B,6A61,6A65,6A71,6A79,6A7C,6A80,6A84,6A8E,6A90,6A91,6A97,6AA0,6AA9,6AAB,6AAC,6B20,6B21,6B22,6B23,6B24,6B27,6B32,6B37,6B39,6B3A,6B3E,6B43,6B46,6B47,6B49,6B4C,6B59,6B62,6B63,6B64,6B65,6B66,6B67,6B6A,6B79,6B7B,6B7C,6B81,6B82,6B83,6B84,6B86,6B87,6B89,6B8A,6B8B,6B8D,6B92,6B93,6B96,6B9A,6B9B,6BA1,6BAA,6BB3,6BB4,6BB5,6BB7,6BBF,6BC1,6BC2,6BC5,6BCB,6BCD,6BCF,6BD2,6BD3,6BD4,6BD5,6BD6,6BD7,6BD9,6BDB,6BE1,6BEA,6BEB,6BEF,6BF3,6BF5,6BF9,6BFD,6C05,6C06,6C07,6C0D,6C0F,6C10,6C11,6C13,6C14,6C15,6C16,6C18,6C19,6C1A,6C1B,6C1F,6C21,6C22,6C24,6C26,6C27,6C28,6C29,6C2A,6C2E,6C2F,6C30,6C32,6C34,6C35,6C38,6C3D,6C40,6C41,6C42,6C46,6C47,6C49,6C4A,6C50,6C54,6C55,6C57,6C5B,6C5C,6C5D,6C5E,6C5F,6C60,6C61,6C64,6C68,6C69,6C6A,6C70,6C72,6C74,6C76,6C79,6C7D,6C7E,6C81,6C82,6C83,6C85,6C86,6C88,6C89,6C8C,6C8F,6C90,6C93,6C94,6C99,6C9B,6C9F,6CA1,6CA3,6CA4,6CA5,6CA6,6CA7,6CA9,6CAA,6CAB,6CAD,6CAE,6CB1,6CB2,6CB3,6CB8,6CB9,6CBB,6CBC,6CBD,6CBE,6CBF,6CC4,6CC5,6CC9,6CCA,6CCC,6CD0,6CD3,6CD4,6CD5,6CD6,6CD7,6CDB,6CDE,6CE0,6CE1,6CE2,6CE3,6CE5,6CE8,6CEA,6CEB,6CEE,6CEF,6CF0,6CF1,6CF3,6CF5,6CF6,6CF7,6CF8,6CFA,6CFB,6CFC,6CFD,6CFE,6D01,6D04,6D07,6D0B,6D0C,6D0E,6D12,6D17,6D19,6D1A,6D1B,6D1E,6D25,6D27,6D2A,6D2B,6D2E,6D31,6D32,6D33,6D35,6D39,6D3B,6D3C,6D3D,6D3E,6D41,6D43,6D45,6D46,6D47,6D48,6D4A,6D4B,6D4D,6D4E,6D4F,6D51,6D52,6D53,6D54,6D59,6D5A,6D5C,6D5E,6D60,6D63,6D66,6D69,6D6A,6D6E,6D6F,6D74,6D77,6D78,6D7C,6D82,6D85,6D88,6D89,6D8C,6D8E,6D91,6D93,6D94,6D95,6D9B,6D9D,6D9E,6D9F,6DA0,6DA1,6DA3,6DA4,6DA6,6DA7,6DA8,6DA9,6DAA,6DAB,6DAE,6DAF,6DB2,6DB5,6DB8,6DBF,6DC0,6DC4,6DC5,6DC6,6DC7,6DCB,6DCC,6DD1,6DD6,6DD8,6DD9,6DDD,6DDE,6DE0,6DE1,6DE4,6DE6,6DEB,6DEC,6DEE,6DF1,6DF3,6DF7,6DF9,6DFB,6DFC,6E05,6E0A,6E0C,6E0D,6E0E,6E10,6E11,6E14,6E16,6E17,6E1A,6E1D,6E20,6E21,6E23,6E24,6E25,6E29,6E2B,6E2D,6E2F,6E32,6E34,6E38,6E3A,6E43,6E44,6E4D,6E4E,6E53,6E54,6E56,6E58,6E5B,6E5F,6E6B,6E6E,6E7E,6E7F,6E83,6E85,6E86,6E89,6E8F,6E90,6E98,6E9C,6E9F,6EA2,6EA5,6EA7,6EAA,6EAF,6EB1,6EB2,6EB4,6EB6,6EB7,6EBA,6EBB,6EBD,6EC1,6EC2,6EC7,6ECB,6ECF,6ED1,6ED3,6ED4,6ED5,6ED7,6EDA,6EDE,6EDF,6EE0,6EE1,6EE2,6EE4,6EE5,6EE6,6EE8,6EE9,6EF4,6EF9,6F02,6F06,6F09,6F0F,6F13,6F14,6F15,6F20,6F24,6F29,6F2A,6F2B,6F2D,6F2F,6F31,6F33,6F36,6F3E,6F46,6F47,6F4B,6F4D,6F58,6F5C,6F5E,6F62,6F66,6F6D,6F6E,6F72,6F74,6F78,6F7A,6F7C,6F84,6F88,6F89,6F8C,6F8D,6F8E,6F9C,6FA1,6FA7,6FB3,6FB6,6FB9,6FC0,6FC2,6FC9,6FD1,6FD2,6FDE,6FE0,6FE1,6FEE,6FEF,7011,701A,701B,7023,7035,7039,704C,704F,705E,706B,706C,706D,706F,7070,7075,7076,7078,707C,707E,707F,7080,7085,7089,708A,708E,7092,7094,7095,7096,7099,709C,709D,70AB,70AC,70AD,70AE,70AF,70B1,70B3,70B7,70B8,70B9,70BB,70BC,70BD,70C0,70C1,70C2,70C3,70C8,70CA,70D8,70D9,70DB,70DF,70E4,70E6,70E7,70E8,70E9,70EB,70EC,70ED,70EF,70F7,70F9,70FD,7109,710A,7110,7113,7115,7116,7118,7119,711A,7126,712F,7130,7131,7136,7145,714A,714C,714E,715C,715E,7164,7166,7167,7168,716E,7172,7173,7178,717A,717D,7184,718A,718F,7194,7198,7199,719F,71A0,71A8,71AC,71B3,71B5,71B9,71C3,71CE,71D4,71D5,71E0,71E5,71E7,71EE,71F9,7206,721D,7228,722A,722C,7230,7231,7235,7236,7237,7238,7239,723B,723D,723F,7247,7248,724C,724D,7252,7256,7259,725B,725D,725F,7261,7262,7266,7267,7269,726E,726F,7272,7275,7279,727A,727E,727F,7280,7281,7284,728A,728B,728D,728F,7292,729F,72AC,72AD,72AF,72B0,72B4,72B6,72B7,72B8,72B9,72C1,72C2,72C3,72C4,72C8,72CD,72CE,72D0,72D2,72D7,72D9,72DE,72E0,72E1,72E8,72E9,72EC,72ED,72EE,72EF,72F0,72F1,72F2,72F3,72F4,72F7,72F8,72FA,72FB,72FC,7301,7303,730A,730E,7313,7315,7316,7317,731B,731C,731D,731E,7321,7322,7325,7329,732A,732B,732C,732E,7331,7334,7337,7338,7339,733E,733F,734D,7350,7352,7357,7360,736C,736D,736F,737E,7384,7387,7389,738B,738E,7391,7396,739B,739F,73A2,73A9,73AB,73AE,73AF,73B0,73B2,73B3,73B7,73BA,73BB,73C0,73C2,73C8,73C9,73CA,73CD,73CF,73D0,73D1,73D9,73DE,73E0,73E5,73E7,73E9,73ED,73F2,7403,7405,7406,7409,740A,740F,7410,741A,741B,7422,7425,7426,7428,742A,742C,742E,7430,7433,7434,7435,7436,743C,7441,7455,7457,7459,745A,745B,745C,745E,745F,746D,7470,7476,7477,747E,7480,7481,7483,7487,748B,748E,7490,749C,749E,74A7,74A8,74A9,74BA,74D2,74DC,74DE,74E0,74E2,74E3,74E4,74E6,74EE,74EF,74F4,74F6,74F7,74FF,7504,750D,750F,7511,7513,7518,7519,751A,751C,751F,7525,7528,7529,752B,752C,752D,752F,7530,7531,7532,7533,7535,7537,7538,753A,753B,753E,7540,7545,7548,754B,754C,754E,754F,7554,7559,755A,755B,755C,7565,7566,756A,7572,7574,7578,7579,757F,7583,7586,758B,758F,7591,7592,7594,7596,7597,7599,759A,759D,759F,75A0,75A1,75A3,75A4,75A5,75AB,75AC,75AE,75AF,75B0,75B1,75B2,75B3,75B4,75B5,75B8,75B9,75BC,75BD,75BE,75C2,75C3,75C4,75C5,75C7,75C8,75C9,75CA,75CD,75D2,75D4,75D5,75D6,75D8,75DB,75DE,75E2,75E3,75E4,75E6,75E7,75E8,75EA,75EB,75F0,75F1,75F4,75F9,75FC,75FF,7600,7601,7603,7605,760A,760C,7610,7615,7617,7618,7619,761B,761F,7620,7622,7624,7625,7626,7629,762A,762B,762D,7630,7633,7634,7635,7638,763C,763E,763F,7640,7643,764C,764D,7654,7656,765C,765E,7663,766B,766F,7678,767B,767D,767E,7682,7684,7686,7687,7688,768B,768E,7691,7693,7696,7699,76A4,76AE,76B1,76B2,76B4,76BF,76C2,76C5,76C6,76C8,76CA,76CD,76CE,76CF,76D0,76D1,76D2,76D4,76D6,76D7,76D8,76DB,76DF,76E5,76EE,76EF,76F1,76F2,76F4,76F8,76F9,76FC,76FE,7701,7704,7707,7708,7709,770B,770D,7719,771A,771F,7720,7722,7726,7728,7729,772D,772F,7735,7736,7737,7738,773A,773C,7740,7741,7743,7747,7750,7751,775A,775B,7761,7762,7763,7765,7766,7768,776B,776C,7779,777D,777E,777F,7780,7784,7785,778C,778D,778E,7791,7792,779F,77A0,77A2,77A5,77A7,77A9,77AA,77AC,77B0,77B3,77B5,77BB,77BD,77BF,77CD,77D7,77DB,77DC,77E2,77E3,77E5,77E7,77E9,77EB,77EC,77ED,77EE,77F3,77F6,77F8,77FD,77FE,77FF,7800,7801,7802,7809,780C,780D,7811,7812,7814,7816,7817,7818,781A,781C,781D,781F,7823,7825,7826,7827,7829,782C,782D,7830,7834,7837,7838,7839,783A,783B,783C,783E,7840,7845,7847,784C,784E,7850,7852,7855,7856,7857,785D,786A,786B,786C,786D,786E,7877,787C,7887,7889,788C,788D,788E,7891,7893,7897,7898,789A,789B,789C,789F,78A1,78A3,78A5,78A7,78B0,78B1,78B2,78B3,78B4,78B9,78BE,78C1,78C5,78C9,78CA,78CB,78D0,78D4,78D5,78D9,78E8,78EC,78F2,78F4,78F7,78FA,7901,7905,7913,791E,7924,7934,793A,793B,793C,793E,7940,7941,7946,7948,7949,7953,7956,7957,795A,795B,795C,795D,795E,795F,7960,7962,7965,7967,7968,796D,796F,7977,7978,797A,7980,7981,7984,7985,798A,798F,799A,79A7,79B3,79B9,79BA,79BB,79BD,79BE,79C0,79C1,79C3,79C6,79C9,79CB,79CD,79D1,79D2,79D5,79D8,79DF,79E3,79E4,79E6,79E7,79E9,79EB,79ED,79EF,79F0,79F8,79FB,79FD,7A00,7A02,7A03,7A06,7A0B,7A0D,7A0E,7A14,7A17,7A1A,7A1E,7A20,7A23,7A33,7A37,7A39,7A3B,7A3C,7A3D,7A3F,7A46,7A51,7A57,7A70,7A74,7A76,7A77,7A78,7A79,7A7A,7A7F,7A80,7A81,7A83,7A84,7A86,7A88,7A8D,7A91,7A92,7A95,7A96,7A97,7A98,7A9C,7A9D,7A9F,7AA0,7AA5,7AA6,7AA8,7AAC,7AAD,7AB3,7ABF,7ACB,7AD6,7AD9,7ADE,7ADF,7AE0,7AE3,7AE5,7AE6,7AED,7AEF,7AF9,7AFA,7AFD,7AFF,7B03,7B04,7B06,7B08,7B0A,7B0B,7B0F,7B11,7B14,7B15,7B19,7B1B,7B1E,7B20,7B24,7B25,7B26,7B28,7B2A,7B2B,7B2C,7B2E,7B31,7B33,7B38,7B3A,7B3C,7B3E,7B45,7B47,7B49,7B4B,7B4C,7B4F,7B50,7B51,7B52,7B54,7B56,7B58,7B5A,7B5B,7B5D,7B60,7B62,7B6E,7B71,7B72,7B75,7B77,7B79,7B7B,7B7E,7B80,7B85,7B8D,7B90,7B94,7B95,7B97,7B9C,7B9D,7BA1,7BA2,7BA6,7BA7,7BA8,7BA9,7BAA,7BAB,7BAC,7BAD,7BB1,7BB4,7BB8,7BC1,7BC6,7BC7,7BCC,7BD1,7BD3,7BD9,7BDA,7BDD,7BE1,7BE5,7BE6,7BEA,7BEE,7BF1,7BF7,7BFC,7BFE,7C07,7C0B,7C0C,7C0F,7C16,7C1F,7C26,7C27,7C2A,7C38,7C3F,7C40,7C41,7C4D,7C73,7C74,7C7B,7C7C,7C7D,7C89,7C91,7C92,7C95,7C97,7C98,7C9C,7C9D,7C9E,7C9F,7CA2,7CA4,7CA5,7CAA,7CAE,7CB1,7CB2,7CB3,7CB9,7CBC,7CBD,7CBE,7CC1,7CC5,7CC7,7CC8,7CCA,7CCC,7CCD,7CD5,7CD6,7CD7,7CD9,7CDC,7CDF,7CE0,7CE8,7CEF,7CF8,7CFB,7D0A,7D20,7D22,7D27,7D2B,7D2F,7D6E,7D77,7DA6,7DAE,7E3B,7E41,7E47,7E82,7E9B,7E9F,7EA0,7EA1,7EA2,7EA3,7EA4,7EA5,7EA6,7EA7,7EA8,7EA9,7EAA,7EAB,7EAC,7EAD,7EAF,7EB0,7EB1,7EB2,7EB3,7EB5,7EB6,7EB7,7EB8,7EB9,7EBA,7EBD,7EBE,7EBF,7EC0,7EC1,7EC2,7EC3,7EC4,7EC5,7EC6,7EC7,7EC8,7EC9,7ECA,7ECB,7ECC,7ECD,7ECE,7ECF,7ED0,7ED1,7ED2,7ED3,7ED4,7ED5,7ED7,7ED8,7ED9,7EDA,7EDB,7EDC,7EDD,7EDE,7EDF,7EE0,7EE1,7EE2,7EE3,7EE5,7EE6,7EE7,7EE8,7EE9,7EEA,7EEB,7EED,7EEE,7EEF,7EF0,7EF1,7EF2,7EF3,7EF4,7EF5,7EF6,7EF7,7EF8,7EFA,7EFB,7EFC,7EFD,7EFE,7EFF,7F00,7F01,7F02,7F03,7F04,7F05,7F06,7F07,7F08,7F09,7F0B,7F0C,7F0D,7F0E,7F0F,7F11,7F12,7F13,7F14,7F15,7F16,7F17,7F18,7F19,7F1A,7F1B,7F1C,7F1D,7F1F,7F20,7F21,7F22,7F23,7F24,7F25,7F26,7F27,7F28,7F29,7F2A,7F2B,7F2C,7F2D,7F2E,7F2F,7F30,7F31,7F32,7F33,7F34,7F35,7F36,7F38,7F3A,7F42,7F44,7F45,7F50,7F51,7F54,7F55,7F57,7F58,7F5A,7F5F,7F61,7F62,7F68,7F69,7F6A,7F6E,7F71,7F72,7F74,7F79,7F7E,7F81,7F8A,7F8C,7F8E,7F94,7F9A,7F9D,7F9E,7F9F,7FA1,7FA4,7FA7,7FAF,7FB0,7FB2,7FB8,7FB9,7FBC,7FBD,7FBF,7FC1,7FC5,7FCA,7FCC,7FCE,7FD4,7FD5,7FD8,7FDF,7FE0,7FE1,7FE5,7FE6,7FE9,7FEE,7FF0,7FF1,7FF3,7FFB,7FFC,8000,8001,8003,8004,8005,8006,800B,800C,800D,8010,8012,8014,8015,8016,8017,8018,8019,801C,8020,8022,8025,8026,8027,8028,8029,802A,8031,8033,8035,8036,8037,8038,803B,803D,803F,8042,8043,8046,804A,804B,804C,804D,8052,8054,8058,805A,8069,806A,8071,807F,8080,8083,8084,8086,8087,8089,808B,808C,8093,8096,8098,809A,809B,809C,809D,809F,80A0,80A1,80A2,80A4,80A5,80A9,80AA,80AB,80AD,80AE,80AF,80B1,80B2,80B4,80B7,80BA,80BC,80BD,80BE,80BF,80C0,80C1,80C2,80C3,80C4,80C6,80CC,80CD,80CE,80D6,80D7,80D9,80DA,80DB,80DC,80DD,80DE,80E1,80E4,80E5,80E7,80E8,80E9,80EA,80EB,80EC,80ED,80EF,80F0,80F1,80F2,80F3,80F4,80F6,80F8,80FA,80FC,80FD,8102,8106,8109,810A,810D,810E,810F,8110,8111,8112,8113,8114,8116,8118,811A,811E,812C,812F,8131,8132,8136,8138,813E,8146,8148,814A,814B,814C,8150,8151,8153,8154,8155,8159,815A,8160,8165,8167,8169,816D,816E,8170,8171,8174,8179,817A,817B,817C,817D,817E,817F,8180,8182,8188,818A,818F,8191,8198,819B,819C,819D,81A3,81A6,81A8,81AA,81B3,81BA,81BB,81C0,81C1,81C2,81C3,81C6,81CA,81CC,81E3,81E7,81EA,81EC,81ED,81F3,81F4,81FB,81FC,81FE,8200,8201,8202,8204,8205,8206,820C,820D,8210,8212,8214,821B,821C,821E,821F,8221,8222,8223,8228,822A,822B,822C,822D,822F,8230,8231,8233,8234,8235,8236,8237,8238,8239,823B,823E,8244,8247,8249,824B,824F,8258,825A,825F,8268,826E,826F,8270,8272,8273,8274,8279,827A,827D,827E,827F,8282,8284,8288,828A,828B,828D,828E,828F,8291,8292,8297,8298,8299,829C,829D,829F,82A1,82A4,82A5,82A6,82A8,82A9,82AA,82AB,82AC,82AD,82AE,82AF,82B0,82B1,82B3,82B4,82B7,82B8,82B9,82BD,82BE,82C1,82C4,82C7,82C8,82CA,82CB,82CC,82CD,82CE,82CF,82D1,82D2,82D3,82D4,82D5,82D7,82D8,82DB,82DC,82DE,82DF,82E0,82E1,82E3,82E4,82E5,82E6,82EB,82EF,82F1,82F4,82F7,82F9,82FB,8301,8302,8303,8304,8305,8306,8307,8308,8309,830C,830E,830F,8311,8314,8315,8317,831A,831B,831C,8327,8328,832B,832C,832D,832F,8331,8333,8334,8335,8336,8338,8339,833A,833C,8340,8343,8346,8347,8349,834F,8350,8351,8352,8354,835A,835B,835C,835E,835F,8360,8361,8363,8364,8365,8366,8367,8368,8369,836A,836B,836C,836D,836E,836F,8377,8378,837B,837C,837D,8385,8386,8389,838E,8392,8393,8398,839B,839C,839E,83A0,83A8,83A9,83AA,83AB,83B0,83B1,83B2,83B3,83B4,83B6,83B7,83B8,83B9,83BA,83BC,83BD,83C0,83C1,83C5,83C7,83CA,83CC,83CF,83D4,83D6,83D8,83DC,83DD,83DF,83E0,83E1,83E5,83E9,83EA,83F0,83F1,83F2,83F8,83F9,83FD,8401,8403,8404,8406,840B,840C,840D,840E,840F,8411,8418,841C,841D,8424,8425,8426,8427,8428,8431,8438,843C,843D,8446,8451,8457,8459,845A,845B,845C,8461,8463,8469,846B,846C,846D,8471,8473,8475,8476,8478,847A,8482,8487,8488,8489,848B,848C,848E,8497,8499,849C,84A1,84AF,84B2,84B4,84B8,84B9,84BA,84BD,84BF,84C1,84C4,84C9,84CA,84CD,84D0,84D1,84D3,84D6,84DD,84DF,84E0,84E3,84E5,84E6,84EC,84F0,84FC,84FF,850C,8511,8513,8517,851A,851F,8521,852B,852C,8537,8538,8539,853A,853B,853C,853D,8543,8548,8549,854A,8556,8559,855E,8564,8568,8572,8574,8579,857A,857B,857E,8584,8585,8587,858F,859B,859C,85A4,85A8,85AA,85AE,85AF,85B0,85B7,85B9,85C1,85C9,85CF,85D0,85D3,85D5,85DC,85E4,85E9,85FB,85FF,8605,8611,8616,8627,8629,8638,863C,864D,864E,864F,8650,8651,8654,865A,865E,8662,866B,866C,866E,8671,8679,867A,867B,867C,867D,867E,867F,8680,8681,8682,868A,868B,868C,868D,8693,8695,869C,869D,86A3,86A4,86A7,86A8,86A9,86AA,86AC,86AF,86B0,86B1,86B4,86B5,86B6,86BA,86C0,86C4,86C6,86C7,86C9,86CA,86CB,86CE,86CF,86D0,86D1,86D4,86D8,86D9,86DB,86DE,86DF,86E4,86E9,86ED,86EE,86F0,86F1,86F2,86F3,86F4,86F8,86F9,86FE,8700,8702,8703,8707,8708,8709,870A,870D,8712,8713,8715,8717,8718,871A,871C,871E,8721,8722,8723,8725,8729,872E,8731,8734,8737,873B,873E,873F,8747,8748,8749,874C,874E,8753,8757,8759,8760,8763,8764,8765,876E,8770,8774,8776,877B,877C,877D,877E,8782,8783,8785,8788,878B,878D,8793,8797,879F,87A8,87AB,87AC,87AD,87AF,87B3,87B5,87BA,87BD,87C0,87C6,87CA,87CB,87D1,87D2,87D3,87DB,87E0,87E5,87EA,87EE,87F9,87FE,8803,880A,8813,8815,8816,881B,8821,8822,8832,8839,883C,8840,8844,8845,884C,884D,8854,8857,8859,8861,8862,8863,8864,8865,8868,8869,886B,886C,886E,8870,8872,8877,887D,887E,887F,8881,8882,8884,8885,8888,888B,888D,8892,8896,889C,88A2,88A4,88AB,88AD,88B1,88B7,88BC,88C1,88C2,88C5,88C6,88C9,88CE,88D2,88D4,88D5,88D8,88D9,88DF,88E2,88E3,88E4,88E5,88E8,88F0,88F1,88F3,88F4,88F8,88F9,88FC,88FE,8902,890A,8910,8912,8913,8919,891A,891B,8921,8925,892A,892B,8930,8934,8936,8941,8944,895E,895F,8966,897B,897F,8981,8983,8986,89C1,89C2,89C4,89C5,89C6,89C7,89C8,89C9,89CA,89CB,89CC,89CE,89CF,89D0,89D1,89D2,89D6,89DA,89DC,89DE,89E3,89E5,89E6,89EB,89EF,89F3,8A00,8A07,8A3E,8A48,8A79,8A89,8A8A,8A93,8B07,8B26,8B66,8B6C,8BA0,8BA1,8BA2,8BA3,8BA4,8BA5,8BA6,8BA7,8BA8,8BA9,8BAA,8BAB,8BAD,8BAE,8BAF,8BB0,8BB2,8BB3,8BB4,8BB5,8BB6,8BB7,8BB8,8BB9,8BBA,8BBC,8BBD,8BBE,8BBF,8BC0,8BC1,8BC2,8BC3,8BC4,8BC5,8BC6,8BC8,8BC9,8BCA,8BCB,8BCC,8BCD,8BCE,8BCF,8BD1,8BD2,8BD3,8BD4,8BD5,8BD6,8BD7,8BD8,8BD9,8BDA,8BDB,8BDC,8BDD,8BDE,8BDF,8BE0,8BE1,8BE2,8BE3,8BE4,8BE5,8BE6,8BE7,8BE8,8BE9,8BEB,8BEC,8BED,8BEE,8BEF,8BF0,8BF1,8BF2,8BF3,8BF4,8BF5,8BF6,8BF7,8BF8,8BF9,8BFA,8BFB,8BFC,8BFD,8BFE,8BFF,8C00,8C01,8C02,8C03,8C04,8C05,8C06,8C07,8C08,8C0A,8C0B,8C0C,8C0D,8C0E,8C0F,8C10,8C11,8C12,8C13,8C14,8C15,8C16,8C17,8C18,8C19,8C1A,8C1B,8C1C,8C1D,8C1F,8C20,8C21,8C22,8C23,8C24,8C25,8C26,8C27,8C28,8C29,8C2A,8C2B,8C2C,8C2D,8C2E,8C2F,8C30,8C31,8C32,8C33,8C34,8C35,8C36,8C37,8C41,8C46,8C47,8C49,8C4C,8C55,8C5A,8C61,8C62,8C6A,8C6B,8C73,8C78,8C79,8C7A,8C82,8C85,8C89,8C8A,8C8C,8C94,8C98,8D1D,8D1E,8D1F,8D21,8D22,8D23,8D24,8D25,8D26,8D27,8D28,8D29,8D2A,8D2B,8D2C,8D2D,8D2E,8D2F,8D30,8D31,8D32,8D33,8D34,8D35,8D36,8D37,8D38,8D39,8D3A,8D3B,8D3C,8D3D,8D3E,8D3F,8D40,8D41,8D42,8D43,8D44,8D45,8D46,8D47,8D48,8D49,8D4A,8D4B,8D4C,8D4D,8D4E,8D4F,8D50,8D53,8D54,8D55,8D56,8D58,8D59,8D5A,8D5B,8D5C,8D5D,8D5E,8D60,8D61,8D62,8D63,8D64,8D66,8D67,8D6B,8D6D,8D70,8D73,8D74,8D75,8D76,8D77,8D81,8D84,8D85,8D8A,8D8B,8D91,8D94,8D9F,8DA3,8DB1,8DB3,8DB4,8DB5,8DB8,8DBA,8DBC,8DBE,8DBF,8DC3,8DC4,8DC6,8DCB,8DCC,8DCE,8DCF,8DD1,8DD6,8DD7,8DDA,8DDB,8DDD,8DDE,8DDF,8DE3,8DE4,8DE8,8DEA,8DEB,8DEC,8DEF,8DF3,8DF5,8DF7,8DF8,8DF9,8DFA,8DFB,8DFD,8E05,8E09,8E0A,8E0C,8E0F,8E14,8E1D,8E1E,8E1F,8E22,8E23,8E29,8E2A,8E2C,8E2E,8E2F,8E31,8E35,8E39,8E3A,8E3D,8E40,8E41,8E42,8E44,8E47,8E48,8E49,8E4A,8E4B,8E51,8E52,8E59,8E66,8E69,8E6C,8E6D,8E6F,8E70,8E72,8E74,8E76,8E7C,8E7F,8E81,8E85,8E87,8E8F,8E90,8E94,8E9C,8E9E,8EAB,8EAC,8EAF,8EB2,8EBA,8ECE,8F66,8F67,8F68,8F69,8F6B,8F6C,8F6D,8F6E,8F6F,8F70,8F71,8F72,8F73,8F74,8F75,8F76,8F77,8F78,8F79,8F7A,8F7B,8F7C,8F7D,8F7E,8F7F,8F81,8F82,8F83,8F84,8F85,8F86,8F87,8F88,8F89,8F8A,8F8B,8F8D,8F8E,8F8F,8F90,8F91,8F93,8F94,8F95,8F96,8F97,8F98,8F99,8F9A,8F9B,8F9C,8F9E,8F9F,8FA3,8FA8,8FA9,8FAB,8FB0,8FB1,8FB6,8FB9,8FBD,8FBE,8FC1,8FC2,8FC4,8FC5,8FC7,8FC8,8FCE,8FD0,8FD1,8FD3,8FD4,8FD5,8FD8,8FD9,8FDB,8FDC,8FDD,8FDE,8FDF,8FE2,8FE4,8FE5,8FE6,8FE8,8FE9,8FEA,8FEB,8FED,8FEE,8FF0,8FF3,8FF7,8FF8,8FF9,8FFD,9000,9001,9002,9003,9004,9005,9006,9009,900A,900B,900D,900F,9010,9011,9012,9014,9016,9017,901A,901B,901D,901E,901F,9020,9021,9022,9026,902D,902E,902F,9035,9036,9038,903B,903C,903E,9041,9042,9044,9047,904D,904F,9050,9051,9052,9053,9057,9058,905B,9062,9063,9065,9068,906D,906E,9074,9075,907D,907F,9080,9082,9083,9088,908B,9091,9093,9095,9097,9099,909B,909D,90A1,90A2,90A3,90A6,90AA,90AC,90AE,90AF,90B0,90B1,90B3,90B4,90B5,90B6,90B8,90B9,90BA,90BB,90BE,90C1,90C4,90C5,90C7,90CA,90CE,90CF,90D0,90D1,90D3,90D7,90DB,90DC,90DD,90E1,90E2,90E6,90E7,90E8,90EB,90ED,90EF,90F4,90F8,90FD,90FE,9102,9104,9119,911E,9122,9123,912F,9131,9139,9143,9146,9149,914A,914B,914C,914D,914E,914F,9150,9152,9157,915A,915D,915E,9161,9162,9163,9164,9165,9169,916A,916C,916E,916F,9170,9171,9172,9174,9175,9176,9177,9178,9179,917D,917E,917F,9185,9187,9189,918B,918C,918D,9190,9191,9192,919A,919B,91A2,91A3,91AA,91AD,91AE,91AF,91B4,91B5,91BA,91C7,91C9,91CA,91CC,91CD,91CE,91CF,91D1,91DC,9274,928E,92AE,92C8,933E,936A,938F,93CA,93D6,943E,946B,9485,9486,9487,9488,9489,948A,948B,948C,948D,948E,948F,9490,9492,9493,9494,9495,9497,9499,949A,949B,949C,949D,949E,949F,94A0,94A1,94A2,94A3,94A4,94A5,94A6,94A7,94A8,94A9,94AA,94AB,94AC,94AD,94AE,94AF,94B0,94B1,94B2,94B3,94B4,94B5,94B6,94B7,94B8,94B9,94BA,94BB,94BC,94BD,94BE,94BF,94C0,94C1,94C2,94C3,94C4,94C5,94C6,94C8,94C9,94CA,94CB,94CC,94CD,94CE,94D0,94D1,94D2,94D5,94D6,94D7,94D8,94D9,94DB,94DC,94DD,94DE,94DF,94E0,94E1,94E2,94E3,94E4,94E5,94E7,94E8,94E9,94EA,94EB,94EC,94ED,94EE,94EF,94F0,94F1,94F2,94F3,94F4,94F5,94F6,94F7,94F8,94F9,94FA,94FC,94FD,94FE,94FF,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,950A,950B,950C,950D,950E,950F,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,951A,951B,951D,951E,951F,9521,9522,9523,9524,9525,9526,9528,9529,952A,952B,952C,952D,952E,952F,9530,9531,9532,9534,9535,9536,9537,9538,9539,953A,953B,953C,953E,953F,9540,9541,9542,9544,9545,9546,9547,9549,954A,954C,954D,954E,954F,9550,9551,9552,9553,9554,9556,9557,9558,9559,955B,955C,955D,955E,955F,9561,9562,9563,9564,9565,9566,9567,9568,9569,956A,956B,956C,956D,956F,9570,9571,9572,9573,9576,957F,95E8,95E9,95EA,95EB,95ED,95EE,95EF,95F0,95F1,95F2,95F3,95F4,95F5,95F6,95F7,95F8,95F9,95FA,95FB,95FC,95FD,95FE,9600,9601,9602,9603,9604,9605,9606,9608,9609,960A,960B,960C,960D,960E,960F,9610,9611,9612,9614,9615,9616,9617,9619,961A,961C,961D,961F,9621,9622,962A,962E,9631,9632,9633,9634,9635,9636,963B,963C,963D,963F,9640,9642,9644,9645,9646,9647,9648,9649,964B,964C,964D,9650,9654,9655,965B,965F,9661,9662,9664,9667,9668,9669,966A,966C,9672,9674,9675,9676,9677,9685,9686,9688,968B,968D,968F,9690,9694,9697,9698,9699,969C,96A7,96B0,96B3,96B6,96B9,96BC,96BD,96BE,96C0,96C1,96C4,96C5,96C6,96C7,96C9,96CC,96CD,96CE,96CF,96D2,96D5,96E0,96E8,96E9,96EA,96EF,96F3,96F6,96F7,96F9,96FE,9700,9701,9704,9706,9707,9708,9709,970D,970E,970F,9713,9716,971C,971E,972A,972D,9730,9732,9738,9739,973E,9752,9753,9756,9759,975B,975E,9760,9761,9762,9765,9769,9773,9774,9776,977C,9785,978B,978D,9791,9792,9794,9798,97A0,97A3,97AB,97AD,97AF,97B2,97B4,97E6,97E7,97E9,97EA,97EB,97EC,97ED,97F3,97F5,97F6,9875,9876,9877,9878,9879,987A,987B,987C,987D,987E,987F,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,988A,988C,988D,988F,9890,9891,9893,9894,9896,9897,9898,989A,989B,989C,989D,989E,989F,98A0,98A1,98A2,98A4,98A5,98A6,98A7,98CE,98D1,98D2,98D3,98D5,98D8,98D9,98DA,98DE,98DF,98E7,98E8,990D,9910,992E,9954,9955,9963,9965,9967,9968,9969,996A,996B,996C,996D,996E,996F,9970,9971,9972,9974,9975,9976,9977,997A,997C,997D,997F,9980,9981,9984,9985,9986,9987,9988,998A,998B,998D,998F,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,99A5,99A8,9A6C,9A6D,9A6E,9A6F,9A70,9A71,9A73,9A74,9A75,9A76,9A77,9A78,9A79,9A7A,9A7B,9A7C,9A7D,9A7E,9A7F,9A80,9A81,9A82,9A84,9A85,9A86,9A87,9A88,9A8A,9A8B,9A8C,9A8F,9A90,9A91,9A92,9A93,9A96,9A97,9A98,9A9A,9A9B,9A9C,9A9D,9A9E,9A9F,9AA0,9AA1,9AA2,9AA3,9AA4,9AA5,9AA7,9AA8,9AB0,9AB1,9AB6,9AB7,9AB8,9ABA,9ABC,9AC0,9AC1,9AC2,9AC5,9ACB,9ACC,9AD1,9AD3,9AD8,9ADF,9AE1,9AE6,9AEB,9AED,9AEF,9AF9,9AFB,9B03,9B08,9B0F,9B13,9B1F,9B23,9B2F,9B32,9B3B,9B3C,9B41,9B42,9B43,9B44,9B45,9B47,9B48,9B49,9B4D,9B4F,9B51,9B54,9C7C,9C7F,9C81,9C82,9C85,9C86,9C87,9C88,9C8B,9C8D,9C8E,9C90,9C91,9C92,9C94,9C95,9C9A,9C9B,9C9C,9C9E,9C9F,9CA0,9CA1,9CA2,9CA3,9CA4,9CA5,9CA6,9CA7,9CA8,9CA9,9CAB,9CAD,9CAE,9CB0,9CB1,9CB2,9CB3,9CB4,9CB5,9CB6,9CB7,9CB8,9CBA,9CBB,9CBC,9CBD,9CC3,9CC4,9CC5,9CC6,9CC7,9CCA,9CCB,9CCC,9CCD,9CCE,9CCF,9CD0,9CD3,9CD4,9CD5,9CD6,9CD7,9CD8,9CD9,9CDC,9CDD,9CDE,9CDF,9CE2,9E1F,9E20,9E21,9E22,9E23,9E25,9E26,9E28,9E29,9E2A,9E2B,9E2C,9E2D,9E2F,9E31,9E32,9E33,9E35,9E36,9E37,9E38,9E39,9E3A,9E3D,9E3E,9E3F,9E41,9E42,9E43,9E44,9E45,9E46,9E47,9E48,9E49,9E4A,9E4B,9E4C,9E4E,9E4F,9E51,9E55,9E57,9E58,9E5A,9E5B,9E5C,9E5E,9E63,9E64,9E66,9E67,9E68,9E69,9E6A,9E6B,9E6C,9E6D,9E70,9E71,9E73,9E7E,9E7F,9E82,9E87,9E88,9E8B,9E92,9E93,9E9D,9E9F,9EA6,9EB4,9EB8,9EBB,9EBD,9EBE,9EC4,9EC9,9ECD,9ECE,9ECF,9ED1,9ED4,9ED8,9EDB,9EDC,9EDD,9EDF,9EE0,9EE2,9EE5,9EE7,9EE9,9EEA,9EEF,9EF9,9EFB,9EFC,9EFE,9F0B,9F0D,9F0E,9F10,9F13,9F17,9F19,9F20,9F22,9F2C,9F2F,9F37,9F39,9F3B,9F3D,9F3E,9F44,9F50,9F51,9F7F,9F80,9F83,9F84,9F85,9F86,9F87,9F88,9F89,9F8A,9F8B,9F8C,9F99,9F9A,9F9B,9F9F,9FA0,FF01,FF02,FF03,FF04,FF05,FF06,FF07,FF08,FF09,FF0A,FF0B,FF0C,FF0D,FF0E,FF0F,FF10,FF11,FF12,FF13,FF14,FF15,FF16,FF17,FF18,FF19,FF1A,FF1B,FF1C,FF1D,FF1E,FF1F,FF20,FF21,FF22,FF23,FF24,FF25,FF26,FF27,FF28,FF29,FF2A,FF2B,FF2C,FF2D,FF2E,FF2F,FF30,FF31,FF32,FF33,FF34,FF35,FF36,FF37,FF38,FF39,FF3A,FF3B,FF3C,FF3D,FF3E,FF3F,FF40,FF41,FF42,FF43,FF44,FF45,FF46,FF47,FF48,FF49,FF4A,FF4B,FF4C,FF4D,FF4E,FF4F,FF50,FF51,FF52,FF53,FF54,FF55,FF56,FF57,FF58,FF59,FF5A,FF5B,FF5C,FF5D,FF5E,FFE0,FFE1,FFE3,FFE5';
},
_ansicode: function(){
return 'A1E8,A1EC,A1A7,A1E3,A1C0,A1A4,A1C1,A8A4,A8A2,A8A8,A8A6,A8BA,A8AC,A8AA,A8B0,A8AE,A1C2,A8B4,A8B2,A8B9,A8A1,A8A5,A8A7,A8A9,A8AD,A8B1,A8A3,A8AB,A8AF,A8B3,A8B5,A8B6,A8B7,A8B8,A1A6,A1A5,A6A1,A6A2,A6A3,A6A4,A6A5,A6A6,A6A7,A6A8,A6A9,A6AA,A6AB,A6AC,A6AD,A6AE,A6AF,A6B0,A6B1,A6B2,A6B3,A6B4,A6B5,A6B6,A6B7,A6B8,A6C1,A6C2,A6C3,A6C4,A6C5,A6C6,A6C7,A6C8,A6C9,A6CA,A6CB,A6CC,A6CD,A6CE,A6CF,A6D0,A6D1,A6D2,A6D3,A6D4,A6D5,A6D6,A6D7,A6D8,A7A7,A7A1,A7A2,A7A3,A7A4,A7A5,A7A6,A7A8,A7A9,A7AA,A7AB,A7AC,A7AD,A7AE,A7AF,A7B0,A7B1,A7B2,A7B3,A7B4,A7B5,A7B6,A7B7,A7B8,A7B9,A7BA,A7BB,A7BC,A7BD,A7BE,A7BF,A7C0,A7C1,A7D1,A7D2,A7D3,A7D4,A7D5,A7D6,A7D8,A7D9,A7DA,A7DB,A7DC,A7DD,A7DE,A7DF,A7E0,A7E1,A7E2,A7E3,A7E4,A7E5,A7E6,A7E7,A7E8,A7E9,A7EA,A7EB,A7EC,A7ED,A7EE,A7EF,A7F0,A7F1,A7D7,A1AA,A1AC,A1AE,A1AF,A1B0,A1B1,A1AD,A1EB,A1E4,A1E5,A1F9,A1E6,A1ED,A2F1,A2F2,A2F3,A2F4,A2F5,A2F6,A2F7,A2F8,A2F9,A2FA,A2FB,A2FC,A1FB,A1FC,A1FA,A1FD,A1CA,A1C7,A1C6,A1CC,A1D8,A1DE,A1CF,A1CE,A1C4,A1C5,A1C9,A1C8,A1D2,A1D3,A1E0,A1DF,A1C3,A1CB,A1D7,A1D6,A1D5,A1D9,A1D4,A1DC,A1DD,A1DA,A1DB,A1D1,A1CD,A1D0,A2D9,A2DA,A2DB,A2DC,A2DD,A2DE,A2DF,A2E0,A2E1,A2E2,A2C5,A2C6,A2C7,A2C8,A2C9,A2CA,A2CB,A2CC,A2CD,A2CE,A2CF,A2D0,A2D1,A2D2,A2D3,A2D4,A2D5,A2D6,A2D7,A2D8,A2B1,A2B2,A2B3,A2B4,A2B5,A2B6,A2B7,A2B8,A2B9,A2BA,A2BB,A2BC,A2BD,A2BE,A2BF,A2C0,A2C1,A2C2,A2C3,A2C4,A9A4,A9A5,A9A6,A9A7,A9A8,A9A9,A9AA,A9AB,A9AC,A9AD,A9AE,A9AF,A9B0,A9B1,A9B2,A9B3,A9B4,A9B5,A9B6,A9B7,A9B8,A9B9,A9BA,A9BB,A9BC,A9BD,A9BE,A9BF,A9C0,A9C1,A9C2,A9C3,A9C4,A9C5,A9C6,A9C7,A9C8,A9C9,A9CA,A9CB,A9CC,A9CD,A9CE,A9CF,A9D0,A9D1,A9D2,A9D3,A9D4,A9D5,A9D6,A9D7,A9D8,A9D9,A9DA,A9DB,A9DC,A9DD,A9DE,A9DF,A9E0,A9E1,A9E2,A9E3,A9E4,A9E5,A9E6,A9E7,A9E8,A9E9,A9EA,A9EB,A9EC,A9ED,A9EE,A9EF,A1F6,A1F5,A1F8,A1F7,A1F4,A1F3,A1F0,A1F2,A1F1,A1EF,A1EE,A1E2,A1E1,A1A1,A1A2,A1A3,A1A8,A1A9,A1B4,A1B5,A1B6,A1B7,A1B8,A1B9,A1BA,A1BB,A1BE,A1BF,A1FE,A1B2,A1B3,A1BC,A1BD,A4A1,A4A2,A4A3,A4A4,A4A5,A4A6,A4A7,A4A8,A4A9,A4AA,A4AB,A4AC,A4AD,A4AE,A4AF,A4B0,A4B1,A4B2,A4B3,A4B4,A4B5,A4B6,A4B7,A4B8,A4B9,A4BA,A4BB,A4BC,A4BD,A4BE,A4BF,A4C0,A4C1,A4C2,A4C3,A4C4,A4C5,A4C6,A4C7,A4C8,A4C9,A4CA,A4CB,A4CC,A4CD,A4CE,A4CF,A4D0,A4D1,A4D2,A4D3,A4D4,A4D5,A4D6,A4D7,A4D8,A4D9,A4DA,A4DB,A4DC,A4DD,A4DE,A4DF,A4E0,A4E1,A4E2,A4E3,A4E4,A4E5,A4E6,A4E7,A4E8,A4E9,A4EA,A4EB,A4EC,A4ED,A4EE,A4EF,A4F0,A4F1,A4F2,A4F3,A5A1,A5A2,A5A3,A5A4,A5A5,A5A6,A5A7,A5A8,A5A9,A5AA,A5AB,A5AC,A5AD,A5AE,A5AF,A5B0,A5B1,A5B2,A5B3,A5B4,A5B5,A5B6,A5B7,A5B8,A5B9,A5BA,A5BB,A5BC,A5BD,A5BE,A5BF,A5C0,A5C1,A5C2,A5C3,A5C4,A5C5,A5C6,A5C7,A5C8,A5C9,A5CA,A5CB,A5CC,A5CD,A5CE,A5CF,A5D0,A5D1,A5D2,A5D3,A5D4,A5D5,A5D6,A5D7,A5D8,A5D9,A5DA,A5DB,A5DC,A5DD,A5DE,A5DF,A5E0,A5E1,A5E2,A5E3,A5E4,A5E5,A5E6,A5E7,A5E8,A5E9,A5EA,A5EB,A5EC,A5ED,A5EE,A5EF,A5F0,A5F1,A5F2,A5F3,A5F4,A5F5,A5F6,A8C5,A8C6,A8C7,A8C8,A8C9,A8CA,A8CB,A8CC,A8CD,A8CE,A8CF,A8D0,A8D1,A8D2,A8D3,A8D4,A8D5,A8D6,A8D7,A8D8,A8D9,A8DA,A8DB,A8DC,A8DD,A8DE,A8DF,A8E0,A8E1,A8E2,A8E3,A8E4,A8E5,A8E6,A8E7,A8E8,A8E9,A2E5,A2E6,A2E7,A2E8,A2E9,A2EA,A2EB,A2EC,A2ED,A2EE,D2BB,B6A1,C6DF,CDF2,D5C9,C8FD,C9CF,CFC2,D8A2,B2BB,D3EB,D8A4,B3F3,D7A8,C7D2,D8A7,CAC0,C7F0,B1FB,D2B5,B4D4,B6AB,CBBF,D8A9,B6AA,C1BD,D1CF,C9A5,D8AD,B8F6,D1BE,E3DC,D6D0,B7E1,B4AE,C1D9,D8BC,CDE8,B5A4,CEAA,D6F7,C0F6,BED9,D8AF,C4CB,BEC3,D8B1,C3B4,D2E5,D6AE,CEDA,D5A7,BAF5,B7A6,C0D6,C6B9,C5D2,C7C7,B9D4,B3CB,D2D2,D8BF,BEC5,C6F2,D2B2,CFB0,CFE7,CAE9,D8C0,C2F2,C2D2,C8E9,C7AC,C1CB,D3E8,D5F9,CAC2,B6FE,D8A1,D3DA,BFF7,D4C6,BBA5,D8C1,CEE5,BEAE,D8A8,D1C7,D0A9,D8BD,D9EF,CDF6,BFBA,BDBB,BAA5,D2E0,B2FA,BAE0,C4B6,CFED,BEA9,CDA4,C1C1,C7D7,D9F1,D9F4,C8CB,D8E9,D2DA,CAB2,C8CA,D8EC,D8EA,D8C6,BDF6,C6CD,B3F0,D8EB,BDF1,BDE9,C8D4,B4D3,C2D8,B2D6,D7D0,CACB,CBFB,D5CC,B8B6,CFC9,D9DA,D8F0,C7AA,D8EE,B4FA,C1EE,D2D4,D8ED,D2C7,D8EF,C3C7,D1F6,D6D9,D8F2,D8F5,BCFE,BCDB,C8CE,B7DD,B7C2,C6F3,D8F8,D2C1,CEE9,BCBF,B7FC,B7A5,D0DD,D6DA,D3C5,BBEF,BBE1,D8F1,C9A1,CEB0,B4AB,D8F3,C9CB,D8F6,C2D7,D8F7,CEB1,D8F9,B2AE,B9C0,D9A3,B0E9,C1E6,C9EC,CBC5,CBC6,D9A4,B5E8,B5AB,CEBB,B5CD,D7A1,D7F4,D3D3,CCE5,BACE,D9A2,D9DC,D3E0,D8FD,B7F0,D7F7,D8FE,D8FA,D9A1,C4E3,D3B6,D8F4,D9DD,D8FB,C5E5,C0D0,D1F0,B0DB,BCD1,D9A6,D9A5,D9AC,D9AE,D9AB,CAB9,D9A9,D6B6,B3DE,D9A8,C0FD,CACC,D9AA,D9A7,D9B0,B6B1,B9A9,D2C0,CFC0,C2C2,BDC4,D5EC,B2E0,C7C8,BFEB,D9AD,D9AF,CEEA,BAEE,C7D6,B1E3,B4D9,B6ED,D9B4,BFA1,D9DE,C7CE,C0FE,D9B8,CBD7,B7FD,D9B5,D9B7,B1A3,D3E1,D9B9,D0C5,D9B6,D9B1,D9B2,C1A9,D9B3,BCF3,D0DE,B8A9,BEE3,D9BD,D9BA,B0B3,D9C2,D9C4,B1B6,D9BF,B5B9,BEF3,CCC8,BAF2,D2D0,D9C3,BDE8,B3AB,D9C5,BEEB,D9C6,D9BB,C4DF,D9BE,D9C1,D9C0,D5AE,D6B5,C7E3,D9C8,BCD9,D9CA,D9BC,D9CB,C6AB,D9C9,D7F6,CDA3,BDA1,D9CC,C5BC,CDB5,D9CD,D9C7,B3A5,BFFE,B8B5,C0FC,B0F8,B4F6,D9CE,D9CF,B4A2,D9D0,B4DF,B0C1,D9D1,C9B5,CFF1,D9D2,C1C5,D9D6,C9AE,D9D5,D9D4,D9D7,CBDB,BDA9,C6A7,D9D3,D9D8,D9D9,C8E5,C0DC,B6F9,D8A3,D4CA,D4AA,D0D6,B3E4,D5D7,CFC8,B9E2,BFCB,C3E2,B6D2,CDC3,D9EE,D9F0,B5B3,B6B5,BEA4,C8EB,C8AB,B0CB,B9AB,C1F9,D9E2,C0BC,B9B2,B9D8,D0CB,B1F8,C6E4,BEDF,B5E4,D7C8,D1F8,BCE6,CADE,BCBD,D9E6,D8E7,C4DA,B8D4,C8BD,B2E1,D4D9,C3B0,C3E1,DAA2,C8DF,D0B4,BEFC,C5A9,B9DA,DAA3,D4A9,DAA4,D9FB,B6AC,B7EB,B1F9,D9FC,B3E5,BEF6,BFF6,D2B1,C0E4,B6B3,D9FE,D9FD,BEBB,C6E0,D7BC,DAA1,C1B9,B5F2,C1E8,BCF5,B4D5,C1DD,C4FD,BCB8,B7B2,B7EF,D9EC,C6BE,BFAD,BBCB,B5CA,DBC9,D0D7,CDB9,B0BC,B3F6,BBF7,DBCA,BAAF,D4E4,B5B6,B5F3,D8D6,C8D0,B7D6,C7D0,D8D7,BFAF,DBBB,D8D8,D0CC,BBAE,EBBE,C1D0,C1F5,D4F2,B8D5,B4B4,B3F5,C9BE,C5D0,C5D9,C0FB,B1F0,D8D9,B9CE,B5BD,D8DA,D6C6,CBA2,C8AF,C9B2,B4CC,BFCC,B9F4,D8DB,D8DC,B6E7,BCC1,CCEA,CFF7,D8DD,C7B0,B9D0,BDA3,CCDE,C6CA,D8E0,D8DE,D8DF,B0FE,BEE7,CAA3,BCF4,B8B1,B8EE,D8E2,BDCB,D8E4,D8E3,C5FC,D8E5,D8E6,C1A6,C8B0,B0EC,B9A6,BCD3,CEF1,DBBD,C1D3,B6AF,D6FA,C5AC,BDD9,DBBE,DBBF,C0F8,BEA2,C0CD,DBC0,CAC6,B2AA,D3C2,C3E3,D1AB,DBC2,C0D5,DBC3,BFB1,C4BC,C7DA,DBC4,D9E8,C9D7,B9B4,CEF0,D4C8,B0FC,B4D2,D0D9,D9E9,DECB,D9EB,D8B0,BBAF,B1B1,B3D7,D8CE,D4D1,BDB3,BFEF,CFBB,D8D0,B7CB,D8D1,C6A5,C7F8,D2BD,D8D2,C4E4,CAAE,C7A7,D8A6,C9FD,CEE7,BBDC,B0EB,BBAA,D0AD,B1B0,D7E4,D7BF,B5A5,C2F4,C4CF,B2A9,B2B7,B1E5,DFB2,D5BC,BFA8,C2AC,D8D5,C2B1,D8D4,CED4,DAE0,CEC0,D8B4,C3AE,D3A1,CEA3,BCB4,C8B4,C2D1,BEED,D0B6,DAE1,C7E4,B3A7,B6F2,CCFC,C0FA,C0F7,D1B9,D1E1,D8C7,B2DE,C0E5,BAF1,D8C8,D4AD,CFE1,D8C9,D8CA,CFC3,B3F8,BEC7,D8CB,DBCC,C8A5,CFD8,C8FE,B2CE,D3D6,B2E6,BCB0,D3D1,CBAB,B7B4,B7A2,CAE5,C8A1,CADC,B1E4,D0F0,C5D1,DBC5,B5FE,BFDA,B9C5,BEE4,C1ED,DFB6,DFB5,D6BB,BDD0,D5D9,B0C8,B6A3,BFC9,CCA8,DFB3,CAB7,D3D2,D8CF,D2B6,BAC5,CBBE,CCBE,DFB7,B5F0,DFB4,D3F5,B3D4,B8F7,DFBA,BACF,BCAA,B5F5,CDAC,C3FB,BAF3,C0F4,CDC2,CFF2,DFB8,CFC5,C2C0,DFB9,C2F0,BEFD,C1DF,CDCC,D2F7,B7CD,DFC1,DFC4,B7F1,B0C9,B6D6,B7D4,BAAC,CCFD,BFD4,CBB1,C6F4,D6A8,DFC5,CEE2,B3B3,CEFC,B4B5,CEC7,BAF0,CEE1,D1BD,DFC0,B4F4,B3CA,B8E6,DFBB,C4C5,DFBC,DFBD,DFBE,C5BB,DFBF,DFC2,D4B1,DFC3,C7BA,CED8,C4D8,DFCA,DFCF,D6DC,DFC9,DFDA,CEB6,BAC7,DFCE,DFC8,C5DE,C9EB,BAF4,C3FC,BED7,DFC6,DFCD,C5D8,D5A6,BACD,BECC,D3BD,B8C0,D6E4,DFC7,B9BE,BFA7,C1FC,DFCB,DFCC,DFD0,DFDB,DFE5,DFD7,DFD6,D7C9,DFE3,DFE4,E5EB,D2A7,DFD2,BFA9,D4DB,BFC8,DFD4,CFCC,DFDD,D1CA,DFDE,B0A7,C6B7,DFD3,BAE5,B6DF,CDDB,B9FE,D4D5,DFDF,CFEC,B0A5,DFE7,DFD1,D1C6,DFD5,DFD8,DFD9,DFDC,BBA9,DFE0,DFE1,DFE2,DFE6,DFE8,D3B4,B8E7,C5B6,DFEA,C9DA,C1A8,C4C4,BFDE,CFF8,D5DC,DFEE,B2B8,BADF,DFEC,DBC1,D1E4,CBF4,B4BD,B0A6,DFF1,CCC6,DFF2,DFED,DFE9,DFEB,DFEF,DFF0,BBBD,DFF3,DFF4,BBA3,CADB,CEA8,E0A7,B3AA,E0A6,E0A1,DFFE,CDD9,DFFC,DFFA,BFD0,D7C4,C9CC,DFF8,B0A1,DFFD,DFFB,E0A2,E0A8,B7C8,C6A1,C9B6,C0B2,DFF5,C5BE,D8C4,DFF9,C4F6,E0A3,E0A4,E0A5,D0A5,E0B4,CCE4,E0B1,BFA6,E0AF,CEB9,E0AB,C9C6,C0AE,E0AE,BAED,BAB0,E0A9,DFF6,E0B3,E0B8,B4AD,E0B9,CFB2,BAC8,E0B0,D0FA,E0AC,D4FB,DFF7,C5E7,E0AD,D3F7,E0B6,E0B7,E0C4,D0E1,E0BC,E0C9,E0CA,E0BE,E0AA,C9A4,E0C1,E0B2,CAC8,E0C3,E0B5,CECB,CBC3,E0CD,E0C6,E0C2,E0CB,E0BA,E0BF,E0C0,E0C5,E0C7,E0C8,E0CC,E0BB,CBD4,E0D5,E0D6,E0D2,E0D0,BCCE,E0D1,B8C2,D8C5,D0EA,C2EF,E0CF,E0BD,E0D4,E0D3,E0D7,E0DC,E0D8,D6F6,B3B0,D7EC,CBBB,E0DA,CEFB,BAD9,E0E1,E0DD,D2AD,E0E2,E0DB,E0D9,E0DF,E0E0,E0DE,E0E4,C6F7,D8AC,D4EB,E0E6,CAC9,E0E5,B8C1,E0E7,E0E8,E0E9,E0E3,BABF,CCE7,E0EA,CFF9,E0EB,C8C2,BDC0,C4D2,E0EC,E0ED,C7F4,CBC4,E0EE,BBD8,D8B6,D2F2,E0EF,CDC5,B6DA,E0F1,D4B0,C0A7,B4D1,CEA7,E0F0,E0F2,B9CC,B9FA,CDBC,E0F3,C6D4,E0F4,D4B2,C8A6,E0F6,E0F5,E0F7,CDC1,CAA5,D4DA,DBD7,DBD9,DBD8,B9E7,DBDC,DBDD,B5D8,DBDA,DBDB,B3A1,DBDF,BBF8,D6B7,DBE0,BEF9,B7BB,DBD0,CCAE,BFB2,BBB5,D7F8,BFD3,BFE9,BCE1,CCB3,DBDE,B0D3,CEEB,B7D8,D7B9,C6C2,C0A4,CCB9,DBE7,DBE1,C6BA,DBE3,DBE8,C5F7,DBEA,DBE9,BFC0,DBE6,DBE5,B4B9,C0AC,C2A2,DBE2,DBE4,D0CD,DBED,C0DD,DBF2,B6E2,DBF3,DBD2,B9B8,D4AB,DBEC,BFD1,DBF0,DBD1,B5E6,DBEB,BFE5,DBEE,DBF1,DBF9,B9A1,B0A3,C2F1,B3C7,DBEF,DBF8,C6D2,DBF4,DBF5,DBF7,DBF6,DBFE,D3F2,B2BA,DBFD,DCA4,DBFB,DBFA,DBFC,C5E0,BBF9,DCA3,DCA5,CCC3,B6D1,DDC0,DCA1,DCA2,C7B5,B6E9,DCA7,DCA6,DCA9,B1A4,B5CC,BFB0,D1DF,B6C2,DCA8,CBFA,EBF3,CBDC,CBFE,CCC1,C8FB,DCAA,CCEE,DCAB,DBD3,DCAF,DCAC,BEB3,CAFB,DCAD,C9CA,C4B9,C7BD,DCAE,D4F6,D0E6,C4AB,B6D5,DBD4,B1DA,DBD5,DBD6,BABE,C8C0,CABF,C8C9,D7B3,C9F9,BFC7,BAF8,D2BC,E2BA,B4A6,B1B8,B8B4,CFC4,D9E7,CFA6,CDE2,D9ED,B6E0,D2B9,B9BB,E2B9,E2B7,B4F3,CCEC,CCAB,B7F2,D8B2,D1EB,BABB,CAA7,CDB7,D2C4,BFE4,BCD0,B6E1,DEC5,DEC6,DBBC,D1D9,C6E6,C4CE,B7EE,B7DC,BFFC,D7E0,C6F5,B1BC,DEC8,BDB1,CCD7,DECA,DEC9,B5EC,C9DD,B0C2,C5AE,C5AB,C4CC,BCE9,CBFD,BAC3,E5F9,C8E7,E5FA,CDFD,D7B1,B8BE,C2E8,C8D1,E5FB,B6CA,BCCB,D1FD,E6A1,C3EE,E6A4,E5FE,E6A5,CDD7,B7C1,E5FC,E5FD,E6A3,C4DD,E6A8,E6A7,C3C3,C6DE,E6AA,C4B7,E6A2,CABC,BDE3,B9C3,E6A6,D0D5,CEAF,E6A9,E6B0,D2A6,BDAA,E6AD,E6AF,C0D1,D2CC,BCA7,E6B1,D2F6,D7CB,CDFE,CDDE,C2A6,E6AB,E6AC,BDBF,E6AE,E6B3,E6B2,E6B6,E6B8,C4EF,C4C8,BEEA,C9EF,E6B7,B6F0,C3E4,D3E9,E6B4,E6B5,C8A2,E6BD,E6B9,C6C5,CDF1,E6BB,E6BC,BBE9,E6BE,E6BA,C0B7,D3A4,E6BF,C9F4,E6C3,E6C4,D0F6,C3BD,C3C4,E6C2,E6C1,E6C7,CFB1,EBF4,E6CA,E6C5,BCDE,C9A9,BCB5,CFD3,E6C8,E6C9,E6CE,E6D0,E6D1,E6CB,B5D5,E6CC,E6CF,C4DB,E6C6,E6CD,E6D2,E6D4,E6D3,E6D5,D9F8,E6D6,E6D7,D7D3,E6DD,E6DE,BFD7,D4D0,D7D6,B4E6,CBEF,E6DA,D8C3,D7CE,D0A2,C3CF,E6DF,BCBE,B9C2,E6DB,D1A7,BAA2,C2CF,D8AB,CAEB,E5EE,E6DC,B7F5,C8E6,C4F5,E5B2,C4FE,CBFC,E5B3,D5AC,D3EE,CAD8,B0B2,CBCE,CDEA,BAEA,E5B5,E5B4,D7DA,B9D9,D6E6,B6A8,CDF0,D2CB,B1A6,CAB5,B3E8,C9F3,BFCD,D0FB,CAD2,E5B6,BBC2,CFDC,B9AC,D4D7,BAA6,D1E7,CFFC,BCD2,E5B7,C8DD,BFED,B1F6,CBDE,BCC5,BCC4,D2FA,C3DC,BFDC,B8BB,C3C2,BAAE,D4A2,C7DE,C4AF,B2EC,B9D1,E5BB,C1C8,D5AF,E5BC,E5BE,B4E7,B6D4,CBC2,D1B0,B5BC,CAD9,B7E2,C9E4,BDAB,CEBE,D7F0,D0A1,C9D9,B6FB,E6D8,BCE2,B3BE,C9D0,E6D9,B3A2,DECC,D3C8,DECD,D2A2,DECE,BECD,DECF,CAAC,D2FC,B3DF,E5EA,C4E1,BEA1,CEB2,C4F2,BED6,C6A8,B2E3,BED3,C7FC,CCEB,BDEC,CEDD,CABA,C6C1,E5EC,D0BC,D5B9,E5ED,CAF4,CDC0,C2C5,E5EF,C2C4,E5F0,E5F8,CDCD,C9BD,D2D9,E1A8,D3EC,CBEA,C6F1,E1AC,E1A7,E1A9,E1AA,E1AF,B2ED,E1AB,B8DA,E1AD,E1AE,E1B0,B5BA,E1B1,E1B3,E1B8,D1D2,E1B6,E1B5,C1EB,E1B7,D4C0,E1B2,E1BA,B0B6,E1B4,BFF9,E1B9,E1BB,E1BE,E1BC,D6C5,CFBF,E1BD,E1BF,C2CD,B6EB,D3F8,C7CD,B7E5,BEFE,E1C0,E1C1,E1C7,B3E7,C6E9,B4DE,D1C2,E1C8,E1C6,E1C5,E1C3,E1C2,B1C0,D5B8,E1C4,E1CB,E1CC,E1CA,EFFA,E1D3,E1D2,C7B6,E1C9,E1CE,E1D0,E1D4,E1D1,E1CD,E1CF,E1D5,E1D6,E1D7,E1D8,E1DA,E1DB,CEA1,E7DD,B4A8,D6DD,D1B2,B3B2,B9A4,D7F3,C7C9,BEDE,B9AE,CED7,B2EE,DBCF,BCBA,D2D1,CBC8,B0CD,CFEF,D9E3,BDED,B1D2,CAD0,B2BC,CBA7,B7AB,CAA6,CFA3,E0F8,D5CA,E0FB,E0FA,C5C1,CCFB,C1B1,E0F9,D6E3,B2AF,D6C4,B5DB,B4F8,D6A1,CFAF,B0EF,E0FC,E1A1,B3A3,E0FD,E0FE,C3B1,C3DD,E1A2,B7F9,BBCF,E1A3,C4BB,E1A4,E1A5,E1A6,B4B1,B8C9,C6BD,C4EA,B2A2,D0D2,E7DB,BBC3,D3D7,D3C4,B9E3,E2CF,D7AF,C7EC,B1D3,B4B2,E2D1,D0F2,C2AE,E2D0,BFE2,D3A6,B5D7,E2D2,B5EA,C3ED,B8FD,B8AE,C5D3,B7CF,E2D4,E2D3,B6C8,D7F9,CDA5,E2D8,E2D6,CAFC,BFB5,D3B9,E2D5,E2D7,C1AE,C0C8,E2DB,E2DA,C0AA,C1CE,E2DC,E2DD,E2DE,DBC8,D1D3,CDA2,BDA8,DEC3,D8A5,BFAA,DBCD,D2EC,C6FA,C5AA,DEC4,B1D7,DFAE,CABD,DFB1,B9AD,D2FD,B8A5,BAEB,B3DA,B5DC,D5C5,C3D6,CFD2,BBA1,E5F3,E5F2,E5F4,CDE4,C8F5,B5AF,C7BF,E5F6,ECB0,E5E6,B9E9,B5B1,C2BC,E5E8,E5E7,E5E9,D2CD,E1EA,D0CE,CDAE,D1E5,B2CA,B1EB,B1F2,C5ED,D5C3,D3B0,E1DC,E1DD,D2DB,B3B9,B1CB,CDF9,D5F7,E1DE,BEB6,B4FD,E1DF,BADC,E1E0,BBB2,C2C9,E1E1,D0EC,CDBD,E1E2,B5C3,C5C7,E1E3,E1E4,D3F9,E1E5,D1AD,E1E6,CEA2,E1E7,B5C2,E1E8,BBD5,D0C4,E2E0,B1D8,D2E4,E2E1,BCC9,C8CC,E2E3,ECFE,ECFD,DFAF,E2E2,D6BE,CDFC,C3A6,E3C3,D6D2,E2E7,E2E8,D3C7,E2EC,BFEC,E2ED,E2E5,B3C0,C4EE,E2EE,D0C3,BAF6,E2E9,B7DE,BBB3,CCAC,CBCB,E2E4,E2E6,E2EA,E2EB,E2F7,E2F4,D4F5,E2F3,C5AD,D5FA,C5C2,B2C0,E2EF,E2F2,C1AF,CBBC,B5A1,E2F9,BCB1,E2F1,D0D4,D4B9,E2F5,B9D6,E2F6,C7D3,E2F0,D7DC,EDA1,E2F8,EDA5,E2FE,CAD1,C1B5,BBD0,BFD6,BAE3,CBA1,EDA6,EDA3,EDA2,BBD6,EDA7,D0F4,EDA4,BADE,B6F7,E3A1,B6B2,CCF1,B9A7,CFA2,C7A1,BFD2,B6F1,E2FA,E2FB,E2FD,E2FC,C4D5,E3A2,D3C1,E3A7,C7C4,CFA4,E3A9,BAB7,E3A8,BBDA,E3A3,E3A4,E3AA,E3A6,CEF2,D3C6,BBBC,D4C3,C4FA,EDA8,D0FC,E3A5,C3F5,E3AD,B1AF,E3B2,BCC2,E3AC,B5BF,C7E9,E3B0,BEAA,CDEF,BBF3,CCE8,E3AF,E3B1,CFA7,E3AE,CEA9,BBDD,B5EB,BEE5,B2D2,B3CD,B1B9,E3AB,B2D1,B5AC,B9DF,B6E8,CFEB,E3B7,BBCC,C8C7,D0CA,E3B8,B3EE,EDA9,D3FA,D3E4,EDAA,E3B9,D2E2,E3B5,D3DE,B8D0,E3B3,E3B6,B7DF,E3B4,C0A2,E3BA,D4B8,B4C8,E3BB,BBC5,C9F7,C9E5,C4BD,EDAB,C2FD,BBDB,BFAE,CEBF,E3BC,BFB6,B1EF,D4F7,E3BE,EDAD,E3BF,BAA9,EDAC,E3BD,E3C0,BAB6,B6AE,D0B8,B0C3,EDAE,EDAF,C0C1,E3C1,C5B3,E3C2,DCB2,EDB0,B8EA,CEEC,EAA7,D0E7,CAF9,C8D6,CFB7,B3C9,CED2,BDE4,E3DE,BBF2,EAA8,D5BD,C6DD,EAA9,EAAA,EAAC,EAAB,EAAE,EAAD,BDD8,EAAF,C2BE,B4C1,B4F7,BBA7,ECE6,ECE5,B7BF,CBF9,B1E2,ECE7,C9C8,ECE8,ECE9,CAD6,DED0,B2C5,D4FA,C6CB,B0C7,B4F2,C8D3,CDD0,BFB8,BFDB,C7A4,D6B4,C0A9,DED1,C9A8,D1EF,C5A4,B0E7,B3B6,C8C5,B0E2,B7F6,C5FA,B6F3,D5D2,B3D0,BCBC,B3AD,BEF1,B0D1,D2D6,CAE3,D7A5,CDB6,B6B6,BFB9,D5DB,B8A7,C5D7,DED2,BFD9,C2D5,C7C0,BBA4,B1A8,C5EA,C5FB,CCA7,B1A7,B5D6,C4A8,DED3,D1BA,B3E9,C3F2,B7F7,D6F4,B5A3,B2F0,C4B4,C4E9,C0AD,DED4,B0E8,C5C4,C1E0,B9D5,BEDC,CDD8,B0CE,CDCF,DED6,BED0,D7BE,DED5,D5D0,B0DD,C4E2,C2A3,BCF0,D3B5,C0B9,C5A1,B2A6,D4F1,C0A8,CAC3,DED7,D5FC,B9B0,C8AD,CBA9,DED9,BFBD,C6B4,D7A7,CAB0,C4C3,B3D6,B9D2,D6B8,EAFC,B0B4,BFE6,CCF4,CDDA,D6BF,C2CE,CECE,CCA2,D0AE,C4D3,B5B2,DED8,D5F5,BCB7,BBD3,B0A4,C5B2,B4EC,D5F1,EAFD,DEDA,CDA6,CDEC,CEE6,DEDC,CDB1,C0A6,D7BD,DEDB,B0C6,BAB4,C9D3,C4F3,BEE8,B2B6,C0CC,CBF0,BCF1,BBBB,B5B7,C5F5,DEE6,DEE3,BEDD,DEDF,B4B7,BDDD,DEE0,C4ED,CFC6,B5E0,B6DE,CADA,B5F4,DEE5,D5C6,DEE1,CCCD,C6FE,C5C5,D2B4,BEF2,C2D3,CCBD,B3B8,BDD3,BFD8,CDC6,D1DA,B4EB,DEE4,DEDD,DEE7,EAFE,C2B0,DEE2,D6C0,B5A7,B2F4,DEE8,DEF2,DEED,DEF1,C8E0,D7E1,DEEF,C3E8,CCE1,B2E5,D2BE,DEEE,DEEB,CED5,B4A7,BFAB,BEBE,BDD2,DEE9,D4AE,DEDE,DEEA,C0BF,DEEC,B2F3,B8E9,C2A7,BDC1,DEF5,DEF8,B2AB,B4A4,B4EA,C9A6,DEF6,CBD1,B8E3,DEF7,DEFA,DEF9,CCC2,B0E1,B4EE,E5BA,D0AF,B2EB,EBA1,DEF4,C9E3,DEF3,B0DA,D2A1,B1F7,CCAF,DEF0,CBA4,D5AA,DEFB,B4DD,C4A6,DEFD,C3FE,C4A1,DFA1,C1CC,DEFC,BEEF,C6B2,B3C5,C8F6,CBBA,DEFE,DFA4,D7B2,B3B7,C1C3,C7CB,B2A5,B4E9,D7AB,C4EC,DFA2,DFA3,DFA5,BAB3,DFA6,C0DE,C9C3,B2D9,C7E6,DFA7,C7DC,DFA8,EBA2,CBD3,DFAA,DFA9,B2C1,C5CA,DFAB,D4DC,C8C1,DFAC,BEF0,DFAD,D6A7,EAB7,EBB6,CAD5,D8FC,B8C4,B9A5,B7C5,D5FE,B9CA,D0A7,F4CD,B5D0,C3F4,BEC8,EBB7,B0BD,BDCC,C1B2,B1D6,B3A8,B8D2,C9A2,B6D8,EBB8,BEB4,CAFD,C7C3,D5FB,B7F3,CEC4,D5AB,B1F3,ECB3,B0DF,ECB5,B6B7,C1CF,F5FA,D0B1,D5E5,CED3,BDEF,B3E2,B8AB,D5B6,EDBD,B6CF,CBB9,D0C2,B7BD,ECB6,CAA9,C5D4,ECB9,ECB8,C2C3,ECB7,D0FD,ECBA,ECBB,D7E5,ECBC,ECBD,C6EC,CEDE,BCC8,C8D5,B5A9,BEC9,D6BC,D4E7,D1AE,D0F1,EAB8,EAB9,EABA,BAB5,CAB1,BFF5,CDFA,EAC0,B0BA,EABE,C0A5,EABB,B2FD,C3F7,BBE8,D2D7,CEF4,EABF,EABC,EAC3,D0C7,D3B3,B4BA,C3C1,D7F2,D5D1,CAC7,EAC5,EAC4,EAC7,EAC6,D6E7,CFD4,EACB,BBCE,BDFA,C9CE,EACC,C9B9,CFFE,EACA,D4CE,EACD,EACF,CDED,EAC9,EACE,CEEE,BBDE,B3BF,C6D5,BEB0,CEFA,C7E7,BEA7,EAD0,D6C7,C1C0,D4DD,EAD1,CFBE,EAD2,CAEE,C5AF,B0B5,EAD4,EAD3,F4DF,C4BA,B1A9,E5DF,EAD5,CAEF,EAD6,EAD7,C6D8,EAD8,EAD9,D4BB,C7FA,D2B7,B8FC,EAC2,B2DC,C2FC,D4F8,CCE6,D7EE,D4C2,D3D0,EBC3,C5F3,B7FE,EBD4,CBB7,EBDE,C0CA,CDFB,B3AF,C6DA,EBFC,C4BE,CEB4,C4A9,B1BE,D4FD,CAF5,D6EC,C6D3,B6E4,BBFA,D0E0,C9B1,D4D3,C8A8,B8CB,E8BE,C9BC,E8BB,C0EE,D0D3,B2C4,B4E5,E8BC,D5C8,B6C5,E8BD,CAF8,B8DC,CCF5,C0B4,D1EE,E8BF,E8C2,BABC,B1AD,BDDC,EABD,E8C3,E8C6,E8CB,E8CC,CBC9,B0E5,BCAB,B9B9,E8C1,CDF7,E8CA,CEF6,D5ED,C1D6,E8C4,C3B6,B9FB,D6A6,E8C8,CAE0,D4E6,E8C0,E8C5,E8C7,C7B9,B7E3,E8C9,BFDD,E8D2,E8D7,E8D5,BCDC,BCCF,E8DB,E8DE,E8DA,B1FA,B0D8,C4B3,B8CC,C6E2,C8BE,C8E1,E8CF,E8D4,E8D6,B9F1,E8D8,D7F5,C4FB,E8DC,B2E9,E8D1,BCED,BFC2,E8CD,D6F9,C1F8,B2F1,E8DF,CAC1,E8D9,D5A4,B1EA,D5BB,E8CE,E8D0,B6B0,E8D3,E8DD,C0B8,CAF7,CBA8,C6DC,C0F5,E8E9,D0A3,E8F2,D6EA,E8E0,E8E1,D1F9,BACB,B8F9,B8F1,D4D4,E8EF,E8EE,E8EC,B9F0,CCD2,E8E6,CEA6,BFF2,B0B8,E8F1,E8F0,D7C0,E8E4,CDA9,C9A3,BBB8,BDDB,E8EA,E8E2,E8E3,E8E5,B5B5,E8E7,C7C5,E8EB,E8ED,BDB0,D7AE,E8F8,E8F5,CDB0,E8F6,C1BA,E8E8,C3B7,B0F0,E8F4,E8F7,B9A3,C9D2,C3CE,CEE0,C0E6,CBF3,CCDD,D0B5,CAE1,E8F3,BCEC,E8F9,C3DE,C6E5,B9F7,B0F4,D7D8,BCAC,C5EF,CCC4,E9A6,C9AD,E9A2,C0E2,BFC3,E8FE,B9D7,E8FB,E9A4,D2CE,E9A3,D6B2,D7B5,E9A7,BDB7,E8FC,E8FD,E9A1,CDD6,D2AC,E9B2,E9A9,B4AA,B4BB,E9AB,D0A8,E9A5,B3FE,E9AC,C0E3,E9AA,E9B9,E9B8,E9AE,E8FA,E9A8,BFAC,E9B1,E9BA,C2A5,E9AF,B8C5,E9AD,D3DC,E9B4,E9B5,E9B7,E9C7,C0C6,E9C5,E9B0,E9BB,B0F1,E9BC,D5A5,E9BE,E9BF,E9C1,C1F1,C8B6,E9BD,E9C2,E9C3,E9B3,E9B6,BBB1,E9C0,BCF7,E9C4,E9C6,E9CA,E9CE,B2DB,E9C8,B7AE,E9CB,E9CC,D5C1,C4A3,E9D8,BAE1,E9C9,D3A3,E9D4,E9D7,E9D0,E9CF,C7C1,E9D2,E9D9,B3C8,E9D3,CFF0,E9CD,B3F7,E9D6,E9DA,CCB4,CFAD,E9D5,E9DC,E9DB,E9DE,E9D1,E9DD,E9DF,C3CA,C7B7,B4CE,BBB6,D0C0,ECA3,C5B7,D3FB,ECA4,ECA5,C6DB,BFEE,ECA6,ECA7,D0AA,C7B8,B8E8,ECA8,D6B9,D5FD,B4CB,B2BD,CEE4,C6E7,CDE1,B4F5,CBC0,BCDF,E9E2,E9E3,D1EA,E9E5,B4F9,E9E4,D1B3,CAE2,B2D0,E9E8,E9E6,E9E7,D6B3,E9E9,E9EA,E9EB,E9EC,ECAF,C5B9,B6CE,D2F3,B5EE,BBD9,ECB1,D2E3,CEE3,C4B8,C3BF,B6BE,D8B9,B1C8,B1CF,B1D1,C5FE,B1D0,C3AB,D5B1,EBA4,BAC1,CCBA,EBA5,EBA7,EBA8,EBA6,EBA9,EBAB,EBAA,EBAC,CACF,D8B5,C3F1,C3A5,C6F8,EBAD,C4CA,EBAE,EBAF,EBB0,B7D5,B7FA,EBB1,C7E2,EBB3,BAA4,D1F5,B0B1,EBB2,EBB4,B5AA,C2C8,C7E8,EBB5,CBAE,E3DF,D3C0,D9DB,CDA1,D6AD,C7F3,D9E0,BBE3,BABA,E3E2,CFAB,E3E0,C9C7,BAB9,D1B4,E3E1,C8EA,B9AF,BDAD,B3D8,CEDB,CCC0,E3E8,E3E9,CDF4,CCAD,BCB3,E3EA,E3EB,D0DA,C6FB,B7DA,C7DF,D2CA,CED6,E3E4,E3EC,C9F2,B3C1,E3E7,C6E3,E3E5,EDB3,E3E6,C9B3,C5E6,B9B5,C3BB,E3E3,C5BD,C1A4,C2D9,B2D7,E3ED,BBA6,C4AD,E3F0,BEDA,E3FB,E3F5,BAD3,B7D0,D3CD,D6CE,D5D3,B9C1,D5B4,D1D8,D0B9,C7F6,C8AA,B2B4,C3DA,E3EE,E3FC,E3EF,B7A8,E3F7,E3F4,B7BA,C5A2,E3F6,C5DD,B2A8,C6FC,C4E0,D7A2,C0E1,E3F9,E3FA,E3FD,CCA9,E3F3,D3BE,B1C3,EDB4,E3F1,E3F2,E3F8,D0BA,C6C3,D4F3,E3FE,BDE0,E4A7,E4A6,D1F3,E4A3,E4A9,C8F7,CFB4,E4A8,E4AE,C2E5,B6B4,BDF2,E4A2,BAE9,E4AA,E4AC,B6FD,D6DE,E4B2,E4AD,E4A1,BBEE,CDDD,C7A2,C5C9,C1F7,E4A4,C7B3,BDAC,BDBD,E4A5,D7C7,B2E2,E4AB,BCC3,E4AF,BBEB,E4B0,C5A8,E4B1,D5E3,BFA3,E4BA,E4B7,E4BB,E4BD,C6D6,BAC6,C0CB,B8A1,E4B4,D4A1,BAA3,BDFE,E4BC,CDBF,C4F9,CFFB,C9E6,D3BF,CFD1,E4B3,E4B8,E4B9,CCE9,CCCE,C0D4,E4B5,C1B0,E4B6,CED0,BBC1,B5D3,C8F3,BDA7,D5C7,C9AC,B8A2,E4CA,E4CC,D1C4,D2BA,BAAD,BAD4,E4C3,B5ED,D7CD,E4C0,CFFD,E4BF,C1DC,CCCA,CAE7,C4D7,CCD4,E4C8,E4C7,E4C1,E4C4,B5AD,D3D9,E4C6,D2F9,B4E3,BBB4,C9EE,B4BE,BBEC,D1CD,CCED,EDB5,C7E5,D4A8,E4CB,D7D5,E4C2,BDA5,E4C5,D3E6,E4C9,C9F8,E4BE,D3E5,C7FE,B6C9,D4FC,B2B3,E4D7,CEC2,E4CD,CEBC,B8DB,E4D6,BFCA,D3CE,C3EC,C5C8,E4D8,CDC4,E4CF,E4D4,E4D5,BAFE,CFE6,D5BF,E4D2,E4D0,E4CE,CDE5,CAAA,C0A3,BDA6,E4D3,B8C8,E4E7,D4B4,E4DB,C1EF,E4E9,D2E7,E4DF,E4E0,CFAA,CBDD,E4DA,E4D1,E4E5,C8DC,E4E3,C4E7,E4E2,E4E1,B3FC,E4E8,B5E1,D7CC,E4E6,BBAC,D7D2,CCCF,EBF8,E4E4,B9F6,D6CD,E4D9,E4DC,C2FA,E4DE,C2CB,C0C4,C2D0,B1F5,CCB2,B5CE,E4EF,C6AF,C6E1,E4F5,C2A9,C0EC,D1DD,E4EE,C4AE,E4ED,E4F6,E4F4,C2FE,E4DD,E4F0,CAFE,D5C4,E4F1,D1FA,E4EB,E4EC,E4F2,CEAB,C5CB,C7B1,C2BA,E4EA,C1CA,CCB6,B3B1,E4FB,E4F3,E4FA,E4FD,E4FC,B3CE,B3BA,E4F7,E4F9,E4F8,C5EC,C0BD,D4E8,E5A2,B0C4,E5A4,E5A3,BCA4,E5A5,E5A1,E4FE,B1F4,E5A8,E5A9,E5A6,E5A7,E5AA,C6D9,E5AB,E5AD,E5AC,E5AF,E5AE,B9E0,E5B0,E5B1,BBF0,ECE1,C3F0,B5C6,BBD2,C1E9,D4EE,BEC4,D7C6,D4D6,B2D3,ECBE,EAC1,C2AF,B4B6,D1D7,B3B4,C8B2,BFBB,ECC0,D6CB,ECBF,ECC1,ECC5,BEE6,CCBF,C5DA,BEBC,ECC6,B1FE,ECC4,D5A8,B5E3,ECC2,C1B6,B3E3,ECC3,CBB8,C0C3,CCFE,C1D2,ECC8,BAE6,C0D3,D6F2,D1CC,BFBE,B7B3,C9D5,ECC7,BBE2,CCCC,BDFD,C8C8,CFA9,CDE9,C5EB,B7E9,D1C9,BAB8,ECC9,ECCA,BBC0,ECCB,ECE2,B1BA,B7D9,BDB9,ECCC,D1E6,ECCD,C8BB,ECD1,ECD3,BBCD,BCE5,ECCF,C9B7,C3BA,ECE3,D5D5,ECD0,D6F3,ECD2,ECCE,ECD4,ECD5,C9BF,CFA8,D0DC,D1AC,C8DB,ECD6,CEF5,CAEC,ECDA,ECD9,B0BE,ECD7,ECD8,ECE4,C8BC,C1C7,ECDC,D1E0,ECDB,D4EF,ECDD,DBC6,ECDE,B1AC,ECDF,ECE0,D7A6,C5C0,EBBC,B0AE,BEF4,B8B8,D2AF,B0D6,B5F9,D8B3,CBAC,E3DD,C6AC,B0E6,C5C6,EBB9,EBBA,EBBB,D1C0,C5A3,EAF2,C4B2,C4B5,C0CE,EAF3,C4C1,CEEF,EAF0,EAF4,C9FC,C7A3,CCD8,CEFE,EAF5,EAF6,CFAC,C0E7,EAF7,B6BF,EAF8,EAF9,EAFA,EAFB,EAF1,C8AE,E1EB,B7B8,E1EC,E1ED,D7B4,E1EE,E1EF,D3CC,E1F1,BFF1,E1F0,B5D2,B1B7,E1F3,E1F2,BAFC,E1F4,B9B7,BED1,C4FC,BADD,BDC6,E1F5,E1F7,B6C0,CFC1,CAA8,E1F6,D5F8,D3FC,E1F8,E1FC,E1F9,E1FA,C0EA,E1FE,E2A1,C0C7,E1FB,E1FD,E2A5,C1D4,E2A3,E2A8,B2FE,E2A2,C3CD,B2C2,E2A7,E2A6,E2A4,E2A9,E2AB,D0C9,D6ED,C3A8,E2AC,CFD7,E2AE,BAEF,E9E0,E2AD,E2AA,BBAB,D4B3,E2B0,E2AF,E9E1,E2B1,E2B2,E2B3,CCA1,E2B4,E2B5,D0FE,C2CA,D3F1,CDF5,E7E0,E7E1,BEC1,C2EA,E7E4,E7E3,CDE6,C3B5,E7E2,BBB7,CFD6,C1E1,E7E9,E7E8,E7F4,B2A3,E7EA,E7E6,E7EC,E7EB,C9BA,D5E4,E7E5,B7A9,E7E7,E7EE,E7F3,D6E9,E7ED,E7F2,E7F1,B0E0,E7F5,C7F2,C0C5,C0ED,C1F0,E7F0,E7F6,CBF6,E8A2,E8A1,D7C1,E7FA,E7F9,E7FB,E7F7,E7FE,E7FD,E7FC,C1D5,C7D9,C5FD,C5C3,C7ED,E8A3,E8A6,E8A5,E8A7,BAF7,E7F8,E8A4,C8F0,C9AA,E8A9,B9E5,D1FE,E8A8,E8AA,E8AD,E8AE,C1A7,E8AF,E8B0,E8AC,E8B4,E8AB,E8B1,E8B5,E8B2,E8B3,E8B7,E8B6,B9CF,F0AC,F0AD,C6B0,B0EA,C8BF,CDDF,CECD,EAB1,EAB2,C6BF,B4C9,EAB3,D5E7,DDF9,EAB4,EAB5,EAB6,B8CA,DFB0,C9F5,CCF0,C9FA,C9FB,D3C3,CBA6,B8A6,F0AE,B1C2,E5B8,CCEF,D3C9,BCD7,C9EA,B5E7,C4D0,B5E9,EEAE,BBAD,E7DE,EEAF,B3A9,EEB2,EEB1,BDE7,EEB0,CEB7,C5CF,C1F4,DBCE,EEB3,D0F3,C2D4,C6E8,B7AC,EEB4,B3EB,BBFB,EEB5,E7DC,EEB6,BDAE,F1E2,CAE8,D2C9,F0DA,F0DB,F0DC,C1C6,B8ED,BECE,F0DE,C5B1,F0DD,D1F1,F0E0,B0CC,BDEA,D2DF,F0DF,B4AF,B7E8,F0E6,F0E5,C6A3,F0E1,F0E2,B4C3,F0E3,D5EE,CCDB,BED2,BCB2,F0E8,F0E7,F0E4,B2A1,D6A2,D3B8,BEB7,C8AC,F0EA,D1F7,D6CC,BADB,F0E9,B6BB,CDB4,C6A6,C1A1,F0EB,F0EE,F0ED,F0F0,F0EC,BBBE,F0EF,CCB5,F0F2,B3D5,B1D4,F0F3,F0F4,F0F6,B4E1,F0F1,F0F7,F0FA,F0F8,F0F5,F0FD,F0F9,F0FC,F0FE,F1A1,CEC1,F1A4,F1A3,C1F6,F0FB,CADD,B4F1,B1F1,CCB1,F1A6,F1A7,F1AC,D5CE,F1A9,C8B3,F1A2,F1AB,F1A8,F1A5,F1AA,B0A9,F1AD,F1AF,F1B1,F1B0,F1AE,D1A2,F1B2,F1B3,B9EF,B5C7,B0D7,B0D9,D4ED,B5C4,BDD4,BBCA,F0A7,B8DE,F0A8,B0A8,F0A9,CDEE,F0AA,F0AB,C6A4,D6E5,F1E4,F1E5,C3F3,D3DB,D6D1,C5E8,D3AF,D2E6,EEC1,B0BB,D5B5,D1CE,BCE0,BAD0,BFF8,B8C7,B5C1,C5CC,CAA2,C3CB,EEC2,C4BF,B6A2,EDEC,C3A4,D6B1,CFE0,EDEF,C5CE,B6DC,CAA1,EDED,EDF0,EDF1,C3BC,BFB4,EDEE,EDF4,EDF2,D5E6,C3DF,EDF3,EDF6,D5A3,D1A3,EDF5,C3D0,EDF7,BFF4,BEEC,EDF8,CCF7,D1DB,D7C5,D5F6,EDFC,EDFB,EDF9,EDFA,EDFD,BEA6,CBAF,EEA1,B6BD,EEA2,C4C0,EDFE,BDDE,B2C7,B6C3,EEA5,D8BA,EEA3,EEA6,C3E9,B3F2,EEA7,EEA4,CFB9,EEA8,C2F7,EEA9,EEAA,DEAB,C6B3,C7C6,D6F5,B5C9,CBB2,EEAB,CDAB,EEAC,D5B0,EEAD,F6C4,DBC7,B4A3,C3AC,F1E6,CAB8,D2D3,D6AA,EFF2,BED8,BDC3,EFF3,B6CC,B0AB,CAAF,EDB6,EDB7,CEF9,B7AF,BFF3,EDB8,C2EB,C9B0,EDB9,C6F6,BFB3,EDBC,C5F8,D1D0,D7A9,EDBA,EDBB,D1E2,EDBF,EDC0,EDC4,EDC8,EDC6,EDCE,D5E8,EDC9,EDC7,EDBE,C5E9,C6C6,C9E9,D4D2,EDC1,EDC2,EDC3,EDC5,C0F9,B4A1,B9E8,EDD0,EDD1,EDCA,EDCF,CEF8,CBB6,EDCC,EDCD,CFF5,EDD2,C1F2,D3B2,EDCB,C8B7,BCEF,C5F0,EDD6,B5EF,C2B5,B0AD,CBE9,B1AE,EDD4,CDEB,B5E2,EDD5,EDD3,EDD7,B5FA,EDD8,EDD9,EDDC,B1CC,C5F6,BCEE,EDDA,CCBC,B2EA,EDDB,C4EB,B4C5,B0F5,EDDF,C0DA,B4E8,C5CD,EDDD,BFC4,EDDE,C4A5,EDE0,EDE1,EDE3,C1D7,BBC7,BDB8,EDE2,EDE4,EDE6,EDE5,EDE7,CABE,ECEA,C0F1,C9E7,ECEB,C6EE,ECEC,C6ED,ECED,ECF0,D7E6,ECF3,ECF1,ECEE,ECEF,D7A3,C9F1,CBEE,ECF4,ECF2,CFE9,ECF6,C6B1,BCC0,ECF5,B5BB,BBF6,ECF7,D9F7,BDFB,C2BB,ECF8,ECF9,B8A3,ECFA,ECFB,ECFC,D3ED,D8AE,C0EB,C7DD,BACC,D0E3,CBBD,CDBA,B8D1,B1FC,C7EF,D6D6,BFC6,C3EB,EFF5,C3D8,D7E2,EFF7,B3D3,C7D8,D1ED,D6C8,EFF8,EFF6,BBFD,B3C6,BDD5,D2C6,BBE0,CFA1,EFFC,EFFB,EFF9,B3CC,C9D4,CBB0,EFFE,B0DE,D6C9,EFFD,B3ED,F6D5,CEC8,F0A2,F0A1,B5BE,BCDA,BBFC,B8E5,C4C2,F0A3,CBEB,F0A6,D1A8,BEBF,C7EE,F1B6,F1B7,BFD5,B4A9,F1B8,CDBB,C7D4,D5AD,F1B9,F1BA,C7CF,D2A4,D6CF,F1BB,BDD1,B4B0,BEBD,B4DC,CED1,BFDF,F1BD,BFFA,F1BC,F1BF,F1BE,F1C0,F1C1,C1FE,C1A2,CAFA,D5BE,BEBA,BEB9,D5C2,BFA2,CDAF,F1B5,BDDF,B6CB,D6F1,F3C3,F3C4,B8CD,F3C6,F3C7,B0CA,F3C5,F3C9,CBF1,F3CB,D0A6,B1CA,F3C8,F3CF,B5D1,F3D7,F3D2,F3D4,F3D3,B7FB,B1BF,F3CE,F3CA,B5DA,F3D0,F3D1,F3D5,F3CD,BCE3,C1FD,F3D6,F3DA,F3CC,B5C8,BDEE,F3DC,B7A4,BFF0,D6FE,CDB2,B4F0,B2DF,F3D8,F3D9,C9B8,F3DD,F3DE,F3E1,F3DF,F3E3,F3E2,F3DB,BFEA,B3EF,F3E0,C7A9,BCF2,F3EB,B9BF,F3E4,B2AD,BBFE,CBE3,F3ED,F3E9,B9DC,F3EE,F3E5,F3E6,F3EA,C2E1,F3EC,F3EF,F3E8,BCFD,CFE4,F3F0,F3E7,F3F2,D7AD,C6AA,F3F3,F3F1,C2A8,B8DD,F3F5,F3F4,B4DB,F3F6,F3F7,F3F8,C0BA,C0E9,C5F1,F3FB,F3FA,B4D8,F3FE,F3F9,F3FC,F3FD,F4A1,F4A3,BBC9,F4A2,F4A4,B2BE,F4A6,F4A5,BCAE,C3D7,D9E1,C0E0,F4CC,D7D1,B7DB,F4CE,C1A3,C6C9,B4D6,D5B3,F4D0,F4CF,F4D1,CBDA,F4D2,D4C1,D6E0,B7E0,C1B8,C1BB,F4D3,BEAC,B4E2,F4D4,F4D5,BEAB,F4D6,F4DB,F4D7,F4DA,BAFD,F4D8,F4D9,B8E2,CCC7,F4DC,B2DA,C3D3,D4E3,BFB7,F4DD,C5B4,F4E9,CFB5,CEC9,CBD8,CBF7,BDF4,D7CF,C0DB,D0F5,F4EA,F4EB,F4EC,F7E3,B7B1,F4ED,D7EB,F4EE,E6F9,BEC0,E6FA,BAEC,E6FB,CFCB,E6FC,D4BC,BCB6,E6FD,E6FE,BCCD,C8D2,CEB3,E7A1,B4BF,E7A2,C9B4,B8D9,C4C9,D7DD,C2DA,B7D7,D6BD,CEC6,B7C4,C5A6,E7A3,CFDF,E7A4,E7A5,E7A6,C1B7,D7E9,C9F0,CFB8,D6AF,D6D5,E7A7,B0ED,E7A8,E7A9,C9DC,D2EF,BEAD,E7AA,B0F3,C8DE,BDE1,E7AB,C8C6,E7AC,BBE6,B8F8,D1A4,E7AD,C2E7,BEF8,BDCA,CDB3,E7AE,E7AF,BEEE,D0E5,CBE7,CCD0,BCCC,E7B0,BCA8,D0F7,E7B1,D0F8,E7B2,E7B3,B4C2,E7B4,E7B5,C9FE,CEAC,C3E0,E7B7,B1C1,B3F1,E7B8,E7B9,D7DB,D5C0,E7BA,C2CC,D7BA,E7BB,E7BC,E7BD,BCEA,C3E5,C0C2,E7BE,E7BF,BCA9,E7C0,E7C1,E7B6,B6D0,E7C2,E7C3,E7C4,BBBA,B5DE,C2C6,B1E0,E7C5,D4B5,E7C6,B8BF,E7C8,E7C7,B7EC,E7C9,B2F8,E7CA,E7CB,E7CC,E7CD,E7CE,E7CF,E7D0,D3A7,CBF5,E7D1,E7D2,E7D3,E7D4,C9C9,E7D5,E7D6,E7D7,E7D8,E7D9,BDC9,E7DA,F3BE,B8D7,C8B1,F3BF,F3C0,F3C1,B9DE,CDF8,D8E8,BAB1,C2DE,EEB7,B7A3,EEB9,EEB8,B0D5,EEBB,D5D6,D7EF,D6C3,EEBD,CAF0,EEBC,EEBE,EEC0,EEBF,D1F2,C7BC,C3C0,B8E1,C1E7,F4C6,D0DF,F4C7,CFDB,C8BA,F4C8,F4C9,F4CA,F4CB,D9FA,B8FE,E5F1,D3F0,F4E0,CECC,B3E1,F1B4,D2EE,F4E1,CFE8,F4E2,C7CC,B5D4,B4E4,F4E4,F4E3,F4E5,F4E6,F4E7,BAB2,B0BF,F4E8,B7AD,D2ED,D2AB,C0CF,BFBC,EBA3,D5DF,EAC8,F1F3,B6F8,CBA3,C4CD,F1E7,F1E8,B8FB,F1E9,BAC4,D4C5,B0D2,F1EA,F1EB,F1EC,F1ED,F1EE,F1EF,F1F1,F1F0,C5D5,F1F2,B6FA,F1F4,D2AE,DEC7,CBCA,B3DC,B5A2,B9A2,C4F4,F1F5,F1F6,C1C4,C1FB,D6B0,F1F7,F1F8,C1AA,C6B8,BEDB,F1F9,B4CF,F1FA,EDB2,EDB1,CBE0,D2DE,CBC1,D5D8,C8E2,C0DF,BCA1,EBC1,D0A4,D6E2,B6C7,B8D8,EBC0,B8CE,EBBF,B3A6,B9C9,D6AB,B7F4,B7CA,BCE7,B7BE,EBC6,EBC7,B0B9,BFCF,EBC5,D3FD,EBC8,EBC9,B7CE,EBC2,EBC4,C9F6,D6D7,D5CD,D0B2,EBCF,CEB8,EBD0,B5A8,B1B3,EBD2,CCA5,C5D6,EBD3,EBD1,C5DF,EBCE,CAA4,EBD5,B0FB,BAFA,D8B7,F1E3,EBCA,EBCB,EBCC,EBCD,EBD6,E6C0,EBD9,BFE8,D2C8,EBD7,EBDC,B8EC,EBD8,BDBA,D0D8,B0B7,EBDD,C4DC,D6AC,B4E0,C2F6,BCB9,EBDA,EBDB,D4E0,C6EA,C4D4,EBDF,C5A7,D9F5,B2B1,EBE4,BDC5,EBE2,EBE3,B8AC,CDD1,EBE5,EBE1,C1B3,C6A2,CCF3,EBE6,C0B0,D2B8,EBE7,B8AF,B8AD,EBE8,C7BB,CDF3,EBEA,EBEB,EBED,D0C8,EBF2,EBEE,EBF1,C8F9,D1FC,EBEC,EBE9,B8B9,CFD9,C4E5,EBEF,EBF0,CCDA,CDC8,B0F2,EBF6,EBF5,B2B2,B8E0,EBF7,B1EC,CCC5,C4A4,CFA5,EBF9,ECA2,C5F2,EBFA,C9C5,E2DF,EBFE,CDCE,ECA1,B1DB,D3B7,D2DC,EBFD,EBFB,B3BC,EAB0,D7D4,F4AB,B3F4,D6C1,D6C2,D5E9,BECA,F4A7,D2A8,F4A8,F4A9,F4AA,BECB,D3DF,C9E0,C9E1,F3C2,CAE6,CCF2,E2B6,CBB4,CEE8,D6DB,F4AD,F4AE,F4AF,F4B2,BABD,F4B3,B0E3,F4B0,F4B1,BDA2,B2D5,F4B6,F4B7,B6E6,B2B0,CFCF,F4B4,B4AC,F4B5,F4B8,F4B9,CDA7,F4BA,F4BB,F4BC,CBD2,F4BD,F4BE,F4BF,F4DE,C1BC,BCE8,C9AB,D1DE,E5F5,DCB3,D2D5,DCB4,B0AC,DCB5,BDDA,DCB9,D8C2,DCB7,D3F3,C9D6,DCBA,DCB6,DCBB,C3A2,DCBC,DCC5,DCBD,CEDF,D6A5,DCCF,DCCD,DCD2,BDE6,C2AB,DCB8,DCCB,DCCE,DCBE,B7D2,B0C5,DCC7,D0BE,DCC1,BBA8,B7BC,DCCC,DCC6,DCBF,C7DB,D1BF,DCC0,DCCA,DCD0,CEAD,DCC2,DCC3,DCC8,DCC9,B2D4,DCD1,CBD5,D4B7,DCDB,DCDF,CCA6,DCE6,C3E7,DCDC,BFC1,DCD9,B0FA,B9B6,DCE5,DCD3,DCC4,DCD6,C8F4,BFE0,C9BB,B1BD,D3A2,DCDA,DCD5,C6BB,DCDE,D7C2,C3AF,B7B6,C7D1,C3A9,DCE2,DCD8,DCEB,DCD4,DCDD,BEA5,DCD7,DCE0,DCE3,DCE4,DCF8,DCE1,DDA2,DCE7,BCEB,B4C4,C3A3,B2E7,DCFA,DCF2,DCEF,DCFC,DCEE,D2F0,B2E8,C8D7,C8E3,DCFB,DCED,DCF7,DCF5,BEA3,DCF4,B2DD,DCF3,BCF6,DCE8,BBC4,C0F3,BCD4,DCE9,DCEA,DCF1,DCF6,DCF9,B5B4,C8D9,BBE7,DCFE,DCFD,D3AB,DDA1,DDA3,DDA5,D2F1,DDA4,DDA6,DDA7,D2A9,BAC9,DDA9,DDB6,DDB1,DDB4,DDB0,C6CE,C0F2,C9AF,DCEC,DDAE,DDB7,DCF0,DDAF,DDB8,DDAC,DDB9,DDB3,DDAD,C4AA,DDA8,C0B3,C1AB,DDAA,DDAB,DDB2,BBF1,DDB5,D3A8,DDBA,DDBB,C3A7,DDD2,DDBC,DDD1,B9BD,BED5,BEFA,BACA,DDCA,DDC5,DDBF,B2CB,DDC3,DDCB,B2A4,DDD5,DDBE,C6D0,DDD0,DDD4,C1E2,B7C6,DDCE,DDCF,DDC4,DDBD,DDCD,CCD1,DDC9,DDC2,C3C8,C6BC,CEAE,DDCC,DDC8,DDC1,DDC6,C2DC,D3A9,D3AA,DDD3,CFF4,C8F8,DDE6,DDC7,DDE0,C2E4,DDE1,DDD7,D6F8,DDD9,DDD8,B8F0,DDD6,C6CF,B6AD,DDE2,BAF9,D4E1,DDE7,B4D0,DDDA,BFFB,DDE3,DDDF,DDDD,B5D9,DDDB,DDDC,DDDE,BDAF,DDE4,DDE5,DDF5,C3C9,CBE2,DDF2,D8E1,C6D1,DDF4,D5F4,DDF3,DDF0,DDEC,DDEF,DDE8,D0EE,C8D8,DDEE,DDE9,DDEA,CBF2,DDED,B1CD,C0B6,BCBB,DDF1,DDF7,DDF6,DDEB,C5EE,DDFB,DEA4,DEA3,DDF8,C3EF,C2FB,D5E1,CEB5,DDFD,B2CC,C4E8,CADF,C7BE,DDFA,DDFC,DDFE,DEA2,B0AA,B1CE,DEAC,DEA6,BDB6,C8EF,DEA1,DEA5,DEA9,DEA8,DEA7,DEAD,D4CC,DEB3,DEAA,DEAE,C0D9,B1A1,DEB6,DEB1,DEB2,D1A6,DEB5,DEAF,DEB0,D0BD,DEB4,CAED,DEB9,DEB8,DEB7,DEBB,BDE5,B2D8,C3EA,DEBA,C5BA,DEBC,CCD9,B7AA,D4E5,DEBD,DEBF,C4A2,DEC1,DEBE,DEC0,D5BA,DEC2,F2AE,BBA2,C2B2,C5B0,C2C7,F2AF,D0E9,D3DD,EBBD,B3E6,F2B0,F2B1,CAAD,BAE7,F2B3,F2B5,F2B4,CBE4,CFBA,F2B2,CAB4,D2CF,C2EC,CEC3,F2B8,B0F6,F2B7,F2BE,B2CF,D1C1,F2BA,F2BC,D4E9,F2BB,F2B6,F2BF,F2BD,F2B9,F2C7,F2C4,F2C6,F2CA,F2C2,F2C0,F2C5,D6FB,F2C1,C7F9,C9DF,F2C8,B9C6,B5B0,F2C3,F2C9,F2D0,F2D6,BBD7,F2D5,CDDC,D6EB,F2D2,F2D4,B8F2,F2CB,F2CE,C2F9,D5DD,F2CC,F2CD,F2CF,F2D3,F2D9,D3BC,B6EA,CAF1,B7E4,F2D7,F2D8,F2DA,F2DD,F2DB,F2DC,D1D1,F2D1,CDC9,CECF,D6A9,F2E3,C3DB,F2E0,C0AF,F2EC,F2DE,F2E1,F2E8,F2E2,F2E7,F2E6,F2E9,F2DF,F2E4,F2EA,D3AC,F2E5,B2F5,F2F2,D0AB,F2F5,BBC8,F2F9,F2F0,F2F6,F2F8,F2FA,F2F3,F2F1,BAFB,B5FB,F2EF,F2F7,F2ED,F2EE,F2EB,F3A6,F3A3,F3A2,F2F4,C8DA,F2FB,F3A5,C3F8,F2FD,F3A7,F3A9,F3A4,F2FC,F3AB,F3AA,C2DD,F3AE,F3B0,F3A1,F3B1,F3AC,F3AF,F2FE,F3AD,F3B2,F3B4,F3A8,F3B3,F3B5,D0B7,F3B8,D9F9,F3B9,F3B7,C8E4,F3B6,F3BA,F3BB,B4C0,EEC3,F3BC,F3BD,D1AA,F4AC,D0C6,D0D0,D1DC,CFCE,BDD6,D1C3,BAE2,E1E9,D2C2,F1C2,B2B9,B1ED,F1C3,C9C0,B3C4,D9F2,CBA5,F1C4,D6D4,F1C5,F4C0,F1C6,D4AC,F1C7,B0C0,F4C1,F4C2,B4FC,C5DB,CCBB,D0E4,CDE0,F1C8,D9F3,B1BB,CFAE,B8A4,F1CA,F1CB,B2C3,C1D1,D7B0,F1C9,F1CC,F1CE,D9F6,D2E1,D4A3,F4C3,C8B9,F4C4,F1CD,F1CF,BFE3,F1D0,F1D4,F1D6,F1D1,C9D1,C5E1,C2E3,B9FC,F1D3,F1D5,B9D3,F1DB,BAD6,B0FD,F1D9,F1D8,F1D2,F1DA,F1D7,C8EC,CDCA,F1DD,E5BD,F1DC,F1DE,F1DF,CFE5,F4C5,BDF3,F1E0,F1E1,CEF7,D2AA,F1FB,B8B2,BCFB,B9DB,B9E6,C3D9,CAD3,EAE8,C0C0,BEF5,EAE9,EAEA,EAEB,EAEC,EAED,EAEE,EAEF,BDC7,F5FB,F5FD,F5FE,F5FC,BDE2,F6A1,B4A5,F6A2,F6A3,ECB2,D1D4,D9EA,F6A4,EEBA,D5B2,D3FE,CCDC,CAC4,E5C0,F6A5,BEAF,C6A9,DAA5,BCC6,B6A9,B8BC,C8CF,BCA5,DAA6,DAA7,CCD6,C8C3,DAA8,C6FD,D1B5,D2E9,D1B6,BCC7,BDB2,BBE4,DAA9,DAAA,D1C8,DAAB,D0ED,B6EF,C2DB,CBCF,B7ED,C9E8,B7C3,BEF7,D6A4,DAAC,DAAD,C6C0,D7E7,CAB6,D5A9,CBDF,D5EF,DAAE,D6DF,B4CA,DAB0,DAAF,D2EB,DAB1,DAB2,DAB3,CAD4,DAB4,CAAB,DAB5,DAB6,B3CF,D6EF,DAB7,BBB0,B5AE,DAB8,DAB9,B9EE,D1AF,D2E8,DABA,B8C3,CFEA,B2EF,DABB,DABC,BDEB,CEDC,D3EF,DABD,CEF3,DABE,D3D5,BBE5,DABF,CBB5,CBD0,DAC0,C7EB,D6EE,DAC1,C5B5,B6C1,DAC2,B7CC,BFCE,DAC3,DAC4,CBAD,DAC5,B5F7,DAC6,C1C2,D7BB,DAC7,CCB8,D2EA,C4B1,DAC8,B5FD,BBD1,DAC9,D0B3,DACA,DACB,CEBD,DACC,DACD,DACE,B2F7,DAD1,DACF,D1E8,DAD0,C3D5,DAD2,DAD3,DAD4,DAD5,D0BB,D2A5,B0F9,DAD6,C7AB,DAD7,BDF7,C3A1,DAD8,DAD9,C3FD,CCB7,DADA,DADB,C0BE,C6D7,DADC,DADD,C7B4,DADE,DADF,B9C8,BBED,B6B9,F4F8,F4F9,CDE3,F5B9,EBE0,CFF3,BBBF,BAC0,D4A5,E1D9,F5F4,B1AA,B2F2,F5F5,F5F7,BAD1,F5F6,C3B2,F5F9,F5F8,B1B4,D5EA,B8BA,B9B1,B2C6,D4F0,CFCD,B0DC,D5CB,BBF5,D6CA,B7B7,CCB0,C6B6,B1E1,B9BA,D6FC,B9E1,B7A1,BCFA,EADA,EADB,CCF9,B9F3,EADC,B4FB,C3B3,B7D1,BAD8,EADD,D4F4,EADE,BCD6,BBDF,EADF,C1DE,C2B8,D4DF,D7CA,EAE0,EAE1,EAE4,EAE2,EAE3,C9DE,B8B3,B6C4,EAE5,CAEA,C9CD,B4CD,E2D9,C5E2,EAE6,C0B5,D7B8,EAE7,D7AC,C8FC,D8D3,D8CD,D4DE,D4F9,C9C4,D3AE,B8D3,B3E0,C9E2,F4F6,BAD5,F4F7,D7DF,F4F1,B8B0,D5D4,B8CF,C6F0,B3C3,F4F2,B3AC,D4BD,C7F7,F4F4,F4F3,CCCB,C8A4,F4F5,D7E3,C5BF,F5C0,F5BB,F5C3,F5C2,D6BA,F5C1,D4BE,F5C4,F5CC,B0CF,B5F8,F5C9,F5CA,C5DC,F5C5,F5C6,F5C7,F5CB,BEE0,F5C8,B8FA,F5D0,F5D3,BFE7,B9F2,F5BC,F5CD,C2B7,CCF8,BCF9,F5CE,F5CF,F5D1,B6E5,F5D2,F5D5,F5BD,F5D4,D3BB,B3EC,CCA4,F5D6,F5D7,BEE1,F5D8,CCDF,F5DB,B2C8,D7D9,F5D9,F5DA,F5DC,F5E2,F5E0,F5DF,F5DD,F5E1,F5DE,F5E4,F5E5,CCE3,E5BF,B5B8,F5E3,F5E8,CCA3,F5E6,F5E7,F5BE,B1C4,F5BF,B5C5,B2E4,F5EC,F5E9,B6D7,F5ED,F5EA,F5EB,B4DA,D4EA,F5EE,B3F9,F5EF,F5F1,F5F0,F5F2,F5F3,C9ED,B9AA,C7FB,B6E3,CCC9,EAA6,B3B5,D4FE,B9EC,D0F9,E9ED,D7AA,E9EE,C2D6,C8ED,BAE4,E9EF,E9F0,E9F1,D6E1,E9F2,E9F3,E9F5,E9F4,E9F6,E9F7,C7E1,E9F8,D4D8,E9F9,BDCE,E9FA,E9FB,BDCF,E9FC,B8A8,C1BE,E9FD,B1B2,BBD4,B9F5,E9FE,EAA1,EAA2,EAA3,B7F8,BCAD,CAE4,E0CE,D4AF,CFBD,D5B7,EAA4,D5DE,EAA5,D0C1,B9BC,B4C7,B1D9,C0B1,B1E6,B1E7,B1E8,B3BD,C8E8,E5C1,B1DF,C1C9,B4EF,C7A8,D3D8,C6F9,D1B8,B9FD,C2F5,D3AD,D4CB,BDFC,E5C2,B7B5,E5C3,BBB9,D5E2,BDF8,D4B6,CEA5,C1AC,B3D9,CCF6,E5C6,E5C4,E5C8,E5CA,E5C7,B5CF,C6C8,B5FC,E5C5,CAF6,E5C9,C3D4,B1C5,BCA3,D7B7,CDCB,CBCD,CACA,CCD3,E5CC,E5CB,C4E6,D1A1,D1B7,E5CD,E5D0,CDB8,D6F0,E5CF,B5DD,CDBE,E5D1,B6BA,CDA8,B9E4,CAC5,B3D1,CBD9,D4EC,E5D2,B7EA,E5CE,E5D5,B4FE,E5D6,E5D3,E5D4,D2DD,C2DF,B1C6,D3E2,B6DD,CBEC,E5D7,D3F6,B1E9,B6F4,E5DA,E5D8,E5D9,B5C0,D2C5,E5DC,E5DE,E5DD,C7B2,D2A3,E5DB,D4E2,D5DA,E5E0,D7F1,E5E1,B1DC,D1FB,E5E2,E5E4,E5E3,E5E5,D2D8,B5CB,E7DF,DAF5,DAF8,DAF6,DAF7,DAFA,D0CF,C4C7,B0EE,D0B0,DAF9,D3CA,BAAA,DBA2,C7F1,DAFC,DAFB,C9DB,DAFD,DBA1,D7DE,DAFE,C1DA,DBA5,D3F4,DBA7,DBA4,DBA8,BDBC,C0C9,DBA3,DBA6,D6A3,DBA9,DBAD,DBAE,DBAC,BAC2,BFA4,DBAB,DBAA,D4C7,B2BF,DBAF,B9F9,DBB0,B3BB,B5A6,B6BC,DBB1,B6F5,DBB2,B1C9,DBB4,DBB3,DBB5,DBB7,DBB6,DBB8,DBB9,DBBA,D3CF,F4FA,C7F5,D7C3,C5E4,F4FC,F4FD,F4FB,BEC6,D0EF,B7D3,D4CD,CCAA,F5A2,F5A1,BAA8,F4FE,CBD6,F5A4,C0D2,B3EA,CDAA,F5A5,F5A3,BDB4,F5A8,F5A9,BDCD,C3B8,BFE1,CBE1,F5AA,F5A6,F5A7,C4F0,F5AC,B4BC,D7ED,B4D7,F5AB,F5AE,F5AD,F5AF,D0D1,C3D1,C8A9,F5B0,F5B1,F5B2,F5B3,F5B4,F5B5,F5B7,F5B6,F5B8,B2C9,D3D4,CACD,C0EF,D6D8,D2B0,C1BF,BDF0,B8AA,BCF8,F6C6,F6C7,F6C8,F6C9,F6CA,F6CC,F6CB,F7E9,F6CD,F6CE,EEC4,EEC5,EEC6,D5EB,B6A4,EEC8,EEC7,EEC9,EECA,C7A5,EECB,EECC,B7B0,B5F6,EECD,EECF,EECE,B8C6,EED0,EED1,EED2,B6DB,B3AE,D6D3,C4C6,B1B5,B8D6,EED3,EED4,D4BF,C7D5,BEFB,CED9,B9B3,EED6,EED5,EED8,EED7,C5A5,EED9,EEDA,C7AE,EEDB,C7AF,EEDC,B2A7,EEDD,EEDE,EEDF,EEE0,EEE1,D7EA,EEE2,EEE3,BCD8,EEE4,D3CB,CCFA,B2AC,C1E5,EEE5,C7A6,C3AD,EEE6,EEE7,EEE8,EEE9,EEEA,EEEB,EEEC,EEED,EEEE,EEEF,EEF0,EEF1,EEF2,EEF4,EEF3,EEF5,CDAD,C2C1,EEF6,EEF7,EEF8,D5A1,EEF9,CFB3,EEFA,EEFB,EEFC,EEFD,EFA1,EEFE,EFA2,B8F5,C3FA,EFA3,EFA4,BDC2,D2BF,B2F9,EFA5,EFA6,EFA7,D2F8,EFA8,D6FD,EFA9,C6CC,EFAA,EFAB,C1B4,EFAC,CFFA,CBF8,EFAE,EFAD,B3FA,B9F8,EFAF,EFB0,D0E2,EFB1,EFB2,B7E6,D0BF,EFB3,EFB4,EFB5,C8F1,CCE0,EFB6,EFB7,EFB8,EFB9,EFBA,D5E0,EFBB,B4ED,C3AA,EFBC,EFBD,EFBE,EFBF,CEFD,EFC0,C2E0,B4B8,D7B6,BDF5,CFC7,EFC3,EFC1,EFC2,EFC4,B6A7,BCFC,BEE2,C3CC,EFC5,EFC6,EFC7,EFCF,EFC8,EFC9,EFCA,C7C2,EFF1,B6CD,EFCB,EFCC,EFCD,B6C6,C3BE,EFCE,EFD0,EFD1,EFD2,D5F2,EFD3,C4F7,EFD4,C4F8,EFD5,EFD6,B8E4,B0F7,EFD7,EFD8,EFD9,EFDA,EFDB,EFDC,EFDD,EFDE,BEB5,EFE1,EFDF,EFE0,EFE2,EFE3,C1CD,EFE4,EFE5,EFE6,EFE7,EFE8,EFE9,EFEA,EFEB,EFEC,C0D8,EFED,C1AD,EFEE,EFEF,EFF0,CFE2,B3A4,C3C5,E3C5,C9C1,E3C6,B1D5,CECA,B4B3,C8F2,E3C7,CFD0,E3C8,BCE4,E3C9,E3CA,C3C6,D5A2,C4D6,B9EB,CEC5,E3CB,C3F6,E3CC,B7A7,B8F3,BAD2,E3CD,E3CE,D4C4,E3CF,E3D0,D1CB,E3D1,E3D2,E3D3,E3D4,D1D6,E3D5,B2FB,C0BB,E3D6,C0AB,E3D7,E3D8,E3D9,E3DA,E3DB,B8B7,DAE2,B6D3,DAE4,DAE3,DAE6,C8EE,DAE5,B7C0,D1F4,D2F5,D5F3,BDD7,D7E8,DAE8,DAE7,B0A2,CDD3,DAE9,B8BD,BCCA,C2BD,C2A4,B3C2,DAEA,C2AA,C4B0,BDB5,CFDE,DAEB,C9C2,B1DD,DAEC,B6B8,D4BA,B3FD,DAED,D4C9,CFD5,C5E3,DAEE,DAEF,DAF0,C1EA,CCD5,CFDD,D3E7,C2A1,DAF1,CBE5,DAF2,CBE6,D2FE,B8F4,DAF3,B0AF,CFB6,D5CF,CBED,DAF4,E3C4,C1A5,F6BF,F6C0,F6C1,C4D1,C8B8,D1E3,D0DB,D1C5,BCAF,B9CD,EFF4,B4C6,D3BA,F6C2,B3FB,F6C3,B5F1,F6C5,D3EA,F6A7,D1A9,F6A9,F6A8,C1E3,C0D7,B1A2,CEED,D0E8,F6AB,CFF6,F6AA,D5F0,F6AC,C3B9,BBF4,F6AE,F6AD,C4DE,C1D8,CBAA,CFBC,F6AF,F6B0,F6B1,C2B6,B0D4,C5F9,F6B2,C7E0,F6A6,BEB8,BEB2,B5E5,B7C7,BFBF,C3D2,C3E6,D8CC,B8EF,BDF9,D1A5,B0D0,F7B0,F7B1,D0AC,B0B0,F7B2,F7B3,F7B4,C7CA,BECF,F7B7,F7B6,B1DE,F7B5,F7B8,F7B9,CEA4,C8CD,BAAB,E8B8,E8B9,E8BA,BEC2,D2F4,D4CF,C9D8,D2B3,B6A5,C7EA,F1FC,CFEE,CBB3,D0EB,E7EF,CDE7,B9CB,B6D9,F1FD,B0E4,CBCC,F1FE,D4A4,C2AD,C1EC,C6C4,BEB1,F2A1,BCD5,F2A2,F2A3,F2A4,D2C3,C6B5,CDC7,F2A5,D3B1,BFC5,CCE2,F2A6,F2A7,D1D5,B6EE,F2A8,F2A9,B5DF,F2AA,F2AB,B2FC,F2AC,F2AD,C8A7,B7E7,ECA9,ECAA,ECAB,ECAC,C6AE,ECAD,ECAE,B7C9,CAB3,E2B8,F7CF,F7D0,B2CD,F7D1,F7D3,F7D2,E2BB,BCA2,E2BC,E2BD,E2BE,E2BF,E2C0,E2C1,B7B9,D2FB,BDA4,CACE,B1A5,CBC7,E2C2,B6FC,C8C4,E2C3,BDC8,B1FD,E2C4,B6F6,E2C5,C4D9,E2C6,CFDA,B9DD,E2C7,C0A1,E2C8,B2F6,E2C9,C1F3,E2CA,E2CB,C2F8,E2CC,E2CD,E2CE,CAD7,D8B8,D9E5,CFE3,F0A5,DCB0,C2ED,D4A6,CDD4,D1B1,B3DB,C7FD,B2B5,C2BF,E6E0,CABB,E6E1,E6E2,BED4,E6E3,D7A4,CDD5,E6E5,BCDD,E6E4,E6E6,E6E7,C2EE,BDBE,E6E8,C2E6,BAA7,E6E9,E6EA,B3D2,D1E9,BFA5,E6EB,C6EF,E6EC,E6ED,E6EE,C6AD,E6EF,C9A7,E6F0,E6F1,E6F2,E5B9,E6F3,E6F4,C2E2,E6F5,E6F6,D6E8,E6F7,E6F8,B9C7,F7BB,F7BA,F7BE,F7BC,BAA1,F7BF,F7C0,F7C2,F7C1,F7C4,F7C3,F7C5,F7C6,F7C7,CBE8,B8DF,F7D4,F7D5,F7D6,F7D8,F7DA,F7D7,F7DB,F7D9,D7D7,F7DC,F7DD,F7DE,F7DF,F7E0,DBCB,D8AA,E5F7,B9ED,BFFD,BBEA,F7C9,C6C7,F7C8,F7CA,F7CC,F7CB,F7CD,CEBA,F7CE,C4A7,D3E3,F6CF,C2B3,F6D0,F6D1,F6D2,F6D3,F6D4,F6D6,B1AB,F6D7,F6D8,F6D9,F6DA,F6DB,F6DC,F6DD,F6DE,CFCA,F6DF,F6E0,F6E1,F6E2,F6E3,F6E4,C0F0,F6E5,F6E6,F6E7,F6E8,F6E9,F6EA,F6EB,F6EC,F6ED,F6EE,F6EF,F6F0,F6F1,F6F2,F6F3,F6F4,BEA8,F6F5,F6F6,F6F7,F6F8,C8FA,F6F9,F6FA,F6FB,F6FC,F6FD,F6FE,F7A1,F7A2,F7A3,F7A4,F7A5,F7A6,F7A7,F7A8,B1EE,F7A9,F7AA,F7AB,F7AC,F7AD,C1DB,F7AE,F7AF,C4F1,F0AF,BCA6,F0B0,C3F9,C5B8,D1BB,F0B1,F0B2,F0B3,F0B4,F0B5,D1BC,D1EC,F0B7,F0B6,D4A7,CDD2,F0B8,F0BA,F0B9,F0BB,F0BC,B8EB,F0BD,BAE8,F0BE,F0BF,BEE9,F0C0,B6EC,F0C1,F0C2,F0C3,F0C4,C8B5,F0C5,F0C6,F0C7,C5F4,F0C8,F0C9,F0CA,F7BD,F0CB,F0CC,F0CD,F0CE,F0CF,BAD7,F0D0,F0D1,F0D2,F0D3,F0D4,F0D5,F0D6,F0D8,D3A5,F0D7,F0D9,F5BA,C2B9,F7E4,F7E5,F7E6,F7E7,F7E8,C2B4,F7EA,F7EB,C2F3,F4F0,F4EF,C2E9,F7E1,F7E2,BBC6,D9E4,CAF2,C0E8,F0A4,BADA,C7AD,C4AC,F7EC,F7ED,F7EE,F7F0,F7EF,F7F1,F7F4,F7F3,F7F2,F7F5,F7F6,EDE9,EDEA,EDEB,F6BC,F6BD,F6BE,B6A6,D8BE,B9C4,D8BB,DCB1,CAF3,F7F7,F7F8,F7F9,F7FB,F7FA,B1C7,F7FC,F7FD,F7FE,C6EB,ECB4,B3DD,F6B3,F6B4,C1E4,F6B5,F6B6,F6B7,F6B8,F6B9,F6BA,C8A3,F6BB,C1FA,B9A8,EDE8,B9EA,D9DF,A3A1,A3A2,A3A3,A1E7,A3A5,A3A6,A3A7,A3A8,A3A9,A3AA,A3AB,A3AC,A3AD,A3AE,A3AF,A3B0,A3B1,A3B2,A3B3,A3B4,A3B5,A3B6,A3B7,A3B8,A3B9,A3BA,A3BB,A3BC,A3BD,A3BE,A3BF,A3C0,A3C1,A3C2,A3C3,A3C4,A3C5,A3C6,A3C7,A3C8,A3C9,A3CA,A3CB,A3CC,A3CD,A3CE,A3CF,A3D0,A3D1,A3D2,A3D3,A3D4,A3D5,A3D6,A3D7,A3D8,A3D9,A3DA,A3DB,A3DC,A3DD,A3DE,A3DF,A3E0,A3E1,A3E2,A3E3,A3E4,A3E5,A3E6,A3E7,A3E8,A3E9,A3EA,A3EB,A3EC,A3ED,A3EE,A3EF,A3F0,A3F1,A3F2,A3F3,A3F4,A3F5,A3F6,A3F7,A3F8,A3F9,A3FA,A3FB,A3FC,A3FD,A1AB,A1E9,A1EA,A3FE,A3A4';
},
_u2a_char: function(chrCode){
var chrHex=chrCode.toString(16);
chrHex='000'+chrHex.toUpperCase();
chrHex=chrHex.substr(chrHex.length-4);
var i=this._unicode().indexOf(chrHex);
if (i!=-1){
chrHex=this._ansicode().substr(i,4);
}
return parseInt(chrHex,16)
},
_a2u_char: function(chrCode){
var chrHex=chrCode.toString(16);
chrHex='000'+chrHex.toUpperCase();
chrHex=chrHex.substr(chrHex.length-4);
var i=this._ansicode().indexOf(chrHex);
if (i!=-1){
chrHex=this._unicode().substr(i,4);
}
return parseInt(chrHex,16)
},
_u2a: function(asContents){
var len1=asContents.length;
var temp='';
for (var i=0;i<len1;i++){
var varasc=asContents.charCodeAt(i);
if (varasc<0) varasc+=65536;
if (varasc>127) varasc=this._u2a_char(varasc);
if (varasc>255){
var varlow=varasc & 65280;
varlow=varlow>>8;
var varhigh=varasc & 255;
temp+=String.fromCharCode(varlow)+String.fromCharCode(varhigh);
} else {
temp+=String.fromCharCode(varasc);
}
}
return temp;
},
_a2u: function(asContents){
var len1=asContents.length;
var temp='';
var chrcode;
for (var i=0;i<len1;i++){
var varasc=asContents.charCodeAt(i);
if (varasc>127){
chrcode=this._a2u_char((varasc<<8)+asContents.charCodeAt(++i));
} else {
chrcode=varasc;
}
temp+=String.fromCharCode(chrcode);
}
return temp;
}
};
/**
* Cookie plugin
*
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/
/**
* Create a cookie with the given name and value and other optional parameters.
*
* @example $.cookie('the_cookie', 'the_value');
* @desc Set the value of a cookie.
* @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
* @desc Create a cookie with all available options.
* @example $.cookie('the_cookie', 'the_value');
* @desc Create a session cookie.
* @example $.cookie('the_cookie', null);
* @desc Delete a cookie by passing null as value.
*
* @param String name The name of the cookie.
* @param String value The value of the cookie.
* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
* If set to null or omitted, the cookie will be a session cookie and will not be retained
* when the the browser exits.
* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
* require a secure protocol (like HTTPS).
* @type undefined
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/
/**
* Get the value of a cookie with the given name.
*
* @example $.cookie('the_cookie');
* @desc Get the value of a cookie.
*
* @param String name The name of the cookie.
* @return The value of the cookie.
* @type String
*
* @name $.cookie
* @cat Plugins/Cookie
* @author Klaus Hartl/klaus.hartl@stilbuero.de
*/
jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + options.path : '';
var domain = options.domain ? '; domain=' + options.domain : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};
\ No newline at end of file
/*! jQuery v1.8.3 jquery.com | jquery.org/license */
(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
\ No newline at end of file
;!function(a,b){
"use strict";
var c,d,
e="", //组件存放目录,为空表示自动获取
f={getPath:function(){var a=document.scripts,b=a[a.length-1].src;return e?e:b.substring(0,b.lastIndexOf("/")+1)},type:["dialog","page","iframe","loading","tips"]};a.layer={v:"1.8.5",ie6:!!a.ActiveXObject&&!a.XMLHttpRequest,index:0,path:f.getPath(),use:function(a,b){var d=c("head")[0],a=a.replace(/\s/g,""),e=/\.css$/.test(a),f=document.createElement(e?"link":"script"),g=a.replace(/\.|\//g,"");e&&(f.type="text/css",f.rel="stylesheet"),f[e?"href":"src"]=/^http:\/\//.test(a)?a:layer.path+a,f.id=g,c("#"+g)[0]||d.appendChild(f),b&&(document.all?c(f).ready(b):c(f).load(b))},alert:function(a,b,d,e){var f="function"==typeof d,g={dialog:{msg:a,type:b,yes:f?d:e},area:["auto","auto"]};return f||(g.title=d),c.layer(g)},confirm:function(a,b,d,e){var f="function"==typeof d,g={dialog:{msg:a,type:4,btns:2,yes:b,no:f?d:e}};return f||(g.title=d),c.layer(g)},msg:function(a,d,e,f){var g={title:!1,closeBtn:!1,time:d===b?2:d,dialog:{msg:""===a||a===b?"&nbsp;":a},end:f};return"object"==typeof e?(g.dialog.type=e.type,g.shade=e.shade,g.shift=e.rate):"function"==typeof e?g.end=e:g.dialog.type=e,c.layer(g)},load:function(a,b){return"string"==typeof a?layer.msg(a,b||0,16):c.layer({time:a,loading:{type:b},bgcolor:b?"#fff":"",shade:b?[.1,"#000"]:[0],border:3!==b&&b?[6,.3,"#000"]:[0],type:3,title:["",!1],closeBtn:[0,!1]})},tips:function(a,b,d,e,f,g){var h={type:4,shade:!1,success:function(a){this.closeBtn||a.find(".xubox_tips").css({"padding-right":10})},bgcolor:"",tips:{msg:a,follow:b}};return h.time="object"==typeof d?d.time:0|d,d=d||{},h.closeBtn=d.closeBtn||!1,h.maxWidth=d.maxWidth||e,h.tips.guide=d.guide||f,h.tips.style=d.style||g,h.tips.more=d.more,c.layer(h)}};var g=["xubox_layer","xubox_iframe",".xubox_title",".xubox_text",".xubox_page",".xubox_main"],h=function(a){var b=this,d=b.config;layer.index++,b.index=layer.index,b.config=c.extend({},d,a),b.config.dialog=c.extend({},d.dialog,a.dialog),b.config.page=c.extend({},d.page,a.page),b.config.iframe=c.extend({},d.iframe,a.iframe),b.config.loading=c.extend({},d.loading,a.loading),b.config.tips=c.extend({},d.tips,a.tips),b.creat()};h.pt=h.prototype,h.pt.config={type:0,shade:[.3,"#000"],fix:!0,move:".xubox_title",title:"&#x4FE1;&#x606F;",offset:["","50%"],area:["310px","auto"],closeBtn:[0,!0],time:0,bgcolor:"#fff",border:[6,.3,"#000"],zIndex:19891014,maxWidth:400,dialog:{btns:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],type:8,msg:"",yes:function(a){layer.close(a)},no:function(a){layer.close(a)}},page:{dom:"#xulayer",html:"",url:""},iframe:{src:"http://sentsin.com",scrolling:"auto"},loading:{type:0},tips:{msg:"",follow:"",guide:0,isGuide:!0,style:["background-color:#FF9900; color:#fff;","#FF9900"]},success:function(){},close:function(a){layer.close(a)},end:function(){}},h.pt.space=function(a){var b=this,a=a||"",c=b.index,d=b.config,e=d.dialog,f=-1===e.type?"":'<span class="xubox_msg xulayer_png32 xubox_msgico xubox_msgtype'+e.type+'"></span>',h=['<div class="xubox_dialog">'+f+'<span class="xubox_msg xubox_text" style="'+(f?"":"padding-left:20px")+'">'+e.msg+"</span></div>",'<div class="xubox_page">'+a+"</div>",'<iframe scrolling="'+d.iframe.scrolling+'" allowtransparency="true" id="'+g[1]+c+'" name="'+g[1]+c+'" onload="this.className=\''+g[1]+'\'" class="'+g[1]+'" frameborder="0" src="'+d.iframe.src+'"></iframe>','<span class="xubox_loading xubox_loading_'+d.loading.type+'"></span>','<div class="xubox_tips" style="'+d.tips.style[0]+'"><div class="xubox_tipsMsg">'+d.tips.msg+'</div><i class="layerTipsG"></i></div>'],i="",j="",k=d.zIndex+c,l="z-index:"+k+"; background-color:"+d.shade[1]+"; opacity:"+d.shade[0]+"; filter:alpha(opacity="+100*d.shade[0]+");";d.shade[0]&&(i='<div times="'+c+'" id="xubox_shade'+c+'" class="xubox_shade" style="'+l+'"></div>'),d.zIndex=k;var m="",n="",o="z-index:"+(k-1)+"; background-color: "+d.border[2]+"; opacity:"+d.border[1]+"; filter:alpha(opacity="+100*d.border[1]+"); top:-"+d.border[0]+"px; left:-"+d.border[0]+"px;";d.border[0]&&(j='<div id="xubox_border'+c+'" class="xubox_border" style="'+o+'"></div>'),!d.maxmin||1!==d.type&&2!==d.type||/^\d+%$/.test(d.area[0])&&/^\d+%$/.test(d.area[1])||(n='<a class="xubox_min" href="javascript:;"><cite></cite></a><a class="xubox_max xulayer_png32" href="javascript:;"></a>'),d.closeBtn[1]&&(n+='<a class="xubox_close xulayer_png32 xubox_close'+d.closeBtn[0]+'" href="javascript:;" style="'+(4===d.type?"position:absolute; right:-3px; _right:7px; top:-4px;":"")+'"></a>');var p="object"==typeof d.title;return d.title&&(m='<div class="xubox_title" style="'+(p?d.title[1]:"")+'"><em>'+(p?d.title[0]:d.title)+"</em></div>"),[i,'<div times="'+c+'" showtime="'+d.time+'" style="z-index:'+k+'" id="'+g[0]+c+'" class="'+g[0]+'"><div style="background-color:'+d.bgcolor+"; z-index:"+k+'" class="xubox_main">'+h[d.type]+m+'<span class="xubox_setwin">'+n+'</span><span class="xubox_botton"></span></div>'+j+"</div>"]},h.pt.creat=function(){var a=this,b="",d=a.config,e=d.dialog,f=a.index,h=d.page,i=c("body"),j=function(d){var d=d||"";b=a.space(d),i.append(c(b[0]))};switch(d.type){case 0:d.title||(d.area=["auto","auto"]),c(".xubox_dialog")[0]&&layer.close(c(".xubox_dialog").parents("."+g[0]).attr("times"));break;case 1:if(""!==h.html)j('<div class="xuboxPageHtml">'+h.html+"</div>"),i.append(c(b[1]));else if(""!==h.url)j('<div class="xuboxPageHtml" id="xuboxPageHtml'+f+'">'+h.html+"</div>"),i.append(c(b[1])),c.get(h.url,function(a){c("#xuboxPageHtml"+f).html(a.toString()),h.ok&&h.ok(a)});else{if(0!=c(h.dom).parents(g[4]).length)return;j(),c(h.dom).show().wrap(c(b[1]))}break;case 3:d.title=!1,d.area=["auto","auto"],d.closeBtn=["",!1],c(".xubox_loading")[0]&&layer.closeLoad();break;case 4:d.title=!1,d.area=["auto","auto"],d.fix=!1,d.border=[0],d.tips.more||layer.closeTips()}1!==d.type&&(j(),i.append(c(b[1])));var k=a.layerE=c("#"+g[0]+f);if(k.css({width:d.area[0],height:d.area[1]}),d.fix||k.css({position:"absolute"}),d.title&&(3!==d.type||4!==d.type)){var l=0===d.type?e:d,m=k.find(".xubox_botton");switch(l.btn=d.btn||e.btn,l.btns){case 0:m.html("").hide();break;case 1:m.html('<a href="javascript:;" class="xubox_yes xubox_botton1">'+l.btn[0]+"</a>");break;case 2:m.html('<a href="javascript:;" class="xubox_yes xubox_botton2">'+l.btn[0]+'</a><a href="javascript:;" class="xubox_no xubox_botton3">'+l.btn[1]+"</a>")}}"auto"===k.css("left")?(k.hide(),setTimeout(function(){k.show(),a.set(f)},500)):a.set(f),d.time<=0||a.autoclose(),a.callback()},f.fade=function(a,b,c){a.css({opacity:0}).animate({opacity:c},b)},h.pt.offset=function(){var a=this,b=a.config,c=a.layerE,e=c.outerHeight();a.offsetTop=""===b.offset[0]&&e<d.height()?(d.height()-e-2*b.border[0])/2:-1!=b.offset[0].indexOf("px")?parseFloat(b.offset[0]):parseFloat(b.offset[0]||0)/100*d.height(),a.offsetTop=a.offsetTop+b.border[0]+(b.fix?0:d.scrollTop()),-1!=b.offset[1].indexOf("px")?a.offsetLeft=parseFloat(b.offset[1])+b.border[0]:(b.offset[1]=""===b.offset[1]?"50%":b.offset[1],a.offsetLeft="50%"===b.offset[1]?b.offset[1]:parseFloat(b.offset[1])/100*d.width()+b.border[0])},h.pt.set=function(a){var b=this,e=b.config,h=(e.dialog,e.page),i=(e.loading,b.layerE),j=i.find(g[2]);switch(b.autoArea(a),e.title?0===e.type&&layer.ie6&&j.css({width:i.outerWidth()}):4!==e.type&&i.find(".xubox_close").addClass("xubox_close1"),i.attr({type:f.type[e.type]}),b.offset(),4!==e.type&&(e.shift&&!layer.ie6?"object"==typeof e.shift?b.shift(e.shift[0],e.shift[1]||500,e.shift[2]):b.shift(e.shift,500):i.css({top:b.offsetTop,left:b.offsetLeft})),e.type){case 0:i.find(g[5]).css({"background-color":"#fff"}),e.title?i.find(g[3]).css({paddingTop:18+j.outerHeight()}):(i.find(".xubox_msgico").css({top:8}),i.find(g[3]).css({marginTop:11}));break;case 1:i.find(h.dom).addClass("layer_pageContent"),e.shade[0]&&i.css({zIndex:e.zIndex+1}),e.title&&i.find(g[4]).css({top:j.outerHeight()});break;case 2:var k=i.find("."+g[1]),l=i.height();k.addClass("xubox_load").css({width:i.width()}),k.css(e.title?{top:j.height(),height:l-j.height()}:{top:0,height:l}),layer.ie6&&k.attr("src",e.iframe.src);break;case 4:var m=[0,i.outerHeight()],n=c(e.tips.follow),o={width:n.outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},p=i.find(".layerTipsG");e.tips.isGuide||p.remove(),i.outerWidth()>e.maxWidth&&i.width(e.maxWidth),o.tipColor=e.tips.style[1],m[0]=i.outerWidth(),o.autoLeft=function(){o.left+m[0]-d.width()>0?(o.tipLeft=o.left+o.width-m[0],p.css({right:12,left:"auto"})):o.tipLeft=o.left},o.where=[function(){o.autoLeft(),o.tipTop=o.top-m[1]-10,p.removeClass("layerTipsB").addClass("layerTipsT").css({"border-right-color":o.tipColor})},function(){o.tipLeft=o.left+o.width+10,o.tipTop=o.top,p.removeClass("layerTipsL").addClass("layerTipsR").css({"border-bottom-color":o.tipColor})},function(){o.autoLeft(),o.tipTop=o.top+o.height+10,p.removeClass("layerTipsT").addClass("layerTipsB").css({"border-right-color":o.tipColor})},function(){o.tipLeft=o.left-m[0]+10,o.tipTop=o.top,p.removeClass("layerTipsR").addClass("layerTipsL").css({"border-bottom-color":o.tipColor})}],o.where[e.tips.guide](),0===e.tips.guide?o.top-(d.scrollTop()+m[1]+16)<0&&o.where[2]():1===e.tips.guide?d.width()-(o.left+o.width+m[0]+16)>0||o.where[3]():2===e.tips.guide?o.top-d.scrollTop()+o.height+m[1]+16-d.height()>0&&o.where[0]():3===e.tips.guide?m[0]+16-o.left>0&&o.where[1]():4===e.tips.guide,i.css({left:o.tipLeft,top:o.tipTop})}e.fadeIn&&(f.fade(i,e.fadeIn,1),f.fade(c("#xubox_shade"+a),e.fadeIn,e.shade[0])),e.fix&&""===e.offset[0]&&!e.shift&&d.on("resize",function(){i.css({top:(d.height()-i.outerHeight())/2})}),b.move()},h.pt.shift=function(a,b,c){var e=this,f=e.config,g=e.layerE,h=0,i=d.width(),j=d.height()+(f.fix?0:d.scrollTop());h="50%"==f.offset[1]||""==f.offset[1]?g.outerWidth()/2:g.outerWidth();var k={t:{top:e.offsetTop},b:{top:j-g.outerHeight()-f.border[0]},cl:h+f.border[0],ct:-g.outerHeight(),cr:i-h-f.border[0]};switch(a){case"left-top":g.css({left:k.cl,top:k.ct}).animate(k.t,b);break;case"top":g.css({top:k.ct}).animate(k.t,b);break;case"right-top":g.css({left:k.cr,top:k.ct}).animate(k.t,b);break;case"right-bottom":g.css({left:k.cr,top:j}).animate(c?k.t:k.b,b);break;case"bottom":g.css({top:j}).animate(c?k.t:k.b,b);break;case"left-bottom":g.css({left:k.cl,top:j}).animate(c?k.t:k.b,b);break;case"left":g.css({left:-g.outerWidth()}).animate({left:e.offsetLeft},b)}},h.pt.autoArea=function(a){var b,d=this,a=a||d.index,e=d.config,f=e.page,h=c("#"+g[0]+a),i=h.find(g[2]),j=h.find(g[5]),k=e.title?i.innerHeight():0,l=0;switch("auto"===e.area[0]&&j.outerWidth()>=e.maxWidth&&h.css({width:e.maxWidth}),e.type){case 0:var m=h.find(".xubox_botton>a");b=h.find(g[3]).outerHeight()+20,m.length>0&&(l=m.outerHeight()+20);break;case 1:var n=h.find(g[4]);b=c(f.dom).outerHeight(),"auto"===e.area[0]&&h.css({width:n.outerWidth()}),(""!==f.html||""!==f.url)&&(b=n.outerHeight());break;case 2:h.find("iframe").css({width:h.outerWidth(),height:h.outerHeight()-(e.title?i.innerHeight():0)});break;case 3:var o=h.find(".xubox_loading");b=o.outerHeight(),j.css({width:o.width()})}"auto"===e.area[1]&&j.css({height:k+b+l}),c("#xubox_border"+a).css({width:h.outerWidth()+2*e.border[0],height:h.outerHeight()+2*e.border[0]}),layer.ie6&&"auto"!==e.area[0]&&j.css({width:h.outerWidth()}),h.css("50%"!==e.offset[1]&&""!=e.offset[1]||4===e.type?{marginLeft:0}:{marginLeft:-h.outerWidth()/2})},h.pt.move=function(){var a=this,b=a.config,e={setY:0,moveLayer:function(){if(0==parseInt(e.layerE.css("margin-left")))var a=parseInt(e.move.css("left"));else var a=parseInt(e.move.css("left"))+-parseInt(e.layerE.css("margin-left"));"fixed"!==e.layerE.css("position")&&(a-=e.layerE.parent().offset().left,e.setY=0),e.layerE.css({left:a,top:parseInt(e.move.css("top"))-e.setY})}},f=a.layerE.find(b.move);b.move&&f.attr("move","ok"),f.css(b.move?{cursor:"move"}:{cursor:"auto"}),c(b.move).on("mousedown",function(a){if(a.preventDefault(),"ok"===c(this).attr("move")){e.ismove=!0,e.layerE=c(this).parents("."+g[0]);var f=e.layerE.offset().left,h=e.layerE.offset().top,i=e.layerE.width()-6,j=e.layerE.height()-6;c("#xubox_moves")[0]||c("body").append('<div id="xubox_moves" class="xubox_moves" style="left:'+f+"px; top:"+h+"px; width:"+i+"px; height:"+j+'px; z-index:2147483584"></div>'),e.move=c("#xubox_moves"),b.moveType&&e.move.css({opacity:0}),e.moveX=a.pageX-e.move.position().left,e.moveY=a.pageY-e.move.position().top,"fixed"!==e.layerE.css("position")||(e.setY=d.scrollTop())}}),c(document).mousemove(function(a){if(e.ismove){var c=a.pageX-e.moveX,f=a.pageY-e.moveY;if(a.preventDefault(),!b.moveOut){e.setY=d.scrollTop();var g=d.width()-e.move.outerWidth()-b.border[0],h=b.border[0]+e.setY;c<b.border[0]&&(c=b.border[0]),c>g&&(c=g),h>f&&(f=h),f>d.height()-e.move.outerHeight()-b.border[0]+e.setY&&(f=d.height()-e.move.outerHeight()-b.border[0]+e.setY)}e.move.css({left:c,top:f}),b.moveType&&e.moveLayer(),c=null,f=null,g=null,h=null}}).mouseup(function(){try{e.ismove&&(e.moveLayer(),e.move.remove()),e.ismove=!1}catch(a){e.ismove=!1}b.moveEnd&&b.moveEnd()})},h.pt.autoclose=function(){var a=this,b=a.config.time,c=function(){b--,0===b&&(layer.close(a.index),clearInterval(a.autotime))};a.autotime=setInterval(c,1e3)},f.config={end:{}},h.pt.callback=function(){var a=this,b=a.layerE,d=a.config,e=d.dialog;a.openLayer(),a.config.success(b),layer.ie6&&a.IE6(b),b.find(".xubox_close").on("click",function(){d.close(a.index),layer.close(a.index)}),b.find(".xubox_yes").on("click",function(){d.yes?d.yes(a.index):e.yes(a.index)}),b.find(".xubox_no").on("click",function(){d.no?d.no(a.index):e.no(a.index),layer.close(a.index)}),a.config.shadeClose&&c("#xubox_shade"+a.index).on("click",function(){layer.close(a.index)}),b.find(".xubox_min").on("click",function(){layer.min(a.index,d),d.min&&d.min(b)}),b.find(".xubox_max").on("click",function(){c(this).hasClass("xubox_maxmin")?(layer.restore(a.index),d.restore&&d.restore(b)):(layer.full(a.index,d),d.full&&d.full(b))}),f.config.end[a.index]=d.end},f.reselect=function(){c.each(c("select"),function(){var a=c(this);a.parents("."+g[0])[0]||1==a.attr("layer")&&c("."+g[0]).length<1&&a.removeAttr("layer").show(),a=null})},h.pt.IE6=function(a){var b=this,e=a.offset().top;if(b.config.fix)var f=function(){a.css({top:d.scrollTop()+e})};else var f=function(){a.css({top:e})};f(),d.scroll(f),c.each(c("select"),function(){var a=c(this);a.parents("."+g[0])[0]||"none"==a.css("display")||a.attr({layer:"1"}).hide(),a=null})},h.pt.openLayer=function(){{var a=this;a.layerE}layer.autoArea=function(b){return a.autoArea(b)},layer.shift=function(b,c,d){a.shift(b,c,d)},layer.setMove=function(){return a.move()},layer.zIndex=a.config.zIndex,layer.setTop=function(a){var b=function(){layer.zIndex++,a.css("z-index",layer.zIndex+1)};return layer.zIndex=parseInt(a[0].style.zIndex),a.on("mousedown",b),layer.zIndex}},f.isauto=function(a,b,c){"auto"===b.area[0]&&(b.area[0]=a.outerWidth()),"auto"===b.area[1]&&(b.area[1]=a.outerHeight()),a.attr({area:b.area+","+c}),a.find(".xubox_max").addClass("xubox_maxmin")},f.rescollbar=function(a){g.html.attr("layer-full")==a&&(g.html[0].style.removeProperty?g.html[0].style.removeProperty("overflow"):g.html[0].style.removeAttribute("overflow"),g.html.removeAttr("layer-full"))},layer.getIndex=function(a){return c(a).parents("."+g[0]).attr("times")},layer.getChildFrame=function(a,b){return b=b||c("."+g[1]).parents("."+g[0]).attr("times"),c("#"+g[0]+b).find("."+g[1]).contents().find(a)},layer.getFrameIndex=function(a){return c(a?"#"+a:"."+g[1]).parents("."+g[0]).attr("times")},layer.iframeAuto=function(a){a=a||c("."+g[1]).parents("."+g[0]).attr("times");var b=layer.getChildFrame("body",a).outerHeight(),d=c("#"+g[0]+a),e=d.find(g[2]),f=0;e&&(f=e.height()),d.css({height:b+f});var h=-parseInt(c("#xubox_border"+a).css("top"));c("#xubox_border"+a).css({height:b+2*h+f}),c("#"+g[1]+a).css({height:b})},layer.iframeSrc=function(a,b){c("#"+g[0]+a).find("iframe").attr("src",b)},layer.area=function(a,b){var d=[c("#"+g[0]+a),c("#xubox_border"+a)],e=d[0].attr("type"),h=d[0].find(g[5]),i=d[0].find(g[2]);if(e===f.type[1]||e===f.type[2]){if(d[0].css(b),h.css({width:b.width,height:b.height}),e===f.type[2]){var j=d[0].find("iframe");j.css({width:b.width,height:i?b.height-i.innerHeight():b.height})}"0px"!==d[0].css("margin-left")&&(b.hasOwnProperty("top")&&d[0].css({top:b.top-(d[1][0]?parseFloat(d[1].css("top")):0)}),b.hasOwnProperty("left")&&d[0].css({left:b.left+d[0].outerWidth()/2-(d[1][0]?parseFloat(d[1].css("left")):0)}),d[0].css({marginLeft:-d[0].outerWidth()/2})),d[1][0]&&d[1].css({width:parseFloat(b.width)-2*parseFloat(d[1].css("left")),height:parseFloat(b.height)-2*parseFloat(d[1].css("top"))})}},layer.min=function(a,b){var d=c("#"+g[0]+a),e=[d.position().top,d.position().left+parseFloat(d.css("margin-left"))];f.isauto(d,b,e),layer.area(a,{width:180,height:35}),d.find(".xubox_min").hide(),"page"===d.attr("type")&&d.find(g[4]).hide(),f.rescollbar(a)},layer.restore=function(a){{var b=c("#"+g[0]+a),d=b.attr("area").split(",");b.attr("type")}layer.area(a,{width:parseFloat(d[0]),height:parseFloat(d[1]),top:parseFloat(d[2]),left:parseFloat(d[3])}),b.find(".xubox_max").removeClass("xubox_maxmin"),b.find(".xubox_min").show(),"page"===b.attr("type")&&b.find(g[4]).show(),f.rescollbar(a)},layer.full=function(a,b){var e,h=c("#"+g[0]+a),i=2*b.border[0]||6,j=[h.position().top,h.position().left+parseFloat(h.css("margin-left"))];f.isauto(h,b,j),g.html.attr("layer-full")||g.html.css("overflow","hidden").attr("layer-full",a),clearTimeout(e),e=setTimeout(function(){layer.area(a,{top:"fixed"===h.css("position")?0:d.scrollTop(),left:"fixed"===h.css("position")?0:d.scrollLeft(),width:d.width()-i,height:d.height()-i})},100)},layer.title=function(a,b){var d=c("#"+g[0]+(b||layer.index)).find(".xubox_title>em");d.html(a)},layer.close=function(a){var b=c("#"+g[0]+a),d=b.attr("type"),e=c("#xubox_moves, #xubox_shade"+a);if(b[0]){if(d==f.type[1])if(b.find(".xuboxPageHtml")[0])b[0].innerHTML="",b.remove();else{b.find(".xubox_setwin,.xubox_close,.xubox_botton,.xubox_title,.xubox_border").remove();for(var h=0;3>h;h++)b.find(".layer_pageContent").unwrap().hide()}else b[0].innerHTML="",b.remove();e.remove(),layer.ie6&&f.reselect(),f.rescollbar(a),"function"==typeof f.config.end[a]&&f.config.end[a](),delete f.config.end[a]}},layer.closeLoad=function(){layer.close(c(".xubox_loading").parents("."+g[0]).attr("times"))},layer.closeTips=function(){layer.closeAll("tips")},layer.closeAll=function(a){c.each(c("."+g[0]),function(){var b=c(this),d=a?b.attr("type")===a:1;d&&layer.close(b.attr("times")),d=null})},f.run=function(){c=jQuery,d=c(a),g.html=c("html"),layer.use("skin/layer.css"),c.layer=function(a){var b=new h(a);return b.index},(new Image).src=layer.path+"skin/default/xubox_ico0.png"},"function"==typeof define?define(function(){return f.run(),layer}):f.run()}(window);
\ No newline at end of file
//$.ajaxSetup({cache: false});
var fstServer = "147.1.4.101";//法视通服务器
//var manageServer = "http://147.1.6.16:8091/portalLogin";
// var manageServer = "http://147.1.4.52:91/portalLogin";
var manageServer = "http://127.0.0.1/portalLogin";
var loginTypeMap = {
"0": "任意方式",
"1": "用户名密码",
"2": "CA证书登录",
"3": "用户名密码 + CA证书"
};
var rmemberUser = false;
//重写登陆方法
function formSubmit() {
$("#fm1").submit();
}
var passKey = "1236812368";
$(function () {
$('#rmemberUser').change(function(){
rmemberUser = true;
});
if(null != $.cookie("cas_username")){
$('#rmemberUser').prop("checked",true);
$("#username").val($.cookie("cas_username"));
}
$.base64.is_unicode = true;
function getNameByBase64() {
return $.base64.encode($.trim($('#username').val()));
}
function getPassByBase64() {
return $.base64.encode($.trim($('#password').val()));
}
/*$.ajax({
url: manageServer + '/likeThing',
dataType: "jsonp",
jsonp: "jsonpcallback",
error: function (dat) {
if (browser.ie)
layer.msg("由于您的IE版本实在过低,无法为您回传登陆信息,但不影响您的正常登陆使用");
}, success: function (dat) {
if (dat) {
var now = dat[dat.length - 1];
if (now.isChecked == "true") {
$('#rmemberUser').click();
if (now.username) {
$('#username').val($.trim(now.username));
$('#password').focus().empty();
}
}
if (now.loginFst == "true") {
$('#loginFst').click();
// if (!browser.ie) {
// $('#loginFst').attr("disabled", "disabled").parent().css({color: "gray"}).attr("title", "非IE浏览器无法使用此功能");
// }
}
}
}
});*/
function login(loginType) {
var chain;
//登录前记住账号
var username = $('#username').val();
if (username.indexOf("@gxfy.com") == -1) {
username += "@gxfy.com";
$('#username').val(username);
}
try {
//正常登陆逻辑处理
var catype = $("#loginType").val();
if (catype == "8888") {
if (loginType <= 1) {
//法师通
if ($("#loginFst").is(":checked")) {
popChild();
layer.msg("请允许窗口弹出");
} else {
/*if(rmemberUser){
chain = $.ajax({
url: manageServer + '/addLike',
data: {
username: username,
isChecked: $('#rmemberUser').is(":checked"),
loginFst: $('#loginFst').is(":checked")
},
type: 'get',
dataType: "jsonp",
jsonp: "jsonpcallback"
});
$.cookie("cas_username",username,{expires:365});
}else{
$.cookie("cas_username","",{expires:-1});
}*/
if(rmemberUser && $('#rmemberUser').prop("checked")){
$.cookie("cas_username",username,{expires:365});
}else if(rmemberUser && !$('#rmemberUser').prop("checked")){
$.cookie("cas_username","",{expires:-1});
}
$("#fm1").submit();
}
} else {
layer.msg("用户设置了 \"" + loginTypeMap[loginType] + "\" 登录");
}
} else if (catype == "2") {
var strServerRan = $("#random").val();
var strContainerName = $("#CAuserList").val();//得到证书序列号
var strUserCert = SZG_ExportUserCert(strContainerName);//从序列号得到证书公钥
if (strContainerName == null || strContainerName == "") {
alert("请先选择需要登陆的证书");
return false;
}
//对随机数进行签名
var strClientSignedData = SZG_SignedData(strContainerName,
strContainerName);
if (strClientSignedData == "") {
alert("签名失败");
return false;
}
//获取证书信息
var certInfo = SZG_GetUserInfo(strUserCert, 17);
$("#userSignedData").val(strClientSignedData); //签名结果值
$("#userCert").val(strUserCert); //证书公钥
$("#containerName").val(strContainerName);//证书序列号
var temp_username = $("#temp_username").val();
if (catype == "2") {
if (loginType == 3) {
$("#username").val(temp_username);
alert(temp_username);
alert("用户设置了 \"" + loginTypeMap[loginType] + "\" 登录");
return false;
}
if (temp_username == null || temp_username == ""
|| temp_username == "undefine") {
alert("您的证书在门户中没有匹配的帐号,请联系0771-5788527");
return false;
}
$("#username").val(temp_username);
$("#password").val("gxfy_yunwei_test@gxfy.com");//实际使用时,密码可随机填充
// return true;
}
if (catype == "3" && !username) {
$("#username").val(temp_username);
}
$("#fm1").submit();
}
} catch (e) {
throw e;
}
}
var validAndLogin = function () {
$("#btn_login").attr("disabled", "disabled");
$.ajax({
url: manageServer + '/validPass',
data: {username: getNameByBase64(), password: getPassByBase64()},
type: "get",
dataType: "jsonp",
jsonp: "jsonpcallback",
success: function (res) {
var $msg = $('#msg').empty();
if (res != null && res.result != null) {
if (res.result == "error") {
$msg.text(res.message);
$("#btn_login").removeAttr("disabled");
} else if (res.result == "success") {
setCookie();
setPCookie();
login(res.loginType);
}
} else {
alert("服务器繁忙,请稍后再试");
$("#btn_login").removeAttr("disabled");
}
}, error: function () {
setCookie();
setPCookie();
login(0);
}
});
};
$('#btn_login').click(validAndLogin);
$('#loginType').change(function () {
$("#catype").val(this.value);
if (this.value == 8888) {
$("#CAdiv").hide();
} else if (this.value == 2) {
if (browser.ie) {
try {
var strTemp = SZG_GetUserList();
alert(strTemp);
if ($.trim(strTemp) != "") {
alert(SZG_CheckSupport());
alert(strTemp);
$("#CAdiv").show();
getYouxiang();
} else {
layer.msg("请重新打开页面");
}
} catch (e) {
layer.confirm("您可能未安装驱动,请点击下载", function () {
window.open("http://147.1.3.133/download.php?ATTACHMENT_ID=333333335&ATTACHMENT_NAME=SEAL_Setup.exe");
});
throw e;
}
} else {
layer.msg("请使用IE浏览器进行CA登陆");
}
} else if (this.value == 3) {
if (browser.ie) {
//暂时跳过
} else {
layer.msg("请使用IE浏览器进行CA登陆");
}
}
});
function getYouxiang() {
var strContainerName = $("#CAuserList").val();//得到证书序列号
if (strContainerName) {
var strUserCert = SZG_ExportUserCert(strContainerName);//从序列号得到证书公钥
strContainerName = SZG_GetUserInfo(strUserCert, 2);
var youxiang = "";
$.ajax({
type: "GET",
async: false,
url: "http://147.1.4.53:90/verify/getYouxiang",
data: {
containerName: strContainerName
},
dataType: "jsonp",
jsonp: "jsonpcallback",
success: function (data) {
$(data).each(function (i, v) {
if (v.youxiang == "noemailmapping") {
$("#temp_username").val("");
//alert("您的证书在门户中没有匹配的帐号,请联系0771-5788527");
} else {
$("#temp_username").val(v.youxiang);
$("#temp_realname").val(v.xm);
}
});
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Http status: " + xhr.status + " "
+ xhr.statusText + "\najaxOptions: "
+ ajaxOptions + "\nthrownError:" + thrownError
+ "\n" + xhr.responseText);
}
});
}
}
if (!browser.ie) {
$('#loginType option:gt(1)').attr("disabled", "disabled");
}
var enterLogin = function (e) {
e.stopPropagation();
if (e.keyCode == 13) {
validAndLogin();
}
};
$('#username').keypress(enterLogin);
$('#password').keypress(enterLogin);
$(document).keypress(enterLogin);
});
function setCookie() { //设置cookie
var loginCode = $("#username").val(); //获取用户名信息
//var pwd = $("#password").val(); //获取登陆密码信息
//var checked = $("[name='checkbox']:checked");//获取“是否记住密码”复选框
var checked = $("#recordPwd:checked");//获取“是否记住密码”复选框
var cookietime = new Date();
cookietime.setTime(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));//coockie保存7天
if (checked && checked.length > 0) { ////判断是否选中了“记住密码”复选框
$.cookie("login_code", loginCode, {
expires: cookietime
});//调用jquery.cookie.js中的方法设置cookie中的用户名
//$.cookie("pwd",$.base64.encode(pwd),{expires:cookietime});//调用jquery.cookie.js中的方法设置cookie中的登陆密码,并使用base64(jquery.base64.js)进行加密
} else {
$.cookie("pwd", null);
}
}
function setPCookie() {
//设置cookie
//var loginCode = $("#username").val(); //获取用户名信息
var pwd = $("#password").val(); //获取登陆密码信息
//var checked = $("[name='checkbox']:checked");//获取“是否记住密码”复选框
var checked = $("#recordP:checked");//获取“是否记住密码”复选框
var cookietime = new Date();
cookietime.setTime(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));//coockie保存7天
if (checked && checked.length > 0) { ////判断是否选中了“记住密码”复选框
//$.cookie("login_code",loginCode,{expires:cookietime});//调用jquery.cookie.js中的方法设置cookie中的用户名
$.cookie("pwd", $.base64.encode(pwd), {
expires: cookietime
});//调用jquery.cookie.js中的方法设置cookie中的登陆密码,并使用base64(jquery.base64.js)进行加密
} else {
$.cookie("pwd", null);
}
}
\ No newline at end of file
// var strServerCert;
// var strServerRan;
// var strServerSignedData;
//验证是否插入key
function getCAKeyAuth() {
SetUserCertList("certUser", CERT_TYPE_HARD);
setTimeout(function () {
var certUser = $("#certUser option:selected").val();
console.log("certUser",certUser)
if (!certUser){
layer.open({
title: '提示',
content: '获取CA用户失败,请检查是否插入UKey!'
});
$('#btn_login').attr("disabled",false);
return false;
}
}, 800);
}
//获取strServerSignedData、strServerRan和strServerCert
function certLoginVerify(strCertID, pin, loginType, username, password){
console.log("strCertID",strCertID,"pin",pin)
$.get("ca/param", function(res){
if (res && res.success) {
var strServerCert = res.strServerCert;
var strServerRan = res.strServerRan;
var strServerSignedData = res.strServerSignedData;
if(strServerSignedData === "" || strServerRan === "" || strServerCert === ""){
layer.open({
title: '提示1',
content: '连接CA服务器失败,请刷新页面重试无效后联系管理员!'
});
$('#btn_login').attr("disabled",false);
return false;
}
//2.校验证书密码
VerifyUserPIN(strCertID, pin, function(retObj) {
if (!retObj.retVal) { //校验失败
//2.1获取PIN剩余次数
GetUserPINRetryCount(strCertID, function (retObj){
var retryCount = Number(retObj.retVal);
if (retryCount > 0) {
layer.open({
title: '提示',
content: '校验证书密码失败!您还有' + retryCount + '次机会重试!'
});
$('#btn_login').attr("disabled",false);
return;
} else if (retryCount == 0) {
layer.open({
title: '提示',
content: '您的证书密码已被锁死,请联系管理员进行解锁!'
});
$('#btn_login').attr("disabled",false);
return;
} else {
layer.open({
title: '提示',
content: '证书服务错误,登录失败!'
});
$('#btn_login').attr("disabled",false);
return;
}
});
} else{
//3、获取用户证书
GetSignCert(strCertID, function(retObj){
var UserCert = retObj.retVal;
if (UserCert == "") {
layer.open({
title: '提示1',
content: '获取签名证书失败,请联系管理员!'
});
$('#btn_login').attr("disabled",false);
return;
}else {
//4.验证服务端签名
VerifySignedData(strServerCert,strServerRan,strServerSignedData,function(retObj){
if (!retObj.retVal) {
layer.open({
title: '提示1',
content: '验证服务端签名失败,请联系管理员!'
});
$('#btn_login').attr("disabled",false);
return;
}else{
//5、客户端对服务器随机数签名
SignedData(strCertID, strServerRan, function(retObj){
if (retObj.retVal == "") {
layer.open({
title: '提示1',
content: '客户端签名失败,请联系管理员!'
});
$('#btn_login').attr("disabled",false);
return;
}else{
var UserSignedData = retObj.retVal;
$.post("ca/verify",
{
"userCert": UserCert,
"strServerRan": strServerRan,
"userSignedData":UserSignedData,
"loginType":loginType,
"username": username,
"password":password
},
function (result) {
if (result){
if (result.success){
console.log("result", result)
console.log("loginType", loginType)
$('#username').val(result.username);
if (loginType == 2) {
$('#password').val(result.password);
$("#loginForm").submit();
}else if (loginType == 3) {
$("#loginForm").submit();
}
}else{
alert(result.errMsg);
$('#btn_login').attr("disabled",false);
}
}
}).error(function (xhr, status, info) {
alert("服务连接失败......");
$('#btn_login').attr("disabled",false);
});
//在此处写你的代码,把UserCert,strServerRan,UserSignedData等传到后台验证
//6、通过ajax把 UserCert,strServerRan,UserSignedData传到后台,由后台解析验证,判断用户是否有权限登陆系统
//alert("通过ajax把 UserCert,strServerRan,UserSignedData传到后台,由后台解析验证,判断用户是否有权限登陆系统");
}
});
}
});
}
});
}
})
}else {
layer.open({
title: '提示2',
content: '连接CA服务器失败,请刷新页面重试无效后联系管理员!'
});
$('#btn_login').attr("disabled",false);
}
}).error(function (xhr, status, info) {
alert("服务连接失败......");
$('#btn_login').attr("disabled",false);
});
}
$(function () {
if ($.cookie("cas_username")) {
$('#rmemberUser').prop("checked", true);
$('#username').val($.cookie("cas_username"));
}
})
\ No newline at end of file
var http_addr = "http://172.18.3.245:9888/admin/users/checkLockUser";
//绑定点击事件
$('#btn_login').click(function (){
validAndLogin();
});
//提交按钮事件
function validAndLogin(){
$('#btn_login').attr("disabled",true);
var loginType = $("#loginType option:selected").val();
$("#errMsg").html("");
$("#msg").html("");
switch (loginType) {
case "1":
userPwdLogin();
break;
case "2":
certLogin(loginType);
break;
case "3":
PwdAndCertLogin(loginType);
break;
default:
userPwdLogin();
break;
}
}
//用户名密码登录
function userPwdLogin(){
var username = $('#username').val();
var password = $('#password').val();
if (!checkUserPwd(username, password)){
$("#msg").html("用户名或密码不能为空");
$('#btn_login').removeAttr("disabled");
return false;
}
//18
if (http_addr){
var formData = {};
if (getOS() == "Linux"){
formData = {"username":username,"password":password,"isLinux":1};
}else{
formData = {"username":username,"password":password,"isLinux":0};
}
$.ajax({
type: 'get',
url: http_addr,
dataType: 'json',
data: formData,
success:function(res){
if (res && res.success){
var isChecked = $('#rmemberUser').is(':checked');
if (isChecked){
$.cookie("cas_username", username, {expires: 365});
}
$("#loginForm").submit();
}else{
$("#msg").html(res.errMsg);
$('#btn_login').removeAttr("disabled");
}
},
error:function (e){
//请求失败
var isChecked = $('#rmemberUser').is(':checked');
if (isChecked){
$.cookie("cas_username", username, {expires: 365});
}
$("#loginForm").submit();
}
})
}else{
$("#loginForm").submit();
}
}
//CA证书登录
function certLogin(loginType){
var strCertID = $("#certUser option:selected").val();
var pin = $("#certPwd").val();
if(!strCertID || !pin ){
layer.open({
title: '提示',
content: '请插入ukey和输入PIN码'
});
return false;
}
certLoginVerify(strCertID, pin, loginType, "", "");
//$("#loginForm").submit();
}
//密码+证书登录
function PwdAndCertLogin(loginType){
var strCertID = $("#certUser option:selected").val();
if(!strCertID ){
layer.open({
title: '提示',
content: '请插入证书Key'
});
return false;
}
//校验用户名密码
var username = $('#username').val();
var password = $('#password').val();
if (!checkUserPwd(username, password)){
$("#msg").html("用户名或密码不能为空");
$('#btn_login').removeAttr("disabled");
return false;
}
if (http_addr){
var formData = {};
if (getOS() == "Linux"){
formData = {"username":username,"password":password,"isLinux":1};
}else{
formData = {"username":username,"password":password,"isLinux":0};
}
$.ajax({
type: 'get',
url: http_addr,
dataType: 'json',
data: formData,
success:function(res){
if (res && res.success){
if (strCertID){
layer.prompt({
formType: 1,
value: '',
title: 'CA证书密码',
btn: ['确定','取消'], //按钮,
btnAlign: 'c'
}, function(value,index,elem){
if (value) {
certLoginVerify(strCertID, value, loginType, username, password);
}
layer.close(index);
});
}
}else{
$("#msg").html(res.errMsg);
$('#btn_login').removeAttr("disabled");
}
},
error:function (e){
//请求失败
var isChecked = $('#rmemberUser').is(':checked');
if (isChecked){
$.cookie("cas_username", username, {expires: 365});
}
$('#btn_login').removeAttr("disabled");
layer.open({
title: '提示',
content: '服务连接失败。。。。'
});
}
})
}else{
$('#btn_login').removeAttr("disabled");
layer.open({
title: '提示',
content: '无服务连接。。。。'
});
}
}
//检查用户名密码非空
function checkUserPwd(u, p){
if (!u || !p){
return false;
}
return true
}
//下拉选择触发事件
function loginTypeFunc(){
var loginType = $("#loginType option:selected").val();
switch (loginType) {
case "1":
$('#username').val("");
$('#password').val("");
if ($.cookie("cas_username")) {
$('#rmemberUser').prop("checked", true);
$('#username').val($.cookie("cas_username"));
}
$("#username-block").show();
$("#password-block").show();
$("#certUser-block").hide();
$("#certPwd-block").hide();
$('#btn_login').removeAttr("disabled");
break;
case "2":
$('#username').val("");
$('#password').val("");
$("#username-block").hide();
$("#password-block").hide();
$("#certUser-block").show();
$("#certPwd-block").show();
$('#btn_login').removeAttr("disabled");
getCAKeyAuth();
break;
case "3":
$('#username').val("");
$('#password').val("");
$("#username-block").show();
$("#password-block").show();
$("#certUser-block").show();
$("#certPwd-block").hide();
$('#btn_login').removeAttr("disabled");
getCAKeyAuth();
// setTimeout(function () {
// var certUser = $("#certUser option:selected").val();
// if (certUser){
// layer.prompt({
// formType: 1,
// value: '',
// title: 'CA证书密码',
// btn: ['确定','取消'], //按钮,
// btnAlign: 'c'
// }, function(value,index,elem){
//
// layer.close(index);
// });
// }
// }, 800);
break;
default:
alert("叫你没事别瞎几把点!");
break;
}
}
function getOS () {
if (navigator.userAgent.indexOf('Window') > 0) {
return 'Windows'
} else if (navigator.userAgent.indexOf('Mac OS X') > 0) {
return 'Mac '
} else if (navigator.userAgent.indexOf('Linux') > 0) {
return 'Linux'
} else {
return 'NUll'
}
}
\ No newline at end of file
$(function(){
$(".win-homepage").click(function(){
if(document.all){
document.body.style.behavior = 'url(#default#homepage)';
document.body.setHomePage(document.URL);
}else{
alert("设置首页失败,请手动设置!");
}
});
$(".win-favorite").click(function(){
var sURL=document.URL;
var sTitle=document.title;
try {window.external.addFavorite(sURL, sTitle);}
catch(e){
try{window.sidebar.addPanel(sTitle, sURL, "");}
catch(e){alert("加入收藏失败,请使用Ctrl+D进行添加");}
}
});
$(".win-forward").click(function(){
window.history.forward(1);
});
$(".win-back").click(function(){
window.history.back(-1);
});
$(".win-backtop").click(function(){$('body,html').animate({scrollTop:0},1000);return false;});
$(".win-refresh").click(function(){
window.location.reload();
});
$(".win-print").click(function(){
window.print();
});
$(".win-close").click(function(){
window.close();
});
$('.checkall').click(function(){
var e=$(this);
var name=e.attr("name");
var checkfor=e.attr("checkfor");
var type;
if (checkfor!='' && checkfor!=null && checkfor!=undefined){
type=e.closest('form').find("input[name='"+checkfor+"']");
}else{
type=e.closest('form').find("input[type='checkbox']");
};
if (name=="checkall"){
$(type).each(function(index, element){
element.checked=true;
});
e.attr("name","ok");
}else{
$(type).each(function(index, element){
element.checked=false;
});
e.attr("name","checkall");
}
});
$('.dropdown-toggle').click(function(){
$(this).closest('.button-group, .drop').addClass("open");
});
$(document).bind("click",function(e){
if($(e.target).closest(".button-group.open, .drop.open").length == 0){
$(".button-group, .drop").removeClass("open");
}
});
$checkplaceholder=function(){
var input = document.createElement('input');
return 'placeholder' in input;
};
if(!$checkplaceholder()){
$("textarea[placeholder], input[placeholder]").each(function(index, element){
if($(element).attr("placeholder") || $emptyplaceholder(element)){
$(element).val($(element).attr("placeholder"));
$(element).data("pintuerholder",$(element).css("color"));
$(element).css("color","rgb(169,169,169)");
$(element).focus(function(){$hideplaceholder($(this));});
$(element).blur(function(){$showplaceholder($(this));});
}
})
};
$emptyplaceholder=function(element){
var $content=$(element).val();
return ($content.length === 0) || $content == $(element).attr("placeholder");
};
$showplaceholder=function(element){
//不为空及密码框
if($emptyplaceholder(element) && $(element).attr("type")!="password"){
$(element).val($(element).attr("placeholder"));
$(element).data("pintuerholder",$(element).css("color"));
$(element).css("color","rgb(169,169,169)");
}
};
var $hideplaceholder=function(element){
if($(element).data("pintuerholder")){
$(element).val("");
$(element).css("color", $(element).data("pintuerholder"));
$(element).removeData("pintuerholder");
}
};
$('textarea, input, select').blur(function(){
var e=$(this);
if(e.attr("data-validate")){
e.closest('.field').find(".input-help").remove();
var $checkdata=e.attr("data-validate").split(',');
var $checkvalue=e.val();
var $checkstate=true;
var $checktext="";
if(e.attr("placeholder")==$checkvalue){$checkvalue="";}
if($checkvalue!="" || e.attr("data-validate").indexOf("required")>=0){
for(var i=0;i<$checkdata.length;i++){
var $checktype=$checkdata[i].split(':');
if(! $pintuercheck(e,$checktype[0],$checkvalue)){
$checkstate=false;
$checktext=$checktext+"<li>"+$checktype[1]+"</li>";
}
}
};
if($checkstate){
e.closest('.form-group').removeClass("check-error");
e.parent().find(".input-help").remove();
e.closest('.form-group').addClass("check-success");
}else{
e.closest('.form-group').removeClass("check-success");
e.closest('.form-group').addClass("check-error");
e.closest('.field').append('<div class="input-help"><ul>'+$checktext+'</ul></div>');
}
}
});
$pintuercheck=function(element,type,value){
$pintu=value.replace(/(^\s*)|(\s*$)/g, "");
switch(type){
case "required":return /[^(^\s*)|(\s*$)]/.test($pintu);break;
case "chinese":return /^[\u0391-\uFFE5]+$/.test($pintu);break;
case "number":return /^\d+$/.test($pintu);break;
case "integer":return /^[-\+]?\d+$/.test($pintu);break;
case "plusinteger":return /^[+]?\d+$/.test($pintu);break;
case "double":return /^[-\+]?\d+(\.\d+)?$/.test($pintu);break;
case "plusdouble":return /^[+]?\d+(\.\d+)?$/.test($pintu);break;
case "english":return /^[A-Za-z]+$/.test($pintu);break;
case "username":return /^[a-z]\w{3,}$/i.test($pintu);break;
case "mobile":return /^((\(\d{3}\))|(\d{3}\-))?13[0-9]\d{8}?$|15[89]\d{8}?$|170\d{8}?$|147\d{8}?$/.test($pintu);break;
case "phone":return /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/.test($pintu);break;
case "tel":return /^((\(\d{3}\))|(\d{3}\-))?13[0-9]\d{8}?$|15[89]\d{8}?$|170\d{8}?$|147\d{8}?$/.test($pintu) || /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/.test($pintu);break;
case "email":return /^[^@]+@[^@]+\.[^@]+$/.test($pintu);break;
case "url":return /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/.test($pintu);break;
case "ip":return /^[\d\.]{7,15}$/.test($pintu);break;
case "qq":return /^[1-9]\d{4,10}$/.test($pintu);break;
case "currency":return /^\d+(\.\d+)?$/.test($pintu);break;
case "zip":return /^[1-9]\d{5}$/.test($pintu);break;
case "radio":
var radio=element.closest('form').find('input[name="'+element.attr("name")+'"]:checked').length;
return eval(radio==1);
break;
default:
var $test=type.split('#');
if($test.length>1){
switch($test[0]){
case "compare":
return eval(Number($pintu)+$test[1]);
break;
case "regexp":
return new RegExp($test[1],"gi").test($pintu);
break;
case "length":
var $length;
if(element.attr("type")=="checkbox"){
$length=element.closest('form').find('input[name="'+element.attr("name")+'"]:checked').length;
}else{
$length=$pintu.replace(/[\u4e00-\u9fa5]/g,"***").length;
}
return eval($length+$test[1]);
break;
case "ajax":
var $getdata;
var $url=$test[1]+$pintu;
$.ajaxSetup({async:false});
$.getJSON($url,function(data){
$getdata=data.getdata;
});
if($getdata=="true"){return true;}
break;
case "repeat":
return $pintu==jQuery('input[name="'+$test[1]+'"]').eq(0).val();
break;
default:return true;break;
}
break;
}else{
return true;
}
}
};
$('form').submit(function(){
$(this).find('input[data-validate],textarea[data-validate],select[data-validate]').trigger("blur");
var numError = $(this).find('.check-error').length;
if(numError){
$(this).find('.check-error').first().find('input[data-validate],textarea[data-validate],select[data-validate]').first().focus().select();
return false;
}
});
$('.form-reset').click(function(){
$(this).closest('form').find(".input-help").remove();
$(this).closest('form').find('.form-submit').removeAttr('disabled');
$(this).closest('form').find('.form-group').removeClass("check-error");
$(this).closest('form').find('.form-group').removeClass("check-success");
});
$('.tab .tab-nav li').each(function(){
var e=$(this);
var trigger=e.closest('.tab').attr("data-toggle");
if (trigger=="hover"){
e.mouseover(function(){
$showtabs(e);
});
e.click(function(){
return false;
});
}else{
e.click(function(){
$showtabs(e);
return false;
});
}
});
$showtabs=function(e){
var detail=e.children("a").attr("href");
e.closest('.tab .tab-nav').find("li").removeClass("active");
e.closest('.tab').find(".tab-body .tab-panel").removeClass("active");
e.addClass("active");
$(detail).addClass("active");
};
$('.dialogs').each(function(){
var e=$(this);
var trigger=e.attr("data-toggle");
if (trigger=="hover"){
e.mouseover(function(){
$showdialogs(e);
});
}else if(trigger=="click"){
e.click(function(){
$showdialogs(e);
});
}
});
$showdialogs=function(e){
var trigger=e.attr("data-toggle");
var getid=e.attr("data-target");
var data=e.attr("data-url");
var mask=e.attr("data-mask");
var width=e.attr("data-width");
var detail="";
var masklayout=$('<div class="dialog-mask"></div>');
if(width==null){width="80%";}
if (mask=="1"){
$("body").append(masklayout);
}
detail='<div class="dialog-win" style="position:fixed;width:'+width+';z-index:11;">';
if(getid!=null){detail=detail+$(getid).html();}
if(data!=null){detail=detail+$.ajax({url:data,async:false}).responseText;}
detail=detail+'</div>';
var win=$(detail);
win.find(".dialog").addClass("open");
$("body").append(win);
var x=parseInt($(window).width()-win.outerWidth())/2;
var y=parseInt($(window).height()-win.outerHeight())/2;
if (y<=10){y="10"}
win.css({"left":x,"top":y});
win.find(".dialog-close,.close").each(function(){
$(this).click(function(){
win.remove();
$('.dialog-mask').remove();
});
});
masklayout.click(function(){
win.remove();
$(this).remove();
});
};
$('.tips').each(function(){
var e=$(this);
var title=e.attr("title");
var trigger=e.attr("data-toggle");
e.attr("title","");
if (trigger=="" || trigger==null){trigger="hover";}
if (trigger=="hover"){
e.mouseover(function(){
$showtips(e,title);
});
}else if(trigger=="click"){
e.click(function(){
$showtips(e,title);
});
}else if(trigger=="show"){
e.ready(function(){
$showtips(e,title);
});
}
});
$showtips=function(e,title){
var trigger=e.attr("data-toggle");
var place=e.attr("data-place");
var width=e.attr("data-width");
var css=e.attr("data-style");
var image=e.attr("data-image");
var content=e.attr("content");
var getid=e.attr("data-target");
var data=e.attr("data-url");
var x=0;
var y=0;
var html="";
var detail="";
if(image!=null){detail=detail+'<img class="image" src="'+image+'" />';}
if(content!=null){detail=detail+'<p class="tip-body">'+content+'</p>';}
if(getid!=null){detail=detail+$(getid).html();}
if(data!=null){detail=detail+$.ajax({url:data,async:false}).responseText;}
if(title!=null && title!=""){
if(detail!=null && detail!=""){detail='<p class="tip-title"><strong>'+title+'</strong></p>'+detail;}else{detail='<p class="tip-line">'+title+'</p>';}
}
detail='<div class="tip">'+detail+'</div>';
html=$(detail);
$("body").append( html );
if(width!=null){
html.css("width",width);
}
if(place=="" || place==null){place="top";}
if(place=="left"){
x=e.offset().left - html.outerWidth()-5;
y=e.offset().top - html.outerHeight()/2 + e.outerHeight()/2;
}else if(place=="top"){
x=e.offset().left - html.outerWidth()/2 + e.outerWidth()/2;
y=e.offset().top - html.outerHeight()-5;
}else if(place=="right"){
x=e.offset().left + e.outerWidth()+5;
y=e.offset().top - html.outerHeight()/2 + e.outerHeight()/2;
}else if(place=="bottom"){
x=e.offset().left - html.outerWidth()/2 + e.outerWidth()/2;
y=e.offset().top + e.outerHeight()+5;
}
if (css!=""){html.addClass(css);}
html.css({"left":x+"px","top":y+"px","position":"absolute"});
if (trigger=="hover" || trigger=="click" || trigger==null){
e.mouseout(function(){html.remove();e.attr("title",title)});
}
};
$('.alert .close').each(function(){
$(this).click(function(){
$(this).closest('.alert').remove();
});
});
$('.radio label').each(function(){
var e=$(this);
e.click(function(){
e.closest('.radio').find("label").removeClass("active");
e.addClass("active");
});
});
$('.checkbox label').each(function(){
var e=$(this);
e.click(function(){
if(e.find('input').is(':checked')){
e.addClass("active");
}else{
e.removeClass("active");
};
});
});
$('.collapse .panel-head').each(function(){
var e=$(this);
e.click(function(){
e.closest('.collapse').find(".panel").removeClass("active");
e.closest('.panel').addClass("active");
});
});
$('.icon-navicon').each(function(){
var e=$(this);
var target=e.attr("data-target");
e.click(function(){
$(target).toggleClass("nav-navicon");
});
});
$('.banner').each(function(){
var e=$(this);
var pointer=e.attr("data-pointer");
var interval=e.attr("data-interval");
var style=e.attr("data-style");
var items=e.attr("data-item");
var items_s=e.attr("data-small");
var items_m=e.attr("data-middle");
var items_b=e.attr("data-big");
var num=e.find(".carousel .item").length;
var win=$(window).width();
var i=1;
if(interval==null){interval=5};
if(items==null || items<1){items=1};
if(items_s!=null && win>760){items=items_s};
if(items_m!=null && win>1000){items=items_m};
if(items_b!=null && win>1200){items=items_b};
var itemWidth=Math.ceil(e.outerWidth()/items);
var page=Math.ceil(num/items);
e.find(".carousel .item").css("width",itemWidth+ "px");
e.find(".carousel").css("width",itemWidth*num + "px");
var carousel=function(){
i++;
if(i>page){i=1;}
$showbanner(e,i,items,num);
};
var play=setInterval(carousel,interval*600);
e.mouseover(function(){clearInterval(play);});
e.mouseout(function(){play=setInterval(carousel,interval*600);});
if(pointer!=0 && page>1){
var point='<ul class="pointer"><li value="1" class="active"></li>';
for (var j=1;j<page;j++){
point=point+' <li value="'+(j+1)+'"></li>';
};
point=point+'</ul>';
var pager=$(point);
if(style!=null){pager.addClass(style);};
e.append(pager);
pager.css("left",e.outerWidth()*0.5 - pager.outerWidth()*0.5+"px");
pager.find("li").click(function(){
$showbanner(e,$(this).val(),items,num);
});
var lefter=$('<div class="pager-prev icon-angle-left"></div>');
var righter=$('<div class="pager-next icon-angle-right"></div>');
if(style!=null){lefter.addClass(style);righter.addClass(style);};
e.append(lefter);
e.append(righter);
lefter.click(function(){
i--;
if(i<1){i=page;}
$showbanner(e,i,items,num);
});
righter.click(function(){
i++;
if(i>page){i=1;}
$showbanner(e,i,items,num);
});
};
});
$showbanner=function(e,i,items,num){
var after=0,leftx=0;
leftx = - Math.ceil(e.outerWidth()/items)*(items)*(i-1);
if(i*items > num){after=i*items-num;leftx= - Math.ceil(e.outerWidth()/items)*(num-items);};
e.find(".carousel").stop(true, true).animate({"left":leftx+"px"},800);
e.find(".pointer li").removeClass("active");
e.find(".pointer li").eq(i-1).addClass("active");
};
$(".spy a").each(function(){
var e=$(this);
var t=e.closest(".spy");
var target=t.attr("data-target");
var top=t.attr("data-offset-spy");
var thistarget="";
var thistop="";
if(top==null){top=0;};
if(target==null){thistarget=$(window);}else{thistarget=$(target);};
thistarget.bind("scroll",function(){
if(target==null){
thistop=$(e.attr("href")).offset().top - $(window).scrollTop() - parseInt(top);
}else{
thistop=$(e.attr("href")).offset().top - thistarget.offset().top - parseInt(top);
};
if(thistop<0){
t.find('li').removeClass("active");
e.parents('li').addClass("active");
};
});
});
$(".fixed").each(function(){
var e=$(this);
var style=e.attr("data-style");
var top=e.attr("data-offset-fixed");
if(top==null){top=e.offset().top;}else{top=e.offset().top - parseInt(top);};
if(style==null){style="fixed-top";};
$(window).bind("scroll",function(){
var thistop=top - $(window).scrollTop();
if(style=="fixed-top" && thistop<0){
e.addClass("fixed-top");
}else{
e.removeClass("fixed-top");
};
var thisbottom=top - $(window).scrollTop()-$(window).height();
if(style=="fixed-bottom" && thisbottom>0){
e.addClass("fixed-bottom");
}else{
e.removeClass("fixed-bottom");
};
});
});
})
\ No newline at end of file
.layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}a,body{color:#333}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-edge,hr{height:0;overflow:hidden}.layui-layout-body,.layui-side,.layui-side-scroll{overflow-x:hidden}.layui-edge,.layui-elip,hr{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;background:0 0}a{text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-btn,.layui-btn-group,.layui-edge{display:inline-block}.layui-edge{width:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px}.layui-side-scroll{position:relative;width:220px;height:100%}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#FAFAFA}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5FB878;border-radius:0 2px 2px 0;background-color:#FAFAFA}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#FAFAFA;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-panel,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-form-select dl,.layui-panel{box-shadow:1px 1px 4px rgb(0 0 0 / 8%)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{border-width:1px;border-style:solid;border-radius:2px;background-color:#fff;color:#666}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-border,.layui-border-black,.layui-border-blue,.layui-border-cyan,.layui-border-green,.layui-border-orange,.layui-border-red{border-width:1px;border-style:solid}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#FAFAFA!important;color:#666!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{color:#666!important}.layui-border-red{border-color:#FF5722!important;color:#FF5722!important}.layui-border-orange{border-color:#FFB800!important;color:#FFB800!important}.layui-border-green{border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-color:#2F4056!important;color:#2F4056!important}.layui-border-blue{border-color:#1E9FFF!important;color:#1E9FFF!important}.layui-border-black{border-color:#393D49!important;color:#393D49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:10px 0}.layui-text p:first-child{margin-top:0}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#FF5722!important}.layui-font-orange{color:#FFB800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2F4056!important}.layui-font-blue{color:#01AAED!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\9;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#666}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#FBFBFB!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#F6F6F6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:#eee!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5FB878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FAFAFA;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#FAFAFA}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-menu li,.layui-menu-body-title a:hover,.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#F6F6F6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-colorpicker-alpha-slider,.layui-colorpicker-side-slider,.layui-menu,.layui-menu *,.layui-nav{box-sizing:border-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer}.layui-menu li:hover{background-color:#F6F6F6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default;text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:rgba(0,0,0,1)}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#F6F6F6!important;color:#5FB878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5FB878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5FB878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5FB878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:66666666;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#666;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#F6F6F6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#F6F6F6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#FAFAFA}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#F6F6F6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:66666666;width:280px;margin:5px 0;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}
\ No newline at end of file
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}
\ No newline at end of file
.laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}
\ No newline at end of file
.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment