From b171aa35af0676ee90ab7a2c8074f5b3f833bed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Mon, 29 Jul 2019 14:26:26 +0800 Subject: [PATCH 001/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/login/LoginDialog.js | 2 +- public/react/src/modules/message/js/Messagerouting.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/react/src/modules/message/js/Messagerouting.js diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index 50038366d..2db1929b9 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -360,7 +360,7 @@ class LoginDialog extends Component { if(response.status===200){ if (response.data.status === 402) { - window.location.href = response.data.url; + // window.location.href = response.data.url; }else if (response.data.status === -2) { notification.open({ message: '提示', diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js new file mode 100644 index 000000000..e69de29bb From 6630cae57f44c3f155b413a516cbf775aa0d7768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 10:28:20 +0800 Subject: [PATCH 002/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.js | 6 +- .../src/modules/message/css/messagemy.css | 6 + .../src/modules/message/js/MessagChat.js | 21 + .../react/src/modules/message/js/MessagSub.js | 125 ++++ .../src/modules/message/js/MessagePrivate.js | 21 + .../src/modules/message/js/Messagerouting.js | 77 ++ public/react/src/modules/tpm/TPMIndexHOC.js | 5 +- .../modules/user/LoginRegisterComponent.js | 702 +++++++++--------- 8 files changed, 618 insertions(+), 345 deletions(-) create mode 100644 public/react/src/modules/message/css/messagemy.css create mode 100644 public/react/src/modules/message/js/MessagChat.js create mode 100644 public/react/src/modules/message/js/MessagSub.js create mode 100644 public/react/src/modules/message/js/MessagePrivate.js diff --git a/public/react/src/App.js b/public/react/src/App.js index 49dac07cd..e7ff43e79 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -18,9 +18,9 @@ import Notcompletedysl from './modules/user/Notcompletedysl'; import Trialapplicationysl from './modules/login/Trialapplicationysl'; import Trialapplicationreview from './modules/user/Trialapplicationreview'; import Addcourses from "./modules/courses/coursesPublic/Addcourses"; -import AccountProfile from"./modules/user/AccountProfile"; - +import AccountProfile from "./modules/user/AccountProfile"; +import Messagerouting from "./modules/message/js/Messagerouting"; import Trialapplication from './modules/login/Trialapplication' import NotFoundPage from './NotFoundPage' @@ -377,7 +377,7 @@ class App extends Component { - + {/* */} {/*列表页*/} {/**/} diff --git a/public/react/src/modules/message/css/messagemy.css b/public/react/src/modules/message/css/messagemy.css new file mode 100644 index 000000000..4bdd0f999 --- /dev/null +++ b/public/react/src/modules/message/css/messagemy.css @@ -0,0 +1,6 @@ +.myw120{ + width: 120px; +} +.myh120{ + height: 120px; +} \ No newline at end of file diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js new file mode 100644 index 000000000..0598efb30 --- /dev/null +++ b/public/react/src/modules/message/js/MessagChat.js @@ -0,0 +1,21 @@ +import React, { Component } from 'react'; +//私信聊天页面 +class MessagChat extends Component{ + constructor(props) { + super(props); + this.state={ + + } + } + + componentDidMount(){ + } + render() { + return ( +
+ +
+ ) + } +} +export default MessagChat; \ No newline at end of file diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js new file mode 100644 index 000000000..a58d059a7 --- /dev/null +++ b/public/react/src/modules/message/js/MessagSub.js @@ -0,0 +1,125 @@ +import React, { Component } from 'react'; +import { + Spin, + Pagination, +} from "antd"; +import axios from 'axios'; + +//消息页面 +class MessagSub extends Component{ + constructor(props) { + super(props); + this.state={ + page:1, + limit:10, + typeysl:"", + count:0, + isSpin:true, + } + } + // 初始化数据 + componentDidMount(){ + debugger + console.log("初始化数据了"); + this.getdata("",this.state.page); + } + + //塞选页数 + paginationonChanges=(pageNumber)=>{ + this.setState({ + page: pageNumber, + }) + this.getdata(this.state.typeysl,pageNumber); + + } + //获取数据源 + getdata=(types,page)=>{ + this.setState({ + isSpin:true, + }) + let{limit}=this.state; + let url = `/users/tidings.json`; + axios.get((url),{params:{ + type:types, + page:page, + per_page:limit, + }}).then((result) => { + if (result) { + console.log(types); + console.log(result); + if(result.data.message!==undefined){ + console.log("5151515151"); + return; + } + console.log("调用了消失的方法"); + console.log("5454545454"); + this.setState({ + count:result.data.count, + typeysl:types, + isSpin:false, + }) + } + }).catch((error) => { + console.log(error); + this.setState({ + isSpin:false, + }) + }) + } + + componentWillUnmount(){ + // 卸载异步操作设置状态 + this.setState = (state, callback) => { + return; + } + } + render() { + let{page,limit,typeysl,count,isSpin}=this.state; + console.log("6868686868"); + console.log(isSpin); + return ( +
+ {/*头部筛选数据*/} + + {/*下面内容页面*/} +
+ {/*这里可以进行数据处理*/} + +
+ + +
+
+ + {/*页数*/} +
+
+ +
+
+ +
+
+ ) + } +} +export default MessagSub; \ No newline at end of file diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js new file mode 100644 index 000000000..7a7c61174 --- /dev/null +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -0,0 +1,21 @@ +import React, { Component } from 'react'; +//私信页面 +class MessagePrivate extends Component{ + constructor(props) { + super(props); + this.state={ + + } + } + + componentDidMount(){ + } + render() { + return ( +
+ +
+ ) + } +} +export default MessagePrivate; \ No newline at end of file diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index e69de29bb..6cf717e6d 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -0,0 +1,77 @@ +import React, { Component } from 'react'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; +import {Input,Pagination,Tooltip} from 'antd'; +import {TPMIndexHOC} from "../../../modules/tpm/TPMIndexHOC"; +import {Link,NavLink} from 'react-router-dom'; +import { WordsBtn ,ActionBtn,SnackbarHOC,markdownToHTML,getImageUrl} from 'educoder'; +import axios from 'axios'; +import MessagSub from "./MessagSub"; +import MessagePrivate from "./MessagePrivate"; +import MessagChat from "./MessagChat"; +import "../css/messagemy.css" +// MessagSub 消息自路由 +// MessagePrivate 私信 +class Messagerouting extends Component{ + constructor(props) { + super(props); + this.state={ + routing:1, + } + } + + componentDidMount(){ + + } + // 切换路由 + + SwitchonClick=(value)=>{ + this.setState({ + routing:value, + }) + } + render() { + let{routing} =this.state; + return ( +
+
+ {/*左边*/} +
+ {/*头像*/} +
+ + + +

杨树林

+

工程师

+
+ {/*路由跳转*/} + +
+ + {/*右边*/} +
+
+ {/*消息自路由*/} + {routing===1? :""} + + {/*私信*/} + {routing===2? :""} + + {/*私信聊天页面*/} + {routing===3?:""} +
+
+
+ +
+ ) + } +} +export default SnackbarHOC() (TPMIndexHOC ( Messagerouting )); \ No newline at end of file diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index e092c17d4..2e40d006a 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -264,7 +264,10 @@ export function TPMIndexHOC(WrappedComponent) { "is_teacher": false, "tidding_count": 0 } - */ + */ + if(response=== undefined){ + return + } if (response.data) { this.initCommonState(response.data) this.setState({ diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index eb0a3a5c2..cffc633f5 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -14,12 +14,12 @@ import './common.css' import './commontwo.css' const { TabPane } = Tabs; const loginInputsyl = { -"width":"434px", -"height": "462px", -"-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", -"border-radius": "6px", -"background": "#fff" + "width":"434px", + "height": "462px", + "-webkit-box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "box-shadow": "3px 10px 21px 0px rgba(76,76,76,0.15)", + "border-radius": "6px", + "background": "#fff" } //父组件EducoderLogin.js @@ -66,6 +66,7 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } @@ -103,13 +104,14 @@ class LoginRegisterComponent extends Component { pciphone:true, MyEduCoderModals:false, registered:undefined, + Phonenumberisnotcodmms:undefined, } } } //判断是否是手机端 - IsPC=()=> { + IsPC=()=> { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", @@ -162,7 +164,7 @@ class LoginRegisterComponent extends Component { StudyMakeMoney = () => { // 调用父组件方法 - this.props.Setshowbool(3); + // this.props.Setlogins(3); this.setState({ login: "", @@ -170,7 +172,12 @@ class LoginRegisterComponent extends Component { logins: "", passwords: "", codes: "", - }) + }); + try { + this.props.Setshowbool(3); + }catch (e) { + + } } onTabChange = (activeKey) => { console.log("onTabChange"); @@ -294,6 +301,7 @@ class LoginRegisterComponent extends Component { //登入接口 postLogin = () => { + if (this.state.login === undefined || this.state.login == "") { this.setState({ Phonenumberisnotco:"账号不能为空", @@ -310,34 +318,35 @@ class LoginRegisterComponent extends Component { login: this.state.login, password: this.state.password, }).then((response) => { + debugger if (response === undefined) { return } if(response.data.status === -2){ - if("该手机号尚未注册" || "该邮箱尚未注册"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("错误的账号或密码"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - return; - } - else if("违反平台使用规范,账号已被锁定"){ - this.setState({ - Phonenumberisnotco:response.data.message, - }) - - return; - } - else { - this.openNotification(response.data.message); - return; - } + if(response.data.message==="该手机号尚未注册" || response.data.message==="该邮箱尚未注册"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + return; + } + else if(response.data.message==="错误的账号或密码"){ + this.setState({ + Phonenumberisnotcodmms:response.data.message, + }) + return; + } + else if(response.data.message==="违反平台使用规范,账号已被锁定"){ + this.setState({ + Phonenumberisnotco:response.data.message, + }) + + return; + } + else { + this.openNotification(response.data.message); + return; + } } @@ -468,7 +477,7 @@ class LoginRegisterComponent extends Component { // }) this.setMyEduCoderModals(); } - } + } }).catch((error) => { }) @@ -489,54 +498,54 @@ class LoginRegisterComponent extends Component { // this.setState({dragOk: true}) if(result){ - if(result.data.status===-2){ - if (id === 1) { - if(result.data.message==="该手机号码或邮箱已被注册"){ - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - }else { - this.setState({ - Phonenumberisnotco: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s5"); - - } - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: result.data.message, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - console.log("s6"); - - return; - } - }else { - if (id === 1) { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } else if (id === 2) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - dragOk:true, - }) - return; - } - } - } + if(result.data.status===-2){ + if (id === 1) { + if(result.data.message==="该手机号码或邮箱已被注册"){ + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + }else { + this.setState({ + Phonenumberisnotco: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s5"); + + } + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: result.data.message, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s6"); + + return; + } + }else { + if (id === 1) { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } else if (id === 2) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + return; + } + } + } }).catch((error) => { @@ -597,12 +606,12 @@ class LoginRegisterComponent extends Component { }) return; } - if(this.state.pciphone===true) { - if (this.state.dragOk === false) { - this.openNotification("拖动滑块验证"); - return; - } - } + if(this.state.pciphone===true) { + if (this.state.dragOk === false) { + this.openNotification("拖动滑块验证"); + return; + } + } if (this.state.getverificationcodes === true) { this.setState({ @@ -660,12 +669,14 @@ class LoginRegisterComponent extends Component { this.setState({ Phonenumberisnotco: undefined, Phonenumberisnotcobool: false, + Phonenumberisnotcodmms:undefined, login: stirngt, }) }else{ this.setState({ login: stirngt, Phonenumberisnotco:undefined, + Phonenumberisnotcodmms:undefined, }) } @@ -729,61 +740,61 @@ class LoginRegisterComponent extends Component { this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - }) - return; - } - // var telephone = $("#telephoneAdd.tianjia_phone").val(); - var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; - // var email = $("#add_email.tianjia_email").val(); - var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - - // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 - var stringdata = undefined; - if (!regph.test(e.target.value)) { - stringdata = "手机号格式不正确"; - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; - }) - return - } + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, - if (!regemail.test(e.target.value)) { - if ((e.target.value.indexOf("@") != -1) === true) { - stringdata = "邮箱格式不正确"; - } else { - stringdata = "手机号格式不正确"; + }) + return + } - } - this.setState({ - Phonenumberisnotcos: stringdata, - Phonenumberisnotcobool: true, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - return + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; } else { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, + stringdata = "手机号格式不正确"; - }) - this.Emailphonenumberverification(e.target.value, id); - return } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + + }) this.Emailphonenumberverification(e.target.value, id); + return + } + this.Emailphonenumberverification(e.target.value, id); } //获取登入密码 passwordonChange = (e) => { @@ -798,6 +809,7 @@ class LoginRegisterComponent extends Component { this.setState({ password: stirngt, Phonenumberisnotcodmm:undefined, + Phonenumberisnotcodmms:undefined, }) // this.setState({ // password: e.target.value @@ -807,28 +819,28 @@ class LoginRegisterComponent extends Component { loginInputonChanges = (e) => { console.log(e.target.value); var stirngt; - if(e.target.value.length>0){ - var str= e.target.value.replace(/\s*/g,"") - stirngt=str; - }else{ - stirngt= e.target.value; - } - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotcos: undefined, - Phonenumberisnotcobool: false, - logins: stirngt, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - }else{ - this.setState({ - logins: stirngt, - Phonenumberisnotcos: undefined, - dragOk:false, - Whethertoverify:this.state.Whethertoverify===true?false:true, - }) - } + if(e.target.value.length>0){ + var str= e.target.value.replace(/\s*/g,"") + stirngt=str; + }else{ + stirngt= e.target.value; + } + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + logins: stirngt, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + }else{ + this.setState({ + logins: stirngt, + Phonenumberisnotcos: undefined, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } } //获取注册密码 @@ -858,7 +870,7 @@ class LoginRegisterComponent extends Component { this.setState({ tab:e.key }) - console.log(e.key); + console.log(e.key); if(e.key === 0){ this.setState({ Phonenumberisnotcos:undefined @@ -916,6 +928,7 @@ class LoginRegisterComponent extends Component { // 注册 readAgreement, pciphone, + Phonenumberisnotcodmms, } = this.state // height: 346px; if (this.state.seconds === 0) { @@ -925,30 +938,30 @@ class LoginRegisterComponent extends Component { console.log(classpass); return ( -
- - -
- - 登录 - 注册 - - - { - parseInt(tab[0])==0 && -
- + +
+ + 登录 + 注册 + + + { + parseInt(tab[0])==0 && +
+ - - this.inputOnBlur(e, 1)} - style={{marginTop: '30px', height: '38px'}}> - - { - Phonenumberisnotco && Phonenumberisnotco != "" ? -

- {Phonenumberisnotco} -

- :
- } - - - { - Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? -

- {Phonenumberisnotcodmm} -

- :
- } - - - - -
- } - - - { - parseInt(tab[0])==1 && -
- this.inputOnBlurzhuche(e, 2)} - style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> - { - Phonenumberisnotcos && Phonenumberisnotcos !== "" ? -

- {Phonenumberisnotcos} -

- :
+ } + + + this.inputOnBlur(e, 1)} + style={{marginTop: '30px', height: '38px'}}> + + { + Phonenumberisnotco && Phonenumberisnotco != "" ? +

+ {Phonenumberisnotco} +

+ :
+ } + + + { + Phonenumberisnotcodmm && Phonenumberisnotcodmm != "" ? +

+ {Phonenumberisnotcodmm} +

+ : (Phonenumberisnotcodmms=== undefined?
:"") + } + { + Phonenumberisnotcodmms && Phonenumberisnotcodmms != "" ? +

+ {Phonenumberisnotcodmms} +

+ : "" + } + + + + +
+ } + + + { + parseInt(tab[0])==1 && +
+ this.inputOnBlurzhuche(e, 2)} + style={{marginTop: '30px' , height: '38px',color:'#999999',fontSize:"14px"}}> + { + Phonenumberisnotcos && Phonenumberisnotcos !== "" ? +

+ {Phonenumberisnotcos} +

+ :
+ + } + {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} + />:""} + + { + Whethertoverify===false&&pciphone===true? + + + : + "" - } - {this.state.MyEduCoderModals===true? {this.setNotcompleteds()}} - />:""} - - { - Whethertoverify===false&&pciphone===true? - - - : - "" - - } - { - Whethertoverify===true&&pciphone===true? - - + } + { + Whethertoverify===true&&pciphone===true? + + : "" - } + } -
- { - pciphone===true? - ( - Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ? +
+ { + pciphone===true? + ( + Phonenumberisnotcosytdhk && Phonenumberisnotcosytdhk !== "" ?

{Phonenumberisnotcosytdhk}

:
- ) - :"" - } -
- - - -
- - - - { - getverificationcodes === undefined ? - - : getverificationcodes === true ? - - : - - } - -
-
- { - Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? -

- {Phonenumberisnotcosyzm} -

- :
+ ) + :"" + } +
+ + + +
+ + + + { + getverificationcodes === undefined ? + + : getverificationcodes === true ? + + : + + } + +
+
+ { + Phonenumberisnotcosyzm && Phonenumberisnotcosyzm !== "" ? +

+ {Phonenumberisnotcosyzm} +

+ :
- } -
+ } +
- - this.Showandhide(key)}> - - }> - { - Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? -

- {Phonenumberisnotcosymmm} -

- :
- - } - 我已阅读并同意 + } + + this.Showandhide(key)}> + + }> + { + Phonenumberisnotcosymmm && Phonenumberisnotcosymmm !== "" ? +

+ {Phonenumberisnotcosymmm} +

+ :
+ + } + 我已阅读并同意 《服务协议条款》 - + -
- } -
-
+
+ } +
+ ); } } From 5479c7f8879604f77ff53cdd230829c78f947a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Tue, 30 Jul 2019 10:36:01 +0800 Subject: [PATCH 003/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/LoginRegisterComponent.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index cffc633f5..9199aa51d 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -368,6 +368,12 @@ class LoginRegisterComponent extends Component { if(weekArray===undefined){ weekArray="/"; } + if(weekArray===null){ + weekArray="/"; + } + if(weekArray==="null"){ + weekArray="/"; + } window.location.href = weekArray; } } From 814aa13c21518c8c463761e09e8c993364ed1c98 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 30 Jul 2019 14:05:26 +0800 Subject: [PATCH 004/623] =?UTF-8?q?Mp3=E3=80=81mp4=E7=B1=BB=E5=AE=9E?= =?UTF-8?q?=E8=AE=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- app/controllers/myshixuns_controller.rb | 2 +- app/helpers/games_helper.rb | 8 +++++++- app/models/challenge.rb | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index b2de6dcad..667d45f2b 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -116,7 +116,7 @@ class GamesController < ApplicationController @qrcode_str = Base64.encode64( qr.to_img.resize(400,400).to_s ) else - @type = "image" + @type = "" #conv = Iconv.new("GBK", "utf-8") @game_challenge = @game.challenge type = @game_challenge.show_type diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index fa47fd7f6..1d6b15969 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -24,7 +24,7 @@ class MyshixunsController < ApplicationController ActiveRecord::Base.transaction do begin @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) - @myshixun.destroy + @myshixun.destroy! StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) diff --git a/app/helpers/games_helper.rb b/app/helpers/games_helper.rb index aff05904f..dfc3fb321 100644 --- a/app/helpers/games_helper.rb +++ b/app/helpers/games_helper.rb @@ -6,7 +6,7 @@ module GamesHelper end # 获取目录下所有文件,返回一个文件名的数组 type是查看文件的类型image表示图片 - # type [[1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"]] + # type [[1, "图片"], [2, "apk/exe"], [3, "txt"], [4, "html"], [5, "mp3"], [6, "mp4"]] def get_dir_filename(path, type, game_id) answer_picture = [] return answer_picture unless File.directory?(path) @@ -39,6 +39,12 @@ module GamesHelper end f.close @type = 'txt' + elsif extension == 'mp3' && type == 5 + answer_picture << file + @type = 'mp3' + elsif extension == 'mp4' && type == 6 + answer_picture << file + @type = 'mp4' end end diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 0bea54eb4..8e4d2ae42 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -1,5 +1,6 @@ class Challenge < ApplicationRecord # difficulty: 关卡难度: 1.简单 2.中等 3.困难 + # show_type: 效果展示:-1.无效果 1.图片 2.apk/exe 3.txt 4.html 5.mp3 6.mp4 default_scope { order("challenges.position asc") } belongs_to :shixun, :touch => true, counter_cache: true From 899827917ad86125990c2c94d6da83346cd8cd16 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 14:42:50 +0800 Subject: [PATCH 005/623] =?UTF-8?q?=E6=89=80=E9=80=89=E5=AD=A6=E7=94=9F?= =?UTF-8?q?=E5=88=86=E7=8F=AD=E8=87=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coursesPublic/form/SchoolSelect.js | 2 +- .../courses/members/modal/AddStudentModal.js | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/form/SchoolSelect.js b/public/react/src/modules/courses/coursesPublic/form/SchoolSelect.js index e1a9062e3..67cf3c842 100644 --- a/public/react/src/modules/courses/coursesPublic/form/SchoolSelect.js +++ b/public/react/src/modules/courses/coursesPublic/form/SchoolSelect.js @@ -57,7 +57,7 @@ class SchoolSelect extends Component{ const { value, onChange } = this.props; return ( 姓名: {this.setState({name: e.target.value})}} - style={{ width: '242px'}} + style={{ width: '221px'}} > 单位: {/* {this.setState({school_name: e.target.value})}} @@ -210,14 +210,7 @@ class AddStudentModal extends Component{ >搜索 {/* */} - {course_groups && course_groups.length &&
- 分班: - -
} +

@@ -271,6 +264,14 @@ class AddStudentModal extends Component{ + {course_groups && course_groups.length &&

+ 所选学生分班至(选填): + +
} : } From b728139be22d7e7196d01695515e4de0a822cf74 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 30 Jul 2019 16:25:50 +0800 Subject: [PATCH 006/623] login --- .../src/modules/courses/members/modal/AddStudentModal.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/modal/AddStudentModal.js b/public/react/src/modules/courses/members/modal/AddStudentModal.js index 34af1d01a..1ad02c9f4 100644 --- a/public/react/src/modules/courses/members/modal/AddStudentModal.js +++ b/public/react/src/modules/courses/members/modal/AddStudentModal.js @@ -240,7 +240,12 @@ class AddStudentModal extends Component{ 12 }> - + From 89b7a5099f4b9426413eb99b8b6d0b642b4ab4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 17:53:34 +0800 Subject: [PATCH 007/623] =?UTF-8?q?=E4=BC=97=E5=8C=85=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.js | 2 +- .../projectPackages/PackageIndex/PackageConcent.js | 4 ++-- .../PackageIndexNEITaskDetails.js | 6 +++--- .../PackageIndexNEIBannerConcent.js | 4 ++-- .../PackageIndexNewandEdit/PackageIndexNEISubmit.js | 4 ++-- .../PackageIndexNewandEditIndex.js | 2 +- .../src/modules/projectPackages/ProjectPackageIndex.js | 8 ++++---- public/react/src/modules/tpm/NewHeader.js | 4 ++-- public/react/src/modules/user/usersInfo/Infos.js | 10 +++++----- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index e713cd0fd..6d1e2a521 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -304,7 +304,7 @@ class App extends Component { {/**/} {/*众包创新*/} - + {/*认证*/} diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index cfc54bb98..921c3e555 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -158,7 +158,7 @@ class PackageConcent extends Component { enterButton={ 搜索} onSearch={ (value)=>this.setdatafuns(value)} />

@@ -224,7 +224,7 @@ class PackageConcent extends Component { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index ac7c8a1a5..35ca952a7 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -230,7 +230,7 @@ class PackageIndexNEITaskDetails extends Component { } goback = () => { // window.history.go(-1) - window.location.href="/crowdsourcings"; + window.location.href="/crowdsourcing"; } render() { @@ -252,7 +252,7 @@ class PackageIndexNEITaskDetails extends Component { '} className={"fl"}> {/*{this.props.current_user.username}*/} - 众包创新 + 众包创新 {data&&data.title} @@ -353,7 +353,7 @@ class PackageIndexNEITaskDetails extends Component { 需求详情: {data&&data.status==="pending"&&data&&data.operation.can_select_bidding_user===true?:""} diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js index eae5589f2..ccc78f04b 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBannerConcent.js @@ -462,7 +462,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcings/"+response.data.id + window.location.href="/crowdsourcing/"+response.data.id } this.setState({ springtype:false @@ -510,7 +510,7 @@ class PackageIndexNEIBannerConcent extends Component { if(type===true){ this.props.setPublicationfun(response.data.id) }else{ - window.location.href="/crowdsourcings/"+response.data.id + window.location.href="/crowdsourcing/"+response.data.id } this.setState({ springtype:false diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js index 932b9295f..e44e654b9 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEISubmit.js @@ -14,10 +14,10 @@ class PackageIndexNEISubmit extends Component { } setageload=(sum)=>{ if(sum===undefined){ - window.location.href="/crowdsourcings/new" + window.location.href="/crowdsourcing/new" }else{ // this.props.history.push("/project_packages/"+sum) - window.location.href="/crowdsourcings/"+sum + window.location.href="/crowdsourcing/"+sum } } diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js index 8d73a6e55..0481577bf 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNewandEditIndex.js @@ -30,7 +30,7 @@ class PackageIndexNewandEditIndex extends Component{ goback = () => { // window.history.go(-1) - window.location.href="/crowdsourcings"; + window.location.href="/crowdsourcing"; } render() { diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 6f2e32b8b..097e012e0 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -43,25 +43,25 @@ class ProjectPackageIndex extends Component { {/*众包首页*/} - () } > - () } > - () } > - () } diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index b84982d86..79b0aa443 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -718,7 +718,7 @@ submittojoinclass=(value)=>{
  • 教学案例
  • 众包创新
  • 交流问答
  • {
  • 我的实训
  • 我的实践课程
  • 我的项目
  • - {/*
  • 我的众包
  • */} +
  • 我的众包
  • 账号管理
  • {/*
  • this.educoderlogin()} >登入测试接口
  • */} {/*
  • this.trialapplications()} >试用申请
  • */} diff --git a/public/react/src/modules/user/usersInfo/Infos.js b/public/react/src/modules/user/usersInfo/Infos.js index f20cd5be5..5286c5797 100644 --- a/public/react/src/modules/user/usersInfo/Infos.js +++ b/public/react/src/modules/user/usersInfo/Infos.js @@ -384,11 +384,11 @@ class Infos extends Component{ to={`/users/${username}/projects`}>项目 - {/*
  • */} - {/* this.setState({moduleName: 'package'})}*/} - {/*to={`/users/${username}/package`}>众包*/} - {/*
  • */} +
  • + this.setState({moduleName: 'package'})} + to={`/users/${username}/package`}>众包 +
  • {/*{ data && data.identity!="学生" &&
  • 题库
  • }*/} From 0bc92a8729a1e8b9a8022d70c9cd26ee119e81ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 30 Jul 2019 23:18:22 +0800 Subject: [PATCH 008/623] =?UTF-8?q?=E4=BC=97=E5=8C=85=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/user/usersInfo/InfosPackage.js | 125 +++++++++++++++--- 1 file changed, 109 insertions(+), 16 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index f1077cd62..65cf2467a 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -2,16 +2,35 @@ import React, { Component } from 'react'; import { SnackbarHOC } from 'educoder'; import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; import {Tooltip,Menu,Pagination,Spin} from 'antd'; -import Loadable from 'react-loadable'; -import Loading from '../../../Loading'; import axios from 'axios'; -import NoneData from '../../courses/coursesPublic/NoneData' import {getImageUrl} from 'educoder'; -import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; -import { CNotificationHOC } from '../../courses/common/CNotificationHOC' +import NoneData from '../../courses/coursesPublic/NoneData' import "./usersInfo.css" -import Create from './publicCreatNew' +import moment from 'moment'; +let categorylist=[ + {name:"全部",value:undefined}, + {name:"前端开发",value:"front"}, + {name:"后端开发",value:"backend"}, + {name:"移动开发",value:"mobile"}, + {name:"数据库",value:"database"}, + {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, + {name:"人工智能",value:"ai"}, + {name:"运维与测试",value:"devops_and_test"}, + {name:"其他",value:"other"}, +] +// +function setcategorylist(val){ + let vals="" + categorylist.some((item,key)=> { + if (item.name === val) { + vals=item.value + return true + } + } + ) + return vals +} class InfosPackage extends Component{ constructor(props){ super(props); @@ -19,8 +38,8 @@ class InfosPackage extends Component{ category:undefined, status:undefined, page:1, - per_page:16, - + per_page:20, + sort_direction:'desc', totalCount:undefined, data:undefined, isSpin:false @@ -36,12 +55,14 @@ class InfosPackage extends Component{ } getCourses=(category,status,page)=>{ - let url=`/users/${this.props.match.params.username}/courses.json`; + let url=`/users/${this.props.match.params.username}/project_packages.json`; axios.get((url),{params:{ category, status, page, - per_page: this.props.is_current && category && page ==1?17:16 + sort_by:"published_at", + sort_direction:'desc', + per_page:20 }}).then((result)=>{ if(result){ this.setState({ @@ -103,21 +124,93 @@ class InfosPackage extends Component{ } = this.state; let is_current=this.props.is_current; - console.log(this.props.current_user&&this.props.current_user.user_identity==="学生") + console.log(data) return(
    - + { + category=="manage"? + : category=="bidden"? + :"" + }

    - 共{0}个 + 共{totalCount}个 发布时间

    + {/*bidden_status: "pending"*/} + + {/*category_id: 2*/} + + {/*status: "published"*/} + + {/*type: "bidden"*/} + + + {data===undefined?:data.project_packages.length===0?:data.project_packages.map((item,key)=>{ + return( +
    +
    +
    + 图片 +
    +
    +
    + +
    +
    +
    +
    + {item.min_price===null?"":¥{item.min_price}} + {item.max_price===null||item.min_price===null?"":~} + {item.max_price===null?"":¥{item.max_price}} + {item.min_price===null&&item.max_price===null?可议价:""} +
    +
    +
    +
    {item.category_name}
    +
    +
    +
    + + {item.visit_count}人浏览 +
    +
    + + {moment(item.deadline_at).endOf('day').fromNow()}竞标截止 +
    +
    + + {item.bidding_users_count}人竞标 +
    +
    +
    + 发布于:{item.published_at} +
    +
    +
    +
    +
    + )})} + + +
    ) From 8c584ba15d2080559518b2bdcc151452e1f3c1b5 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 31 Jul 2019 09:58:08 +0800 Subject: [PATCH 009/623] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=A4=9A=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E7=B1=BB=E7=9A=84=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 2 +- app/views/games/picture_display.json.jbuilder | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index b2de6dcad..510044aa4 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -116,7 +116,7 @@ class GamesController < ApplicationController @qrcode_str = Base64.encode64( qr.to_img.resize(400,400).to_s ) else - @type = "image" + @type = shixun_show_type @game_challenge.show_type #conv = Iconv.new("GBK", "utf-8") @game_challenge = @game.challenge type = @game_challenge.show_type diff --git a/app/views/games/picture_display.json.jbuilder b/app/views/games/picture_display.json.jbuilder index 541c478a9..b43efa57e 100644 --- a/app/views/games/picture_display.json.jbuilder +++ b/app/views/games/picture_display.json.jbuilder @@ -24,5 +24,30 @@ elsif @type == "txt" json.contents @contents.html_safe elsif @type =="qrcode" json.qrcode_str @qrcode_str +elsif @type == "mp3" || @type == "mp4" + if @type == "mp4" + json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378171/123.mp4"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] + json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378173/789.mp4"}] + else + json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378174/58099.mp3"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + end + # json.orignal_file do + # json.array! @orignal_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) + # end + # end + # json.user_file do + # json.array! @user_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) + # end + # end + # json.answer_file do + # json.array! @answer_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @answer_path) + # end + # end end \ No newline at end of file From 60645e22064fc91d0ddc58e7eab94deb9e4922db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 09:59:20 +0800 Subject: [PATCH 010/623] =?UTF-8?q?=E5=AE=9E=E8=AE=ADTPM=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E8=B7=B5=E4=BB=BB=E5=8A=A1=E7=9A=84=E6=95=88=E6=9E=9C=E5=B1=95?= =?UTF-8?q?=E7=8E=B0=E5=A2=9E=E5=8A=A0=E2=80=9CMP3/MP4=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tpm/challengesnew/TPMevaluation.js | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/public/react/src/modules/tpm/challengesnew/TPMevaluation.js b/public/react/src/modules/tpm/challengesnew/TPMevaluation.js index 5d66829c3..6cd0b9977 100644 --- a/public/react/src/modules/tpm/challengesnew/TPMevaluation.js +++ b/public/react/src/modules/tpm/challengesnew/TPMevaluation.js @@ -339,9 +339,6 @@ export default class TPMevaluation extends Component { goblakepath=(path,key)=>{ let {main,selectpath,pathtype} =this.state; - - - let newmain=[] for(var i=0;i<=key;i++){ newmain.push(main[i]) @@ -366,16 +363,20 @@ export default class TPMevaluation extends Component { }); if(pathtype===2){ - // var str=path; - // str.slice(0,str.length-1) - // debugger - // console.log(str) + let paths = path.substring(0,path.length-1); + console.log(paths) this.setState({ - selectpath: path, + selectpath: paths, }) } + } + + + + + // delesavegetfilepath=(value)=>{ // let {selectpatharr} = this.state // let newarr =selectpatharr; @@ -674,6 +675,7 @@ export default class TPMevaluation extends Component { this.setState({ selectpath:e.target.value }) + } updatepath=(e,name,type)=>{ this.setState({ @@ -949,6 +951,8 @@ export default class TPMevaluation extends Component { + + this.showrepositoryurltip(1)}>
    - {pathoptionvalue===1?
    + {pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6?

    待处理图片路径

    this.updatepath(e,"shixunfileexpectpicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfileexpectpicturepath",2)} />

    - 该路径下的文件将在学员评测本关任务时,作为原始图片显示在查看效果页,供学员参考,任务为图片处理时请指定该路径,并注意与程序文件所在文件夹分开 + 该路径下的文件将在学员评测本关任务时,作为原始文件显示在查看效果页,供学员参考;任务为文件处理时请指定该路径,并注意与程序文件所在文件夹分开。

    @@ -997,20 +1001,20 @@ export default class TPMevaluation extends Component {
    :""} - {pathoptionvalue===1?
    + {pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6?

    标准答案图片路径

    this.updatepath(e,"shixunfilestandardpicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfilestandardpicturepath",2)} />

    - 该路径下的文件将在学员评测本关任务时,作为参考答案显示在查看效果页,供学员参考任务输出结果为文件时请指定该路径,并注意与程序文件所在文件夹分开 + 该路径下的文件将在学员评测本关任务时,作为参考答案显示在查看效果页,供学员参考;任务输出结果为文件时请指定该路径,并注意与程序文件所在文件夹分开。

    @@ -1029,9 +1033,9 @@ export default class TPMevaluation extends Component { value={shixunfilepicturepath} onInput={(e)=>this.updatepath(e,"shixunfilepicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfilepicturepath",2)} - placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例:src/step1/outputimages"/> + placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例:src/step1/outputfiles"/>

    - 学员评测本关任务时生成的文件将保存在该路径下,并作为实际输出显示在查看效果页,供学员确认任务输出结果为文件时请指定该路径,并注意与程序文件所在文件夹分开 + 学员评测本关任务时生成的文件将保存在该路径下,并作为实际输出显示在查看效果页,供学员确认;任务输出结果为文件时请指定该路径,并注意与程序文件所在文件夹分开。

    @@ -1066,16 +1070,16 @@ export default class TPMevaluation extends Component {

    - - 系统评分占比: - - 均分比例 - 自定义比例 - - + + 系统评分占比: + + 均分比例 + 自定义比例 + +

    From 400e5c104011c1f593daf97092d230fa4acffc37 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Wed, 31 Jul 2019 10:08:01 +0800 Subject: [PATCH 011/623] export true --- .../modules/courses/shixunHomework/Trainingjobsetting.js | 8 ++++---- .../courses/shixunHomework/Workquestionandanswer.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 8cbf0402f..99c295c40 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1766,16 +1766,16 @@ class Trainingjobsetting extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url + '&export=true'); + this.confirmysl(url, url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url + '?export=true'); + this.confirmysl(url, url + '?export=true'); } - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url, urlWithExport){ + axios.get(urlWithExport).then((response) => { if(response === undefined){ return } diff --git a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js index 2da08e2ad..4ed45790d 100644 --- a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js +++ b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js @@ -339,16 +339,16 @@ class Workquestionandanswer extends Component { daochushixunbaogao=()=>{ let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`; - this.confirmysl(url + '&export=true'); + this.confirmysl(url, url + '&export=true'); } daochuzuoye =() =>{ let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`; - this.confirmysl(url + '?export=true'); + this.confirmysl(url, url + '?export=true'); } - confirmysl(url){ - axios.get(url).then((response) => { + confirmysl(url, urlWithExport){ + axios.get(urlWithExport).then((response) => { if(response === undefined){ return } From 2e889a74e56189c9077fa443a2a267df9cba4a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 11:20:32 +0800 Subject: [PATCH 012/623] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E4=B8=8D=E8=83=BD=E9=80=89=E4=BB=8A?= =?UTF-8?q?=E5=A4=A9=E4=B9=8B=E5=89=8D=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/coursesPublic/HomeworkModal.js | 11 ++++++++++- .../modules/courses/coursesPublic/SelectSetting.js | 8 +++++++- .../src/modules/courses/coursesPublic/sendResource.js | 8 +++++++- .../src/modules/courses/exercise/Exercisesetting.js | 8 ++++++++ .../graduation/tasks/GraduationTaskssetting.js | 9 +++++++++ public/react/src/modules/courses/new/CoursesNew.js | 4 ++++ .../modules/courses/poll/PollDetailTabForthRules.js | 8 ++++++++ .../courses/shixunHomework/Trainingjobsetting.js | 6 ++++++ .../react/src/modules/tpm/TPMsettings/TPMsettings.js | 7 ++++++- public/react/src/modules/tpm/newshixuns/Newshixuns.js | 8 +++++--- 10 files changed, 70 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/HomeworkModal.js b/public/react/src/modules/courses/coursesPublic/HomeworkModal.js index 440d8893c..deb329fb9 100644 --- a/public/react/src/modules/courses/coursesPublic/HomeworkModal.js +++ b/public/react/src/modules/courses/coursesPublic/HomeworkModal.js @@ -20,6 +20,14 @@ function disabledDateTime() { // disabledSeconds: () => [55, 56], }; } + + +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} + + + class HomeworkModal extends Component{ constructor(props){ super(props); @@ -81,7 +89,7 @@ class HomeworkModal extends Component{ // console.log('startValue',dateString); this.setState({ - endtime: handleDateString(dateString), + endtime: date===null?"":handleDateString(dateString), }) } @@ -188,6 +196,7 @@ class HomeworkModal extends Component{ dropdownClassName="hideDisable" showTime={{ format: 'HH:mm' }} disabledTime={disabledDateTime} + disabledDate={disabledDate} showToday={false} locale={locale} format={dateFormat} diff --git a/public/react/src/modules/courses/coursesPublic/SelectSetting.js b/public/react/src/modules/courses/coursesPublic/SelectSetting.js index 08e01e28e..fa2e014f9 100644 --- a/public/react/src/modules/courses/coursesPublic/SelectSetting.js +++ b/public/react/src/modules/courses/coursesPublic/SelectSetting.js @@ -16,12 +16,17 @@ function range(start, end) { } return result; } + function disabledDateTime() { return { disabledMinutes: () => range(1, 30).concat(range(31, 60)), // disabledSeconds: () => range(1,60) } } + +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} class Selectsetting extends Component{ constructor(props){ super(props); @@ -698,6 +703,7 @@ class Selectsetting extends Component{ onChange={(e,index)=>this.onChangeTimepublishs(e,index,key)} // onChange={ this.onChangeTimepublish } disabledTime={disabledDateTime} + disabledDate={disabledDate} /> {key!=0?this.deletegrouppublish(key)}>:""} @@ -730,7 +736,7 @@ class Selectsetting extends Component{ value={datatime===undefined||datatime===""?"":moment(datatime, dateFormat)} onChange={this.onChangeTimepublish} disabledTime={disabledDateTime} - + disabledDate={disabledDate} />

    :""} diff --git a/public/react/src/modules/courses/coursesPublic/sendResource.js b/public/react/src/modules/courses/coursesPublic/sendResource.js index 397711ca3..8443061dd 100644 --- a/public/react/src/modules/courses/coursesPublic/sendResource.js +++ b/public/react/src/modules/courses/coursesPublic/sendResource.js @@ -22,6 +22,11 @@ function disabledDateTime() { }; } +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} + + const dateFormat="YYYY-MM-DD HH:mm"; class Sendresource extends Component{ constructor(props){ @@ -525,6 +530,7 @@ class Sendresource extends Component{ onChange={(e,index)=>this.onChangeTimepublish(e,index,key,2)} // onChange={ this.onChangeTimepublish } disabledTime={disabledDateTime} + disabledDate={disabledDate} /> {key!=0?this.deletegrouppublish(key)}>:""} {key===course_group_publish_times.length-1&&key:""} @@ -551,7 +557,7 @@ class Sendresource extends Component{ value={datatime===undefined||datatime===""?undefined:moment(datatime, dateFormat)} onChange={(e,index)=>this.onChangeTimepublish(e,index,undefined,1)} disabledTime={disabledDateTime} - + disabledDate={disabledDate} />

    :""} diff --git a/public/react/src/modules/courses/exercise/Exercisesetting.js b/public/react/src/modules/courses/exercise/Exercisesetting.js index 9b6103fdb..a93aa9942 100644 --- a/public/react/src/modules/courses/exercise/Exercisesetting.js +++ b/public/react/src/modules/courses/exercise/Exercisesetting.js @@ -23,6 +23,7 @@ function range(start, end) { } return result; } + function disabledDateTime() { return { // disabledHours: () => range(0, 24).splice(4, 20), @@ -30,6 +31,11 @@ function disabledDateTime() { // disabledSeconds: () => [0, 60], }; } + +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} + const dataformat="YYYY-MM-DD HH:mm"; class Exercisesetting extends Component{ @@ -636,6 +642,7 @@ class Exercisesetting extends Component{ format="YYYY-MM-DD HH:mm" showToday={false} disabledTime={disabledDateTime} + disabledDate={disabledDate} onChange={this.onChangeTimepublish} value={publish_time && moment(publish_time,"YYYY-MM-DD HH:mm")} disabled={ publish_timetype===true?true:!flagPageEdit } @@ -661,6 +668,7 @@ class Exercisesetting extends Component{ width={"240px"} format="YYYY-MM-DD HH:mm" disabledTime={disabledDateTime} + disabledDate={disabledDate} onChange={this.onChangeTimeEnd} value={end_time && moment(end_time,"YYYY-MM-DD HH:mm")} disabled={ end_timetype===true?true:!flagPageEdit} diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index 5bbbe1a14..59d3dce17 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -27,6 +27,11 @@ function disabledDateTime() { }; } +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} + + class GraduationTaskssettingapp extends Component{ constructor(props){ @@ -1181,6 +1186,7 @@ class GraduationTaskssettingapp extends Component{ value={publish_time===null||publish_time===""?"":moment(publish_time, dateFormat)} onChange={this.onChangeTimepublish} disabledTime={disabledDateTime} + disabledDate={disabledDate} disabled={this.props.isAdmin()===true?starttimetype===true?true:flagPageEdit===true?false:true:true} className={ this.state.publishTimetypes===true?"noticeTip":""} /> @@ -1218,6 +1224,7 @@ class GraduationTaskssettingapp extends Component{ value={end_time===null||end_time===""?"":moment(end_time, dateFormat)} onChange={this.onChangeTimeend} disabledTime={disabledDateTime} + disabledDate={disabledDate} // disabled={this.props.isSuperAdmin()===true?flagPageEdit===true?false:true:this.props.isAdmin()===true?endtimetype===true?true:flagPageEdit===true?false:true:true} disabled={this.props.isAdmin()===true?endtimetype===true?true:flagPageEdit===true?false:true:true} className={this.state.endTimetypes===true||end_timetype===true?"noticeTip":""} @@ -1269,6 +1276,7 @@ class GraduationTaskssettingapp extends Component{ width={"210px"} value={latetime===null||latetime===""?"":moment(latetime, dateFormat)} disabledTime={disabledDateTime} + disabledDate={disabledDate} onChange={this.onChangeTimelatetime} disabled={this.props.isAdmin()===true?allowlate===true||allowlate===1?flagPageEdit===true?false:true:true:true} className={ latetimetype===true?"noticeTip":""} @@ -1319,6 +1327,7 @@ class GraduationTaskssettingapp extends Component{ width={"210px"} value={commenttime===null||commenttime=== ""?"":moment(commenttime, dateFormat)} disabledTime={disabledDateTime} + disabledDate={disabledDate} onChange={this.onChangeTimecommenttime} disabled={this.props.isAdmin()===true?flagPageEdit===true?false:true:true} className={ commenttimetype===true?"noticeTip":""} diff --git a/public/react/src/modules/courses/new/CoursesNew.js b/public/react/src/modules/courses/new/CoursesNew.js index b817136ed..c5602d285 100644 --- a/public/react/src/modules/courses/new/CoursesNew.js +++ b/public/react/src/modules/courses/new/CoursesNew.js @@ -28,6 +28,9 @@ function disabledDateTime() { }; } +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} class CoursesNew extends Component { @@ -572,6 +575,7 @@ class CoursesNew extends Component { width={"210px"} value={datatime === undefined ? "" :datatime === null ? "" : moment(datatime, dateFormat)} disabledTime={disabledDateTime} + disabledDate={disabledDate} dropdownClassName="hideDisable" onChange={this.onChangeTimepublishs} /> diff --git a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js index 292830fb8..8b62dd5e4 100644 --- a/public/react/src/modules/courses/poll/PollDetailTabForthRules.js +++ b/public/react/src/modules/courses/poll/PollDetailTabForthRules.js @@ -26,6 +26,12 @@ function disabledDateTime() { // disabledSeconds: () => range(1,60) } } + +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} + + class PollDetailTabForthRules extends Component{ constructor(props){ super(props); @@ -404,6 +410,7 @@ class PollDetailTabForthRules extends Component{ showTime={{ format: 'HH:mm' }} format="YYYY-MM-DD HH:mm" disabledTime={disabledDateTime} + disabledDate={disabledDate} disabled={ rule.e_timeflag ===undefined?rule.publish_time===null?false:!flagPageEdit:rule.p_timeflag == true ? true : !flagPageEdit} style={{"height":"42px",width:'100%'}} > @@ -429,6 +436,7 @@ class PollDetailTabForthRules extends Component{ showTime={{ format: 'HH:mm' }} format="YYYY-MM-DD HH:mm" disabledTime={disabledDateTime} + disabledDate={disabledDate} disabled={ rule.e_timeflag ===undefined?rule.publish_time===null?false:!flagPageEdit:rule.e_timeflag == true ? true : !flagPageEdit} style={{"height":"42px"}} > diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index b07392153..21f03a819 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -47,6 +47,9 @@ function disabledDateTime() { } } +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} class Trainingjobsetting extends Component { //unifiedsetting 统一设置 @@ -1935,6 +1938,7 @@ class Trainingjobsetting extends Component { id={"publishtimeid"} disabledDate={this.disabledStartDatestart} disabledTime={disabledDateTime} + disabledDate={disabledDate} className={borreds} showTime={{ format: 'HH:mm' }} format="YYYY-MM-DD HH:mm" @@ -1967,6 +1971,7 @@ class Trainingjobsetting extends Component { showToday={false} id={"end_timeid"} disabledTime={disabledDateTime} + disabledDate={disabledDate} showTime={{ format: 'HH:mm' }} className={borredss} format="YYYY-MM-DD HH:mm" @@ -2049,6 +2054,7 @@ class Trainingjobsetting extends Component { showToday={false} id={"late_timeid"} disabledTime={disabledDateTime} + disabledDate={disabledDate} format="YYYY-MM-DD HH:mm" value={late_time && moment(late_time, dataformat)} onChange={this.onEndChangeys} diff --git a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js index 8eb2c76dd..bb318ba13 100644 --- a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js +++ b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js @@ -199,6 +199,10 @@ function disabledDateTime() { // disabledSeconds: () => [0, 60], }; } + +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} export default class TPMsettings extends Component { constructor(props) { super(props) @@ -1144,7 +1148,7 @@ export default class TPMsettings extends Component { } onChangeTimePicker =(value, dateString)=> { this.setState({ - opening_time:moment(handleDateStrings(dateString)) + opening_time: dateString=== ""?"":moment(handleDateStrings(dateString)) }) } @@ -1871,6 +1875,7 @@ export default class TPMsettings extends Component { width={178} locale={locale} disabledTime={disabledDateTime} + disabledDate={disabledDate} placeholder="请选择开启时间" value={opening_time===null||opening_time===""?"":moment(opening_time, dateFormat)} onChange={this.onChangeTimePicker} diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index f9c8f5b10..790402a22 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -191,7 +191,9 @@ function disabledDateTime() { }; } - +function disabledDate(current) { + return current && current < moment().endOf('day').subtract(1, 'days'); +} class Newshixuns extends Component { constructor(props) { super(props) @@ -743,7 +745,7 @@ class Newshixuns extends Component { onChangeTimePicker = (value, dateString) => { this.setState({ - TimePickervalue: moment(handleDateStrings(dateString)) + TimePickervalue: dateString=== ""?"":moment(handleDateStrings(dateString)) }) } @@ -1288,7 +1290,7 @@ class Newshixuns extends Component { placeholder="请选择开启时间" onChange={this.onChangeTimePicker} value={TimePickervalue && moment(TimePickervalue, "YYYY-MM-DD HH:mm")} - + disabledDate={disabledDate} disabledTime={disabledDateTime} dropdownClassName="hideDisable" /> From 7eb2e4c71351398cbcbf5a1f2c9b77c1099a9e1b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Wed, 31 Jul 2019 13:42:05 +0800 Subject: [PATCH 013/623] move user project search api controller --- app/controllers/projects_controller.rb | 8 -------- app/controllers/users/base_controller.rb | 2 +- app/controllers/users/projects_controller.rb | 11 +++++++++++ app/views/{ => users}/projects/search.json.jbuilder | 0 config/routes.rb | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) rename app/views/{ => users}/projects/search.json.jbuilder (100%) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c9ed6c597..672477790 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,10 +1,2 @@ class ProjectsController < ApplicationController - def search - query_params = { keyword: params[:keyword], category: 'manage' } - projects = Users::ProjectService.new(current_user, query_params).call - - params[:limit] = params[:per_page].to_i.zero? ? 20 : params[:per_page].to_i - @count = projects.count - @projects = paginate projects - end end \ No newline at end of file diff --git a/app/controllers/users/base_controller.rb b/app/controllers/users/base_controller.rb index fd138a182..969aca320 100644 --- a/app/controllers/users/base_controller.rb +++ b/app/controllers/users/base_controller.rb @@ -43,7 +43,7 @@ class Users::BaseController < ApplicationController page = page_value per_page = per_page_value - return Kaminari.paginate_array(objs).page(page).per(per_page) unless observed_logged_user? && opts[:special] + return Kaminari.paginate_array(objs).page(page).per(per_page) unless opts[:special] && observed_logged_user? # note: 为实现第一页少一条记录,让前端放置新建入口 if page == 1 diff --git a/app/controllers/users/projects_controller.rb b/app/controllers/users/projects_controller.rb index 863b99b37..07f4d5cac 100644 --- a/app/controllers/users/projects_controller.rb +++ b/app/controllers/users/projects_controller.rb @@ -1,4 +1,6 @@ class Users::ProjectsController < Users::BaseController + skip_before_action :check_observed_user_exists!, only: [:search] + def index projects = Users::ProjectService.new(observed_user, query_params).call @@ -6,6 +8,15 @@ class Users::ProjectsController < Users::BaseController @projects = paginate(projects.includes(:project_score, owner: { user_extension: :school }), special: true) end + def search + query_params = { keyword: params[:keyword], category: 'manage' } + projects = Users::ProjectService.new(current_user, query_params).call + + params[:limit] = params[:per_page].to_i.zero? ? 20 : params[:per_page].to_i + @count = projects.count + @projects = paginate projects + end + private def query_params diff --git a/app/views/projects/search.json.jbuilder b/app/views/users/projects/search.json.jbuilder similarity index 100% rename from app/views/projects/search.json.jbuilder rename to app/views/users/projects/search.json.jbuilder diff --git a/config/routes.rb b/config/routes.rb index 2f9eed61b..581f563b0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -75,7 +75,7 @@ Rails.application.routes.draw do get :system_update resource :trial_apply, only: [:create] - resources :projects, only: [] do + resources :projects, module: :users, only: [] do get :search, on: :collection end From ea5d5dceaea5fe4323ae7bd96c315de4efe908d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 31 Jul 2019 13:58:06 +0800 Subject: [PATCH 014/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/exercise/Studentshavecompletedthelist.js | 6 ++++-- .../modules/courses/exercise/Testpapersettinghomepage.js | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index f7a989f79..0556d94e9 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -2312,11 +2312,13 @@ class Studentshavecompletedthelist extends Component { }; _getRequestParams() { - const { order, checkedValuesineinfo,searchtext, page ,limit} = this.state + const { order, checkedValuesineinfo,course_groupyslstwo ,searchtext, page ,limit,course_groupyslsthree} = this.state return { page, + review:course_groupyslsthree, + commit_status:course_groupyslstwo, search:searchtext, - group_id:checkedValuesineinfo, + exercise_group_id:checkedValuesineinfo, limit: limit, order, } diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 24e960a9d..8e895b852 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -170,7 +170,7 @@ class Testpapersettinghomepage extends Component{ } console.log("170"); console.log(params); - axios.get(url+`?${queryString.stringify(params)}`).then((response) => { + axios.get(url+`?${queryString.stringify(params)}`+ '&export=true').then((response) => { if(response===undefined){ return } @@ -193,7 +193,7 @@ class Testpapersettinghomepage extends Component{ } }else { this.props.showNotification(`正在下载中`); - window.open("/api"+url+`?${queryString.stringify(params)}`, '_blank'); + window.open("/api"+url+`?${queryString.stringify(params)}`+ '&export=true', '_blank'); } }).catch((error) => { console.log(error) @@ -357,7 +357,7 @@ class Testpapersettinghomepage extends Component{ 导出 :""} From 730d83de4dc431e2810f085a276eb3a888b6b904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 31 Jul 2019 14:00:53 +0800 Subject: [PATCH 015/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun # Conflicts: # public/react/src/modules/courses/exercise/Testpapersettinghomepage.js --- .../src/modules/courses/exercise/Testpapersettinghomepage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 52dd9c080..8e895b852 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -357,7 +357,7 @@ class Testpapersettinghomepage extends Component{ 导出 :""} From 65e7c3231e09ed30c781cdae88dd501ca4b765c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 14:12:14 +0800 Subject: [PATCH 016/623] =?UTF-8?q?=E5=AE=9E=E8=B7=B5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=8F=91=E9=80=81=E8=87=B3=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/paths/PathDetail/sendPanel.js | 51 ++++++++++++++++--- .../Collaborators/Collaborators.js | 15 +++--- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/public/react/src/modules/paths/PathDetail/sendPanel.js b/public/react/src/modules/paths/PathDetail/sendPanel.js index 84c7d8e23..2f9059a18 100644 --- a/public/react/src/modules/paths/PathDetail/sendPanel.js +++ b/public/react/src/modules/paths/PathDetail/sendPanel.js @@ -15,7 +15,6 @@ class sendPanel extends Component{ openSearch:false, sendToCourseId:undefined, sendToShixunArray:[], - shixunNum:0, Modalstype:false, cardsModalcancel:this.cardsModalcancel, cardsModalsave:this.cardsModalsave, @@ -35,7 +34,9 @@ class sendPanel extends Component{ //隐藏发送至弹框 hideSenttothevalue =()=>{ this.setState({ - sentShixunPath:false + sentShixunPath:false, + sendToShixunArray:[], + sendToCourseId:undefined, }) } //打开课堂列表下拉框 @@ -63,7 +64,7 @@ class sendPanel extends Component{ changeCheckBoxs=(list)=>{ this.setState({ sendToShixunArray:list, - shixunNum:list.length + // shixunNum:list.length }) } @@ -86,7 +87,9 @@ class sendPanel extends Component{ Modalstype:true, sentShixunPath:false, Modalstopval:result.data.message, - courseurl:result.data.url + courseurl:result.data.url, + sendToShixunArray:[], + sendToCourseId:undefined, }) } }).catch((error)=>{ @@ -118,8 +121,33 @@ class sendPanel extends Component{ let {courseurl}=this.state; window.location.href =courseurl; } + + + allChange = (e) => { + + if(e.target.checked===false){ + this.setState({ + sendToShixunArray: [], + }) + }else{ + let { sendToCourseList} = this.state; + let newlist = []; + + sendToCourseList.stages.map((item,key)=>{ + item.shixuns.map((items,keys)=>{ + newlist.push(items.shixun_id) + }) + }) + + this.setState({ + sendToShixunArray: newlist, + }) + } + + } + render(){ - let{sentShixunPath,sendToCourseList,openSearch,shixunNum,Modalstype,Modalstopval,Modalsbottomval,cardsModalcancel,cardsModalsave}= this.state; + let{sentShixunPath,sendToCourseList,Modalstype,Modalstopval,Modalsbottomval,cardsModalcancel,cardsModalsave}= this.state; return(
    @@ -178,7 +206,7 @@ class sendPanel extends Component{
    - + { sendToCourseList && sendToCourseList.stages.map((item,key)=>{ @@ -197,7 +225,16 @@ class sendPanel extends Component{
    -

    已选择 {shixunNum} 个实训

    +
    + + + this.allChange(e)} + >全选 + + +
    +

    已选择 {this.state.sendToShixunArray.length} 个实训

    取消 确定 diff --git a/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js b/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js index 7811d12fd..95ce4b8aa 100644 --- a/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js +++ b/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js @@ -532,13 +532,14 @@ class Collaborators extends Component {
    - - 全选 -
    - 请至少选择一个用户 -
    -
    + + + 全选 +
    + 请至少选择一个用户 +
    +
    From e746a13f37caf14da3617e65e06b1d14173c8e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 14:38:14 +0800 Subject: [PATCH 017/623] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8D=A0=E6=AF=94?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 27 ++++++-- .../courses/coursesHome/css/CoursesHome.css | 66 ++++++++++--------- public/stylesheets/educoder/edu-all.css | 33 ++++++++-- 3 files changed, 83 insertions(+), 43 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index fad3568b4..600520410 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -332,8 +332,12 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- } .shixunDes{font-family: 'panmen-webfont';display: block;position: absolute;height: 100%;width: 100%;text-align: center;line-height: 220px;color: #fff;top: 0px;font-size: 24px;background-color: rgba(5,16,26,0.4);border-radius: 6px 6px 0px 0px;} /*TPM*/ -.shixunDetail_top{width: 100%;background-image: url("/images/educoder/shixun-detail.jpg");background-size: 100% 100%;height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} +.shixunDetail_top{width: 100%;background-image: url("/images/educoder/shixun-detail.jpg"); height: 240px; + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .task-item{margin-top: 30px;padding-bottom: 30px;border-bottom: 1px solid #eee} .task-item:last-child{border-bottom: none;} .challengeNav a.active{color: #4CACFF;} @@ -420,14 +424,23 @@ table.text-file{} /*-------------------------------实训路径-------------------------------*/ -.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png");background-color: #081C4B;background-size: 100% 100%;} +.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png"); + background-color: #081C4B; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .pathNavLine{position: absolute;bottom: -8px;width: 100%;} .path-nav li{float: left;padding: 0px 30px;height: 42px;} .path-nav li a{color:#fff;font-size: 16px;display: block; height: 40px;} .path-nav li.active a{border-bottom: 3px solid #4CACFF;color:#4CACFF;} /*---实训路径详情----*/ .subhead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/path-detail.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .subhead_content{width: 1200px;margin: 0px auto;} .pathInfo li{text-align: center;float: left;margin-right: 38px;} .pathInfo li span{display: block;} @@ -467,7 +480,11 @@ li.li-width7{width: 7%;text-align: left} /*-----------------------------在线课堂动态----------------------------------*/ .courseHead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/course-detail.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .invite-tip{position: absolute;top: -5px;right: 140px;color: #fff; box-sizing: border-box;width: 170px;text-align: center;border-radius: 2px;background-color: rgba(5,16,26,0.6)} .inviteTipbtn a{font-size:14px;width: 100%;height: 30px;line-height: 30px;display: block;color: #747A7F;background-color: rgba(5,16,26,0.4)} .inviteTipbtn a:hover{color: #4cacff!important;} diff --git a/public/react/src/modules/courses/coursesHome/css/CoursesHome.css b/public/react/src/modules/courses/coursesHome/css/CoursesHome.css index 696d35ecc..af431da99 100644 --- a/public/react/src/modules/courses/coursesHome/css/CoursesHome.css +++ b/public/react/src/modules/courses/coursesHome/css/CoursesHome.css @@ -1,33 +1,35 @@ -.courses-head{ - width: 100%; - height: 300px; - background-image: url(./courses.jpg); - background-color: #081C4B; - background-size: 100% 100%; -} -a{ - text-decoration: none; - color: #05101a; -} -.ant-input-affix-wrapper .ant-input:not(:last-child) { - padding-right: 24px; -} - -.memberscount{ - font-size: 55px !important; - background: #fff; - color: #dfdfdf; - display: inline-block; - padding-right: 15px; -} -.biaoqiancours{ - overflow: hidden; - position: relative; -} -.coursesover{ - position: absolute; - color: #fff; - left: 17px; - background: #dfdfdf; - width: 200px; +.courses-head{ + width: 100%; + height: 300px; + background-image: url(./courses.jpg); + background-color: #081C4B; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} +a{ + text-decoration: none; + color: #05101a; +} +.ant-input-affix-wrapper .ant-input:not(:last-child) { + padding-right: 24px; +} + +.memberscount{ + font-size: 55px !important; + background: #fff; + color: #dfdfdf; + display: inline-block; + padding-right: 15px; +} +.biaoqiancours{ + overflow: hidden; + position: relative; +} +.coursesover{ + position: absolute; + color: #fff; + left: 17px; + background: #dfdfdf; + width: 200px; } \ No newline at end of file diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index ec245b196..05e767ba4 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -334,8 +334,12 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- } .shixunDes{font-family: 'panmen-webfont';display: block;position: absolute;height: 100%;width: 100%;text-align: center;line-height: 220px;color: #fff;top: 0px;font-size: 24px;background-color: rgba(5,16,26,0.4);border-radius: 6px 6px 0px 0px;} /*TPM*/ -.shixunDetail_top{width: 100%;background-image: url("/images/educoder/shixun-detail.jpg");background-size: 100% 100%;height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} +.shixunDetail_top{width: 100%;background-image: url("/images/educoder/shixun-detail.jpg"); height: 240px; + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .task-item{margin-top: 30px;padding-bottom: 30px;border-bottom: 1px solid #eee} .task-item:last-child{border-bottom: none;} .challengeNav a.active{color: #4CACFF;} @@ -422,14 +426,23 @@ table.text-file{} /*-------------------------------实训路径-------------------------------*/ -.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png");background-color: #081C4B;background-size: 100% 100%;} +.path-head{width: 100%;height: 300px;background-image: url("/images/educoder/path.png"); + background-color: #081C4B; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .pathNavLine{position: absolute;bottom: -8px;width: 100%;} .path-nav li{float: left;padding: 0px 30px;height: 42px;} .path-nav li a{color:#fff;font-size: 16px;display: block; height: 40px;} .path-nav li.active a{border-bottom: 3px solid #4CACFF;color:#4CACFF;} /*---实训路径详情----*/ .subhead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/path-detail.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .subhead_content{width: 1200px;margin: 0px auto;} .pathInfo li{text-align: center;float: left;margin-right: 38px;} .pathInfo li span{display: block;} @@ -469,7 +482,11 @@ li.li-width7{width: 7%;text-align: left} /*-----------------------------在线课堂动态----------------------------------*/ .courseHead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/course-detail.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} .invite-tip{position: absolute;top: -5px;right: 140px;color: #fff; box-sizing: border-box;width: 170px;text-align: center;border-radius: 2px;background-color: rgba(5,16,26,0.6)} .inviteTipbtn a{font-size:14px;width: 100%;height: 30px;line-height: 30px;display: block;color: #747A7F;background-color: rgba(5,16,26,0.4)} .inviteTipbtn a:hover{color: #4cacff!important;} @@ -3055,7 +3072,11 @@ a.singlepublishtwo{ padding: 0px; } .project_packagesHead{width: 100%;margin-bottom:40px;background-size: 100% 100%;background-image: url("/images/educoder/project_packagesHead.jpg");height: 240px; - justify-content: center;align-items: center;display: -webkit-flex;} + justify-content: center;align-items: center;display: -webkit-flex; + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} /* 个人中心-众包 */ From a358aaf63e08bcb74b7df903d90641b1a3af47ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 14:40:24 +0800 Subject: [PATCH 018/623] =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8D=A0=E6=AF=94?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/educoder/path.png | Bin 59814 -> 53938 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/educoder/path.png b/public/images/educoder/path.png index d8b6f1715d7484cd22de10d27f241ac8522f0430..d3d816012532d053624565b95fecc84c40bf37b9 100644 GIT binary patch literal 53938 zcmeGDXFycTvH%LNAtQ(q1OX){5g2j~O3qmjNy5y4z%am&vjJ2~D6FAzy3FFP9m(9#09 z0RSKZ2q6>zE(k%uKLA1p;A3F`u!hk8gzX_*-)V3_8UX;z0Y>nLh6rL|DiDsmX9wVY zZ~F{<_5ddiZUO-3=^xL_a3^a7lkN>CHz(H{PR>jU3QSyDRxmphrhEYqCsDcn^mE-5PMWU5o(hKqN1LE>(T6pYO>eD~ld~lGs8Ym}BZO zoB)8t84aqe6{?gkby<_2_K-3+XqoRC-wHIy3yfpT}mRA6B2)6td*e4fI#HL&x- zP{`Z4VcKA-k9i`{+E$JTL#3;RAnLfY;|98DCnp;Ngqypwj;d_yd(HV}nr z44iQOSr3-54dsz;sP8h6TD#jJ-Rw|UCSW}=mRdo}MB`Y0DGUo7UNHNmBgJnz>NvaE zIiXy^dKwI+g0mayhuDAu(i;7CwHC!x)2#fhXi*YW2 zjKJS_UJMxMH(qp@BJO1{JJuaj1TgC`;Y|=A0IUHk00sUb05qlo{QWikhQqY^xrYCw z`;Fiy?z?c9GRhr^S^F?b5?DLAqu{Q8nc*-u0k96^C;(nojL;!}~&ObJU6UW3D45miycw6{?TYp@4H1bc|3fB04 z#%Q_P{(0*mutK^STG{@IiVTK8A`KBhq{{>G14)Kk@l4EBc7p5bC6#U`HtzhBf8H
      N0VV-wk&|VT_LB5+baq6zSuuGz zB2liAUNS6L=8_c0V;jo`{&fv7db`FO@5lDn10_Elk+EoCfK9;HTk68IS2raOP>p{YWmn7;f$Ae%o!rqdgpvm+CM%{hXGsM#!U~L948e%y$3XoG zkpCRs|JDEjMmY!>7EHX)%P+<&Bw%j09+`-v6ucdi(z;2=jKgn)>+2wa#~L_k!S zS6IRd!7DB(Va34z9gj2guP%VC`)w`!K@Kjk81U!HF8gBz{_pd@7Wl6P z{%e8%THwDH_^$>2KV*SlXF~)E3@tptli#;-(yL%7ZKggwNPs%qMyoN&O4 z9Y^rS786@vHMzz_*a2Sb5QFzf;1!M)%+*=TKpAtX4S;bs6D9!1z`xSgr{f!@ZeCSg zCZ=Eb{}DtEb4G(#w-8;BS_lrF@<2EUgprB3PY~__VK$_@qa6ri z?hdIO5mw+e6CUO^fXxj7y8*)dAWVuj)CZ61c+%iY8&ccfVC&ytH}Gx+qy-e5oV~HP z4NP3H3ryhQR-8!{;fX}Jx$)|P2X-qo96U}tI$NQ<0pM6?Oe=umUk*1|^l|o&mA}#b z6Nnkx?(L3;<_8|H8370q;YC0HD0{ zH+`rv{_@*l-wpxe!x;2u`i}%ZDgQn2TYr3*{(c?|nG}yNrG=8^hyP=<-#B2v zW4{Ig%FH8x%90N_-AM)DF17)9lq3MISt?iq`8jTy#75x76#y7BP9OU{2!r+5{7)H9 z1X#pzwXWC_ZqGZE*dugHxxGx zHyyVSw+gorw;Oj1cL8@7j{uJnj|q<#PYO>J?+P9a&jl|4?*U#S-ZQ*%yn4KDyf1hw zct`jr@z3F3#FxZZ!@r7ei|>hl7e5X^8@~*{0lyc25`T+;fPk8SlR%6>mB56+p1_yj z0YM5u5y5MMj|3A0n}mdfw1gK4We9Z$tq9!+?-C{u<`dQtb`eez?hug>F%k(9DHB~I zLJ{32iX(bXR7=!FG)=Tme43b@Sdv(W7*6a>96_8(Tt(bTJW0HNg8T&M37HdyC+tt$ zI`Q~K;faP5LnqcrNJv;nBuMl~>_~2sJSO>rq>1DU$u21cDL1JCsTrv|=|j>S($}N| zr0XY7p5!=r>EyMOZYLj}%su(;8Z|B3#W-sbDUNy^q#~f=q*9}@rwXGgpz5GnIYV(q_>9pRuQN$! zYR-&N<5F`_t5GAVBdANLKT+?|oTs@=gP;kaDWvJ5**;5u_R?9z+0e5^XM4}?(K690 z(K^sZ(pJz8)8Wx^)9KN9(xuWh&@IqY(M!?8=tJpC=s%ysImdlY|D5l+jB{=0HqSGh zS2^!|KH>bk^9u~r43`+}8Dbb}8D<$N8D$ym7-Jag80VPIFkNOsGCgLhXIf!C$E?ci z&is_QgL$8YljRD_ZI&XIVb&9@;;c5TF|2P{SJ)WYwAlRE^4LDJ6SIr6-(ZhtZ)D%* z;N&poxW`e!F~fP5Q;pMyGmmqK>m-*PmkU=qSI-543*r|XE~H%ez>UK#!hM4~iM#V6 z&PCCSb{A7Fe&oUDk>Ek`r1SLglJZ{W_2A9p{lZ7hr^$DluYzw0$_Bj#jf6HrkN8FS zk^Gtbg8~!+>H@a~ssz>qxdmZ@NrF8>Cxw)S0)<`*tqNZhMhK@0_lr=9Xo=htc`I@# zDkh2+Efk#~+~EvSV`0a#nKba^sg+FTpQmUz)yr;j;bZ{L4%7{PJk| zGWl%dpo*K3e!7-%GFjB9dhqBX0uaJ1C5qP2#!*|kyH6*_>9nohLNur8;ri|#8u z0zF;5B)utp0ewIHMgvL%OM~YITZZz65r%_TxURTgd24ja$jm6$XxmuPILdhJD)g%V z)m9Ta6FZZa*9fl}UCX|an+O$@)PPSfwDZt`k^YBaX82Btg1`&mrwvn-kvYD}!v5mH!y&-oa?#65GL$dSnLx??4Z0_A|JcVckza{B0e(fO|Pn2V%Ktjh{o z1D)*(aW!{+=|%+xQ*G{C?!oR~JY+qRJa#;dJWIXEy-;3l-rU|H-qSwHK3TqazA)dn ze$0Ni{J!{K_J0}x39t@$8^{_M6gYWP<>s?nCvG|1YQN2YJL>kv9pgJyLFa>R22BL3 z1n1o)yNkZtcTehG+I_tHcK16%ghCQRjzZy~En)m&abX7!U=Lct1;QVPe|u>2up>e= zBJ~l$Bh;f$k#dpGqR69sq9&rXqRV5LVnSm!Vl88v3^#7v^)vRy~?R( zu1=~sQxj2pqBf}ZTb)nc=4eY%Z7pvTX)9|NX)o&#?I`aQ>wNh^;zQL(>5sKta$Rq_6}#W}sP(k= zYWIHpbmdcjpIP5nKfHft06DPw+2iy6;LRcYq0r&e!*L_$M$$(wj24ZFj@5io{L(gV zFg`c|o0$LV`t@KkXzJut+%)5K?u_6}^{n#jhdI-^$$97b{e`=WEn!MEv405kSY5%@j~OyFlgr*Uy`e|t3zzH%P~f&c!&EI>tcN!R%dwV)`?Sr(DYVyr^K>}+7K5C|>--YG(ILI?o?E`Z?% zkW(-Vun1D(pS~=g&cv^0YD8hyKqRfvkcfAr2ls{&#W7nFUT$un02oUwSI9 zkB&+&>B7~$?!0oj_@njhx0HIfBFEQQg{;1~yiqWC;+oNow+g!xUHa`aKnhv}REZp9 zv%5aOdlSnJo00Yuq?9`t*$>v}TuaSA7@28P>Lhb<4WAC{@NG|O+YS>;SQd4X@@%g0 zGwpj<<0s?VxVb0Rd8qn}#s6O*(w?|$rM(r`O0SiAcp6O3HcHWmSH52lOB`<>2L-{3 z;+gVlVzl=B{P=J!qug#8F!_7Pq zX<+xvd=3(BXv(A^A+ zjbs&VhgS+-554ptQqzd(nDTFO0*8y-srgI!y{Tm~CVXBS59*zyC0e~oy;Ik*cAJ2i zi51=R*?AekS&`!f7>fXyyxjf=yVMSqS?ajRv|H24TLnr(TNh@Tm0-JbPH0X@M;nsXv zt`-^fJ1VFhu_-1wlW|_oxbwx@Vb#N%0N!&4S5q2aV^c9--u>w@f7!fU*(XG09|G!k zP50y)$M@GlZvNu?7YOuf$Ji3~yd-#K{%y_9t8t}CkKfnH%&+xakGv_-HV7*MKb*vQ z_iC*VxAM*0^@aW#TW2zL@z3CVIJlt;z`w%6pZtX-wg}-aAGKXxsez7f%?3&>`fcy= zd4Uy#_N}wpVjqQst6&D+8Tz6CJ9WDw%$)FiExNHNfA2sXXl5BK2&>7fX|2iY9*{df zIw(id4+-wA*@Om)?hgf6ABFF}qohe}vY=6B)|5gXKbCeWY?ic=_CBuC4wMedH^y37#p$If5sc-Ze|u5XwZE z+`sL`f+nbr%?-JZ-J10YkJ;3~taZlu>W|>A-Q4)WEVZ{~-mQ^-Fa>kACz>{gt&P5# z^BxTih*>a1&s4#alU$RK5$YB=StXLhjSO(6T`wnVv_tb`K%vN8)c7J`@Ec*UXA%OrUgjMyxtt4U*p@s?b?~=Oke9uac`PA z6l$1}8Emg*)c(@3J8iZ;Py=&~ZjI>fsQL=Z1c{od1j7_u{0mywagSwWOWJE>&3AG* z17!?fJv*P`;NUa0TDZLCJ{72wM(aZHwdDgKla@47D`smlA?2E3@*1Dhu%e{-B>;S> zbs8M6lh`{no1ZS~Jz_2Nm6qT!Ei7NwT67z(k&17f-&kIYxP;$V;|}$gn!%W9^j)Ci z?l*wz&~keG?`?#|!i_GO-6X|3OMdf|;Y4A0mv3ECK*75J=GjJA!*0Yt>)^rQ>M3p6 z_|=U~S*d{t!Nug%zUk4X+9erd*Jm4d{?10D(lyeZ<-lhPV<`V(YI9hp%|<}N#)#zF z!`)*mPPzKpKtU6N0#GMWG@WI-%ugC+N}51YctwFY=&S_Mf_RNoCV)~dy959n$+f#4 z7PSG>qs?z&b*Z~Y;bf6q9S&`8=IFjGO7D5wLXGhs4&6%|Zu63@DB26qk=m3cNYlIy zoT3;x*uJ)RDou8PX}0x+huf2tWS<(bv7;n8#%0hSj3cJL0et}{jd-_BjkC9^oGelX zzk2M!b}gN+IcZ6a>hB3JXXtNt*GAADrcL{$ZPq3J+cg(s%BCj((Q5$k7n+!DY5fxL z!1KuGtKjZnUmKaNSkKOUm-sx`pQW7IWKmwVj9*c$uQs%aVM#_RbA#;Kw5v)wx-Vt3 zX>PDnV;0yWZ0&A;1wZ+0I0CewtytY!A8))6RCzXK*DtJAB6(yWY}y?2%_THEn4GI5 z1H3qnOQJL?OL(4lwV}-2+l zBG}~Mj80oXt8K%E zAMU1HC^&NzCOZZ{54;+#5i9GCpXi=>XM4$K zB~VBDd_~HfIn$P$?1AgYTZ7&sSzV9~Xnao6W)nR}oA*8Bt+@k{X_?YS7u&5nfy4Z73KmSOeB;eviBNBKKbEJ``4&F z0dShVk7QF7Iv4WJ`%YI(?BBD5o_NK{cN2_PH@llm0kY+ZZQs$!K&KD2_gYr!x&vep z72vMq=^LLtJo;STu? zE}3mec|bE=`tJF-=*rq{q4zu+`)>Cv`E9OESH$DzZl>KUa(rLCT^L}sg=Q#w7oahU z+kddX+Nn%f;5-_&{hCpASJHdi>{c;d@6`Dc!k69^jdowpug+JCeKlWgo7!r#l$?JA z0Os`EB2kH;G&mZttmy2v**Ym#-~DQ`13x*rJLc2W*ex0SuM(S=P0#lC3YghbDEwjY%jC2h%?9u}=vn@FJ?Y?kf8zvzj&%)rNo zd=68-BG3$QRre9zoEev)d0m$gKv{Umm_+$c_BgJiX)N2_-cX6piQekWM)!s835*4# z`fP3*hZTnVKzY3gbJDKN$`-C{er27sbmH6Ww3Obf-0M5J3-vn%TVHOJIeToT^GP(7 zuAes0yEP83$t}HK$|UcucUNiewqBK-nhu=ww)3j`nvuWc-3LZ<6k_bn@(v$B0j7oA zc|MlAW)+rKZ8HQ~R>`S!9m=AjJ6EqQ3!A*gN_a9a&3N-*sXK?}-N1OYuU!iUOCg5% z98tX9+zkc<>JF1Cy1-}I(iMMRr;el2$xd)#SEwV_KvbApd} z^pp-*V*FSbwq5HP6HvE)PA9LKgcaM*KV|2#%`8&4r)D>x(K#`mjqOLZexlh6{v?yL z3#tAGyc;k5Yt~c$(BNkDgBFHwU&ddiS3KxwZ47Q4_sf?C}e_@EbB#n&mS1s z*vchMB(Kg^O8M9_c5TXzkR=34U_A*hgqHu(Yv6oFQCiO-gVvCb_(Rz`#;J*$Kr<@` z(PNCQ-YoZbKHmT_!0wg4Y>_B7&D8eJ9I^GcTBI013^PHEfCiq>|2!FZ2e$7izB<`Wm2)#WKKaZ&pqLrvzp$ zh-Qh2e*Hv2id`j$X_WGWQa5+}S?7*)y(?M{EzQ?_%NA}m&8KDiNc)%cuWfB~m{+&B zJ^@fltpLEJA8SNRUotk?y}+}U0lte9X5TIGn4^AhCT8F&fxTXAN~sBjSscZqM-MoN zVq;AHS$wc|vecWXtB_vzUkQ;)^Cr31F?iA_6On}c!i%I0$)&|~?slbomk~AJfMq{2 zhe5S1>r0MPk1-n6Yqnl9A5Y3N{b6W(qkSeb|D2LsJWe$qSUTu(6l{$nDzd|UAnKr5(7 z!9t9~c0Y;*j?1Qb2LMat1mLNN;A^Q!S12t3=^dc?CcK#vyp1*{pd@Cs;TEO3l-3Wfl@dm!Iv|Of&P4Zq{4$bE)*aScA(qi2zNDf(;+rGmwv;fr?rq|? zU+BBc>%D9S&RzMJ;o5;T1xxP!tz->hpFE|Uqy}9Ii>lXYUlFRzN*O^7hc;5Loriia z()N+tA{(BqG3@jeegr95d_2z^+4tThN{Oe*TS7JJ&Pp|2GFE{N{70LB1Z473wisQPr8g<>_bgYJO_~?a z`c-7uQf42S+q%}R_Y!}tS(8$R8V%LTNIlFj(?YK{eEJHmxFm)Cr{byy3w=|05w-$J z-IBIB8!0)Ude@iy7N1K|Luqq+D!_-yi0`xvdZ30e+k0W8w8DSVoo8)ipsx^PZ^A5> zPaD-7+0Ae4T_s-W)!S9jQKO?48m|p4^jCAFK(iIYo6)+78~A0zQqBwJ=jvMb&IR>a zbok>^W{gM)hMRH&pX0hXQXYev2s*a%U;p@rPnxA%;r7}X0EwQ0a(v% zh?AnirI?WGi!I(YLpf=K&AT;z@oC*nyNC2czD~~b6|KHzWyQe!*Zlcx zn>QpF<r?0YA<+N!ITFutyi0%$ag-M_l-n0!eTRW!Nlqn4 zrptYu1D^t>ph3aX_~LJ1KDAlJdoTeUMhi6;HL`p z>q$ZhZLMZL-+)caDKpN2-79xWcJ~+2Gr+mdb<06yfa{Wqk?6`uhYahI-$>ZDtg-su zH$ce1`#yozta5DR|5lM7^d~Ek#~~mFL2|Ov+OpQ7eQsqL);&O)X7^QEc z+5AcFX#i(_z^irl==YU!VH=g5AshLJI`1<~0CeE3!@GT7>(tI)9ab@-em@_v;kv$D zvwASP!AO#K2u)=}wFvY45cYrjB&fG2O9b~aY{I`g^h(s1FsHSyv%Be_D62nEVzWwa z_N&)EYvbVC9IcH5U+=wFoSlbq665#HIpDnm7}T8mF}!0rF*6K zt{$cB6p$U<1lT76#73v8{bjl>{4LC@m)E}m&*ti+7T(X%RoiCVOAZKIw+P%06l>U+ z`XTfG_6aHD%{(auwj!uUqgN7d0zmWU937L+a_O4liG|I&>0zI~o=rE)ip?*rpoW9u z?vn>2d=BmF-VYh2VkX9tlDX;ZoyxQK=jRLf%BtQw(T=$0PZ+dSP_)^A>&bZA)X?~B zr$+DO?)qNcmm1r(x{`(3Q?Ube5}S*a?Eu%loLoVm(m`Cjg%^MmcuUbixhe! z{23U2ucWr-4fcS3|PeU%IS)$9_I6ge-d%( zzqk@v@QF2A;9U@{C(}@u#OqcbNN0i!kuANMy3^ z$$@NzHWOB`|9ytJbV%H~4mPBPhV_8)hzxZ4DDS10oDPF*|LT^+9wN-f_ zb+Olk8LaSXACDO#M9s!l;>$$quEaoCZsFe2zI4(#$AihC$?D00HgJoGdE6V^yHBr`A)_mOt$A5FvO3{HN z^v#(DkS^HUVpcMS#vZ~n@!Mz1T~5*Z6SD+!=nVD%a_kS&^@b3oX@Ng z$!E+Re=&Ke9f1(J;3{$fAtIh!+McX!LXD7so5ZA}HDgMm>=NKM?6iUa0Sy7E>Dh)q z@=Ym3=wW)SNMyKTaB<0*6XD8DCby|)C&rmA}a_G(fV<&Mj9|9TO$p4Zy3DP)Y_e;Db_~K^a8c@ z)j_(DD`m0f28Q-}hIU1{Mfvk{4)atF!r+f;=t_QX{^i6amPaL`*3(4%r+=va{fThp z(7b)Ar5P_u*Oug;>pfQx?syQ znXJvzp4g!_$>Jg&qsA^342V>RDN7DGO^qq%!+Nw5ePLTMpn({Fl+0KGp6QO+_em@?djzfE;{q z1S>z)EfK+c7|9AZz;ghl5R3xdoo&3n;v&2X+6tqz7Ui$Ixb{kLCtl!8&Yv}#fLnGbsM@tSYG z`VR>};7WO%%5t zy~N=!epblM<`}NrKS*)$#NEfNy3b7MnRTBTB11@+ktl2BwzI0bZ$ahNl-26HnkoeQ zYcbZ;kjF3UcO0itA3n@jk^Rm?r{UhgO5lY zpr+uYP}7Ye`Vdq$Xm0E%+MTPUmqnMj*HN2A-%-;}-ylXcf5yxpzt6=~pfb2kUoz+| zDbt^Qp1@cT-V~zS(k!UjqK1G+!SgP}#&+CDxMao^5?p_s_!2%(R`UgPWnx=Tc9zHm zTan~Bbc;Q@QxrWw*`91d8OD}e8s);3tgc285&{oVHaG#i9Sg^de8`E0vcdaz^SMQC zgUg(PY9=?G;%)g1I5LEuKeB>||0V)6{Avv$D5EJ$dRlO$vw2T5SsYtw8Z*HHeo2fO zexuqR6YZE@pV&_{5SyN?aW#sa0v>q;H9t6B|`4aR58!1eC2*_+1$=jE+_c|Z6q3K0YcfZziM;UsyhPl@Dd z?y(=p8TFYIMFbPcpAP;~$K5)52GTeZ`$;|TZ4fh&1#N4YoZoY?Uf*7JofD^nn7y2a zmI9V4*>|oEyHswTM$gpD?S>n?#*mWq*)1KUXF}g1z;`yLDKs@s<09J6K(3z_=X^sf z+tBG|J5nYB3wPC%pNAe%LY-{Sy=p3K@~w^$NS@tAF=ZP1 zMrdL;R*u;-J$QAiLyd;+alWG7)6X6$!E{oIXWppEA%{<9&khBgI~lWT9=2M?=sIVZ ztDoaC5+OpivLrSU6QkO!F>o;w7G-XE`+4n~Dz9#x^%m-}OdBOu%SSzjNwI{IA%?nC zdO9Zw$zR7LQwe^Nv#aY|w2)Eu>>k=idm38yu+EXA=b|cH|JV!imzRC&Ry)HtCHwWN zyJp3qaX}o)?a8D{mt0?$;L^+yVWM|VqV}XE=D}%b7E8tYxk^l-@_cJ%p6aKxg!Ij6 zdlQK(A|Au7wGCBdwr#o;Ii*q0o61yRd>&!60@XD^U!RmfrMkE1sv{&jUwIxmmn3?m zr#-r7!xjFlX^os+8BQIT!#at`qVZrer*GmN%9w@D%`(owjC~Yp&7jhe) z3v*eD=q}+dFu7ll^~tgqV+Zh!O_cen)VOE8Yl!WhT5FkUI3>?FK+SbZV-ggC85M-E zByrnPcRaC@nW^3dGvqdY9m0Sh^k*^Atc(`5)~V#$8Q+sTmoWq%c+yMiFk*P%dw(0| z%OJye?^XP(Jd#DK2d&Fr9#)@ZSul1Cdi*)m^Fs=K9cx=O??K4Bmum@=0++YFHP;e| zJa%~5wfj?wrL09LIya)??bjnOw!|%E#`d(P30hvX?B1m?Tq(1>kwR3Jt5WHen0pc4 ztr$X$+C_&wUu71k+9!$Y`J@$3aD90BUg%+wC`DM<7M+8vd78(h3utVe5=E3U_riWk zUSud}`j6z1>w$;PNg=dSA+U6pMVBBYZ{tk%p(>TVJ#|BW$IBv%ncjJ@CFrE9ym!t8iCfRLjzfwr-1erc<-vG(oS^u(J6 zZ!y+0XO@Or%{ym1b2uH!*p0t3YWs`Fl13zb1LjN5un6eQ2FTI4ceU4+2bi-S`t$ki zeJ;X9Nr^OG*O1al!m*t#d9VTeS#jAFf zO~PlU=W{}!C&MUecu2X%-wl8Mkg^f+V6gEb*XcSv$&IGn@>jf_e^j`%w~U8KJw#L) z&1WJ-_e^%(A~rWF*V!2+TBM(ohel3P+_QgR7;F<{HQ4oaU&DD(KLQ=}Y^h34lC_2! zl;8_|hSQStNH3CF?oF2dX}xnHs;IhK5fwFLlRl#krH2esaT6|x)wL!3c@+nxYSVa9 z$1}~3`yVx0ELLd8qr}r_BmYq5mZ8g)!h?@}L>J`gTQ_prhl-jq+bO=ffku{*^_T`5 z$9Stmd8@>z%jBc(B^k7$DRN9qHS?b+t1AwwpPm~}5HElKyr8ixfcJSy0m+I>d4Dc> z6Z+s>?WsZWco(zJhTG50>2%(YrxoYCjN|c)ydA=Ifo8$Oixyx4hm;Ls&Q|8$)We#DkSv8$KH&i3#lb1!)=w^1FDTf9ju9G?|b z|LIVko}%7P=UDdhs3%9PmiQn2EY-NlbD_ys3#08d9LksS zOpW>Z#*A~dk_ZO51^1AMX`s?Rhp}L#*@p*_r7Qu6I4z5g(r_W=! zLVeE;qFM1NIk~A>r-wT|kni6X_`fJrW-E16jO+N!UJ=4u9pYFhXe!m_y?u3^ulVZ_ zgJP$wZJN*=ie*G;x7EC;(otPRqfx?O^Cb79vddNUC-Ys}{Aj;6>v8*D`1+P@i(j!E znd;w6Q73USmK)rGveYq;2y4&j!cPhmGISX$U*T`-ZJV;E9Rg8G$@^k~x~w$dd_5N) z*H=8|;8)xf@z9fsc=|1Sd(eQ?LnUnU?_Bh=G(09fuC=>4fB7`GiY6GjEFYZwsys|; zpuV)C)cHY7{A>?wh+7dY`ic|Tcm3jpCN$GrRmZ}0vwkHSAx`G1Sa5|M&?{~xyRod| zJ>+?2Ug5=udFjU+$vtNdr$o}1FT7|{Q}dEwe{S|vKKKL`uSH4@%w0TARJ14{nO*GkSRi6GMZ3$&(a7^GuM%vufG?-S}WD&Njr2HC(GM*Ph4C^mZsO- zTu6vHj5Im-tE!!lTI`hR3aXevDJQ=+#M=D+_(%EMVTcn{0_%k)0$VEypa*u{ol(BB zb(V+)k>JoKNU+fcMuE%fArNyMh@CKjWaMMU;AdzI*X z#X#1Aqu&6&IuRv_9`v~oEfy1g#ZqE;b9lM#lSc*R7kSoBu`}pPzwk)ELr+f+j-$cL zhPG7URdk$ErTP?U(V9aA%hI;wj{7T`2a7`n7Ca#m+KmT)RH<{TPu4cOJ(X{tz2>zq z-lScZP3Z<|(bQS*>L{%IHQiqk)I+VFFsE0V{P;Rm!%b~bQ9R@OF^#}NXw{Ur~|qK%#Rrsbo#46;s8 z3+BKZ+ryW;_6x%?W@E8a^svR?{V>Qyq(UN@4 z-eY+}y>&JcVg4X}d`1^j6`ndKKc0BV)4YSR6R3PqDCiQPgq6`K){a}7kF0BGNkM7f zx5UoNr(Ea?mi+Ma@@xB4da*25kO!~d|gXQl%dzRLuETkQDa&Sgc&W`yDpUS?q@j*6`u=~>94MrW@rdwa@!L9wq zf{HyImw99GyRChd#jS|JMaIiF9Pd{Sk&CvV4+SDjJC6$nza-;d_h=bDM?|bu{YH;!HI!?JGSbC-4PD7?9lwJ0h-(Me1rdU3NSIFQmMio z&y6RaW2{1PIZK`5S!=+nwllO(Z7mBiZq#{gus+n<-pZhvWnA{`tLK@Oo@bfYA`&h> z7GtWuAuq4=az~%#e#S+{wuo1uB2r{;1)j1S{IMV3kEPjF2DV4`7Su?j9zye_n-d^E{yUe2}jOtHU`R#Kx|J z!*ahql;y#og?XpPmo@a$p^mK!q7uTM#csFcl8K8#!)W`(H!b-hCc7-iK6#Xub(f{& z+ou@6xk7f|kzDF=X0so-cDg=U*4=v?#==rV&1nIKDg^TjLw64hx6X<^E6}MlE6*+! zu#m2LN~9x6dUZ@)`Q9BdG@Mph zF9u#~eT8kl%TiE|nPT^dJNSfG;#Rw%hjp`cx^8R3rX=0Wf%>g8x&M}JoY|AnVS$X{pPv5{OS9Cdky4@)=K0dXOnVPx6#7qPQ193 zb{9G!H02?ia(_{=*4j<#;dmX{#7k5yu~8Yq#OO-YZiwNcb=W!keG|qwZ=d71r7?L)@#GLVcZfGb zSt+3f-bq{hVk=M}Yx2tm?JIlCsC^ zUVLYMfKz6GJp1~AJOu@pu&~_Q3VHOBondJDYK}auLCE=(rnG8v=#VFzUGKT?*_}Vu z&gYt@p+65SSM(BTY6d-LQzBQ?17j*>3;D*N%&&)o`cFqZL$A<|c%~dO1x{(-ai1md zI6&}~%pIAtj>SAXUT)#F{>E?QB2*88G^Tfgm|2D^#LoM%l<=Q9`wbxW*>*W=Smv-o zab-(j^~>n0F_F=HZX0rlb>mtDpEiTpw#B`-7%KJu~C7 za(XziU&eakEML)Nmkj08ArkgHR9EqAuk!tsy2?s3D>$U%3?-Ewwz{ zpV@i)-23@nO*`4J$)S4!s%TYoE-e-4RoeGlhCI(VI;R+GcfDA-z(^o+nLB**S(>7l zF{rBGa3e~0U@)qsKl|}vxJ+NBsl8+E&{^kCP~ZGX3-hjnSp zf?4X}5&e_!UG;-$=VFOLuS!|_d5LFHRa5dGNmSm-a{GEiuczS6FFrRcn$^O@bwz(D zfv+}hgqO4|B4c9IMv>v=P1mTXRJf1mH2NhnP3?-h6JswfM2c_Kc9)&L;t73JdNIf` zQ@;P}qv62Qeb=70lZ_4f^R`5ca>vd!jLFmJ9PH!i`s=N%FrUhssS@_{>C50|_KFWC z_1CRBP-Na`GcO%cCu0diPzlAE_f1zF)xXfgDs|qQM{No0 z`cCWT=UrUjHg3?bap=nOF)S)6y0*i8WyfK>=#O0e8gAnOv+5_>U$bEo>hs}`t)pTJ zMSIlLT0g&STRPnf*Svf8;Qs0W`NRkLk0$cn6HgtG%vL5U-Pcqiaa(RKy!K#fEl0jV zik^NsJ~R4|Jnv8*72FmY8LX*E=oZ`mSsky?m+JYoPnIvQO;lu>PB<&oa7YtbUn@7v z)hjs;#Pv#9Swva?=H|AXRv?N|$6A+-}>#Pn=r+$!!qMVPo=dl~{9;MpY1skBy)56Aj`WdhqD(T0} zldrua8Q?nk3T?9adl_>&&y=TO)3T9a(PjBH&J`Jn>~wMj58Z<$4YDN7O6fzlQYoPG zOP>$LQTH68gVW#3xmK=$-Q2$>DDtsMCt{dqwXz~Svlwou0E5{&Ps*F^ zIT{mO9&S7y_75Lid7-SX0gL^rkS!}+)YATVAjALxE4Mglq+aS`I{-&JHd#^x6S7r( zsJn$)jm%CazT9vWQ?{`0d;c2qjWV)cdUxg<*iKnd_nMICr_!y?oG)&3mPT_XpcS(x z7r4N!BL*Q&?^Ry58=&{nz*y7l!dGcOul@+rtt}M6zuS63qK#yQL(Z@sXcsvvhu>F zC50$Q!#z>8xj^lrEj!QT+JebF6NB7(wK6jC%L z2PK^eDYi1V?rRS-<2lO=8w@eL$NF*!+&hk)4D7QdR_Kr6W~(o|GB?CIq_{k;cAG=3 z-_E+4uxXt5s%GLMMcd!;-l24Caq+WBio2Lpfo={M{v#X~zvd5{w>fnkoHfE|OQOij zpa_?il5cnsjN(EfF-IXVuzxs#>22cwq3o^W;@FmUVRj4>f)gOP28ZAd8+Qoq5ZoCC zcLE6v?ykYzVQ>iU?#uwe-Cgr_vd=lMeD{xgtNSDR1xDd{6vKX@&~%+W)F7dNm`1;_9-cVg#-Mao)bQK8LXAKYnJ)+>Cb&(Td3On zmjCw0#9~U9(KsejD`6qOharGLeo-LfTp;6AAcN^2&9D3kd;+g02<6gY&UgZd;D7vM|5pisL+gJSy?}>{9I(y%|6>LJN%-$(F_7>-t^zp4vw@PQFwT%r~i!k#yus25f3c zaSZEYX@j?3*WM8cFd{3;RAbvK|Gn4jKlES8&5#-R?_*ujO8%4RuJZ4}Mb$vU zNtuoha8KlQ*bMuHzpuF@WZ&eo>h##TdmpfVP0)A51*vKo(EOG;_2Z0`4}(7`Vp`IQ zIsx*+g`$qA@K7A%w}JA%^BpLDAqw9p=E2>gb-Z4|$P(b8rGHt`Erbl1ycOryH+9Dz zxa$V$ERi|awm#B|j&o~Cy)3|C?mizfb}HUH=m19frO%pB7c=HgJC*)P+i#;ApsxKf z=7EWI0b|||DHxMd46w%Wf&htT$Q}e%0pS6qs=Lx}80UR|{Q%?R(;o4nCne*20E8tn zR}4@9&{Rv3YNgc8v$c!os4qx&WVkui_r!~+k2&bvvWq|iTO8MPiP^*eRyCx@w-)v&xzPZvH@X+g@DS?`s>CXk-(GT#jUNlemt}5{RK4U_!G2|~K+t!hs zgK_evE6mslAgvLo_+FKP2@@xMr2D-6$%Dk|pDk4{WskC#%T5VNGFTh_Oe^$=-i>HZ zTG-%y+lp#@P5UPwuz&Yn@3sQsqG~=z!byW|7F>A`JF44=nLD}oi@o~39J$#Z8ya;V z!(n$s!|XR{)?berc`bWVKtK$e&V!?&vB3d{2jOG!NuG*tA19$F^?7d4kDvH7dmMMN zHRf>K*L|&JK4ahR%$v5j1OzU)uDiYapIVT_Fzl!bamo@7Ga&XBD~bNfSuU$CtNXZ!5UM$r`*`70UkIN#GIzIr{z6dXLd>_} z(of!>@<}wm-Ui0h70Kpzw+X($CO;$AV7BeC}%g@n_V&t5;C9}^WcPG zMP0yEdUSC&BK!3|WP_8V>9r@ZP%o4pLOt~h0a_~etS6LPz1l^F3U=1;7!R}BU|zKM z%A7hhAl0o2Fb9{kVqhZGhO#jH=;+Q+Tl!EuTYy}ej$HrGf~InzGZ(cQTBj)S9EE$!{= z+Y8CpvX9$W-oFq$uSNT6t{(p$a*XzYsES8+#s|x3p404T{H+7O^HQL9j6IuwC={LNY7v%LW#=y_11MFDh4?Gj7UTH^v-$-60xE5S>$E<0Bn;xE-P7z>U zsTO?oK|k@(xw;n=kNm#wal{uMok?K&FtBv8VK(1eUwvsV96-e61;x{6EXyq)W%nd< z4iArT>^eG4>!g%5&D9dm^)L>qc1Kg+(QEkk;&C65pxZiB@q3&BJi`G?{OjbgfupzJ ztfRh?W4!Gn{(a<>CC9_qWE=CI9m#jN2fypIZ%f5fY?$}tffIht!SGgF0C?H7@~2?< zP6Lxhsn=v5@+Ae^F`9P4NImXFia;d%nq!D_x$La9miK>U^kbL(vSi&R$-0l3Z}@HU z6W5km#ZXTH_*!($r$(M3kBK@J*aZR7V${H+iz}=Ch(1aoj+jfjVGZ!}RD4E_kWY(|a zV>?}J@KrA$Ec8uIiyT7VdvImpvFyd&LX2cn&yOT)#w=&Ud@Hmeu zaM9nI{$se&9|$huzD+2ZR;*)m>Ev#KB;IMnUqLEdZ_$=H9Ws3Ng)&<@4M6Y`@5B+G z11=bf#H#|G_De+5l6#p=o)0UEM9>fc6F+z3{$m^H~Rc^^kFiDb3vVUeHBO!!O|#!U> zWIAAh>@0X@_y4~2Eh31}zzT4*X=9Epff?JeD5^OL)!AWSzO5Z%W$2$c*eo0F?GKdC z-t0X5ucd1yylLJp?`Q?%LL=4zPI8%=Mw~Ez$rVx#-l-_`>ax8$-c10#n(^2LsI1Ie zX^D@f+lY5Vqi^ASNg7Y1Kxg81{d9QAHd*Fc=)#i-7>yYHPy@GS0!V&KxmSIpgRjzU z{P1H143~6Zf~xeCH|;$0Lg8?Hn8#jgEYc z1`h2jdOi#6D-DiJ;?<3{3&at=R)lO%=SNug>+|z9vxj#m^#@U*T;C!lA46h-#sN2s zQTG{>g>xqK^Pmj9Z9HMi7*XmqgCg2A<1$@jF-*0>BfYl4!+bxtDvTfY9@DDha4E?>R6Y$CWwuRB3=%RH{1W$vPGD% z40-mryPSFrnlxxg(?`zvg#fNZyCy)mn3`)mKa8Y;El*pY`5c46cD@bsi1*=N>>OwN z_zsSr3L<@vRvMoy>(}P_bJFbGRRkv*S%)Wf1yE*J&&C>#HJ6s#9ai8(JVH--yF1%g zV+MKxW*cyo=wArcY4BeNraX;LgN}}R*F+;AlgB{-9&%p2b$#Ucsrywad@rH)!twso zYUXvOedY>rXHWT2eTBv%8HRXjdj1E>v!e}g(z+yQ-q)|g~#dSr#zR?zz7D;J$Nsan*36?U7{M{3E=pvpwB)YOF52cT2+#Tp@kof!6Yt zZz1tAjee$7(Dy1e^(#?eGqs-AJ>M^cqV*J_Z>>g`HIrVMN;Y>(JLT zcPcw=6;r7`RYM*PW3ciBPao@R%ih|Ql0JC-HKKwdaJC1~FstqDtQzu;&*5(~8@xu2 z6hCg=E0BO5uAc|qrMf1VpJjgH(iOStI^w(E!bY>kG+H?$ny`No$wyoN%UT0{)Dm@)%dnm<@dsDnQd9U%i8xibodraTNv}w zXVD^Oi3P899lJ_8?;aY~dzYG{ayA^47xF(yhL@68!OQn~$nn$98?(5LOgDSUg5`Ea?|z;{c;>tH zf+E2tP~*_O&*e3~=Hd}!_JoPY_TCGgdI|xQ3p-V<+*`bd#E`}`N5i)$nI*cJSaA*@q9B*vw&RdR+boMgfuuue6pq#UN6}kvs6$?Qc}&hJd&;GXpWa%t;s^6s7Ff(qIx5M&9b>5gq?8wF zeW{VY1`CUVoQ=Xhd_tdpb&1N!!Nxw8%Fei+QplwNB2Pjwzhk$#r9a%bI(z1wQG@Lm zml%2-HWxWX&3dKU!s*DY8T@(>v)yM)>_Ll1!=d2tu&+svX{=3u=5=t0r2U4BsPTye zlh|(?N-Tn_&lj9ffrk5vPmW)A=S-io?ks~{i%%IM&-s-N>=@zU3MnNZj8NR83d7>! zys}++)vo3%c%@(NhFhfgwzOC5GzGsv)^}Pcu|T(4SHnFnhuN@YeDxUYEqSp|5xD6D zmP_E*;$wyQ0T&lZDkuJ&zd&FkL*qcOGryM1;8yLDhvvfZetx#<7lL~iS2KfLvrw|J zWZtbyAB>EJwZMKu)uztMwV-x-WA7NJlm{auWcP(Nes3L!HDt?FK2?h|ztHfr!DwUd zMccH#pg^gPZEBlna6x_l?X1~K7ZOjiOWa!q*t|v!@NS1?!WjPk5a}CgTe(KtAHU0l z`0Lqa`?wIX!eYx>Or!LveKlzWYi_EtR~b>1_SW&H=G$L8=4FbH77cD*uhf6 zus>~N7sSYHy%-dgzM^d!VKCPx=jRK zT#81NwdLg64N|hIU{%N_OiyR8J-lOp9brio@m2Zp=MTsabr4JjRjUzHG;7<53#f9! zQ@9sHwK!d2vf8l4Rw25{KFhYXM(u{5Hdicee6Ni_tW~qJD?9cF3j;s34+Hfhr`|3l z4C?3r6Zph0>0@p4L-e8<4dkhRAq-5U@aRRjq`n%PYURZ7VJ1@6)Zh+Cvf&{nCLXi> zg>VaJ;dKAFbjlD$$Y1KamQtD)WMy;kk@KcOqf@3JJ=VJ5O;LLK*@S?kZ`Yx00m0;SCWMV((EIWEt(bRzfNo`}m%x)WF zi#5L@u42*1rR+d!_-s%4_T=H6lX#KR?p3>jc7MG)ehYFkE(@6Da)_RDOLqCpOJ2;i zC5IVIf7P7m&*EV3@6V(M_{vjHdli^wW(31Ea&Db2m<_kB(^9dOPq~X2m&vyL4$i5JXtmQTY=FL)NiM%*nXAxf^;0&KDTydtbdf zcnIaR-81(~&kk=_tPtez46!J+;ez=V_QOSmp5s5JUO8Ur3K`eNow)}JnwE>!4Ynrs zRXeAKF}b?R`!Yj(ej$LuB~@a5<2}Bbe{e;8`7Xdi*}*&?z24y$!r@}Ko_i>WIjfRCszUcVJ>uFPLek-W+x4{%ip@MUU^* zs<4c6r9%QRAM1g7#7mrJU>J}YIYRNh1)z~R);`pGqv)?E`OfNfw?_7!HOBddowVi+ zF9kA_W#Y^@@TUSJ@MKReo!aHo5-%N{-At!?FEj!Q118%{Uuum>mLqUT2=h{b|FEfp zw*Jd_myhGHK23gQy{i83!lnMYU{H)lJUwK3R7IhcmGP>r;p$$=Va-1-Ewf4?pd@|& zcge9m=bZIa^`R+lQ*z;QX+w6jx17rtZ*rC?M?Vn1Z*4m>wmUyHd`Ps=-bm%s02<3f zVPa8BzASQ_O(j^q{GQ8B(L0^rhG%ttk?qSNhBGtCWytaQ~c^A4# zz*x(Xs#~V^kT%rF#o;M?H*}wVWwv(+Z=N$`%n&=}fboYrT|RwxK(S+5NwKTv+#H6U z)s(!Sy%UeT;`Ru%UnI;~mqwi9iJ&38l=0*@#UwIET9T2^6tS;Xg zi+1D}pj$d)7#SH&y5`k|IC zA(?@~_K{hWky#+R$;tvOS?UVjMNRD!YUevMB&%7(^U0W{p?KG<)IF^n^@id!jJO1? zHJ*Z^k)`$NnaJoHZP_cs1h$t75ln@x#0wHkidsEaS|6wj-e1f4${uh8?=EL_gns|g zL-C9STl_D;f%@{ot4wC|BPG*%O^QO!$uB6@Zw6UALJ^y<89oRgf%lhgO+Q<2T z>|RJ_r9x)JvbQL9CP_^_IqYdOR)0w-QJ2@r~yRx7s8D$0Hnac0_yYdJEHP7I{~U?>#%k<9Ea3IKf2J> z$@S89@dKGER%6K<9ggPQp&}Fa z6p{yL689V;t`&UMj9Tdn#;3Lc>+(IUAIrDq&&u665`}&ObUV?g4NlwI20jZ=E9%?^ zK=YNa*H(Z6(WbsR+>^UL0uv96k^3Br%`n+TMyhZoHgn?X)_e_4SgEXhcz9Z5m@$aV zbBbZUMN#gU$GX9+9x0#>JDVmLBN&N?-}{5uHVi^BU)nHE4 zhQ#y{EibC5Ir&fR@ZEmz_w$ChV33hM)!8FnJ=20yGwOgRqhR^b9DTxxC){JDvUZo^ z+v#OVkB!aGhBv*qbd9tJsRRUsf!)P4QP7Q3w<90n@D7K3;}b6n9PXpG4y&bR*%rXP zO~%4PG(c>F#*3JYK6nG#!HKd!I}9vAR^xSTR^L0?625odX{OqLDu3 zsG2~1>~8+b%=2QPOJYC;i^!_kf7pN|aty(yYahPzrJLKA83*W{ONmj{(> z6`u_@_}lrsTK%24&5CSlU<3r**Pz3PxzOcy7t0oN)rU zbe)=IIQ^zWZ)r`3$)SZic8hbsVSm^wlSy=WOYU)qPI7uFDlHi=Iv6iH=(_|v1uZ#O zIfZv|eQVc>)sbb56U+u^j1{X5>eP0dg?UuWs0ysDgi9s|(3F#GyNap%F_LNhWE`?+ zkZl0N+k)RDJuZAXfz~#~T_%P14%20_7y4KSmNU4A8Yi5Ls?CvelMnjCA9{O735Lpy zV09k2#<3N>gCqpA>a&?|2Kb_C%a82Ka2xfT7Cci|#ac%vJd@4jTH8ii6b{PSy8%Qd z81sb^_P=U1#uuQm1@D0hv|u*v3a$LQE=)ibWk~Lh=#>iWoeol96FcZNeUxtw7y7_pm7vu3IpSEqYkQH1AERqH_T2hrpq!I(SF8Mwi534RKlZ(h99uR1(f zINJA-k-NB)-UYIofWd6J&witsJ9dNbeeBpklX7;j;!A~9DP;;^7S?{&7f9qtVF3Cf z^&<@EgJixMNBz@ic;47C%}yRxk1kL556C+oib$iO0%7kSU%8Ok_`MLJBnPsLCWOl3pGN%W^LK5t z{@|j|`4kWq>N*1ec4j{pM(YOL1p5Lu?iBX|%0a^@bY$!mn{sa1kk0xS)tmEvx z%IF{R|9==C-=}PVE=^HItgFaGUXL{xRN8&^nI2s*<5@41!PSQeU5S@hGCKQN+aPO1^c45u6yRxl8Cq6}=XK*mqH7bfSbXg1I|=Bk6z}^e-g_e6 zTluor9&H`}6zuKR0Bv|;EXT#3Bk6JOJCz4NDC+uR&1QCAcCDps_`drmS`i59}0|osppYnwnJlW zUJhJ6+qnPB!S+idlRL3wTK^g0tfXgB|B*v7O1WIn0dqA^q87oq36pemEQi-uHqG`- zyMVEJifvf*`Qt?LK+W08abq+I#c0s2dM{;T;3UNs%tX+&L3H~*SLjo{@g=g0ZwfY>#URCCji)l=x3jl8TbvD${9gq-)7Gwa#f`$%q_N({16ZnJ$x&ucJX!SfJo zm+YWy{Qm=T{Kn_KTcQ}5b5K;G_?mT>aK)RQCY5aQ7vH{7Qc_Y0labR%g#cv7!l-C$ zN=lk(sXvmn_$f=c`w-v@TYMj%pk)6q;h2>2#>dA8BF^*xFjOj<^l#|je$QTrF;xR! zICTO3rF3|B_@!blfEY&`nP}mVGl)r5Im=Z@u!KdknhYeqPJEqhG7v*474x1fX6FIz zEN{k1t@LBm~c(Hf`b9P zIT=Sd8cfzJQX1tt15(BcaAD#5?;AiBxT9}k_sgwYrHWuhL`F=kmSs6mfe|O(NP6D91 z9)^DWK3OcKRI+`teS=(sTr#Uk@LQ8W!N{D4GUVdDCaPH)5fMGioe($eoxZgKZ6`ft zKCvdCtSQA`{}v39e@RgGCqP-?Uj9*X?N1qVhXXIJ_+R2=-TRH4+yw9y0{Qr|`mG-Z zatWmrkdFZCm$LUag&YezsG1@4dom`2oQRPTFm?F}S!52STr|1KKT6Tx@~WWPw~RYJNdKIOtCXhLVd%llMm( zk&_7)dTWvU(qjIjnrY|n>AR$&0Aj^i9Z<$QZ6;!5PC-pfq1mT`VLt3+P5}8dNCX1| z37|fR0DJ-rj5q#!Euh?{sxXs4fOA2~5<|)Id-u|ZY6f5~P$Ho-MlnW_iizy>O8u_$ zKxH@HDJH`p7xVkwWXQ$Dq(X~H)PX(mKiB?KhOxkZc$2KP{}b8y?3ED0sy~yi5QH$Z zZ}#kG=i2#^I+5Dz@Vq`KE|DyKq#P44J4jwGo|sKzAk8YVl8#_=jSiZgHwpjON2|ym?!m_AL?T1?M~`F@rqy63ec@T z?eRusSMSVsVR)kilC+pV$;OYsy$@9KH4x6D+nu7&O>3Zs1$ zWjH8KyC5v`2K^H?p8q#&((emeW)HDT20%R zk=y^^-$JNoVVD+)8XbdO5uN>4Ok4r&rlyz}JFw;%Iw1wtilKk`!h{wStW_m8K9w2E zca`=bH$Q*RCY%(`Krb@Z%q0j(na;h(mKnX{ZW#YD381q!-|&Qg_KUGf$tb54#D6}; z#2~}Oh|fCZdluIqf5t61eoH7q2AOccxG>bleLxnsR4X!%-dbGS7wt0PLxdm>E|8N@ zh{=g{;gcIt8(qD{@c$?&R>q@6CZkISll{7B+dZHaEHOOpX34(&oFYWel0s-tWnpG* z9aZubqGnvgD+zKu{2xOUaiOr!r@##P$il#hL%OffJKxfWUedmgw767J@ziNnD4 zgD|gCp;5~|LB^vDOI0Ptuo-~Ud)w)*Y62)rR(W^^VnS3aknBz#*|(WZf9Up<%#SVAJ^qHP9ZJpjd!%0{q_&h-1 z(7EAMih@!%sx@+M5+Y>&B*-bmKi>T?Sl=>0US<83%JXZCFZxDQ$BoY#FYUW9b$$EN zmd!VVqb%>tkxICGOt)z;mCM%RO5YD+)eowl`oe5q*p`UWu*LNauonS{oWqqQ5I#uJ z)x51FFy2|$($7Sd?t-a~^jl6R zadKt$sj*I)BHrQ=4I0$MsU_uQwe-*>MK6!kMV%%2yhVK*)LbGlei#^2StX%3E51JD zA@r=EA@$Y5$5RzUaT$ejTP3+*k2ecwLW;~*g_c6GebT!}zYxe~)u~+>6b&|oE}pEp zlCo940ifS<@h^lAX9bR~wXFu&WlAx!EyP7Do6!|A`B6s7H4LWm67!atd2TzYNxlN9 zpUk3q;vQexKnQ1y$|I@GO6dv*5!-ZDB$QteuF1=&cmtjZL6POW^(;y-oL%DU@T)NvD`0$+magV_6cT!am}mO)lUI3Vwi8%Q zn*U4`_iBviuRPh<;8ucG(-$=hmO=LR;hoi;Svh2X}rQ;zCzSOirjQ*opg^Q2<}M=Vc4SM=Ltoac!QPZ`09s z&AVlJpV&vPXM-8khMF#XYN6<_Yn0 zUbJ`9d6l_WhnOavMxy&?xHXq3?hDr9Qx|u3clN)(A&L6uFr7Q!0U-H&a>n01=AQ>g z)6lzWS)5{X@e|Md&(GhIO%l3-84+15JEbn_hZU|xJ!6Agw!%K`g_JNHP%dgm4VG+c zL}L6m*~7rt`_J;Poqzw_m_bTPHv2ypQZjQ{Exl}fnML$T_3^+M=r{KGT0(7^L-e*R z2{edM1kag{Yk*3 zEs}wTMZl#?(7!jI0xprP|97H>MPN*`FlK}kJXzC-$mrR>MQC;4pQxul59I**c@@XD z3|*u#)QmC0^u9?27b!!B74H2CaehZjb*am@h2SHP;-A+IdpSqoJ%`oMK1a&jEzSrU zj`#U46y|h$uDFEwPVv1O5M30~fkB28-mGm$!J*5yf}ij{$%Qvb3y#k!D7wT~K?CDW zPOJP{RBXbUq#k3~2d%26Mx(s-19Z*w8IJzeChM$ZdFh2H7ya{4*;+3RVw?$}2( z$-NEi8}+{?1y=Jc?1S8s0-Z@^=t>wV9p(EiJAVu|#Axa33o8c98~QB`XW)`#nJpvu&<@)4@`dN)skyz=l9{b# z4`2=g$Hj%yUI$Vf5nDZ1_oQ8?ILNf;=N<3-$*Lqy9{=(c1@F2cf0v?P>frM?ZH2jJ zM#0Iih`g;4A$$p6d89ThL&yp!Zp}?fu|*Ym)I@V#KcK7z#(zFTeM={UT~vYfytjhJ zcQ8X%r)xCEVTV#)9DA2eQZH-X}W_zPq$`7EsLJ2~k}Y|d%;h5?p_Z)glc0$V1e#>1&B4&PWQSHCfvFA-vtxf93E z62yju1Czm!-tkozHJ{VB(%U4(q!Bw^h+|P%K%&pSOeHw%1s6F`nlYxL$1_uYRkvKS ztdNLEvMK;M6c%t02nSK-Q0BuW@(8DMISFc~B~$4-67(r5bH!+qbELQnHeQiXhx1U= z6&k9=^`F(03NEU)>fU8F_fWeoDZ=$fDiZ4FB z>s)m>=xr%=NR7kJLq~q@zD=NJ5qEKV<^^Dh$)E@iPb!SND=4tiIyg)vSZWG}R0Uv3 zhB$Z?V^7C0Z8BPB)tHwMxGPHJ2N`Pd_dAuq35BP`L`Mt=R8$>BrFffm3aq;rrXR_z zOw%+y=GECFtZ+oCeaHrdZ(@k(4`|;pm`rH!f1md59MLq4o7&ifCMH{3K`;urgKEDy zT0r2h`71U)6z3NjWwGa*JUZq&V;i5Bekjy zn$>C4c5Q25-=gzCk`E}AR-#>D{pz1Q;?o>>=tj`@&{BlA-30Op^*`@NICu#c7^sh& z337J^$JC0U>8J{J&?wcorM&G;J@Z#Gj1huWnvrG9q?6}Gq^#CmyX~H@?VahXGn2EZ zkr(^?)tw1>)_C=eIsJM177DG7zjOCSD_yO^l6M^tb}g^-%xci8k&(4Wy>0+wl2@&$v9vQ|KC^yp%4!Q?XS$qNOmaAeCm|=o}gPWHzHOylMzouKy=_ zZD@)xtpwsH(-9{ihlX&9+Y&AJm*q4sysLHf{3ik1CS;KY_^wnr6r z7x3q$UBH-7=#L0-5pzz{*7m0!MAb2Kgpwp7?$4P4$_QuBsm%ovv#9e~WZV(0G8+5^|E+uFSK zDZE%*U}3)yqVAU6>QzzrBpOoI5T18BlqAMLE%KDhzm?GT3%^GaQvL+;(Da`Xea2TE zRvMXmb6<*gy0%eHkFrZisX`Dz-*Zhk0?~PW)Zjf<@l{g6YaKZmLg~!UTy|@+)PR&O z($t?DPH@5*tP%|7$Sp49&P!f^Uus2s5d4KOomzJuse$CBY%KI)CTaF^fffGpR@2bH zEd$f1br?JFde|VyO~6y%A@&kNWOIt`Z!5uNx_%JaTh4q)qSCGqVu^WlIl82?E(OdV zI9$q%$jzC-xFY?byRpL|s-AcgCb2JI7`&|XjX{Zmk6;AuH*gGI{DrU?U+;5F9c{g5 zu}4nypwLe1ldCoJl7rq9bHuI1`;cR0!}SW$O_4+NbhU}&rU`U2q-!xCpu%2%m0NXb zEWidf^b%ddgz)dP-xtlcVI;l@!(6)Iq%!D^#dS9eG^HiSe6NWvOej~d50YE<_)1$P zJ|0=fmN9S_LZaWZ*DSWUI@{s4Xn0(y33mnKo_bs^wLs};cQa_o3u)OIx#>Whvx#?dlOsX^pxNNW@Y43#Q(t!$=Ps`??49`)}HI;BpoXA`ta^s|bw>3fTD_yaF( z8kUmTE1`jHWmR}esl{EmgLM!w3Bq><%Qr zT{q2aM=~c%QhPYZed3{KoaW`(QJwX-^DS$7OTZgB|GJSQ;wFElnfm3uG^hM_JG!){ zok?(YsSn=f(1;?kY&O$RQT?2e(Hv$is{3rm*l0^GmlHXxUONF19wta!_`u!FAY&4Y z1sdYFP}fsVWRp(N(@1MlY*F6#1v&BE4Y=u*ELk+K7_Y>V}^r?~tx-00zGLOQm(AquWmONFi6guKtnXV~u%p5qWol0`RS zFsJ#5EUrgIAhkb90v!*DFwSiPqV{WeA7Qse&0EcQMGfI6X6fX5FH8m6b=IL8<#}{# zscSRwqbB-*aMUZm-Qs6~Ki1a4GoZuy;&@PD(We8rp@ORL^6KPCDRZ@_tb!k%p>u@M z%lU~~rPOxG&Nk%hlBthJ{Zd~DQry{%4M-A}Hr$qnRCq&{ezG2#Dg`Jm8%?U7z_8QL z_F%MiLpE1~9)y7lhk2G}IsQnlNpwTpx|ExESAhbaQ%!wFXFp8B9M-0YPo@ms^BP|H zSAjGKwCx>@@Xu~iidNQ+JcNr14CZ!)E&4}?(pT?IjvqMhmb?$8HBk7$!{hPMnyE9& za@s-x^_TddkgKO0`BVLs;f$u&MW*4|DO4IS{U#-JwYg)&4RA@Ett>3_WIT$sWa;}~ ztA9&Cuio;q|Z z&+zk^aq8!A@UXog&X5_z`NMum^s5h=FEG*Bj7%fn4OvMQevZiC%vPtzq&M=R(!0nK0Ln#!{FRlPtIZg9=50Ko^XC^`U%1=NOXp9nwfQlW>2u92aXy|A zM1u*rbM0i9Y0DlR!M_mjd__U~sgXBbcLct=aNk~%ahUHRSH?m7e$h)h`FFw=IlV*# zvs5hQLpbam6(K8gTqLKE3(lv;hF=I_LRs~fBYh8sk0|*|G4d#~B7d_^wQ(<=kcPZygpP7D)kIafT~#a>f<-CwjD$QDIWSJ6S#IDAG_;$Av@VP> zY)d{in$PvT+Y4qMUu4MtYm<^u%o(CKE2&({eO6*x{R@G!tE$s}eWquiuP5+8dlt0G z?ZPd=fZx!l$z8bw(I_y3s@UYiUDlzFHh~N6m82|DrUhz&;_ELZ-relx8O97XK7X#J zz0>2?Z2?Xc#108*oy~Nd48Ym*+xx&T#roG0pOr-GIh26WympkX;Jr96Cb>Z;r(|l! zc;rcfCaHJ`B`zK5Uw;$IltgK7)@@u=Ls)P%zou!n6jc}T&zqVhD&v8#*4`>_Ja`8l!7tc3-ciZ^L|P}`C)g-btCeqewS7lZ$UxDmRb|)} zIWZ$>V+~r^5e!kBS`776d#SZo6r+KJ^l7*u0=*}Kgy5^U@2b!>XX3S+PY>V(ae7$O z4uLrTeaXT2Hjuy=cO~4X7m%tyHuh z2?=P~+|*M-APdDFbio>L6lxM^K(okIvQHeXMa$TzMn(P!xZyuul%TZs$z0Z7N()l@ z0->Ai_k$84+CkBCFWlAA)gU>0I_@`M9~q`pduV($YHXa2#2iTx69aBJ=w9bArugMa zXygcNWOf2;dNK9!0H=qr_K3Imz-MxiE^;1xHE-)V*?3|H8c2Y?j*o5%LlS7iP;1U( zkxp8Q!+ttDOM^gklCnq8BG1$ygv-LM7a2WeWi1dxtzKh7hx0o6H>V_9cU*%*H z!Q%UTa^`!?`k6 zOSm_H^ODXpgTxYuT#&vMTZOkDVR@%ykeIbE>^}Y2Aue&6P*+vKBl~MLc!3!?mxZ(o zw42(uLv?2R$maI=qD{U%A4Kv!aiEsrzQ*k(CK+WH7UqwF!5~s(m?0Ypz#`=$lPua++%?oMNSO z@ZSYHGfyjD7mwj<55Evz9X}qS4KmheLU1>-cN5e6=THfudoWU{wHZ{&F0Y#4#*VYq z(Fy!1u%nI(XAgme%hHxeo;_^m@C&5r{;0>T3nD3*b?HILDh;*{=ptQjt=7tpdgnx? zN%%8tJ=Z8aq+XSvl+&5%?={CTAGUY?bDia_(;n1ob$jrkcabl$4{6}YeWnDPngb%< z`uh1!f=te*K8)c4+N*|1rx;7L>pRK0I?J3rp1l$6QhDaV&9f7mRM59sInA%t2a)y& z&SA4$e0kiq7K;yDm&RQ_B+u7iV`>sPt?Hl}|GDXDX=?vxXrtOUyEF6P0ne*U$yD?2 zpRlLu_Hsx&7aZJfN>xpu`XK_VFEkC)fuY3_>+`{l5>~^L+S1zTpvmE_O*PzDQ+TH^ zqd2A?i*9il1%E1)*YJcDlo*fJ^_v6hXh4-DxC`8sTdLk+Nl$@EECw-~yL>kE6*o9! zE>u8IC+KIeEFb6J2(??~3_4KBCi14895GBbLHerdGq5!%;_`8N>c*^weRK8n&)gb$u_5;MBg09!!S;3*@oY8OV&@hpv#0;;r0#{f~O-tvl*|R)lSM)tw3Zcsb4Yetw2GMd4*?X_hvVD+L3hs{)!Y+;~B?Fbv>lyJQsRA z2|YOhIt2>cXLjieUuR9;Y7o4{ry#H-u7s8`pCVh~7x&~}x>*^<$gvf1znjVJY{~he z-Rz|l;;6`%|JIQ%H5!wlq^HQTWDh6RSdn1x#$4I{JJY;I*s6}F-hG-u=1<_oVyzvw z;?VPxwTC!8W-L!Qk8MuOf`^1IbRaYEa%_TOyh<8%t)xiK2R3p@@GV`z^?xOsGO*=M$E8Z*x6NPXFXUKN$Ijvm2N*F|z|Y z8)%ZuH|4#IK5IY_Kn)UG#B`&M?3sm9ag~_9FeAPAe3at%V!(T651$J$W^eD-Goi~O zr{a7@rMUTxX#-q3^cjOy4$h1F%-;HvPiu7B1Z?}5o~5DAOQXd2;%nG*_W<02i14JR zL21GBVofpIOM0Zbr^WOccGJ!}-lymx!$d4M?Upcp0;ymRb3qq!hmS{zjZqHT6LS-s z+$OjYg?lB=@7;CLD2;Zk0%ts_C($DF)-UYU^J_6F)6=Nm%}TFv=R}Lr?)fvTOzNR8 z#{r}K=-h|vuC+%yl-2 zC*8a6;cb+`me(`hAv2w| z)ak8l?sJ_ijguy{@9edhj#mo5&^l$#h|%%sBbn;igk5nzWiT^MDvvTHP@5QfU$dq$ z!k}l5tAgSM50t+U?p$iIVUt>G+UDjee|?fR{I<4835DMuJEw&7fR#-m%w_wLDgz`U z*t>R*CpBiOo(!5vLyPL7b8nFqtr)Lq)DrUfHeS1Z+S8`}XvAQ@F0rZY4by0)$Jfkv zlaZvLIw&>n@+W+*6B{@If)v3(4*AkW`8I=2@tCgG(80DS!9XVcz;rnJ(Xr-bdL6qn zUghUz%TQ5N9uE6`qf<9m=KF6eW(5#WkfP>1fOqNj!6*9ZQxkF4=k^t;8Qw$pE@QE$P7KPXm|BIsTE*Ec4D(QRa+8HD!ElStt zrSgxY(#Y80q$1KtCmp0BbN$@^ueG<1YP;#$MyUWTQlYpNm*DQS#Vxo8DH4hWcWVoU z7Kcz=3Iq)rB)Ge~6WrakaDTaS%@P(k*3}8j zx#kMkANO)^{QLw3Qmez|O4Zj$-h9N?D@QR!sWRo$FL|8RGs2QvG~u6%Ux6)R8Q(MB zk30*Sd1J~*k97+A^f=b28v8dTtHmIPoMhYjra4@zwQZcC$OSJ2QRcR-*Y9vO#Qvia z!QQ#eu*tmdEW|#^t1a4l9BGNeA9-yCn0`zYn&66c+;#Qmy(LCZhih#_XAt2;Rc4Mw zT(~q_Gn|>NP1g=+3IsCRBRKY-iyk>P;P{mRhA`!J3Zk@ycpEdhCFFFYPXAlQfArag zO&QU7n|#dYm`!RzH8^rDz1uMS+Kwjp<=Z*jdNL}HH&*nPY93?)VvF&!A=lcMa(GhW zp4Mv(RI?waTN{Z$vGcdqdGjpyi`jqELp4pKZI|u#j*_>2D+Aw>(VG(v@Lg*jA`Y6j z%XTFwd`S-0ldWP_ioD90uN6-A#rz)Mw?2&N1;#xfQ_s`H5+B+fE44ZfzZ|{1UHV>Q zvR$ZOsQV&`HB6|#Ls?12s^+lpulNVp|Mjg(L&BEGn@Hi(%k`b-;$fpW`PbgAQEgvE zve{$*Ye0vB0%-!nxJ_V<`}WtfLmU6XMdxCZQO#10O}U`)=*RkaQFQ#N_uCQ@O{EXR zTq7qA|6nYw{LNnY-}Xh^udUVgx_bW}frJ;bM_a3QNeK>oN%~dZq|W|IM4#A!t#})= zdNZ%5ldQ{}UT?n^`Zm_-_wbRvJPmnT{o&Tf10b^T4a&vSz<~}<7|wtBYFugS%9Ak( zeVr><(0`2Hn9A1V&ySD#e%4oM17;F*fwfk;P^Qzs`T*daFtfimoty+TbKX$Vol#DD z)+}V`-G-%keg!^?(tXk~&^mH2pjSc%qKg#%6;+5a->ItZn|lO1ZWfZ6a*rYq*xP2V z)9AN@WL$jbdYiBAt`@LZRRPJEnP`MHtQv#`Tmms z@!YOeNtCqmN&M#5ME>JPZn=6c>YGe2>$%}!g;WZ_na3EC()e8NAB^2<X1rV%5_e(M)mml)uPm81 zqK#SAGeet50!2YqB&3q0Rl_mifD9yWIH_HA`F1>)Kk7`Z(83i1_LP&-gfF)sFSj5e zFE3k9k?aJ%2&a$|ASsKapTo!JlU17Av%;i%1}~Ol{W`8!IoZQDV#@Ail|D?=;pI|D zbn}+WNdFJT_1{#T4;4f1)}Z0HzDdoVQ%AQ4qKzexKk03@Of(f*76q=8t@%&xtfD5} ztJK-W`Vl!cD&Efk!4qDW9udd8B0gTHPMTkl69KOO<1z9terWq3*2aGLNxo4KPJ(ag zD+`LeL2qHpr>MTaTn|NT+79?r26~LWxw|Ry4h*uLgNI8cg{J<#e6?9Vot&`;guR&* zjR$6@@{c6O#(IxpbsvKN!KgN?-?=8KEFbJ2%*%dD4&{@}NoRep^EN=LQlIJOO4)6K zTa?!)cSqqqt#^pRtIP^sx(Le7_G}=8P9$15wb!OEBI?{Aglr8gLIGXj=CGeuLtYJd zArFizHt>b1YXOq<;sOg7I6ggj4T?(s&SqO|x=TjTH!swK(D{jz{tS~iWgO>wB0=Xf zj#t;H=)i2OMt4$|^%$4f8QJ2N$F?gS?$JqssmX!g6RPg#euEL-1ATE%ebwrBKH8?F zSkp(mb7J?nwxOJU$atTx7BU$h*Y+ZeY%R7o`BhkbrRBkY+3&ILrIe)d4dY#mDj^K* zAjTO4WpGzd|0#rnfdFC=S&DyT>IrrSWmzvv_Vs%>npSmLK)b$G8mF9lPMT-L;z5Pp z+%wk^6A_Up>!F;vR{l0W(^B{8hlx>d80_rwl=cV{2i64SF*rakf{ZP#{B^n_r)WZ7hKP-)Xs%mD5QAp_Bi$MfwYLfXJ*<$9z^S z4488z+oWHwQ7}v~AZLwPD$ZMDr(KSP$^omSKl~(#z3^yGDP>}Y4h1*UuiBaGK6n3w z5D<7P@A*y`duhZxwHm0BKGvk}dj~o7vxDsCaLU0W!kTd&9C#GX!?qO?twBnPJO?l% zT&Cusi{4MX2e{ANYymwPpqdxFV zh_p1r?d7!k=tlM1xne%rXDnCnI0Vk<9k~|<)~HNnnwMYLMrWF z0k$|yfvzXV@Yg8~C%&dwLuzbyc}L8Q{0!gZm;V?#QVd=5lw@ChnYa0&+4)pUTfsqB zqX=)}~NIPN$svzIOr zM|<2Q4A5rfDJ-Tau?xZC`r6y$5Ft}b|L7lM_Y%)cdRU-YKZl31+X1@6{r0ce79!+FxZ>Xo)zn91h4tUSdl~t?s7p;? zUiu}trOC2u7(`mYW$tZhgdNCtk@jstpc2Hh(>Y;^$ukfdqD!^*fGi7!1e0S@Lei5i z4Qd7BQa40nBMwiv{4F#z(dz+k)TR%6!jS#+kbTpOgDCRoFJBx*lsra*u7xC>BX-{glJ39CvrlIgS~<_GJ^@w zrTDy*aUfkb#V48E0K_JSu#!lyZz7UA&Mt%k46EDtm3nZaZoO-(%dKtsoG=t=tf*9@ zCy{4&HH!!&-XGtV*DriR$>lIuIJ+V{cz2!M)F?H183MO)IxZmV)7(;|5Rt%{XwA)WbtxFOpPXXR)fVCwHzu|-sq>Pz zbeeDk4fj#tWjc4y^KPuyxy`iblqc|#QDULZ&MgVr9ia$w1=D5h(6KsBqz(rXmT`_( zW8`8dPqWcmbHi2Km}`QE?1Q2l5}lB-$WNo2NR@!&Tx<4 zF{>A|@l&_t_4O2!+=B_E4&WchFGI9`kO|>5vcphW8I?A9N!$Le_f8`aW-g@%FCN{^l z6MJq?AJ|0kcBDc&uIDTLy1w*NfLvX?Y^xIlu(al`4z@bc`^yob;KAP$lg~<&yTT)kLKk}Iq1PiS2;@~zr> zg%xQiDhT+ZT?tMIp3vZq=v%FfKR4kTm|UsV2ZZ|XVs zQ~O96NK{sfia|}T;(fx{k^t2@8#yrT-&4^zVUnr6Ks)eao|qSN($ivp`;QL9b0hQ# zb7FL6Yi7cb6PeE&I2SX`(;3PiPQ?gl=?~u6w6{qM(`-h4jBSoWctK&CefGePM2QMZ z;sJ21SL-U{C#wb;N~?C@%B)_k(IcNT+Cia6-i5Pm-_dPpcJr-|dt0SQX=@&pruS!0t+FU0+X_zEPHyQ&l&T5lk3O4vr5HEHJZ zTH#A8-fv7LIL`8QS9eLeRb9$nN!z6|mQhmq8u_pdJ5VCW`t0*FN9QlRT4?>}O5d zXFcNK_>!aq=_lhOs@#WH_bP^lic7h<3mOh7VUPs^0g)e*q7@^oq|ff=m5DQ^(IB*H z;0OMsLn$Fjb#?6|@ss%j^LOlVk^&h>^TNB9qJ7}5o0jSX(|I6iQTJY%cLs^PV)*E! z8j<=eNf2RqA4R3qEQ6y+=?G--l&%O^R}<9x5u@^1lSTK#g#CIXk0(p|P*Hx6Ypz2( zBmY^7G_5CJH?)*n{OE-V@Rd}VuWg@YSj?D1zrhwOBcsF+jl8Xoe{syAz+~_2AL8zp zZpAGAnO+49-x?j3N)bQk9!R1>7{3TtIe-2dYI|ZRu})UN#g8k?A-&SQVEL)So6Cbz@}yc7c;u6;Lcxp>x%Xbmk_I8DOBy09%>3I~&SFAAhiZlsjoMNkD2+wPLI zg4z5sg<;V_^1k z3O>(HFjibJzz`!iGX#(ghA7v0`eT$DO0$8NxZBqh9a5~3s)#-|Et&F(KFMx@*xe1V ztg`m>_|cxy&RViFL$_{%fIn&E=l~WA&uvrQd!>QsSL0&7vTE`iR8%Z^{B0`hva1=f z+x{V}@M(@*@f67WAX}+;!gC1=xwsUC%}5>-g!sTdj}*_KbEQ3O4#HzFURszf7L}(! zmo#2{K*z3|!J51o#Y#dxR2iA+NA3fXc%FxH8Nvip>Cmed1zY>!#4YOXm`;rO(KFcx5s};%m|9se^T#Q}lh_$9gYV z1;{|J%9@>E*rJ!5?4A{eHL-=9JuwuO*lu9ye5cvPCr+0sO15H{6t4r{Fcm!Ou5Y@+ zRothIkj!dy{y`)7UaPPxh&YN}w6?@p@Gza#CO0$rb;)of4cIb1XI2xYS`L>lDL-*G zB%fuD%JzotW{~DY3Av9glohk>R?0$%*!@bc3{)#>q}aN@vJ~XwDJJhLjZkSW{w5LkkX3<^1G`DyRDP@%F5dj!Bl~H?T@jaw7$=a zZHF3JBS_;-iScwFzwA-8OiQ?0e1+%E3i<*~aYn^D6xF_e8x7SI&jF{a+hlH9?=5&J zGwL3PrMSWj5cA-epsGarP))#3%T?~g)^r$CnLPjk1FP=k z0qVW1i*ie|Lv*89X1UQHy|W04N8ytPYl(y2i8Ikslb~*eQSH0#b>S%@-d;wVDhr$p zXPAnic&hS^+`afa$GML@N41es%SnR@VWB?%U=%mHR6O*vvKxf512@t(PRvmk{Mx-v znt7?pb%h19t*1$@u*{j!d zpN+_Mmo9x%g6+Uj*3Vy@K>E861=(QWI4EMxPE{y^Nc$-J4}q3ExlF`~EE^L^M`diz zf*`JgegXc+^ny9F1=1<*l>R}`mzGb6L;faeJkmN{lyb`tQe9d7{m)RGpuIg0UYUD( zEuc`*-{FN}`JE=}5wM!9ae0*6QoP%xW(kMHKEAkL=AtR%$Pah}i29ed1(6Kuv1HY!>mjBkmQ#s;jnfPAVpFa(6(SZG?Shq9 zDdDfmQUJu_v*EDN^6X>=TI&qKu}FiIsf8stt5vl5g);-gOB2PZ1V}76PL7;b^IQ_E zEi2q)fn%ASx`@hB6~O$*vtjYOZq^5omzDnW*?HE?U=PG#lOg9Gx-XVNLEbrBc4ix5|U3jpA2g^sri>;)f?B{?>zp@s*Ce zo%EX8zxuGZIwgzLN4~OHv_Ev^qfW*e7se~Hz7%DL)iWkYB*j@!eqtFXqe{t!lu!Z0 zV?Kw=x~+dqZBDUOAt}lk4+XuEu(m1p5{95-0sg_6h-|}o^2_|ZitxS;mzmKrC2L&V zPz{m#D#ELzwq^GEXaCaG5>`DDM|eLgl9q!>s0ly^Ro*Q`PVwwWGZ8}>^p47R4S{0~ zaTX0Wo*pLv5zT&^T!N|LIUYsEB}jldB@Y)zMpWpuKxr^JQ(=NmqzMCQ);s>%Hxi<3 z-4zfXMdEHs;dLYT)3M1C+hb?`&&BLx@?rXUdWp6dwd*or^2sxJ&SsrufVu8NT=9Dp zI6F_@22W+2J;qLK3g{v!(6)6d#79Mms)%0HE1)HacSk0 zqsZX?wq&1CiT)Q?uE$U7k`NU&PGLmPK;^yp4J8y%_gUHJHyTz6iArc>X7BHXJt)8< z&xIk3+-uh;P>)|OtCLM9gyjfL~fJ+G$B z?Z~M({(_3<(^Sx*F9@t7XJ^S~(O!l5N2IdM3@Qx(7VHjsV^r*N4Gd|xTFpW>%@@;| zE2bRTGGT;oJ~aX?>of%mvXyL31!3Cj$;oD>!sA|p*}6ZctZf+LJSSRvfX_)yjQoJ~ zjrTSin?ODnrxUf74RWzkdUns#;U2Jz7<$lqR(3b4w^>C-uucrtpxJy4Tg}3$xJdmA zjT2yS%ee1XsioyEu75DL7Cbb^+8Bg)Y{rGbpNC)C5NT|*JzZ;w{z8?H(s3P^i_v7H zLf@jyg$&v1rVst|g$g2H958`suV!PWSDtJ6QYwkSLjZYCi>rBavR?aDg)2wb`q}kW z1A+MBm7P{`O2Tu&8*9@ay;8clv%hFOsm0+`2=A z{mBGDaRal%gC4ds44kh7u%>uZmno0uJ0!v|Hn2FK@0KU%zx27VApRFi8Bk3JZ_I*O z`f|RukaY$PkgDd~f$Ih$MTbU+hk|dA6xs^>jV5LnjLHrP z$!>8UYmJfDP&3TL1kK<50#X1~hS;G#?$I{A$Xg{vXc(UWtF(BIQ7xRidpsM@(Q|2n z#06P~y0n-s*xT8K`Qd*}Q?fQp$zv8T$lG*T^@iOJIK02Q{cu@5jq=^h3N*C+YG5RQ zEjzc_P9I4WyBSL|jC?N_8hQ)3xMcR!Aeg!YXy+vP6LB2wA}sv$O_g1Bp zR>kuwjI$kRvRrITS#EL^V4XRsT&Cs~3VA6HeyzPN@f{LLaIn5Eo_B3;l^!TpHy7F7{l{&m z)Pj{v?OWrYm&KMb306V~rZbY%s7UR>4Nxh5PlJ2?eB6=OrVO!P6tn8w`K zhQ&4E#$(@Y``#>-Xs}`z8`o2Gm92CN-#8FA1g`$skC9f>;CGJbhjKstTMvia8_SQk z#9Qyv7p2?MHuliO2j#Bg+Ak9`bPAL&+;yKk0!%r(K)y3EE^lme&kiODU8~-RFm~$E z3;a!HRN?JSmY`^0_H838`#m_Chxw(pnVQi?f+5M9Le3sHyIv3)yyX$7C-2Vm7f7D8 z+Bx4T6VV?Yjx+ZqKc*KrdJ0>tYr?TJ!t@b_ z%(>|>YkD4;k0jZNe7B7$_|+c%*|&p6MS{BqoH-tNy+m?!uV^EW=7n{~b*wr*|A1!S z2j61e9>g?M%2VACLZz1D%gdNas50S21>SkNI0(KpS*bL|l9F7M*R)t4qu1VGh%uZJ zk1|bvD()3l*W$dvW>JF8Rz&Ccphv}L+TS^@z^VkcDU{ztUiBaMHnARgdULPQ)mIJ; z!)6!Zak8eeUaZ;h^n4{gKRWgIuOP35DF_WEgHL6bYy^Ui$u?54WboXyJ$ZTx$*&Rc zl86g}q~s7{GMxGh8ALP7rs|ojWqB^=0>);$X*TJ%;v3&=c=nja0AG_h`k0tqiHSb+ zgbBU|v6H6qI~JW_8m8I$%eEMO+NZNo_RL|^w=gFb46X&c;l(2C5IgKpGb4Ssh2Txp zSrxA$h0I{xE8+%%km36Jfn3K0ctG;sB8G-`-4um&{rFVY_L^1Axdo6xRdHOW15^+% z=bKB=FKcAzX^D9G%=yf>tOds-J6bF>kqg(x2^C z_wAG#djbB6SS9XV4NtY$gzBjTUA05Z~dZnA-<|bt-i{=3R0QD)EVg{MBQNyVw7RVLzKHqNaYj!2^f(&=gEg^@s)Yf zZua%iqDh%HW;1rO9O5vWr!Uq#ql7GVEa>c)v_0e^7l!J0^WcI+AT)QTZC}7KN`)nH z5d)XJSffB22VO`H;KJ!J5EFk{_@<7|^y!NesSJRD?GB?Cv&!&~pc!ghm&AA*#+V3A zgeT6^LWZ>qn_v>jF!-toFj$9GgDwz@Uyn?79$J)jgEZLRm=~pq*9DIvP>MWCa*g#gIz8S!+o-2~k_n}A zIURjdJ)g0v>WE+W0WiDwN5(d@ z7gpW^>G*M<_T1@v$5#^Uy;Jdwr*UVHET#4Kx&Q-^%>nEr15MbXUh*jsuFb3B4=D6{~xlOF?YY$A>BXSzP;!j|1vOrl-gW5r6Wm1t}X7|(eUw^J%Ee(7l_d9IFZNfhwpL7%-~qJ7(<4Gs(Wcc`uyJ; z4Ac0inIx5;@B=k#GZRQ-m$-sY7UtsvN{k})TlHbAoS8#r^;MXISb0Wo-u83asoG}>&oauj{J~w zyTs+{?H}%ECuWaZPgXu?J(*c;ZcmAIbl`PmIZ9d>ig3r{&!Ois^NnA*?0+D|Xk_j4 zI!Y}_;QuX3xK2yY#M$GLhA$JcLnCB7r@%~M9Z#|c2FLs;4$jLpIjGgG}BQIN` zTL(*QIO+NhXKrYk`^Uc1YJ2hu*f5fa(fB>;Xt3#X*D_*(=h2we ziCu^|_x_8K&XTi`6Laer%$?v zril#=om1I(hKIU)zMDx#x}{zIj0dBB&kO%HZwU2fU3YtC=cANT$`^&8%&kdDVWPUC zy&^iio7^i}da5Rd`CT6wC8BBL>Mnw;wR{$yRf{`fIRB;zrO8RTZ-c2i;4NIT4Sv=J zLX##y!1Sik5B+oWEftFBsQcD3L0!akvS?^>YCAaCXt8Gb_Z4P>wZ6Cmm#&rw<{i#qVyRk6TKI5)$MtNW2H~dRmbm}2!;(jGFqNYruvMTAjp6v?g0JN@56 zxvfmf6~>9_Z9aH!g5rlAN$Le>C!$|Qc}N5Vy+nNGSCfa1O&s|qNI8o~$gbdPtD|PP z)~Li8kuj_}u-i@avpM<-$OblbWl?~iPcc-m&DH~@tUc!<== zIfCK>g|pyKPA&C92?OJf71$(Qr1L^1hZ;vUpVWQ|_W9peTpif$64udJX#8Pjm8VuF zGIJ(tTdgPjBC*4KVEB;mWXc8G4wP!QXZ5T&@X^&qOfu-$LX8AsPc ze#eb%FfSu3eXo3QDwHJEy{1Bn%8U$+mwE6`Day!x(G&b}2f}dr$ICHtuX$^zfsWP4 zaX(E|vZ|xUp&h1jyxd35T3kz^3x>Dm+9t?>v3J&OL*n+ZMRcs2A*U+d2!)kGDs>14 z8<+!5N~x~;;}~Ggx>bK7d1qc;qua~=jY3nps4uySwCu>8f|D`o>X|^ zafpKCLMETF%V1dRWov7In*80kvB1nrJ^I(4@hjC4HITxe!!$!TvKxLG_xDNdu1;&F zzWHnRiy{(_FTM@qE}y1mHNPb1TSB}ypTP;0m~Ni4WxOVhMmUPF)qq2*x9@RI90Y6A zq|5C7e7q|0N$mk;4z<1{le2R`os-8Q(9YYkNT{}vk$zQaP4Uqj|0I46Fn08MVDXx> zo|1_&oYzJUB|RyzZ;+X;q!6-&{p-S$vb!7RfqH)1??Q3$rETok-ezyKhi2`ArKj|L zV*AoI{(j8-`uLgQ)pe~?X#kl`-*}YrLpQZ%&7>z@&iuvq-|nXJo2$s!P+#`1eZUIR zh4P-m!1-GL3*oVrpidjYm$4N4i- zCK#nx^Zsl1@VH&EBHsRNj#X8xIjll#e#CXj;+Z5D?(vK1y(G+yD9tm37rk=M0oxnl zHIZaB9Z*=e^>IpK!!y9+8)q-W7X3OjAmhJMYK=Xr@_#3Y$sDrGenAfjDOwPmI!v{_ z8mdN5jHb%}dLU%K@c*6uUvvKF!3X?m-!H4keEYwGlZSso=F=-r7POE76t*5C9T3&I z8_3S>(8FTX}VYGEtvQsy-2^w=v?XSt+ z7K(S2{Z}mf|9`Rf{}w9wZ=rtw7K*Oh{L25i%64J@UGKsLbkoHCADecCZkh?YY3L5^ zZL0hiJA?Y~-qb_dkH~p|yLzJj!H5i7N=#`6HgO5~rTUnl?>4(=oH~Q-dKYahjGycE z)#PrK#W^YunKCWK{VT@&ub8UsU*eg=*MW1URg$=1hf$>NAud>Or0os{pe`N4_4ClR z3m6+zqg$?Web-xaNZEPDaWBs!9&VoU5d?qx^cL&I{T7SIdO!yS|#d z|Ecx=(YSwW-3^WDh>^IjRk+F)jT`$^bSA@rb7ySv69hil-`q>R%TP z@y5Gg&;&Z8zMsx@v}`k@AO`X<*mjM`EGW&}VCf?HvD^bpJCA|7)z! Tliv!R{^gB1K2jY2Gxxs$fl1YY literal 59814 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ʅpGwUM9nIkJ9*K|gbD)C>J{ z__y)$*UBlXQzLGI05(j@j74@u=exrQ(=qnZ(XV+%n7B5PC+cqxSryWV{2-0VUp782 zxIX#lL4>RPL@dQ{_l??kf%|VtpKSnU84^XSA_IM)9U)YTnCpqhQTiY3U=_occRIyO z1oum^S_~WQt5(!`ZBIeb+M2UM%R-`goeE6_jr-Y3`s1ljcSQoKEmMYbNH+y#=}ZhC zzs7E`_u7DC`>V-8TJ##v458skBTL2 z*!|{+57f`nnt;qzM-mU4mXqPvZhX8-tO8ONuscHqNp%jX5eY}G+2qJgH6uOW;e2aG zD|14p{&nRi}A+tzyQ9E3Gsr0a!Q$aQ=Z(eK>sMnl?0JF z{}@;>iSJ#Qw}Z~Ui z%|>?JQt7Cc1Di!Y z^kR&&Hw0!DEoQZX$d{hZAi3KfRy^xoMvwPSyrOJ;4B^XjD-C=K>nbDdGGanVBT>)} zeZZXeL-RZOahk9zQrSI|%B{_sBfPiBj(+U|-Sqz$dSODSgUIs^_u9f)Wz7lqLI{0# zLSA~GC#%N&dGHzE7yEX13w@Zml`+GP=7_qcyHj0{$*3sk)Awivz3JPLukl3c7^>-V z`g~t8KaATSI#=@NOkWhVr(`$$nC5vUc!uo)J-KoFoBucIO(BKJr=JOI+GDbx&3b|) z_+~CH;%u*F3K}(0!qN(5BPsj+d*nLej#T0EDQas5Uy}#l4P={$63yHiyyt3h;@Too zpD8?h=XQ%E%2k>h3}^d~e>X8U2UXvq34NFw)MY49Juro#R*ZS`j2toDb-SXPuJImz z!)|6i@MJ2DJQoS6M9z!{B=;^L8qTdnhd(5>MktKQHv8Cq)tYd>a*G~o*2z88W(KT+ zL`%r#Sz*b5I!t+!*smhnF!Iw^Ckz`;$d$Pabv-?5_k7>9&)}ZdH|WC+dfb>?7UaO=QNvJun-%$<2aw@16RgcWiBPR- zmo}N&8B#?xl8!-t!>8GUWTeF0>y6j(8&5ZQMxL!Jav3rwYz*st(H-l9$Z&+yffHpe{F3xUb9`PW4s zaL{6YtsI4@()JRra~)E(h%^c!QF=9g0$)B7N^)xhziZYoVx9j`*Z103#CkI{ivin3 zoRb&?($jRCXVKYd(c*hW4%yh8nBk=Y9OBmZLK>0p6>$U4|ENUMpna-4_ZxPjVqz_Z zU4x*XHH50eUjV{(9QHaOsx7k|IZDJ0dW5L&ZMr8aQ|@a_pPip{=_cGg*WYL{6=A*6 zM%tUU-5I`Uyh=c1R2+?v(K(%u{b}U+G(>h$e3NX`ahtty0us|l8~%`g+h$Xj4KugT zV$2@GjPDd2wx4C+7H#B&o|kNr4*C)vV}0e`(6UaKsw~M@)Juw^2qTvH<7nUb*ahR=FuaM9Vo%;Q#ZDqF^)w^E36jWO_c^uzrxVXM2^!xQFhRus*o+TN&OrCHpd-0E0 zvhs=14o&HPe$?>zV(L7mQ-zgL+=085NYAUJ0QEOYq2biJXpV-MCQ{OX`! z7k(fas4*vf4uur^Dc;@P^HZ-*AS6I@Z&ai)3^^N9^MF^__GG_{Yh5(BI)yIl*9vZ9$yr3+95pFg+A_`6AXyA;QE zMznETy{XScryEO|#Ae<48TLmcj8-mh*zwmgc zC3l#Al|bz4rn9AOd`p?izwIx7;RC2|03<_p%g71un@OhW8dKYGy@ti9amxG^*S0OK z?+`4J^Fu>Rnbx&H_@Qc85MS~GH;x=W0_$w4S_a_?f{e3SMILni%?>C} z*{IG2HVh)s>A|N&nXLN|B)QW@XeuEGdSrLEq}kzMVplyQ2@FV*AL03=<0aD-;|U?6 z$r6^sB=U~eh!nC}?4tcH`)R==Yp_!(e&%rZifYLVID13hdi;J%4JiYxik_0cKE&nQ zW&b)&VuJsoaLytX5T}CgM3Rad5wznkW@b2Xxn#RO3f(t95=y%tZTf_60cyz+f52{esTa>;6-n2zN7SP0ht>0San_ktCuIKE)S6w)f{b0cOhKP0Gfy=Pf$5$nih~ zpu>X^YYxA>|8U`;4tN|?+HAP3v1-yvHT6~}3rR`)xFRu1DXOsoP~Bc?pz=;#JO1;Y z9Gh#Q95VY7&`Wu(+*X>`#-~ZbqD#+#3p-8lJAtX3z@r;OS-4vU&6uCBuaKTD7-iwA z=4+vIaU}D_kIzq5ets@5$;>ELj|q;9JPn8YXiQ6k-q$&e5|8b|dZi(@)CQ@N;)7HJ zZp7g?Fsv2$`pb)aD&Q8s4Jh;6dnB4a-9{6P!Peb@~|Adrm> zH^B1=3d6_wO`Lg8(4#yqAFkYJp{swvAs6Z`+iNhRN3?>nMg;DT6SfYhfH1gto1xu0 zB)O6xui-_7YjCQ#a$h~4gA^B+Pm+>`-)N(6Oif{V>1|@gQB`HMBC1DtGLkBKoAcgn z#-YzaV~U(xY2txQYOcUQZcwo}tCb{%I{c|HsVqpc{Ias<#V+0b0>OUmpo5=S?7MGM zROeI?e3%ZoX}4#7ebg7Ef9Zc#=1BKQKPtAB)K(09lTJN=74nJXflmib!3JbW<$-40 zxb^a|{GQdJ%~~9@80jm}_JVl~i^`?-Tz3LG6koe!tmCO9AmXw!$_oQ2_n?`PX?JeY zuDeT)IcgGa`nuSXZbzUXX^|`b^pD1tu$|JMhmBRe#a=>?%HF!HwiU(pQ4&?1TDp39 zR~va245d(-~8GUA^CE6{ma+slG>Yl?t3hZ`xglR;`ZJKJ+keOC497zPYzMu z<%F@EL^;&eazY~3{w_yOGC{`meDXWiJrv2sPR`kHl6aXIr=_FwUj^y=wJ1n!$%>1M zzd-qW+C`cc%A;k|TR~k}zq|MAhk2m96$Pn7>%&AEf z4`=NuCj^L*I5}inRJiJZ9^t7ChH6So;mlz{$M707?^@%Q41n5eFV_oxjo%cxM%1OHMt9FXiJaRvSbBcxiG%BuLq3>~ZUWW;+_v;eZu8BDI~0M2w_GBuuuq z=wZd`=(pXff4MVkE1ItV;6q00yno^U`R3&vXjx$S*q)6sAMQ}UemI{?v#T2y*}Na^ z1ht-S+&s6x(l#0`(mz_CyWc9duwAbZhY{czxTOV}bzYo)?BM&-(1W^Qm~R}(1Lh+# zEcaNPTsDctj#sH|zu?Arkw8M|`B_{aV9LGJQ4uu6M<`}Q3XXm1bSmNgAbeT!T)Q?~xP2wy%^~QqJA21u76}hYMs$b< z8alr+Nf->y(^8H)ho&h8T#u#7djIMw&!xf zYY+1?U>N8j?&4hAn_zKP!T`>gv;*hV67X^b+yfCRz|aLqI2DN7+K-#^#i_DaHXd9&y5+lkVZTYTp ztV1(1N#4Itn78Fp1Zhy?2x0bd8iIqvy3yW=dsz+f`{>YAI^vPCg3HrDJ!N@1TSiBXyR<7rYVtqlAQ8jrjPhNg}UPbAk$xtc>Qrr9a&nJ z&Vr)Eclzqot@zDJu@L#x{D_fzvq2#JPw+N*6S)lkIG*i;QRidkJOH|alLWX7H=pn9 z{tZ>~q7;Fi@KdC3Msrw;Hw{z9)j;O6W4XShykx&HPcwMW9upBB{tU5w5~n5yVJ)v9 zcUTOyjlPmF^|90&9bFdy$f3?Ixp{i>(GRPh&R!2#R|1Cq)-h1!$m&)6z2%~}@FkRO z|K*gfcO63x-*p6;`0gZm^TSs@1b2*~>`;O${D~4yt!FkIA~Oq_Nvd zx^@Y7_`$sd1}gI{>@413^B?+woW!7xW-Pk_x$Wr0tzP>r~xG$Pr`sB0J?`M zAu!N8Kh8Wk7b#D)SD(+-99!*##X!8%%1NBuSC&z3%2NglZVCzkiNb(+r-2UOY=ohbZM7B?785r2Ss1MD;Mrar#HEfon zA|gE1FHlc^eYqIcV*zk({4N__oYB4k_PvIjyQ`~+2w6lgo54&W2FSGTgNBd`s%gM! zl_-=EBVe_}uRI`IFt#W)e?OsweC-%N)P^Fw z2zRb5=!$i@QXjiL$!lV07TV3Pa3zoTJhlBnBc!twAYL<4!LhQz`Dxot_Gmr*iPRABk*`4<^0Y9SiSYR6cVV|+{W{LWVv7s5F;&at@8Q%SKH#yyZf{!Ja}`=5UxvJNXYfA%H{qd;$Kag$C&BOJw{Kd}J7DgE zV;vH#b^z}l$uj%M-m9#kH;ExM%D^b2dYtnCpUn+r!JMzNfv$AZ?H+&*TF%26&0Rh& zAF`Z?_a~W>N+5&WTkyh|v%aonL5hyc*E)SVB?B(R$jk7{lzFZE3vUQtvVuNhyyPF@ zWFf;pp9^lidWt`8{f>RhKnOZMz!)C|Dt^(Vxm|&J$I+H?`S-&qo0qj?M$V@R63_B7 zqNb97z27=ZO8{7z5HzHX{ll4=3&Au8yh#;T<_6(1lpFcM(FL7zdqHH(Ti7~{-n>&r z2xp!L29$Z$?-^F%&E58b#P?)4LY`=Cq4e3x37mO%M>J+xm7&j-AJmIdss4OO#-&8} ziH{YveU_^XJilcO$bonn$GtBbfGpzxG`G`$Mp|);L6xOr@7&PAJm{?F*~hNDGHZ!& zi30x|VsME%()Nqc@{ijnUwqH7Y0yt68J0mq)2}3y#Y}O}#B0Y$6yuBpy=-dZh4n@b zlkrMBZ?zMM!6*_g?j^+vT}BOx)6U%!rM%-BA$QwMePYO3($?EMzy>|O=1*8La!zZ` zJXwL!(rtS=NC_Ef6>Idxw<|e-^IeZ};O?MlHEG;$iie@q-AS%@T+?*pXT97Ax|O{H z^qcRnpQVLA6x^-1Yx4VFG`)pGRNwPHzI1oDv~)?ANOws$NVjw^4N?-)U5YeF$1bTf zNarp{cjvPFc)h>B&;1AHo_S`Tx%Zrz=agoXBDuU_T$Gyq>ZCW#Xv6ff9E|iAG?a3* zx~-C#e?XO{Qc~nb%NuMC&#Q18)#U#e{MP8XnF#sQVu1(~L3jK7JBNOt83HJ_@gax#pNheBgquHNpm z-tH=O0NjYLxH~5}5=sVQSMU>qdw?PI$vB}{%AdK}uyd-?2+Re!T-LEV5j}fDpK}`~ zo->T}^wlFaByb$@cpPM`v3ew%*4S&u3{W23|NJ~c2Xf;y8P{~?#9VjdfUPp^2tXnc zP3UHh)23mC$diNe*!TLSVB!cQM;3aCcBY0f10Oo&`=FfbmPKb);RCryH|K+$%D9)| zqloX}VOr!3AJMpA4L|76)KN5PR#LXb_1F!=t7%Vwo^(9%0Gwu0#e&4Y>H3^#1I-f&fZgZg_Qv61No?J?wisW$pyJ)YY8-&E*Xa z4-j6FR^$%95mpPmc#p~HOoS+bJ}paavXmM@|7Dr)*GF`X6FXGXPx2dDzVh!o#QpgJp{IzP)oQ8~P!57z zKY9XKffls_q;AH}OchDf)RE~td&g?3cwzD@z``|u65o5$k++K?s68&&SSv}2( z15-RHBO(^ro=^gR&S533jaHCY%IYa`etZ11J9Y-??d|A0odRvFbw9&*{1e;V-*ZbC z;>XdQ`^7P08j}8$%9rt3t&#DdP0Azpko}}kng+2ox5mv>Nsx`7_h-(~xc z5nqZ)X7wK3!2DktOTekbMw3-Z*?3Ro_pMP*B?=GIlQ*1V2S}(><^V~41sIvqEV`!! zL8RptvbuOU0g^8PO0V9#{SL+{#waxT@TrftV+ZaZ`v(v#ErA-N4RDu-j;<&KvM59% zT$rN6J6+2viuiZP>26H=Sn6XX&p6}~H!y>G^PJsmlz#Ko){7`B)7c@+hBwsc=lH*) zdVNCLM?wgh<}V!ouNNS>8H+>_MWUiwozd?~FNv}eT}nZMrdv(*F<11*NKXn?@{a-X zNt->kHS8%-?NZ_3_shzWz7r*)cG&mIy9fic)Wx=s3F+W&%$1!aa5=j3mJZ2Ehl1&W z{w^5u*AsgafgdWK43btEv8a*03(yLTK&TASf_l*YV>%CZ=TkM>h2GKB z+PL;sMi-;ozkMX#+j3}SDhH(wJ=Wy?7e31$o3~}v#a5cQ)ch#8)e1~}_)8V8;C6g5 z4+%D$Zo~1&_il)%cI1)yE=zZU3Vv%3KT$z5-H@c-O-$#xBzo_$R3+YShG@eYihHaz zf6DiNuE5+soEmv^#kkvcJje-yV8abrADt)A5ohh`5!D9wRDig#n6IqE^sde*!@<=x zD27#5$OOu}_`{uHtSz{%VNl@oitF$~>Q74vI@a`Ky}z&^F4k7SPaQS9#+!;esQLLj z>~;%;l{d|aOae8S;ngKk*{I@^qEko~7D09Iu&Rhq*D@|3S@18rkRK{93g%M@4F}k) z1zJ!aRcC^I^HlwEleI6`p}i-jfSJUP6AB+V$qnSD+673t5`32?^7LQw2@exQ1p;W_ z>`WogRKUv+!eZ|+%MvTh4f(FKa@1MGVf8#&K5J2ph`oX>nHhdNj;=gk%|xAa!(|Kr zF5k-Enmn!NMaCU>xL`;qWOoNHl_CsA?>=YA?J#PR9_s;xe0YiGZODmzyT$;SQ&VFP*3|un4Gl4e;NYrX8ge{{rLiq1t zA2KkTX($sfSVg7g<)?mssV}xiSo!)H{4o-j?}<5j`eO_(I&#@FFpLYL*qB7_eqz)BC!`&#(^UA!m6Xyc6omo*AoDx?;QnJS^e=swd@P1 z7GCioX8&|8NF;}2rJv7S>^YyKH{w*dm=vot54pvz#|f996qy?oubZgf_!%{f`&hTC=eN4lZ)Ev#3(^W`PH zzHI=n8A#tqG(v2(CQ}}S%?hIVCbV3{jh?EO^#97VJY{S4|9tBxWf0_WTNCS z)X%O2%>`C0**qfJdJxcdC)rCMBeMSkfw$FdGGScUm_1s%4*1Esf1=uU)*RU?ZAjk9 z2`|fW;W5OviY4cp2vN@zC3nJrh`}?Fr7@}*S;Q0%(Ifv}cbzn;HyR!QW@fjAo( zygamumpinJL@p?|caT2mnnFMZcQ5 zA;yK9ULLL()w3M~dOl^8W68VL$h)Gb0AYt$JqC|#?=4G>FFFx*QE$C0iGv`6R!qrg zErZTxJRe5KBt7fnvXu1b3>=9|%Q4S^gH3EJF^8uwFLaat8fjRWw$Vz)HUi)NdXJT? z3%l^Mlc>A-EFqb~6i#N0G=dy&ge!>@^33NrrOKfGgA-8d=D7n&4HZPZh)tYnWC4UPdTZ z-akhGHn=+;zh&)kdr*sNv^^80>2_Qyqz1Pb?f63Wy)_?w2Th(ij~p{1rpGs~8hTPg zq{eo>7)nr8b4DiUDaTo|eTfzYTJV_qCpe;8;Eq~^sthm?nz|KHxFkM<5SNxhRwU6a z*VJTG`!BJ2#0N-}qpv7X&J#YrFGC9~Uh|8?LNA>3>mm&E1KO}eEH|u=3RCj5K+ih= z^jP1ok3S_JWMKayMHW_T-bxLgPC2XQquC7}Hn(c%=UKxyr^{{6jlRqT9#LFi_1X`c z-ws8&|CwSDDWW0cbMbEAL$b69YXb~()-)k!b{Kwmu|Azo*adPk@t$;3=+riOfAH({ z-zb60-o${9s@#`^OOwoV`B_W?;2b+HFS23DuqG37kyezs+>xOsOu;+$(=QKk&N zQ%p(xV)=8=`r+gJkdAZO8)_FuKW%KH&>P;%u?s4(I1AQ6LnPMv+>gI8`t0stZ3 zq}y&hl=mSaYz;4^PCAD<2J(P=`QJP@wYT^lvZf^IMPvwM;A}vx>GZi0uZ>NckeUHx zXan=2OJXWyqudQ71yxU+{Up_c5v2)D(PC%fB1`JCDGOK27!o~(rWN6LQ9qmAZW~z zjewKqxX}zh-_8_K{M%-Z%b04)sB?;S*J6{OvD2)Gf;fkzb4_4IN{Xk5Mt3I$ct5VS zDiM`~9-Gsb589>0EKD9jzaWk?)NjGSp%uee#0$hIu8Z{K7k)iC;FMrMlO6^4e< zrS74Io7pJ6ddWG%$0^6~;hW43~iCO;s(BL*33e~#-gv!zlHpi?cv`t6V1DGmVxN+vv0;rPA{ zg>Pl+)BS*VcS^QCvvs z2uL9v0NmE@3=aZi-`*nj==uye3hY*`x05EUn)QmXsH_?Tb^&(55ATwXaNLa7zbV1u zQ;YwnX4Wo(Ti+h8ZE@;?J472bcyJ66MqJ9~vkCi#X58>A22=;Zhkv^fpYGN(o(Oij zIJsng{g1_ZeEp=foa;rmaJyQLhIpnma)+WYx>jmGlw<@NgnUmnPulv_tx|+EOqc+VnVY zHhs;e{&Q8eHK`d|YC4{cD8+^|-iS3awZ$zVJWJfbs#|o_YG!%acGen1BWk>inD@bG zyBE1vWU*5L5$iFc;KzoNig;_2KsX1*Oj>NC=4`R6c z5^1E7=#aIW6W;gg-!|c=!c6H$r{L>a)e_5S$Y-4W?*X~~AyB)4Td@Y8AbetN=pi0H zQlYH2Rb{ou<{3}lMtSF1|8DJFyFZZ5{`TZ=b8FX6cJFC1RH`2L&d$Fe8b>aCa zvB!SQJ3Uq1{i1ZumFTf%q?HdHt74lOqC7E?^~EJQOqRp zL9{X{aFmAvAQeOt?Uv)&jSvK=_=r^MrM{i0!B4jzm+5fccF$i{aesa7o7)gUDE`bL zkx(3oX>;s4`-32j(84i`Ak$~@U6rlJbTb+Am1=TD$q+hPDUHaKcFjc$coS9LTj^%q z)r4PX7kZN--WO1Aai)gs``)8>vhC(2~~C^7cUXWwTpndZ*; z9|&qyU?&!VWwr4G?+jOE+6s=_6Yw7SgL&k_^Ln@!@v|407BI+H=P0LB=7j#2UKUn& zUGRQ)!hy_rbJzpnm+L;0L7>@YBzI6TNkp4F>vp{sNV@uZeH*DWX~UY}XGkizmi4KL z=&`w=r=2w0kTJhNs)yVu&-n-44}>Z{n-gr{TlJerMO3}I@0;#Y zcjmCM`P5o94RU!zb|%VDHv{jWvj`a_*>4<0QsL)5y#ck8rL&-NgMX8_AKmYU{C?Yi zzmUg#s@pzU?H-$qBvZVrtgvBY^$tZe8L;h14rStSg~;@t&6q6F zfv*+hvyZWOR=`cdx58X>>&$9V;!SG%(zmy>_ za|tpsjg}t&80v02?w#MGUgpSngJ`PjnNt7K*;2*DXZHU<-c8!rbrh=xgHv4s-!59I zq}Z;hoiB5;YX3X;aLEq%RPBDlIKACup1V7;5pST3XmKIDoWqpz5N+g=F2OuF(h=|t z_jIm(G(0mo$1kZTHsAyG-ets89Y39>`_8ubm565PvCmYOBcBy=>srU2ZFTgbV>-yK ztf>-c4;j;jq>)iRBwXG>q|;S)lGIOEkcOY~!Xt&IBv)=&l0==P!CDhi*bO%%wZ9Za z^@)ZB?P{*IN1ByDa4%&d>igWU?j-9ROgb54qwZqO>eeOso%u?s4IYed6h$emI~F zyZ6FMzFRrNc82~=cghWLZuIXEH-n|-pI#USpjlJ}cfv|&lWQ+U>cp!W(US56FMZ$$ zp3UqibthWnC3T^4TQjh^!d+jJTxX{J0|OvYWUv&(UiV$NE^Jxw;i6suR=2x}-*&+j zZSrr^FQ9oUCHANm>*bgLcJ?}-A+Rv9m0^;(d1p;N@p+WE;c*E;O)w8yHWI3W0QT6) zR-bhMS=WCk+ServDQjQAE48rM1ez2EVSshF!bTV0zy5*lC*q|l*J5~;i{yX|@g?{GToleH9>SheB&~M9$a2~jy zFZD}GPxFB*wPJrm28AvI13AvMt!5|ASE_JP9_wQHuL!H_tTF27K!pAB>_`rz`5=r;u>{z+wzuA2Dl8OVVsEkOenY*BG(>{SLB}|e3l~j{K@h$% z60?A=5Fr#1-}7?xh^Zk>qv3B@ygc08yQYZUeB)AHYZ9J<_r3)`A!@+>6$xuW$(X<1 z57{)hZFjFY)gxKee&3v-K=5L>Wz(e*-puDP5mtsP6sc|WIMINj zzf0&wmDui1>SsABM*oG%yUuIG_)0m)R7ZE zvA=KI6e%jV;})?0O8D!RUZpN0MPj;=xS8U`1sLnlq#RZEyKmcAo3~R(GO#8I{S8<~ zfDTHaZobW*H0GVr_harSq`a+!vt_t?oQl5V>jB|Iw%eUqQizjde@3OMX4zVeqE^^` zFuJ6}(-q>lxthEU_9NEY^K}VCNn$yqmo(%s=?w@YTmy3J;J#9Ck<}h@%M(du!3n;( zYkLnJkgtW2H)qf5KSc?B1C6?Vp-02!$*omItP$LxJLi!XeYhe*DC;tiRcZI~!R-H8 zfI%`{G~0LmH~Uy_ZC66%jVqmqa~c?j#|lwTVqGC;&YwoL}EHdQ(eI+rMI#|!K zAX5|bcVf-^4>FsV3|Wq*b!GmNdOW}8&goUFY>cS%xyvH{or`xWep?lb@Y;4LAcHQj z*_u{BM_lkM2Kn0xxw@%rriCql;bGLYSu(%R1q|Cj-?yqAPv%3z?oN)H3i9DM;Da$@ z5x);NdsI=yphYtJV?~OgS3i6jwgWEYy(LHmmZ>@DfBZ`^smMj2f9CN#RD5Rx&(=}GFkTQn)Ea-=aODe(Y^ft2Bv8j;WQ+VoY#83 zo%^Cp2Yee1OyYjxmY*Tw8$3@4+hCv+Ba}SGU!cu{Ezn?7D%l__# z;6q3|;dffe(a7V=Megsx5Qr6%{7 z=KcLdN1MdRpXL46UOHaGgpzIEPoa%2N*O9$8zWy;+^a5zv9)&`HM~uv#CCkj%%Ehj zic}f;*rd;0?`?78*D^o3dP4lF2*wipo4O%EevAvzjrsis3(r6k!{d$(L1t^+n)bxE zdHwRwE4fQcjHjDi|EeB_Z5PZx_S#3cWIxqx{0`zfl1<4G$8^F2RZ`AZzi`ejEK4YUn0jBc=b zb{um7mhal)WGq%jQv|+L*WNl}WUqpMvpd)lb)y~;c-j+aUY`jdZv5(NwKi!mXE&+( zb(*!bq=**E>=muS(glbcC=$cwob^QHcV(MZZ9Ml!Op-o(PbyN2nX96ct=P)<#a#Vz z?){TaW^pm^KLg;Yk3zj*|v&jQ@8|@<{INuC& ze*-okYfTHw*EV%+nX*aw;%yU}LWGd=dAMVkhI~}H1?K~izFZMHdG?$Tw74fa^6_Uv zkkGVygFb2P)V-726zPl@Db-yARqK3~ZQLNHW(^u*ujeWbI^0ebc|5P6Ick+TbU-un zYx`NHlmAHtUxCaIXG@_?uZpFTFm4B_ZD2`-1b1pB#t`w4J(B6o#&v05qEi)bqe@*h zXFER&xuf#T`^dbLTRSGpSDXcsg8piwE?!Z}P9r>t)gTRDKcH&F^IfzneVIo;^NBS) z^H6Ui|FD3wlfIdYR~r}oDYNPEZ;urB165o8YZKD6FnJ8>gZv@Q_MIgh5q5%oamMx( z6q}0Os)ewjExLq=Q1=p=z;y0x+~M&4f0Uq#K@N_`5rwjIf37lS_HafcP!WkpX&)z< z{l4Eow+Cz?!k+0!#`$q@*pU>JZYd0wRx{ zm5(TrE-|*plZZ+yG;!3S3F4+!xY_wv@xX)MzyO;sW>|mEl)#QtJErJjMSr$|etl&s z-r}QN>2VnL=>569s=Pu7D+`mK!N9@n&P2-JPfOnY*2j2%2pAJNbd0^SR5h`({2)!p zLv&KM1?nG157gPua*K8C-4`HP*@{#H`+e)j>(g+V)E<|1moMb#0L!gV>m#1C|0 zUy`Z_vI0z6SrKW`HrPdMk^ar$BLsP=1}yb!XBNP*C{K(^f^Ox2wOb%E=wg>`s0z|c z(xs|%Xw~fl{%stnQaqcfukrEFjkCyv3Gu9&`qc+RbYzU@()A3`?%YefcmMH)C*4S?Q)FhbxO9t3{`FD!ynU1G66%u~;gu_U=Q|9WhJOcD6M68VZAyq1W*ejb=Yw{rEXg$^ zXkP65cb>kcznI}fS6RQvytN(M7=PBp9@duXypQ`5zu;{9s4o%ls&>R|*zf9uEWCVC zsU2d<@M(>u3WM8lr{{e@`+Q?A8*oq!-Oy&&pm1ZGo>oa%yGaUzcY*6$>5rFJwG7^t zT2rf~UWAcVbXK;L=qU5_oNYU6`(XyYA>@dIT3fb19s)f#u?mgy#V;??-cz9t1{Q{C z1;lG1C^27w2F|65XQK8~xBtG5sc4QFnGFUSTPebedJS4AzE%VZ21NKI^f?nj1U_Co zvG{?*sSp}w?kut9!E!O}3ys9?8$`9(__}5964r=dcb(+^WCFv`?nr~2$w5Eb zIS%a5c!2a>GEl-F2kf<#9VKZzm}jtZ1DnrH7svju7vQS+G?59}fC~~O!s|X5uCS-C z^<7nS;PN0|b76pi3JG^rHfpUMa)Xp1^|oBrOyHVwcV6KgtQ(_9gxtg7gG;`Gnph}S zc@y7+*!Sq3-tpkss|L;6eia5ZF@H<6?gN_-H|*x!*ka4{Ox}xv2sZp7lO2MWn=Fwn zMVSZWd6p`}zk34bc@1Y8&2jeII%rK)b?H!I>blGURu&npR64s*9gVp|ankxFOqzzB zd(!Ik>S)|{R#D5QuOh`Q-a=Ac@$GQ~rzCa*3U!cX4!6d!`>jrDztPDyz}R{*hl z{VjBE0T1f+M^E@Eb7n>K8;E9FxL)fO(z z8Aqhcy$hzC&S!$pA}?Gxl=D>rS6OQMY@c)1QbEdYC{EAQt&Fp!1RksZl2S(CYK8Fu zxT`{Q|3vk+ZA*qOm8g=Xx@Qj^e`A~%gqL)cYsK%{&$6`lv&V5Xpyw0?PSqrjE1`F~ z6&*D&6AH~S5vF>Bmm^j4f9!U&*r3G|ZBuZoYa`C-EuPq+^ zai{m=ETt@%Bd3Wixj?)?%T&pLV+_uKcyTk0ec$(H3-!$*x1iTlK~MWl+& z?CfzZml|A3(o}`mO>AemI{9GpFQ%9a{$)ejZ8#=fk_ zF&;V*H6iV$7&@k6?GH((ceZ2J$Tlje`3O8R-9J$^I5u#Z)%cJh zR^Lh=c+F56uf}(z6g}$O&Gq8>F@6$=F}BbsSv>bzw0x0~w23ImABp*9hSPL}zYhMI z;Wfi%i@W6EvL01A9Vp+%tNVN(qOt%DbYx|(BvF$tDmb?oqUN0{V>}*BJ%85wzde%nWju8ba_+2b(5xD@s$WW1GiA-y)q z{AfVvJBu$M6dmx7efAx_$}pujh- z<8M$9iQuS1?4MiC?A8-&_p&>)I|?+?d#qM`|Hw!s{TLG&$5q)t=iP#Du}*WA>|Ri^-;GdE-)e9(9^K_Fxe*xZJKPZz zm<#5ycV|Vk@K3)4MLHbkNMJs#CNEp?vyL%^@1+Pu1mBy@RRz9oNTj_!i0602>?;J3 z3sMRD0*#=qt}fli3xY;alIyS1?~~GUzpg%=VN;*6iDvh*B)Wgku>Y78vxxE6U4%WdanAyx9HD`Yg@yFdSn_VWa)m z>ol5-_dT$hZz~Y=Z#1QiH@N9p9(NyGyGyQ41~KxnrG%HosUu|!sQaG@UsNwvNnoy? zfHsx3$YJ>1YOD^A!A6!Q#p`SUGYa&n!upxF&hWSc<@nq2SuG=Um9mQ(j&UfJqaxZzYT$8F6s-<~AO3Bto7YKS5Aj!h#-Hn8=9vWA72!YsdrG{Dyv` zhoXcqVr%GIj9{gpmY!3r@uHJTE_eYvNLcOVGYnNTD4@t}?CO|J_Fe03)KT=0=8S9gBxzN>sSCh6j@~pv zQ0Ze1_hW_pl$oy<-1oaOtbaS>P$B-Ji!ba+@}e5M;T6r#;5%BdaqBb9*H=+1}eizex>lu9`MnD?tsodrGf&<_(ZGf+ANTx89kU zP#tBcD8L^Eht`9-+2)2j{_xQ2pc*PGD~m#(LKt%FFXOWzn`*y$DaDXM@1DoREjl!@ z1er!Q$NK3Pii*tg0RftX+qO$RdA$=EP%mNHFk0;L%RQwX0UuC4sP^4sn%I8nL<6vw z3Nm~akLw199eawxoHznYzGY-&oC>y1cP?RY*;^8tHE&QcJWAxB#vWKSp19XT)wp*N zu|26UYd>7;!2ZT22QxX>%R#E&A^YWx45zElT&iq`I>HUEi@g7yxaW|+YXm`f10k`G zpRcd1KBfJ#y~ulsenmki&|&zZ1W{x!8Yas@5ONBEhhM1v1xef|J|s*xA;rA_enp4y zD4fM(L*51m4AJoJxqW#`;(W1nPRTVh50AbWn+28Mkj%cr0+EB|kBa+VjOU)4B7--i z9%nZX&rO)-i(kX&x&Z*wdY0=2m(#qaZHxpAdw%NOGl#FazezA)#mo}e(gWVmHNrUK z2qQcT_*MW*A~hc=sFynts09(;pD1){w(97$lc8Zr6I~M`(s|&9i3ZM(wOpcqyN}i* zaA0Px@IhFlgedJ#2d1%x<-GWSpHGtu;$GHIYdw%nvU}vdd-5UW8~Ksc!A?Hi6=dLZ z3W#)G#=WX=J;a@b&b9u1c&f(-4>3%)5rg^>h)^TXvvA#{dW|b@olZ{4|AS&-JFs#G zT`kw@Ui23z#F_4&--|wbZ@*Ip)V)(M2zDCLm$fBK8e(@8$~+siVq^%T9)bJrR2qC< zRqi;>*$JZv>1ur3(~q%3IV%3%|AYy{M7L?NcyYBCh3y9Y4{TZ%;7nk?!e!_9&mxoV zYs`OsBF{+o;yoE_XFF#_Va5~qzPHJKVs}lhee_}K5 z!6zxd=%*c+`c-c!g+2nJ7gF$>*{nwhlCni|Ay+u0;OdXmCQ^*q`>To_hc5 z4!r8HJEMo@a}cPjI(y`V)t*)2oU>Ns3u~DCjb7m5p5f}=HL{1xQM3bO?-b})n6boh z1N!o`5hiz7ycbQ=kpGg@m^It}{J0l*U?GO`N=OwqDCYy%2V7suj}`^=pCqtOcsM}0 zx6F45DQ(QLZ>*=??+l?i?U3{z45ar-Ovla>E8 zuW~oO{PGNEtxPU0+cKUVlZ`ctuZ!h6UlNf8flfv9=k|bC6^f-!pLtQe`QcrDO25g~ z^X*cKEm6M5d2%j_QwYcJyA0I>X!t=hbFEECJ$er>=}qGsY*L2=T|x~ z;`>h6q+AhK*i+!+Ho6iyRMP~{W0U2)229oOjwVF+pspCc@3r|eQtZyzIK^ejD7Nrq zdoPzL-26DK>n>-APZ~YlV3sVvvSso6OK>y8`zq7~Ifida6@c@tqe}`6I3{fL-YfB5 zTzhphWNLF8Pu4=xosl?rcxF$d3;+s$tcIT3OFVSs8dxgBw$24U_JsKX0(ZprbyXpN zDCf6`W{Z1$6fmnj8IXetLb_5pA%Z^*k0Vz7n2n&H4W3+4Z2t>8{8sJW=+f`A#bfBJ zrgD$_s`JxOdOdc8c(`7Q<%QS4K%G2K;eEd5h6AZw5z1|o?RnQBXR_{^zc*B&$k|5; z(kWSVAdO46N2bn@s$|Qb!hFxMMOoYR=9SmTlwZUzVP_$L;LrCzcc$A;<|M`OadEma zS;Bk{+X%A79Z98BJPGv8gTF#2nuBc_sHhI-p(-@b1U z@GjHF_jfBjwC@@lcPHX{Oc<@dKmFHcVv5!y5gu}MWFWoB=U!b}>n_=Ve=_766M07aRlI6VecTpfb~6zY2b)@YjT$s&n1( za(jLK?J)Jr*RkcX*}HZcaDBXV5c9P8f!BA3c^M^$)|s~MR8ZzZCQ|YR*H1-b{w`PC ziq55n;k)DCJA~i??aan{4yN$tNXv_6`>-SOo+>z_jL6MFtSlmLyxe2x#~3D$J|Cmu zA}^#hU3lB#6jLdG76{h9<5!dwI6#!rD;h4l3_&#xz<-1!8$4m}nadz?QY90+s%eMezr9EV0g=4d4Pkk4dL-PqOPHjF%;8x3&N`sFs}^c~nX9&Xg9mwCGQxN{ zb`s#?v|d#G*!0V7;>(0J_Xs3@u>LcMQ5iC_9o*z)k6e6tD1vNZ8L}!B?s?u({M2?> z6IAZXjYidVo1D5H-CX<}Sd&{s( z1thLVD)YxbIYG<~9K3InxyoQQ%?VfX(9@c+$%`XkEguhVKg%pxMakLtI zoA2f+ukWwVd-Oro41^oR7NPht``S?JB!@SnfRpHhHyN+#VG->j2omFRZl<0EM_V7l z@9iEq8`KdO*M=>QgO5azIEA0yFQitSg@wrcXAMFFT;xWj>Ew1#Nqy2or;SH+=nY@v zc?(X1NlF*Ns6(?poE^P;X~l}1l5gDmdE1p6mfFXW$nrb87rbvhx&;*&zKj6;GS5Za zO<|6GUD)@8&Xf-~Q&qjnwMatvZbByY|2ea2JFxYZZ-3h7Vf+qMw((W~!66Sme|o2X zVerP^9_6g-?UOT$1q$PIemBG4@s6O)`}HMzx8r5w*qK7yoIjwzF9mIWJ|*Mk9K+s(x@lT$g5|!-TPkd<%rV+ zNYPV_c`!Y=!J+@}o8H=69hjNO17>lSKqWVS_q303(P8r<xix-fQ_VgO);1?c__ z4fWdfBI&HFK2);mTot~l(Rk;hXyMb(K__!%qMqmTI!W`X_GjLik3@aQo6!#0W1K7T z}N0k1{uBKhs7;}s+`u1|1w?2u?5cOa0d&+ z+-l1j8MKQL0KIt#!X;lLHK|^A;`u1$KVT7368_q0>HV|$*YL<#sr9CVXMQ9xKp1lw z3Md(%KlmYnaJ-j(GJ#1dqV;6@^+lZ|0gI-AbI^$$RWqgSe{kjhtm#4V)qD}->7_J= zVIpx#+Gtp;KL!=Liv|h?ql8YaT7x(q*Vv5xwbmz*14;ZhYhQ16;&lnC*wI6SJIoj~ z%-qCQ8*aRr&-ob^H1*sLz@zbFzM&=$m>Rz5z# zk`C05V(_v?4@g&HY68DjH&EooUg`yiao(uRx!!W`Of*hX6~;{#f*M)0ep*Iq&og^$ zyKvpqkMEuMvj|btLYkU}>I0QV*_8aEjRw>+Gi;yuoD3JbFCUu1cj~)hYHMa$G@Lew z@v4^R9s;+OJxZ`_h_uXsk^KD9!+!SD-J!&ASYjR zb>93Lv^REdk=6Sue^HXv*Do=9d(1Hr(dJYf*iXMn!-ezjn1rLZLsB{FaR*G2Tg5lFL9E{^o|9b>7kyKmWg1-7X< z%oOd=z1!jJ=2~MFt@SAY=-AlA(S`r$h4|XJV0{kU!X_*nL4TFg_4)r{TQQnzVu=pb zl+}8~z8BXaA{8)wl90LIIToBZIO(dcSHsb-p3Ry3OWm>pJH(NYGjA6`J5~>v|OGM*Gr;y5@noOOup= zbi45WusVJ!waDrg`(i?N7Mzt8IWj*FJTJ6YhJFrsx@SzD(iM z<;Iq{Ap-sZXig^`jpt)1A$o6Tr+SmS`TcSz=xuVOpyBNa9eGr5H!RmfFf9?u-^-?K z2}xYWA=2z0kU7HdKlAaN=OIkzW9sMsknaCkqKk(q`YxB5;IIhgK>O17{4a-fnuRH6 z-wAgRMAU56vG6n(jYwnun=9t$$VbcknLy)at$3pPhS;@i{!(%NUXqF~Nfg%munzJ( zjwyOJ=I)uI+YfgqWZnewU;(;Q|71eu0?iF0ZD|^`oU{H5^goD@Sp+;(9@^()>4280 z*X@iIN`4Xlrk(L#S`8~IK5Jt?QU(uksD9dtbJHwSdOS2=9P3=Q$|La zF$eqmOk3>KkFD2;vr3!I6|~l|lZO@UVOjuk0&TObugCJ8!r?rk!0Iig zC?vQ(GL$E+xASo{mS?VJB~bmpLTlRs*7WsRT{*)*>wej{fAIuHOj*wKY2!lgNzsZ* zUV3KXlf@T;p0;ro&LI?od`ykc{KGmds9c{hO3%gf?uhlZG-Ta=+J-w(c8L1n1e=ZA z#EB%}m0}6)-tTZ{yZ;Tr#R(HwYeg35(;yT2GwcZ5*p90Vgo&puPUJ!PLQvulQ6J{=~c3RQZ<2`%u##q_x6^38W%I zGP|Dni$?2+dSBR7gI~@(X4hx0Rb$OP2hf5>z z4$%G0=A?Q3p8de1w?tdaw(>L8AMwRS(J&s4W{I)y0knHtVo6@bJX(fZ2BNPCr4p6) zB!ABkG6PSRjqF>w9%TePh?rM7pz=A8O9JW6&rYuF!DItDEF~A} z{Hu=tj?ht)>f@3#``G6axx^}9J+)=9S4_h;Pca!cdGrwAov7v38Gap3s(k>ws7z@b z$0}UrOca^gRX*I=?}*c*Kn5OFm@#!fg@y+EMFDpIxf=FcV?Sq_YSt_xvK4TW1l1N1sMxzr4^G;wL-EQ8@rD(6O*770XMPJ_~b+(nukqf!Hyh7gZWJ za_RR;0YzAT>suTxcYlyQ^VzU}&#J#{-dtW9f3B_LKC4o4UP7);gMGV}l#pPrcqz~# z?rgqL5W~HBK$kh#THL80*)URus>gLH7k)7zWc~ZRJBy5;Xyt$fA`YR|jJ4LVJt29p zpa}Q<M;QvR{S@<>iz5kyDW5DQ!(cMG3 zQ#uqBCI}lKp&%h54WkWE z$o>18Bh~Bg3v&HE4Di~IizzGgq!&T!5uJN4kYKgj_2~ODb?+V#G$&9s1S6)b^&S?! zy_;YGOM0EBkm8*8G;~$xp9-D~RLp|R$K27%CA{rN0?_y}Q5!4i_XziY3 z5C%A!Mt)SEs!b_huy#V_(R+ixZhPXyzxVh1MKnBU`H7dke_@P0G1}18Qh9=#4)gpM zWYX*&EmiuHk?v*v`?#{@mL<{nLx(cjC{#a{EEhaPg8R;nx|2Y0KeibED>CuODg;?s-@0$U z?R2Gy`AoMd4tp5GqiRWAvw|C;b(iV&pi@rG>;77M6X`*j1(5LRdgJ#E`yTGy3R2Jf z4ge*@z$Y&U=~ly|4BECaN^IG3os-O=w({VauH}Cg?bKg_tvAE0j%S4s&SoCU4E#a1 zs(zu19Lih*zn;LqxnT*zd0nsSXF+m*KG4F)Zs>pL<#Pl$zRE0Tpx0@_Ny?E^?HA)R zE$NEuvI5uTW^O%KjSHJ)_dr%P$$a8kEU)z%_FjO@I#o$Key zxlR>V@@QxCxZk}Dd=CpMy%AJ%7Z%dj_)dkO`G@ooX)KW6xg6Vk_D8;h_m^r%M%Ia} z!>96qnN_pvtpG<)A(m-c_wA5p<#28GF{ZB?M-M1}p8-gPj>sFyH&r`s?v_{_c}y}fKD$R~dnMO;?9IJff~^MCjC2KWPJhdYrO@Lu2G0wh4=Q}9DXd3kARDaxQ8)$u&p%khyvSg&ZKWkB*1vN|rT;e2skHa|A{ zc#ZAC@bcSsz!ZPy6~v;Q9unYdNpU{v=^gssbge85XvemQ0pSB#*nzE!++SAd)Ry%Qr_E@?*wj_Iw9%7!l2uSRkBRHE+-6I@6#eTJHYy+66%Wtv@N6o@34u|Kd? zI`C(nkZQjt_VEdu1X+SJfpFomuKDBj=|GpXzy1SxtSQ#^LW?hMhNLXow4A1^9Q|9R zfhuvJNhN?NvqZR!;HlQx)tHbWb~0%nRe1`IY93A`7xU@2z8-qE5+yILeoph}av9Jz zMAFf=8I-RYivr}fqkNge#q9L*@2ih$IF8BKdL3G98d-ok2N9a&n%xeYk3RJ6G9dqX z_26y#J^p@xyDw02q>;1Z{hp@3Ic3bOoR7yprA+itgJ$t_m*MCA5&L(KY$Y5>7k9ZZ zL$@?Z8b1j>qNlANWb0w4A8g3|nUp8%mkohw!Z4};pV{=_vIV%YU!b#N&VN#JZG7p~ z+_2$y*A5BM+q6%RMq#f;rus+>!7G~JFT40x*9L_}G?GjZ(=3EzJfr@2S#5ssL1P<6pYT^pJcjrF`RWplGCctOI|fZF)!XG4f$Au9?ce+a+i^Z7ndpYTz=ProRmy$%IC27vaEP2u2U7ybh1!{$3doRZLNWCYr z45)_vx3d7{B(H5%nFmkW#%5Ose<1w9n>+ZxD{8opw?MT_sB3-GsW&={t`PqJtN%ca z;tF!$nUmXJr^D?VI}+N>dOs!(jQH^3{Nvfa5N;ors(Ho!IXTE@h!*0c|2oA+;#e;D zSL7cw1PFfX=*x=KLjMHHo~77MeK$0o3tgDQd_UV!|IT5_Vec5xm?uV!>3qYMBD2-+68HM>H(+^k zeyQvf8$Sf|N}pwb86U3xsLwG>9fiu$$c+iXi{?L!)^=n-E)}ycLWe?Y>t&c32e>~k zd~IF+pdDa$FCYKHefh%jZ1ug*-l=mej`q!S^C70;?tX~x1W$AI* zHowEV1}PF%2YdBAk8BrbQ7afT?~_Kag*-L9?oTRD(yds@>IZUtz|7{nC1ui97D5LB z)fr}N;!XIXt*;zLQ%g(grFwXObsQQxp3kLvhi~1aOp^ZDT(cOt-1YTv%g(b?+g=%l z+b&cL-2x!`7uT3f?M-eSMU=`#UW@;rcg#h4%Ncd3 zF=H&rsyd*v`+Bvu2kB}S@A*rbH5u!OW;(W_(a>TI^rN*vo#}UDz?VgCjow9d@5PA^ ztI75B3uY8U74x&E=MPr~2du&rTwA_({d!&UqUDZ_rcBF&#X){0zu5if$i{$Szq;Ga zVT)zM|Jn!MZ{D9rMeMHr`xmOD78p3&k-c`X@iqMT)D!stdJdk9Jqn77iHVA8#o;=L z#FfJy)^Ywy%HYh4*08W3!UE$AdUBQcnya%ulbDWcRcy!x35MT496vn|t=!lz9~aDM zP#7Bu-x}>oWqPr-p81Ekb$EC;t@+dAT>=F(Y`YcDZ8JHsoL;%l#QkD2d|&_3V5oZV z9r~)O!rT?GCpCbx!hG7J5v-prenAF>KkODY$q2s)(`X31+1j_5ySMjjMbpyNzw7U) z@&NX~j`kM|^FxPv0ow;Vk7Ami%eF6KF%3;_b(stMzP1SMXHCu_6(c(nU-*hw6;Dk( zlSQ@fsF20G>eZCVu3*!vpVTF8?wkLt`F73Qu)Dawj_iYuof9~rOrq{k&w%A%RR zmxR-J2O`)eQrhnU@88Yov|01S?>k<}h|%1CeAoHaPPs{KpN>mJf7@WN6B+SU@=ddj zpTNQ!pUW$3djsQsg5Al9_3nzbQsL7qjX7n0CXt z`_~i_OD?mE0v?s!jeX=PX+29o{8j%uqg(QG^LS9`L`@?KqyhWs!7T-28{#U)hQk$k z`^9scZo@&W7X@>1Urzsn9BTXs`|3^!50(6x(>xb2P8Yp&^yG;!d5q;q4D7}duWS;O zHef zex{qD|8ANzS!GVBui7;R5&6!7H=me(Z&eogrgy(OT4=7o*lWMhP$b17=sjyC;~vnlCMCbxUJ^YT~2I~0@VAEdP4N0UQc(}FTGEgLK;M`+)E(;S$|_pdH$RGq;nz-K%Z#$9RG(7c7%2_NLD3%zT$U3=LhmIqTl^^T->@U+$nLaxqk7mI!P9ns~a^CDMu zp7Z=XUzw$VGBEWu+d zlRTyUnEW$&F|+Du3%KofJT)SAmH}y8s=GUshE_xCCw+m)vFv5+KDhyfJ%J(NP5-$- z&_yipipCQlc?(2Ric)+KzHWy!p9vId^BkSs25(y}>6g+-TE^XdLV*Bbb=o{UVvk9A zn#EUHYksKg5igy>PUTECRVIQ;SrboLOT&TdFz)ulR5s5?=rLl(c~ONnzudVqT_#}3 zIiB9-%r&(DmFk{|npdnXyD;TkP*-UGVIm|C2eq7{VK|X_{c@JqNzZq1NL5aLwT=quedma z74=MrjnHTml%$x+C5iXmsQ+<(5*Z(}Qs;~Rh9)UO$#uq{&8&;ghjeY*M!p4xo?v-l zm5VH=Z7X)#Qb(*xtR&EV9&1(kp&okD2ta&B=Uu#9Ha#yoKFto#e0(kD`0r``Z>e z4u7DGKr^5=@V@xQ`%$3t1}Fs7!2=n}!_R!UPTFiJ`3MXf{nmZ*fts7=2QV5wjG`Ez zFycSIKzpeot26N#ILr72RkSu=z>Ei5T~sLPR(m;1%p7X*zxsYF*RlCh@t2489_L{M z-XF)iBOicFR^+L#GKB76N<7*Gr&CM9Pfo`e(Z7M>dkn4XWs5(vwiMG|-Bvklff= zP6g;NM+swn@U|G)^z!di(-2J&EG!v^kl9ygoA z2C^38^64LbPe^Z$xDizf!KwIEDY^4O%&LFNmRuJ-s37D20cj#VE4@f*6A9I*{&u{`9h2)6tJlG}dRm4BRa?~fo5 z*zvC5Se)^}gR>v%LbQqB)6BlzZX)$ANju*8gL!ft6(0xe%4tZi?s$KtlsW!-O0~sA zhB#BK`F_!GiN?VL`aPAfb7XTn*Sj6(`Ukr>vrScfnnrNX78`|HVHkGJG8jcHH zufasgLPVEoZi2oX?`p#--;e$j&C%3LpAfnfD~g!g(vjpVH{AQ@yMC^w^L;D>f_+9c z-S8#cVIE#}EV5Wqr(c32Bx@^@`=s{6(~#xctDQI43ajwDY?|32cg4bJ z`vq9a6$7hJ1&2qZJ!o9Qk41Z~x68j?ZQYC6II{U zp*BsSWza87`9xx)J>-q8+%g^rB_iTy8wR3NRY{C0O;HK_VahicJ zup(zSS{m@7HLp+VA@O9Woq>-$zawahND#DN=H)_Sg^H&tTwFk3?hmUa1$6PnzlPS_ z!{;0AK2GEaE;fWSDkj#=-c6(c$wU;OP+&P-6ua*hfV)y1_;@g`7I@0@`Fw!y23WvC zQ^T+`|3Kp5g(7y$pRUXT!&aoVRue9Sq9EyNai$)DfG>Z({PvVFV4BWR8MuFP)^(uo zvgsHLXv%MmtJa0p@9G=|o(x=G4%u898a-}fhdnvb5eWG ztbCa3xPxJhU}Zo~%&Bmd9Fy3@D?#dCU1^(-N_fX{A}t3Jl&~8cC#yWul>K8nzjhRV@I10@Tm*sJt3hkCGhqW(4d#vciQLJ7X)r(;aH9 zkS)XK1O9@0f5!Y9fJNu1_Tcro@z+BaUR%yiY~Q~Gu`!2a6)sE5|6*0~@-sfWOTC)P zL_+*!0cLMqFgird95_d9U3u0~ruRyraI)(T_jAgL3(z_M48 zDoVf*93FW9KmnZy#6X3h7uEUOEF>bX&JcJ&%^%NNV?sI#GbI6M7xtP(OC)xFquU5+yNJ0vif z7;|qgnt%E4$dLBG6xzTvX3+MGka#bfDv5*dziE}o9)6MM5U1;^UpGHlq*2B)fQS6y%6il7-`68&p-^mRxJcNZC7IDVs0iwWe?=)2& zqMH{oM93Vj!zG1h9*iqz&jaUr_JcH7CJYgb70&?1bhJ`I3=2MA6GxH?gxXsZnV|Y9 zyg^#vbq1u_{n#;ZQ_?O3RK`j#v3@^63~OCkJ(NID?T&xJutp`xitZ#D_eV2Hfdmtr z<;+rXAF@3Ujz3udhM4zVPS$2MxE@+zQ1?bKUceX~)CBNFSMu2*{7(g!okpT5ozA2u zD|cM$i^8g>^jgo2N@Q{zRFXQP6hRbEp`#&pyf2}}2eKYB%tQ%36cQE_FyI4DH*(4) zpd|1*>6>f7VLo!o$%Zz z(Ks<^>3aDqs-P>eNz+Aw@aXOSa`p39XyFLQ4&fa&VJ=4PJR9 zV`MOMJKfTdFppbPzdJd>oScv{d|jgW4(a1Rd_wnNx~lVgXGX#G#ZTOoTzpaT% zgpR957aVMkIB~5WE8?9kGZsqdGZ<7&6W1+ zak#(2l&26-@ID(S$#3Rf4~$soZtHs?Gd|7pd?)CF?01DGv(;tBPS5KT?GaB z*%Pm9^KvepQ4UY6JKl{;xpyST@zgj!Hj3Q{I9ozX{YWr!r?Nbcf3-D<=qB>%&Z&kJ zYpJyPpb2PmMhKtGOjLv$S`HH(<`|H-@~IS$WppkI&aU@eR-++~o|tFHj?S>L5z(tL zhm9|sM9zCtmX4$bsH<Ez3!VLfJ)+|!FCuXs&?6r5C&u?!AlIJ4L-+Op%*Rxal}3)A zRlF4m$CxyJ?Ye8-Tn?rwo=p&u)~oa|5jL^sp3c+K;}%vq-zO9FQuw(!w#$4tzJPj- zYy%EI5Mgd}uz_!eN56}|5J36!(_AM(yoVX=Dne|5Ych=Tz$$ury2_RMRCXgH$vsxX z@CeH^JkuKn*}Dl89KFc71*~|((fGLu69+Jnq8*LptTCrB{2O8iLe9i53i!0>Cq0hF zzvG{tZba;cj9uuhZ-fP*ExjjNJYniqj6WOd2~MPeDDx- z4B`gDx{LZt|CIrpI*u(@I-(x8o|^0&T8>otkt|}PfHo7(yi#gu{y6il%~CAa3naOr z>EpN5Xkx6rDz$wGe0foPQBN5?x z=`5Mvqy4sETP0F*2JnMIPVzOhYSMum_vVLW^irpmC&OhEWs`UlK2=B&Xyh_9-!ZV_ z<6PL<+|Fi|Q$zFHbIP#+-CCEPzZgowd7a8NinF3)hiRAy***mM6E(yofe{XedP61F zd&F4(<~q|wqgmG{0^6%h5Vn<~)JN@8JROhv@F{>TO5If4DQeo}yLG9~umrU=^A9Dl z|IqgbA03+hf@G^Lw-;)CW{6}Db=RE$s5p=uB!O{MJ#pg8{d9;uRNh51vFnEYR+P?=>s9!P(_7F7NnN<^KU}*4FnS(= zWk$($?P%xPW>6E6v9JE3-r(f-I8R+J(ardRpV6{?0t2#sQFZ?;xC(n`3|~Izdb!1C z_6}WScQH(iQgOtV^09w;vwXl{kG_$VPW=RC9f?3AtgGf0eoohdul)4sbQS5?Xb{qD zau#AOvG`m?m@rTOV&6?v(tK$Kr&asqSYS=p9SNA=t&oSEN-UeOr{|j&tK^A#bv-v= zEapah!w;Tj-Gm#&)em<8n5PrSYX{-6?WC74Q&dQ1FFC25j= ziKHBStu>_5vpj>&am90z8k0Tns7kyN{hMp7_k9eQW6Mlo;eBdyukileKy{U6dIc1#*35<^7}+%aHciClc~z|eu3b90D0g*jUAA$mWCq0k)PP8AVl9y@oRi6^My zCxvQT-DCy>_k1*I9W?m z+(DPEP#5|CdI%jvj zHzySd@P%o>PI)-3<1LupNbfcAhSU?vl(^637ux+ToO4D+5aIPrS;qKA z^P!5bRe7~@+|PutO%?Jdyd2>@#=c;86VyvQRp*VXv}()a@Dl9cAPs}i`j`^>Qk)TR z6TG2uKPDXZUJ3+{wf-Emd=r*LaCk?Uyh5E)l}rq!m76fEr9pL!rEBip_<<|~roy;2 z$xo#bSW+TqygM}J8q{9}ed%!h4TviMj2*2d;#IBittX5Bg}goeaUC6_LGkk+=5x3z z4MUosX@Oh1pnoyu*74dVXi)1rp1m0wstW-~mJH%LD)O7Rm^_sv`OtyesL%XtLm1M3 z#Di3ftT>fB(HhOH?=*`W9cg5|r*?^uKX#|;(53Gh*+l*AK+Pt05LSss8*Wkuft`vS zH#CyV@CQ{H+(D{JlYy_RaHqCY1$CwCRI?v`M_E}#F3Q!L0>9jtVD`{@@HHVMvGeFr zhdTo|hr3y-ddYy!ole;+M)m(nXoE<pmj|!)WrI>+*&E z(pikzSSu!6f5~d#f3*D*SPZbASxX$)CD=PId7E0!6)px$yjYddllvO`k#4dX`{w63 zeM^NRGHE~jmzo?aX04G+_^R$OfohW9Z#eexdvMENzMDjOQAB)T5qp+pP=DMwLxGVt zOVhJSxyzKJ^cd{=GzZ|o?-(<&QegfGl!yL>nF%GcAGzEi{qZrzgvkMLxr{K^;cI5c z_NQ=!GMe9bls<1zE0z7T;ZJ+g2$DMfx85sT!M#KTiHYGT?h_4f>HxT7j#X^Z*mse5 z>h8gmpN7|o`gc~}C$fM2Le(`7Cj5U|03ep>A7fnZ#{2Rcm=)EvC>lq7!&uO?&G*g+ zv3W=Jy|Z%P1bEJiAVX5;oUv3kd{Bqh$8Tx+Yma7}9-ZALeAsspFHuiAann8AAnR#| z^WRqOQLP4{G@#M_qmv)yq?UNoLUb{+{u+7R@nRg-_6cN5OtH?0LXNRx&CUM!Z4+iw z_BTp<;Ae@R9bm%xR}moWHT*a7-w;VD6ruCR(UPHECFa1*x6E|v>FC=;P(Le4DjB@% zW0N2XPSMYhY|A50Qpz#3dl|~+0mAm1+z7X+wm$*8jM8gAr=+5wvn2CGF?*5TF zQ(Z7`{|_zx)kr1~V>Xw#Pk#IOQ)mc3Kq+HDVON z5eq%I$YbCRk@gCSR!+FacQk(WQy-6gUwMc;1#I3j(}xYp&5k8ib^`KqfR*%(t-tw z@~(H9ClRuV{bYY;?htbYdYC2lUXtGW5B3xMljSbC<%K2&LZc@3PqK+t(7BN`iGR;v zyrHghJ`~1~foEu~NaPOsmE6G12Z1g4u*Ao(-eotzX!mJ6cR8E#U{TQm$9A^%DYcg2bf;(m@L2Tt0hZGN!c(6R2r;W0RF z-s#=j8ol!(R*=V^L6gkrKj&-LG&C`F2OVekY!SETCQ<#dk~QbH_Ot&(sP5PHF-SE1 zh^h~w{}u@q81|u<8YA?aOF5VasnbI2lGL@b!OLqOG}RJ1<~tt*eq%UiiW(n#-aD3J z$ZfAOh;a8HUmNySMWX}WBeI1 zdiATIuMoPGM@nMe2)r-C_nhXm-#uzO7NWO@-rX8*wyEuA3EE4 zmgnIVI*`O=;|vZE6z9c9#iLj&?OquSy-qb@K#LIW02btvihOi>$-N?b3ni{1(GR74 z2Mi9~j3zg7TAQfhSFzWkD3gCM-e9*1NV~I`;E&`F2P@`5#$w3fB2weF3%nB(ntP=J zpZY=xO=rY*5YSm-PC<++S`5#r8jY1RZ3-Z$wuTz3WQA|BG*!y`PIc}G*N_GBt%KRG z6!!J|bwG7&YYb^TpFVn0scm#ji^s)K_X|zPp~JwmKb@jeDisqJIW-=*68hHJ5uCZ< zz%|Get`DQE`Mts+uSj>*&mJlK{^tmd3vLx3c)C#?&O@K85fx+_bmQVGPYa}NfXuNx zl+`hn%EN|^Od*#%jJp*vdj()B(&o0dh`L^`l-Qsfw&i3i5REv1SJ!6EU!E(!4K%^b zsJ}mmX~^|4Nc_VXP_C8MWA|SiZA$X_yrlfJ^|f?UnIHF5^k@^P6K&EJ#uM-ls^T%> z{52s`G!pmRlV1Vb&@`R=sg1;~jr$^@V!o|uf2D%#_?o~_y^Xw!vTz2!SRhY}2oJ9d z{sS9haGL|{{BjF{GI8FQRA=KeyS2)c*0;YBr^N=$rJS`WBO&ioDw~}Gu zEXkF8d6k+>Gw=l)OQPxIwm|A_>e+B+389YapD^~M+3noF>Ny@86dULXC3Ws{GDM66 z6Xg4<6x`E+_x*;ibZ)aMp^3%`HV*31GAhN?zRrmPUnkZYv8JHdQ_2e9;*b$5;M%lL z6K`f6_ZqOy(o_$wk+Nnk)h0SclVEKq8KPFBIJoFxi1WJn&M;S3G{A#X*-i&jA& z_L^|(#oQzQms+EYucTAK2h5D?vQk=Of_m#A*jFdo^ewnOxkiKN;4bd#;Vv&3bO=%U zr7^wgFFVs&eOYo(%i7Rt@l#t7g2nU}awc4U_o(TqLd4UDi&`yiSjvoEujw{2V^ZLvup3`V zTI})B?W-Vb|CY{aue&~qN`!lAtgtSwcqJRdu}S-kH_^VrdFuVb%L^ghn9#(9kK^ZF z=gqPPsdS&!ay@`;2uSq5k^hJX<7x}|mxjc-k|85OQEDx7qbVB_C@>f-vKOO6!{0ZI zqrwrj=v2y#CjDat>|b@ki|DtC1ktx&0}5b?B?&~n3k5X3c@~A{()c>8Of+iAzGtT1X``P)LnccD8|MrP!5jjuSvy_~Ny7`PNX1a0f`gT+VBUix@!8)aAqt#11 z1sja^Ag~X!GV1ui+#=a~jTu5LjenZ5vyj?-M_7C2?R7F zCS>#pa_+x`nUPM}WOY2#*klz5`g<`;4buP<=}BC19x`HmH{ogC{4Fu?Jb=0qO(C3f z)5z7x*D`DN`ex#Mf}{V0})*dX>uAyMRvu{rI*ngllBexk9W z;@`c#2&%P0@3&72Vy$CQ%AGS#oRz5hW#Cuf!*3W*;2GGwgoQ2TvHU6ZQ}I{H`g4lR zakn1SY0n0>7mP4q=HwHCx-qR&PGh<jaADX3_%~gOZWcBs}%n({ntb8pc|0ccMNR{LVE#hVwGWx(N&*dOP3bU?O+YP z9s{U#H8%;4@T^b9!XZ^u=MpfDG;}g^jTJl@fgUt;V6n&_&Y>E5$?h1Q?LKT_Cx(H+Z+rz1@L zT`?TcS6;V2hUTjG>D6yrGSAXlN|p~L)SK3dEFMSVLk(P$4Q|tN1q2rjBav9T5v#pK z+OSlU*kcDH_c_8YIsFbd58~xk8Bv+G>_2v04)(EZIUAEHwa_TRt#_vsMw1) zFdNcWQQ{p9l7Ja=SAPFxw)(`%@BQ)Qzu}A9_W+HLzm^jW(Pbb_16Hjsm<0(0Q?S^U zFaXGvMOgD_3n+h(;qK3PxfAKIF78NShuJfBq{5B@Wkk-UVa0Vq+19aR0;9`L+*s9I z>nI512iInxa?7JQzo{p3hp}>c^5d%9R1oekFb z=303IYm)6#wj5Fx#;0{0J^MEFi7Hxr$NF)8I-(dy0!Ceg$=8I*?}YrZabu7?CoBbd z8;3aJGTME*YW`` z57akiJV{=XYM_;4-P8GkF^0gH*JGK)s3X0ZOTSV<%y%lsp`uMn zj(sUUco5)fY?BT9IPSoqWi%_txRde+DJp}nup@VG5$NP zT)18yBpb(t=Q4;BEW7fzXY-aUpzcTDWH z{YKMw3t$C3*`5ZcdQ~ilTMl8I+=0&8`0pnp*Fdqxr_?sT^6NQ_gFFkw5>Ss4+Uc$9 zwHNVbi6{#r!TAt#KF$i8RBy5KN6(m|%f;~4HI<+mE2MrNWs*7dl8$jCBwP+=yiY2M zs4?7XmB7w|4-UD#yD?w4IlZ2CX9y#u$&yqTb)1Nk_DP^Xa#8MI2w6%Mw=EtFmX?H+ z?sDzD;L$2-_82=j|W)^%8B(JftDD7vW1Q= zcf=Q#l8&Y8P818*W__3CiIMTQx95|Wh2umf{H(c6d`*aSL-f!+dye!9Zg=i?2qpCA zWGfr*kDTp?a@-bVJ&fD+$~mI)Ds`7t7t&><;vM5{bIz6{t}`e5VGFvN`{<9D>M@Ak zb;eBl;cDIUNTq5VW--YVd8F?6jQ)&qiQ6%pIsB^U@FRw!=AWS1eQ;&iHq6n3TDGlg zc!lZ^jMcjIXL>>-#L1dPcF|;MQDSKUK&H(_Cz7$@jLvpfupHLBdxJ*E8pD3}*W(pi zTlJp!xx|Zp8r{^-EGK@_a$zjr>y&&MBYCcou&FniB(NJVV+B9Z>S(hi9LU0s+&>uHpXS&IDNxLVt$toNyOnz<4NCL*J0B>?D#^tnzG2k}-A((isIN zwr3g1GWrR$2>ID)k{vheIHP4~GcAgHW$J*lclh6}0qpi~necv|z9aQIv-|gw?hcX7 zp7i90Asfi;g%pIr6`f}2Nwc!q9?X5lT@ze7^K!aJo}>U^lp@bZaD-u;GRwxA=r3;S zJU7*6JxXM)eSj7{vh74dyUbkwGP66H`6}TRk;m=8- zL4HpI^`%pj9fn7Z@BIRQQC-HSzp{cmlqbF^7n+){;4ZWrj?Eu+!H?LG2#41*08Dz9 zB9PXuigO~1`eV~lLcS;r3DU#iS>PUMfl}@BKPPx{i*QA2s5;9DVO;qB3vrS<)T@1L zJP$1|dQ||y+i~l_1mGL4=YH`1e4-h~O;EvYm?jT%|< zl*&g7Mds(_l=WX+HfXxZ7cO4#6b&SH!;Va)$lK4HXx}kTUahR&ny~04>ebN8;4a_kFOK#B(c2bHi}P$z6pe zd}cSmcF{*1&op|GMF|Xlf!vOm|5KlgZhiC=O}=toH~zSNsrY#E9%{ED>;r>qE)?Q) zO_96ohRQ@cn@_PJcV6)>@>~445_>=2M49sQDyOp-ET9y^ZPkQq7=ucFsY+OZilnH9 zc{J0m{e83^y+SdB>*}S0!lAOkkE*108+aj|HspulGFe@-3&lJeFBmK7^^~86QLgFq z@uRxQ5Cak-eea8A`~BR~UiOI`7A^Yl=c4$mj_=G}F|Q0f>Gwueg6@nsDIqhQzflYP z$7c<1nh%Cl89DH-aW@$8F=_aVKD%Y41DT!D^JT*EFjJ^5vJv63U=26V3M(;PlTpJ? zhki1j3%=p8As@uw8aNab)5{_Djtml)aIqBDe2C|$ z;op|^Nzq5(=&Sr)Jw>bjvk zjuey!mV$AcB<$VE*2A)*@$YFlZ{ejM8)4&Qw>uJra+8+X6T)88s^A_sd%-$VsJOfY z>3rVAFZsaS2S$K(e(STP1b*_&dUO~g{Kz^p$sD7u$lRGAlT%_7)oDdS#%;!)N2u8# zi@rkTFS1j()lw&@3eRo|#Lm1@IfwXsBK3Ph@6lc-S$?7AiFMBtZonI#SF!l?N89rKQZ&5@ZHRoQQ!oc(52}JbApZlDK&7`CDH(VK3Yl zmGaPkdL4eWAA5)#gy0^jwx=pK$q$>NlB!>K7Ie)w#B@Wm;M_c9*cn>ZG!dGeo!yOT zu6*ED1<6i%-RNaTiK6z_}A`rk$Qu1`Ivgj^M1Jm#<#1)@PEh10?sa(*ds3VaoYX|C_1rK+dAJ!wg2tu(7xo=h z?N8(2`*`n(N;=1X!|L4$kH;?I(pJe&&AKqU;1A%LAxyPkI{G{Zyo~$O0i&moe}?$J ze8sNPxpkcukv`m%Vj?Vex9k0kki9&t_^L0%rMA7~kB9jUUu7HaZDJtg>?RE9j6K>b zqQfSL!ghAOKu3LKQoP#r2b5=Fxy2W5Ob;nxHJ2#Qiva}5JNMPcHr{N(Hp&YGCuMWw zU#Gx#Afu!OX!OO`f0VbCG%tkio{Lo~3Q#sVXHRXMC0!3PwCal~_D8p{MO99FcfdKr zVY*N53cH>1je><5P&dSmo`Hn3HCz(aU$%LpW@6Jk7G!iB!CiC4M_%=svS3eof^1@| z)g6L)vSGZNGH^+ldpK;sT@FZm_A%ZfqYjX8tEXhR@uSuo{NgmY627--&FklsQGB~4 z=R>Te|8XD@o?lU)ijp*<;o*HQZt zMXMMt>o&M=EC_Kv<~qK@n2G;MFPn6oLA(q=b9SCNEYMn!cM)*TKRRau=9UVw;(ZuR zTf@6Iy(K)t1>XwN<)Mz;HnD*xGr9M84eLj$EN3!bW~_@JEQoq4S%5$ui;krXc9x~$ z*`Ax3HtZoq`ycpW_$WWt!Z7064@j+?h$M|g3N=oxPGij&s`DjcnW}+2noB*65#m?5 zTUfzxGOtV~dXIlQFghw$z=S;nwHa(q$w9N)!RNVqfzb08BP)3_!^)t}tPZw#)Fgrm zF2H-z`ilb`75M#Il-l)YZq2viaOuK4vyMQ*Sq^G|?^fh*%j@Bb=;FD?D`!O{^%OMF z{Z40J+*}NU9U{rk#S8LBnrQd=Hzz*0zG-=8B(VmkvVv-|L8@H^X0NTodJ~=?2+u zCgijSlmOXVW2!n&zYWku1NSuygX4&+V_U3j_UNt_8+;is%S0pCqtU{$LyF`c+gP>46PcMd=4Z5nLT%SLWW9X1FRQ+ z*Uu<)#nDDBZkqS019xl%yxBsc?o8Ah&Z$-@%1^N!FZKxMmc3&by@lgg{4iMDJbCo0 zfO-1cw6b8GT3Yi7OBI3?6#j(;k}6ph*qLOJ;-<{t%~%Tl&m_Iy*M_OrE|GET&YW?5Z%1>GbI^e(p;rn~QD%>CrH@ zRSM+nLNc+FC5gp&v!BVK%Yk#>SkY_1Ln4)6;pSNw8wk5PK&j1tiWdJ3CzRxhIo23D zaPmH{bXl2aX0(POZ}@hi_-V$3#vWRBe_%gcNWCPoK>_Ct_Uxt-i zB^qS9m2PP{9?!R*its0|Z>7;^vF<%7s>oc1N!ukZ7cxs9FK)`*w?~#=-T93X<1>3k_KY3fx3u14jjMzeO zTj7TlIl@+qPO0!Z!r&e+cpZ#T1Yr@R>01{G(1O0Y?N{^Sy;q?{i8iOfrCTs6O3Qq$ zHJr1F3kBWW7{j|1*r?EFD)Ismnx4dgXLJZ0z?c4i3pr>g;%H%!@DS>tO$<6mfbZY0 z;YerLv zWiZ!)@bWzfCj1S`XS-=F0(a2MAPj~cq+7d(CbDvGDFXM$u`m!V#gt%`q7IGg1-$8p zGITxXt0YH+BM6S)c9u6i5i|e*AOJ~3K~xME7cY|R*-~i-2{RNp8YQ&&%S550qAqP!5)slf^Qgp-;Oo}{pX_|@V$ZHeI^1e`Ku+~AoUx-L*w`M z+^8?rEU63vSMADBV1eKxAh0sv8(wAb3^++)xk9XICWs{p^i(*n<-X9-}&8o=UH z;NSrV8~9`pm?Y@-#3r!pA*uRI99UCWWi1*_DJJlO+pxkN@IqbS;=M`WC-#8TIiwGA z;BNr_XChcXeF|DnfHUy>GZ(O+PV`UQ@9MUBORrh`=Wr z2NwKoT_2^7Veu}oA7z+wCr6URk}eL5w6c^m{cVV`Bfx%;5YCWTg+4t$EBqQ4_=T!C zTDnA9TL{i>0y71E;2-{;3adgd_zYM(IY@%GG3eYG@HYegLID0Tk|Dy83?NY-7Mvet zDmbp41AOH)Xr;i~g2f9+z<AQ{OS&!-_=0;*_K}k z_A>Z3Gsk}seHT&ssulvwT~RW9RN8~(JmJ28zH6Yq$bgYCG5Fqlmb?Cn_ME$QOoA^o z7^yJa;aY^~jwg~3d^_U89bs^e1;e^|KwUUpu((PB(aM7Biegx_qk+beIL8t=@X^W8 z!w{UI!Q*%?DZR(ZtFVV~JP?DP8uDuyaHGZ5h`z{wFJOG8F!W5eLD3fi6lgq={Y!Je z<$Fi#kS-*6u4T|(f&QEU@9dE?fwyV_0|S-_UpfICPaO@hU=Hku1tqE%V6DL;lTP!w}}FMYnvz^+&03uzh870l3~EogM}2h z^AxyGHX`vlLU~8J^&cyYVF>|d^?5a%!IJFN(?Ao)=o^6lz!b1RuxwwDWb{Y`=v03m z+CwiZ%c9%{duWW3*)0mn9Qn|4FnG2%~_A|=<87H5DDOork09r?d^ z>;V^|KvVUGOaTMy1qO^u7Z`()1tar)3-@^#q}{Ab>Dc8uW*Rms>5NR+y1)Pa)>$6hZSNU@k^Gh+kcD)HVOK2RPVNf7z0M@{ zH9sL7*L_7$9NEANqP`XP2+gX1!T58`vI&V}SsmJn(9(JkN3zCo9?RpePhHvO4l2S@ z9_+EWiJGCgr&`uWV2d?mvAFB{%pNc@U;W4FEGF<0`S0UYEnt_! za*dP&Wmu*S`stei|7Q}kuwOdy7YKr%dF>?R-0*Z?|xt!}XRN$utV;nXd*oLv}kF+cVFO4fZ%}1hhxvOz{Irc?ZLljv5Dca67ohtgC*#ia+ z%r{)U2y38f$AEDLiDFoofTnL6EMo8xtld8w1KvCT*Edo65Ht+}N4qJxcYHW~m8#HX zV8KX$Rex3vObqzKfje4`H1`k;F{~X?;Fkcu4_OyD5ukkx%S;=k;Cma70W$*2DhBj` zaS|9kU>O8E~y08NGbuMsN$MDU7e>VWL z(;KFbco*=9HXw~gqi6&vt3XHF2q!=N8emkOxec1YR|kEv2`o2uWOy!N?`vuRx9N1S zs?V<1hDSt4i7=%$JTEiY*&w@MW^l0=BDe9g8ke0 z@D-i_cgX;*!vVb;+`wU_XZs-bTQd2@{1x$DfZkG)%pZ{8lY0tqtI*4*j!trr4lPKG z%oo+@lA%{DV1?jLcFXs{4JI0Vp}jfu_`z zV6K_}1?sz@5#aVQ8-14ea}b_G{3^14W$gl??@Yp1%71D2SKzl+^6SD^TS`8!(e~Y{ z0lc;FJH&cVhWTF56`CF9{4DgBk8sk1FqrYU)7^4Je8~~+I2Fy**ZIMK#5ItE(9O}K z6wMr%m1v8=u1Kh=0tv2S7Q8eFeDn~^QuNSR@YvAcTmWkvb#NdC`#Gd>wiK(GHj={v z^gY8Tb42?=Rkp<6ApZvWT7PjZS?40SqA*; z)@>uSMU)TEx{mO{r=aaNhK`4jx@Z!ZlhEcpJEg+|unYpPXdlu_=a5#z60~uDpUnB& z1O9_kz@zJHGXt!7X!!D@{_GQ2BjmrMpC8;N3c-bjpMe2$6IMYn=xqJQBsG6S0xQN~ zroyof?Yk+zY6UCy;@}Z}W&plu2E!l6@uQY_aU0s8tpn^1P@xapy|DrB7vXo6^glPc z{>Zw&G=aqEo8T{z-g{_;us zun>JKi@%kh3SQc3j$_nK>BfVm1JG$Xa4>sAWo05mr}Mx|sh)1wbSC_5hykBPiw^Gy zT!@5k2FgL#FojfiXUIX9TRHUGC>g9ke_wV4!uzkQ&_aOsCqIX@l^)7G1HM`N@+)(* z-Q|n4mP3=!EJNSBBs5^~8+T!4g3x&RF7NI2# zokH*-V?LAhi!59s&q{m?xziEGj|7A9An$hrcO#4f!Y@!@6rLG-h5uUbS2q5^6WG59!OVS2NnDlNA@VEDM&kDJv(9{mOJu|H zNRN(AN`V=H*$HMwO!T+wy5I!&szvv#M5ds9lssg4P%`QeZa-OmE-b1_!6Q z6xcFg<-nYSX5d{7Z(}fR&`v1MS}mXMc(FSoatE zuLAtiO5Js7rhke1mWKPTE%&|8gszD0CSWR9j12h1^0R;Vmju5Z@MXl_PG#t@V*Or! zuo@4zOX65G65N*PgxNm~QOIpFSWDYDY@buisFz`9lVa?7nrodzY-*5{0%nUdXVEDH2Qs5J0px@m( zr2SV?(7PCglU;wi>LRb%x3;YrsV0d;Ou*R^E1e1_+v}GLpK75>p6xNd& z1lAz5U&ru47iHoCe>33U-vdn{EaJhT3`-XQk1_-}7lRJtM#6tX6Qxc87rcZ}_5r8t zw}`r)+Z1v=CMV-aZL}x&wf#_pmMqqxCHMEPkkf<>--5XBBuZX+1sWsJz<@U#e-0uSB<9-IN+nH>O52r%;AMMe5^y|Cy@>=)6OqgT3Gh!_1K_O1=}HNNiv_uZ<$ zs}>@W-V3b4^PFBpL^!sA?aPj#m>FiO$0B8>Y+nFM|KQ23TEY#(2bL#QHTZv4jC+Dz(n_*o$O>SjvE-M(F1O1dg3xH+SSN(iF7tU%wDoHX&LAn7g3G z1@3yY5!h65CvV*-3V zHv7(0PB1&GxF|5N77^C?sGe|rD9EOov zN<$Zc0ecR7x!zC$dP9qkHh3ZmEE%j#y8G7#uo@AeXXyme;<(^5aom`+CWA9I z9HEZGq_=Fhgo|nyR*%1F-BL6*}X(bZ=kBm)V?4nc#3@UU-Vn+9V z5*2!v4kGP7M_~GO(*qri0dor$n!sEl{u%!@>~~?XcM<8(B?-|q4NN%!qd_MOSeGJM z5!%;LKC3qydYf;DgIE@EhvHYh2`ln|p$$t4p~(ey_}i-vjTl^~4ETTSU0rV)SrT1E zYGs5mEf4_#HiF;~B#?L+Tk3~?nWuFg@)P{h|NlQMw@y{vs(Wu^W~1zfWU#R_I~uJN z?26I1pFCa5(QW@ zz~X@(u>d@*3g_pZ*5~5o*+8>Xg)3Ky}^`bz9q zdGL}5Fu^YSpFR3^c-ig3XLy19Yy8jdu?pBr?03ce8w$OGzDj^MLV=?KYz#TmZA=`6 zFONC;##^&|674mzFF`P9Fc22(SAjVy!T9>9|ItUH!S)dyt$<%L(OP+zfIc2A%jTv*F}C;ay7Z_!a^8WPS9wibUe7| z!s_dy{9wSp6M%7R{=?Qliw7Dl(4Pt&SXUVEXgEv|__KPTt6`-Zgi!&GWy>SK`g=w9 zEk6D_=Nyw}L7IffveJ1sHy`&6MaA2){`Ln(v z1iUvPB)LED#_D!G3il=XcTD^@Mt|x496qPfeHDTm;0%!hGXiVh#v`L|Q^H;k!+_sN zX;1nhxIDo>z;~w-0|p0f@D<-SdWn{mb>J`GpIdu}Rw1}0OSG0#az7=wqL`?k~|7K5A?lXdDz!FzQkX}1x;t@x?>0qKCCfF z@a#wom~+6JX@^N9IIyN~)Q1%^*>5BQ6HtDAOUpRE-(by)rkoraN0 z@N3tQA_pcGj56q?ic%MmR0Q7GDh{c_aw2dY8E`FQNJ~S2i<`iAJvOZVHp&kG{*4S6 zV5>z~0OO%5z}^Ghw*nk>Uq402NhHX>pDSg+iocctpR?89!qvGd9H5I6Np{463OOiF zbS^O8Lv&zK&lTbDh#BxmuFi+E>)^=!&+~OSKku3QhHsa9A;5~kD1+Xw33t1_Yu^|L z0^BJBUKj}&rGppvU5%OhO8w-9d#{B4hWj(Xmw#Hx0a{E~4u130QJN|eJTK4q zE&WdjwxqXb;>_+Cy)}Ap6UvS6_xOCJDVgTkx;H-P{*v6KUj=nbBf2M!|e^um5y zx;}?*7=v>mcxBFcX&y<7IqD-`YWQ7_wYOni9ShbAGk=rZpFIK#`Q4{mOFOu+7JG6* z2mI~oUC1Hrg8s`stZ^`51x=#EFJvgA)ImZD0^{%Yts%pl#*oB+b@C?YuQwG@_RRsC z5O5Mf>JkmOOW{{P>`Qut-rzlLjnFO)98_R}U#9^_3jC5xB1IIYi?L_GWe9c(a2bBB z4NC&Y(FGmh_u09i+gEl$zj6}TmQjKRALAgBWx%zGA!!!aionbA0s0yPzEK7K0N`Kk z!AfhO8Iy5+zH>E{{rtDML&(h>qsV||Y$#>GkXnWPj!OP3+ecX{=Fs-Zvu}oWj}D(*9#VR7y8?&1l$3B zS>=lqm|6#6e@6V*T%g&4g{eLc08hn*`e0Q~GfpU~G6`NyF zgkB!h)xcKh#zv7y1I}dNiKW091I{Wbi?hH^2DYV?JuLW1PtXd%Kam3F81S=qK__jL za)K5Fjy^2&POXm;kaHriHes1b;HAwX-KCSj3d6RD<4%hxKN#@uHepE<7B3-z3N!!x z#Jtx*aQ_aWMPO2Zbpd$9w09T{SVjXD(DlVv)s5HZydF9cl!^YjBlIB;0ORO<-~cdc zp;3tiCM@2o3koOTt4qN0IVb1UIozB%{|hS?Kfr(a{v4EFo*?YPPgqj<#%NktSpLh@ z7iu3ISR1o_v|$96+w;^Yz+3;c;;$VoGFD{<%@YJ&#$BPl3b+<`33-_bGxg0)S%Shr z0oMDoL*7PQScU>Oz}=R=y?otBBv@r&Fk!0WXz2vqZZ=AQEe;y{{CeR34hgZ zlPzOpWWcAS4EhESmcq62-^>IJ7Mv)+_Ws;4@+#ueW56#1{!SjkHk+}Izs>}KS9F0E_wzu~ zzZ-3ze2DQQ`cZ5gSP_aFbA0wm-%0ddA#4;QNGH57274qvSr9&%&xzH63FoOFD*uQVYgBjv;>i0gl7I5s-P!91fIP4DvqzGAL$MH z9Rgfpz^;Z;M?5kKIP+j-@^5C$vW-|%US-hE@W*EA>o{J55lb1cYs4ztpr5loN@K(- znV|~?tZzjHILRT&4LZ=@JO}&|P0-eaWn5Sxgw#R5n(FHkpRk%c7!QVv`f-?j@ zz9R$QC))0Podknxvql*I<$Zlm=V!8E?TrVEo{<7~HCYA5%u(-?d^D)|*cOvkm$N2K+t2-gFEpYQRYgM;9Tu8ziP@Lx5*9kHFzKOhB;Cir~Rc zXv=_KFijXFV8z~^8}!q2!hpZ{KIo?&?EPjtIeO`D!hoaROb6&^+ePVeNG66fO%@4l zd|erEA_6aElF$c%J^E&C(0x4|H%5U!0QeUeu=<}P1D1UxY!PY#=@0clUzLFA(`^8c z%qG$ZjU0s$V6XpH=bp@O5B)8qkzyH#!QDe&{>a|L(MQbz;CVP+!+}*D-2IuJ>$zg@ zl2?GkbG{5=BqV>&dWQxQ@7BtJFCXJIf=Ih@O(*D}0K;Ch!0tK*=ZOB!r1BRD;Eh&r zX#16lzasyJAHsNX5IlwY8`*DT;a8wnd9S#fVc@ZNYrguUbaI0}6(Jaj;B5}St+QmI zkptDxjqRfhb(FkP2oadLFol7Ex^3jZZNY?PB;eGERkIXa7j)p-tH6u?W=em6j-e#u z!txCG-Vxx%dLdODlty9+nC{R7!GK>35>glREKuN?@ZW8RAQG(5fdrq-30geRr@v7} z$^XXJ@7{%Fim)C`3@IXTMLG zO+p_9&Is^3DC~y{dr#2G8T#q<=j(IYg!N*4(2b|SwhQZsLTI~U?b;}7)5Jk0EX^S; z1%B_7E{hr&!1iKVj? z3HwzY*f^~EnXkV_I}EnUaESpolY$dVBw<{kTV=qHO&f;_1%knWL;iP)ATUwjRu+P# zlybGP5PWnjxVMv|W+Avf8WgTgEchJ=_T?NAiyZ>r`$Pbf6svb z@xKYc8bKQJfAQ z=$)p2j}-L80z;I4SF*vt_vgTXH&R(Yu;`0hq#$qu?wgsP4FaRuD)w7htvAAK5r0(% zjy$-;fg8(!8_5Kx9Jpoj+e8N3>Qj!;OoDkHspVSARcjittc#^|fnJr+*A^aF7HpK@ zXvHeSuQ@QQAv(2Vd8WMQRxCkbaY6GD`ttVpCpw|S?`b>SNIEgdQyV2*(1VSVV8LMQ z0dE_&L9+$=?JGBNL=OD^7LvU}`!R;_Uv^7K48j8~!qOA;!1LZz0@nMqTSrQc(A0 Date: Wed, 31 Jul 2019 14:53:46 +0800 Subject: [PATCH 019/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun # Conflicts: # public/react/src/modules/courses/exercise/Testpapersettinghomepage.js --- .../exercise/Testpapersettinghomepage.js | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index 8e895b852..ae4addd59 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -1,7 +1,7 @@ import React,{ Component } from "react"; -import {Checkbox,Input,Table, Pagination,Menu} from "antd"; +import {Checkbox,Input,Table, Pagination,Menu,Spin} from "antd"; import {Link,NavLink} from 'react-router-dom'; -import { WordsBtn ,ActionBtn,queryString} from 'educoder'; +import { WordsBtn ,ActionBtn,queryString,downloadFile} from 'educoder'; import CoursesListType from '../coursesPublic/CoursesListType'; import '../css/members.css'; import '../css/busyWork.css'; @@ -33,6 +33,7 @@ class Testpapersettinghomepage extends Component{ current_status:undefined, DownloadType:false, DownloadMessageval:undefined, + donwloading:false, } } //切换tab @@ -192,8 +193,21 @@ class Testpapersettinghomepage extends Component{ }) } }else { - this.props.showNotification(`正在下载中`); - window.open("/api"+url+`?${queryString.stringify(params)}`+ '&export=true', '_blank'); + this.setState({ donwloading: true }) + downloadFile({ + url: url+`?${queryString.stringify(params)}`+ '&export=true', + successCallback: (url) => { + this.setState({ donwloading: false }); + console.log('successCallback') + }, + failCallback: (responseHtml, url) => { + this.setState({ donwloading: false }); + console.log('failCallback') + } + }) + this.props.showNotification(`正在下载中`); + + // window.open("/api"+url+`?${queryString.stringify(params)}`+ '&export=true', '_blank'); } }).catch((error) => { console.log(error) @@ -353,14 +367,14 @@ class Testpapersettinghomepage extends Component{ `} { From df69ef1ade9f35d54db42e84076177846e9b750c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 31 Jul 2019 14:57:07 +0800 Subject: [PATCH 020/623] b --- public/react/src/modules/tpm/TPMIndexHOC.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index b0bcf6f2a..425faba34 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -32,14 +32,14 @@ if (!window['indexHOCLoaded']) { // $('head').append($('') // .attr('href', `${_url_origin}/stylesheets/educoder/antd.min.css?1525440977`)); $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/css/edu-common.css?15254409771`)); + .attr('href', `${_url_origin}/stylesheets/css/edu-common.css?1`)); $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?15254409781`)); + .attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?1`)); // index.html有加载 $('head').append($('') - .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?15254409781`)); + .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?1`)); // $('head').append($('') From 1cdf397f8c57f4f92e9282832a6dbd016facb161 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Wed, 31 Jul 2019 15:10:00 +0800 Subject: [PATCH 021/623] vedio --- .../media/clappr-playback-rate-plugin.min.js | 1 + .../media/clappr-thumbnails-plugin.js | 1 + public/javascripts/media/clappr.min.js | 1 + .../src/common/components/media/Clappr.js | 79 +++++++++++++++++++ public/react/src/common/educoder.js | 2 + .../react/src/context/EffectDisplayContent.js | 50 ++++++++++++ .../context/EvaluateSuccessEffectDisplay.js | 33 +++++++- 7 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 public/javascripts/media/clappr-playback-rate-plugin.min.js create mode 100644 public/javascripts/media/clappr-thumbnails-plugin.js create mode 100644 public/javascripts/media/clappr.min.js create mode 100644 public/react/src/common/components/media/Clappr.js create mode 100644 public/react/src/context/EffectDisplayContent.js diff --git a/public/javascripts/media/clappr-playback-rate-plugin.min.js b/public/javascripts/media/clappr-playback-rate-plugin.min.js new file mode 100644 index 000000000..8bbcbfaca --- /dev/null +++ b/public/javascripts/media/clappr-playback-rate-plugin.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("clappr")):"function"==typeof define&&define.amd?define("clappr-playback-rate-plugin",["clappr"],e):"object"==typeof exports?exports["clappr-playback-rate-plugin"]=e(require("clappr")):t["clappr-playback-rate-plugin"]=e(t.clappr)}("undefined"!=typeof self?self:this,function(t){return function(t){function e(n){if(a[n])return a[n].exports;var o=a[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var a={};return e.m=t,e.c=a,e.d=function(t,a,n){e.o(t,a)||Object.defineProperty(t,a,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var a=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(a,"a",a),a},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}([function(t,e,a){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function r(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var i=a(1),l=(a.n(i),a(2)),c=a.n(l),s=a(3),u=a.n(s),p=function(){function t(t,e){for(var a=0;a\n <%= title %>\n\n\n'},function(t,e,a){e=t.exports=a(4)(void 0),e.push([t.i,".media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] {\n float: right;\n margin-top: 5px;\n position: relative; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] button.media-control-button.media-control-icon {\n font-family: Roboto,\"Open Sans\",Arial,sans-serif;\n -webkit-font-smoothing: antialiased;\n font-size: 12px;\n cursor: pointer;\n padding: 10px; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] button.media-control-button.media-control-icon:hover {\n color: #c9c9c9; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] button.media-control-button.media-control-icon.changing {\n -webkit-animation: pulse 0.5s infinite alternate; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] > ul {\n display: none;\n list-style-type: none;\n position: absolute;\n bottom: 25px;\n border: 1px solid black;\n border-radius: 4px;\n background-color: rgba(0, 0, 0, 0.7); }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li {\n position: relative;\n font-size: 12px; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li[data-title] {\n padding: 5px; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li a {\n color: #aaa;\n padding: 2px 10px 2px 15px;\n display: block;\n text-decoration: none; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li a.active {\n background-color: black;\n font-weight: bold;\n color: #fff; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li a.active:before {\n content: '\\2713';\n position: absolute;\n top: 2px;\n left: 4px; }\n .media-control[data-media-control] .media-control-layer[data-controls] .playback_rate[data-playback-rate-select] li a:hover {\n color: #fff;\n text-decoration: none; }\n\n@-webkit-keyframes pulse {\n 0% {\n color: #fff; }\n 50% {\n color: #ff0101; }\n 100% {\n color: #B80000; } }\n",""])},function(t,e){function a(t,e){var a=t[1]||"",o=t[3];if(!o)return a;if(e&&"function"==typeof btoa){var r=n(o);return[a].concat(o.sources.map(function(t){return"/*# sourceURL="+o.sourceRoot+t+" */"})).concat([r]).join("\n")}return[a].join("\n")}function n(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var n=a(e,t);return e[2]?"@media "+e[2]+"{"+n+"}":n}).join("")},e.i=function(t,a){"string"==typeof t&&(t=[[null,t,""]]);for(var n={},o=0;o0&&e._renderPlugin()})})}},{key:"removeThumbnail",value:function(t){var e=this,n=t.constructor===Array?t:[t];return this._onThumbsLoaded.then(function(){var t=!0,o=!1;return n.forEach(function(n){var i=e._thumbs.some(function(t,o){return t.src===n&&(e._thumbs.splice(o,1),e._getOptions().backdropHeight&&(e._$backdropCarouselImgs[o].remove(),e._$backdropCarouselImgs.splice(o,1)),!0)});i?o=!0:t=!1}),o&&e._renderPlugin(),c.Promise.resolve(t)})}},{key:"_init",value:function(){this._thumbsLoaded&&(this._$backdropCarouselImgs=[],this._createElements(),this._loadBackdrop(),this._renderPlugin())}},{key:"_getOptions",value:function(){if(!("scrubThumbnails"in this.core.options))throw"'scrubThumbnails property missing from options object.";return this.core.options.scrubThumbnails}},{key:"_appendElToMediaControl",value:function(){this.core.mediaControl.$el.find(".media-control-background").first().after(this.el)}},{key:"_onMouseMove",value:function(t){this._calculateHoverPosition(t),this._show=!0,this._renderPlugin()}},{key:"_onMouseLeave",value:function(){this._show=!1,this._renderPlugin()}},{key:"_calculateHoverPosition",value:function(t){var e=t.pageX-this.core.mediaControl.$seekBarContainer.offset().left;this._hoverPosition=Math.min(1,Math.max(e/this.core.mediaControl.$seekBarContainer.width(),0))}},{key:"_buildThumbsFromOptions",value:function(){var t=this,e=this._getOptions().thumbs,n=e.map(function(e){return t._addThumbFromSrc(e)});return c.Promise.all(n)}},{key:"_addThumbFromSrc",value:function(t){var e=this;return new c.Promise(function(e,n){var o=new Image;o.onload=function(){e(o)},o.onerror=n,o.src=t.url}).then(function(n){var o=t.time,i=null;e._thumbs.some(function(t,e){return o0?e._thumbs[i-1]:null;u&&(u.duration=o-u.time);var s=r?r.time-t.time:null,a=n.width,c=n.height,l={imageW:a,imageH:c,x:t.x||0,y:t.y||0,w:t.w||a,h:t.h||c,url:t.url,time:o,duration:s,src:t};return e._thumbs.splice(i,0,l),l})}},{key:"_buildImg",value:function(t,e){var n=e/t.h,o=(0,a.$)("").addClass("thumbnail-img").attr("src",t.url),i=(0,a.$)("
      ").addClass("thumbnail-container");return i.css("width",t.w*n),i.css("height",e),o.css({height:t.imageH*n,left:-1*t.x*n,top:-1*t.y*n}),i.append(o),i}},{key:"_loadBackdrop",value:function(){if(this._getOptions().backdropHeight)for(var t=this._$carousel,e=0;e=0;n--){var o=e[n];if(o.time<=t)return n}return 0}},{key:"_renderPlugin",value:function(){this._thumbsLoaded&&(this._show&&this._thumbs.length>0?(this.$el.removeClass("hidden"),this._updateCarousel(),this._updateSpotlightThumb()):this.$el.addClass("hidden"))}},{key:"_createElements",value:function(){this.$el.html(this.template({backdropHeight:this._getOptions().backdropHeight,spotlightHeight:this._getOptions().spotlightHeight})),this.$el.append(a.Styler.getStyleFor(d["default"])),this._$spotlight=this.$el.find(".spotlight"),this._$backdrop=this.$el.find(".backdrop"),this._$carousel=this._$backdrop.find(".carousel"),this.$el.addClass("hidden"),this._appendElToMediaControl()}}]),e}(a.UICorePlugin);e["default"]=p,t.exports=e["default"]},function(t,e,n){(function(t,o){"use strict";function i(t,e){this._id=t,this._clearFn=e}var r=n(4).nextTick,u=Function.prototype.apply,s=Array.prototype.slice,a={},c=0;e.setTimeout=function(){return new i(u.call(setTimeout,window,arguments),clearTimeout)},e.setInterval=function(){return new i(u.call(setInterval,window,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},e.setImmediate="function"==typeof t?t:function(t){var n=c++,o=!(arguments.length<2)&&s.call(arguments,1);return a[n]=!0,r(function(){a[n]&&(o?t.apply(null,o):t.call(null),e.clearImmediate(n))}),n},e.clearImmediate="function"==typeof o?o:function(t){delete a[t]}}).call(e,n(1).setImmediate,n(1).clearImmediate)},function(t,e){"use strict";t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e1)for(var n=1;n")},M.garbage=function(t){this.options.recycleVideo&&"VIDEO"===t[0].tagName.toUpperCase()&&(t.children().remove(),D.push(t))},M);function M(){(0,s.default)(this,M)}x.options={recycleVideo:!1};var N=e.DoubleEventHandler=(F.prototype.handle=function(t,e,r){var i=!(2]*>/,Xe=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Ye=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Ze=/^(?:body|html)$/i,$e=/([A-Z])/g,_e=["val","css","html","text","data","width","height","offset"],bf=Se.createElement("table"),cf=Se.createElement("tr"),df={tr:Se.createElement("tbody"),tbody:bf,thead:bf,tfoot:bf,td:cf,th:cf,"*":Se.createElement("div")},ef=/complete|loaded|interactive/,ff=/^[\w-]*$/,hf=(gf={}).toString,jf={},mf=Se.createElement("div"),nf={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},of=Array.isArray||function(t){return t instanceof Array},jf.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var r=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(r)return r.call(t,e);var i,n=t.parentNode,a=!n;return a&&(n=mf).appendChild(t),i=~jf.qsa(n,e).indexOf(t),a&&mf.removeChild(t),i},kf=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},lf=function(r){return Qe.call(r,function(t,e){return r.indexOf(t)==e})},jf.fragment=function(t,e,r){var i,n,a;return Xe.test(t)&&(i=Me(Se.createElement(RegExp.$1))),i||(t.replace&&(t=t.replace(Ye,"<$1>")),e===Ke&&(e=We.test(t)&&RegExp.$1),e in df||(e="*"),(a=df[e]).innerHTML=""+t,i=Me.each(Re.call(a.childNodes),function(){a.removeChild(this)})),uf(r)&&(n=Me(i),Me.each(r,function(t,e){-1<_e.indexOf(t)?n[t](e):n.attr(t,e)})),i},jf.Z=function(t,e){return new Df(t,e)},jf.isZ=function(t){return t instanceof jf.Z},jf.init=function(t,e){var r;if(!t)return jf.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&We.test(t))r=jf.fragment(t,RegExp.$1,e),t=null;else{if(e!==Ke)return Me(e).find(t);r=jf.qsa(Se,t)}else{if(qf(t))return Me(Se).ready(t);if(jf.isZ(t))return t;if(of(t))r=function(t){return Qe.call(t,function(t){return null!=t})}(t);else if(tf(t))r=[t],t=null;else if(We.test(t))r=jf.fragment(t.trim(),RegExp.$1,e),t=null;else{if(e!==Ke)return Me(e).find(t);r=jf.qsa(Se,t)}}return jf.Z(r,t)},(Me=function(t,e){return jf.init(t,e)}).extend=function(e){var r,t=Re.call(arguments,1);return"boolean"==typeof e&&(r=e,e=t.shift()),t.forEach(function(t){!function t(e,r,i){for(Le in r)i&&(uf(r[Le])||of(r[Le]))?(uf(r[Le])&&!uf(e[Le])&&(e[Le]={}),of(r[Le])&&!of(e[Le])&&(e[Le]=[]),t(e[Le],r[Le],i)):r[Le]!==Ke&&(e[Le]=r[Le])}(e,t,r)}),e},jf.qsa=function(t,e){var r,i="#"==e[0],n=!i&&"."==e[0],a=i||n?e.slice(1):e,o=ff.test(a);return t.getElementById&&o&&i?(r=t.getElementById(a))?[r]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:Re.call(o&&!i&&t.getElementsByClassName?n?t.getElementsByClassName(a):t.getElementsByTagName(e):t.querySelectorAll(e))},Me.contains=Se.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},Me.type=pf,Me.isFunction=qf,Me.isWindow=rf,Me.isArray=of,Me.isPlainObject=uf,Me.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},Me.isNumeric=function(t){var e=Number(t),r=typeof t;return null!=t&&"boolean"!=r&&("string"!=r||t.length)&&!isNaN(e)&&isFinite(e)||!1},Me.inArray=function(t,e,r){return Oe.indexOf.call(e,t,r)},Me.camelCase=kf,Me.trim=function(t){return null==t?"":String.prototype.trim.call(t)},Me.uuid=0,Me.support={},Me.expr={},Me.noop=function(){},Me.map=function(t,e){var r,i,n,a=[];if(vf(t))for(i=0;i)<[^<]*)*<\/script>/gi,Ok=/^(?:text|application)\/javascript/i,Pk=/^(?:text|application)\/xml/i,Qk="application/json",Rk="text/html",Sk=/^\s*$/,Tk=Kk.createElement("a");function Vk(t,e,r,i){if(t.global)return function(t,e,r){var i=Ik.Event(e);return Ik(t).trigger(i,r),!i.isDefaultPrevented()}(e||Kk,r,i)}function Yk(t,e){var r=e.context;if(!1===e.beforeSend.call(r,t,e)||!1===Vk(e,r,"ajaxBeforeSend",[t,e]))return!1;Vk(e,r,"ajaxSend",[t,e])}function Zk(t,e,r,i){var n=r.context,a="success";r.success.call(n,t,a,e),i&&i.resolveWith(n,[t,a,e]),Vk(r,n,"ajaxSuccess",[e,r,t]),_k(a,e,r)}function $k(t,e,r,i,n){var a=i.context;i.error.call(a,r,e,t),n&&n.rejectWith(a,[r,e,t]),Vk(i,a,"ajaxError",[r,i,t||e]),_k(e,r,i)}function _k(t,e,r){var i=r.context;r.complete.call(i,e,t),Vk(r,i,"ajaxComplete",[e,r]),function(t){t.global&&!--Ik.active&&Vk(t,null,"ajaxStop")}(r)}function bl(){}function dl(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function fl(t,e,r,i){return Ik.isFunction(e)&&(i=r,r=e,e=void 0),Ik.isFunction(r)||(i=r,r=void 0),{url:t,data:e,success:r,dataType:i}}Tk.href=window.location.href,Ik.active=0,Ik.ajaxJSONP=function(r,i){if(!("type"in r))return Ik.ajax(r);function t(t){Ik(s).triggerHandler("error",t||"abort")}var n,a,e=r.jsonpCallback,o=(Ik.isFunction(e)?e():e)||"Zepto"+Jk++,s=Kk.createElement("script"),l=window[o],u={abort:t};return i&&i.promise(u),Ik(s).on("load error",function(t,e){clearTimeout(a),Ik(s).off().remove(),"error"!=t.type&&n?Zk(n[0],u,r,i):$k(null,e||"error",u,r,i),window[o]=l,n&&Ik.isFunction(l)&&l(n[0]),l=n=void 0}),!1===Yk(u,r)?t("abort"):(window[o]=function(){n=arguments},s.src=r.url.replace(/\?(.+)=\?/,"?$1="+o),Kk.head.appendChild(s),0").html(t.replace(Nk,"")).find(i):t),s&&s.apply(n,arguments)},Ik.ajax(o),this};var gl=encodeURIComponent;Ik.param=function(t,e){var r=[];return r.add=function(t,e){Ik.isFunction(e)&&(e=e()),null==e&&(e=""),this.push(gl(t)+"="+gl(e))},function r(i,t,n,a){var o,s=Ik.isArray(t),l=Ik.isPlainObject(t);Ik.each(t,function(t,e){o=Ik.type(e),a&&(t=n?a:a+"["+(l||"object"==o||"array"==o?t:"")+"]"),!a&&s?i.add(e.name,e.value):"array"==o||!n&&"object"==o?r(i,e,n,t):i.add(t,e)})}(r,t,e),r.join("&").replace(/%20/g,"+")}}(Je),(_m=Je).Callbacks=function(i){i=_m.extend({},i);var e,r,n,a,o,s,l=[],u=!i.once&&[],d=function(t){for(e=i.memory&&t,r=!0,s=a||0,a=0,o=l.length,n=!0;l&&s/,Sq="Zepto"+ +new Date,Lq.qsa=function(a,o){return Tq(o,function(t,r,i){try{var e;!t&&r?t="*":Rq.test(t)&&(e=Kq(a).addClass(Sq),t="."+Sq+" "+t);var n=Mq(a,t)}catch(t){throw console.error("error performing selector: %o",o),t}finally{e&&e.removeClass(Sq)}return r?Lq.uniq(Kq.map(n,function(t,e){return r.call(t,e,n,i)})):n})},Lq.matches=function(i,t){return Tq(t,function(t,e,r){return(!t||Nq(i,t))&&(!e||e.call(i,null,r)===i)})},He.exports=Je},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});function n(t){return null===t?"":(""+t).replace(o,function(t){return a[t]})}function i(a,t){var e,r=new RegExp([(l.escape||u).source,(l.interpolate||u).source,(l.evaluate||u).source].join("|")+"|$","g"),o=0,s="__p+='";a.replace(r,function(t,e,r,i,n){return s+=a.slice(o,n).replace(c,function(t){return"\\"+d[t]}),e&&(s+="'+\n((__t=("+e+"))==null?'':escapeExpr(__t))+\n'"),r&&(s+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(s+="';\n"+i+"\n__p+='"),o=n+t.length,t}),s+="';\n",l.variable||(s="with(obj||{}){\n"+s+"}\n"),s="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+s+"return __p;\n//# sourceURL=/microtemplates/source["+f+++"]";try{e=new Function(l.variable||"obj","escapeExpr",s)}catch(t){throw t.source=s,t}if(t)return e(t,n);function i(t){return e.call(this,t,n)}return i.source="function("+(l.variable||"obj")+"){\n"+s+"}",i}var l={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},u=/(.)^/,d={"'":"'","\\":"\\","\r":"r","\n":"n","\t":"t","\u2028":"u2028","\u2029":"u2029"},c=/\\|'|\r|\n|\t|\u2028|\u2029/g,a={"&":"&","<":"<",">":">",'"':""","'":"'"},o=new RegExp("[&<>\"']","g"),f=0;i.settings=l,e.default=i,t.exports=e.default},function(t,e){t.exports=function(r){var o=[];return o.toString=function(){return this.map(function(t){var e=function(t,e){var r=t[1]||"",i=t[3];if(!i)return r;if(e&&"function"==typeof btoa){var n=function(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}(i),a=i.sources.map(function(t){return"/*# sourceURL="+i.sourceRoot+t+" */"});return[r].concat(a).concat([n]).join("\n")}return[r].join("\n")}(t,r);return t[2]?"@media "+t[2]+"{"+e+"}":e}).join("")},o.i=function(t,e){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},i=0;i=e.length?{value:void 0,done:!0}:(t=i(e,r),this._i+=t.length,{value:t,done:!1})})},function(t,e){t.exports=!0},function(t,e,i){function n(){}var a=i(21),o=i(116),s=i(51),l=i(49)("IE_PROTO"),u="prototype",d=function(){var t,e=i(67)("iframe"),r=s.length;for(e.style.display="none",i(117).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" + * + * ``` + * Now, create the player: + * ```html + * + *
      + * + * + * ``` + */ +// Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var Player = function (_BaseObject) { + (0, _inherits3.default)(Player, _BaseObject); + (0, _createClass3.default)(Player, [{ + key: 'loader', + set: function set(loader) { + this._loader = loader; + }, + get: function get() { + if (!this._loader) this._loader = new _loader2.default(this.options.plugins || {}, this.options.playerId); + + return this._loader; + } + + /** + * Determine if the playback has ended. + * @property ended + * @type Boolean + */ + + }, { + key: 'ended', + get: function get() { + return this.core.activeContainer.ended; + } + + /** + * Determine if the playback is having to buffer in order for + * playback to be smooth. + * (i.e if a live stream is playing smoothly, this will be false) + * @property buffering + * @type Boolean + */ + + }, { + key: 'buffering', + get: function get() { + return this.core.activeContainer.buffering; + } + + /* + * determine if the player is ready. + * @property isReady + * @type {Boolean} `true` if the player is ready. ie PLAYER_READY event has fired + */ + + }, { + key: 'isReady', + get: function get() { + return !!this._ready; + } + + /** + * An events map that allows the user to add custom callbacks in player's options. + * @property eventsMapping + * @type {Object} + */ + + }, { + key: 'eventsMapping', + get: function get() { + return { + onReady: _events2.default.PLAYER_READY, + onResize: _events2.default.PLAYER_RESIZE, + onPlay: _events2.default.PLAYER_PLAY, + onPause: _events2.default.PLAYER_PAUSE, + onStop: _events2.default.PLAYER_STOP, + onEnded: _events2.default.PLAYER_ENDED, + onSeek: _events2.default.PLAYER_SEEK, + onError: _events2.default.PLAYER_ERROR, + onTimeUpdate: _events2.default.PLAYER_TIMEUPDATE, + onVolumeUpdate: _events2.default.PLAYER_VOLUMEUPDATE, + onSubtitleAvailable: _events2.default.PLAYER_SUBTITLE_AVAILABLE + }; + } + + /** + * @typedef {Object} PlaybackConfig + * @prop {boolean} disableContextMenu + * disables the context menu (right click) on the video element if a HTML5Video playback is used. + * @prop {boolean} preload + * video will be preloaded according to `preload` attribute options **default**: `'metadata'` + * @prop {boolean} controls + * enabled/disables displaying controls + * @prop {boolean} crossOrigin + * enables cross-origin capability for media-resources + * @prop {boolean} playInline + * enables in-line video elements + * @prop {boolean} audioOnly + * enforce audio-only playback (when possible) + * @prop {Object} externalTracks + * pass externaly loaded track to playback + * @prop {Number} [maxBufferLength] + * The default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD. + * This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks. + * To change this behavior use `maxBufferLength` where **value is in seconds**. + * @prop {Number} [maxBackBufferLength] + * After how much distance of the playhead data should be pruned from the buffer (influences memory consumption + * of adaptive media-engines like Hls.js or Shaka) + * @prop {Number} [minBufferLength] + * After how much data in the buffer at least we attempt to consume it (influences QoS-related behavior + * of adaptive media-engines like Hls.js or Shaka). If this is too low, and the available bandwidth is varying a lot + * and too close to the streamed bitrate, we may continuously hit under-runs. + * @prop {Number} [initialBandwidthEstimate] + * define an initial bandwidth "guess" (or previously stored/established value) for underlying adaptive-bitreate engines + * of adaptive playback implementations, like Hls.js or Shaka + * @prop {Number} [maxAdaptiveBitrate] + * Limits the streamed bitrate (for adaptive media-engines in underlying playback implementations) + * @prop {Object} [maxAdaptiveVideoDimensions] + * Limits the video dimensions in adaptive media-engines. Should be a literal object with `height` and `width`. + * @prop {Boolean}[enableAutomaticABR] **default**: `true` + * Allows to enable/disable automatic bitrate switching in adaptive media-engines + * @prop {String} [preferredTextLanguage] **default**: `'pt-BR'` + * Allows to set a preferred text language, that may be enabled by the media-engine if available. + * @prop {String} [preferredAudioLanguage] **default**: `'pt-BR'` + * Allows to set a preferred audio language, that may be enabled by the media-engine if available. + */ + + /** + * ## Player's constructor + * + * You might pass the options object to build the player. + * ```javascript + * var options = {source: "http://example.com/video.mp4", param1: "val1"}; + * var player = new Clappr.Player(options); + * ``` + * + * @method constructor + * @param {Object} options Data + * options to build a player instance + * @param {Number} [options.width] + * player's width **default**: `640` + * @param {Number} [options.height] + * player's height **default**: `360` + * @param {String} [options.parentId] + * the id of the element on the page that the player should be inserted into + * @param {Object} [options.parent] + * a reference to a dom element that the player should be inserted into + * @param {String} [options.source] + * The media source URL, or {source: <>, mimeType: <>} + * @param {Object} [options.sources] + * An array of media source URL's, or an array of {source: <>, mimeType: <>} + * @param {Boolean} [options.autoPlay] + * automatically play after page load **default**: `false` + * @param {Boolean} [options.loop] + * automatically replay after it ends **default**: `false` + * @param {Boolean} [options.chromeless] + * player acts in chromeless mode **default**: `false` + * @param {Boolean} [options.allowUserInteraction] + * whether or not the player should handle click events when in chromeless mode **default**: `false` on desktops browsers, `true` on mobile. + * @param {Boolean} [options.disableKeyboardShortcuts] + * disable keyboard shortcuts. **default**: `false`. `true` if `allowUserInteraction` is `false`. + * @param {Boolean} [options.mute] + * start the video muted **default**: `false` + * @param {String} [options.mimeType] + * add `mimeType: "application/vnd.apple.mpegurl"` if you need to use a url without extension. + * @param {Boolean} [options.actualLiveTime] + * show duration and seek time relative to actual time. + * @param {String} [options.actualLiveServerTime] + * specify server time as a string, format: "2015/11/26 06:01:03". This option is meant to be used with actualLiveTime. + * @param {Boolean} [options.persistConfig] + * persist player's settings (volume) through the same domain **default**: `true` + * @param {String} [options.preload] @deprecated + * video will be preloaded according to `preload` attribute options **default**: `'metadata'` + * @param {Number} [options.maxBufferLength] @deprecated + * the default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD. + * This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks. + * To change this behavior use `maxBufferLength` where **value is in seconds**. + * @param {String} [options.gaAccount] + * enable Google Analytics events dispatch **(play/pause/stop/buffering/etc)** by adding your `gaAccount` + * @param {String} [options.gaTrackerName] + * besides `gaAccount` you can optionally, pass your favorite trackerName as `gaTrackerName` + * @param {Object} [options.mediacontrol] + * customize control bar colors, example: `mediacontrol: {seekbar: "#E113D3", buttons: "#66B2FF"}` + * @param {Boolean} [options.hideMediaControl] + * control media control auto hide **default**: `true` + * @param {Boolean} [options.hideVolumeBar] + * when embedded with width less than 320, volume bar will hide. You can force this behavior for all sizes by adding `true` **default**: `false` + * @param {String} [options.watermark] + * put `watermark: 'http://url/img.png'` on your embed parameters to automatically add watermark on your video. + * You can customize corner position by defining position parameter. Positions can be `bottom-left`, `bottom-right`, `top-left` and `top-right`. + * @param {String} [options.watermarkLink] + * `watermarkLink: 'http://example.net/'` - define URL to open when the watermark is clicked. If not provided watermark will not be clickable. + * @param {Boolean} [options.disableVideoTagContextMenu] @deprecated + * disables the context menu (right click) on the video element if a HTML5Video playback is used. + * @param {Boolean} [options.autoSeekFromUrl] + * Automatically seek to the seconds provided in the url (e.g example.com?t=100) **default**: `true` + * @param {Boolean} [options.exitFullscreenOnEnd] + * Automatically exit full screen when the media finishes. **default**: `true` + * @param {String} [options.poster] + * define a poster by adding its address `poster: 'http://url/img.png'`. It will appear after video embed, disappear on play and go back when user stops the video. + * @param {String} [options.playbackNotSupportedMessage] + * define a custom message to be displayed when a playback is not supported. + * @param {Object} [options.events] + * Specify listeners which will be registered with their corresponding player events. + * E.g. onReady -> "PLAYER_READY", onTimeUpdate -> "PLAYER_TIMEUPDATE" + * @param {PlaybackConfig} [options.playback] + * Generic `Playback` component related configuration + * @param {Boolean} [options.disableErrorScreen] + * disables the error screen plugin. + * @param {Number} [options.autoPlayTimeout] + * autoplay check timeout. + */ + + }]); + + function Player(options) { + (0, _classCallCheck3.default)(this, Player); + + var _this = (0, _possibleConstructorReturn3.default)(this, _BaseObject.call(this, options)); + + var playbackDefaultOptions = { recycleVideo: true }; + var defaultOptions = { + playerId: (0, _utils.uniqueId)(''), + persistConfig: true, + width: 640, + height: 360, + baseUrl: baseUrl, + allowUserInteraction: _browser2.default.isMobile, + playback: playbackDefaultOptions + }; + _this._options = _clapprZepto2.default.extend(defaultOptions, options); + _this.options.sources = _this._normalizeSources(options); + if (!_this.options.chromeless) { + // "allowUserInteraction" cannot be false if not in chromeless mode. + _this.options.allowUserInteraction = true; + } + if (!_this.options.allowUserInteraction) { + // if user iteraction is not allowed ensure keyboard shortcuts are disabled + _this.options.disableKeyboardShortcuts = true; + } + _this._registerOptionEventListeners(_this.options.events); + _this._coreFactory = new _core_factory2.default(_this); + _this.playerInfo = _player_info2.default.getInstance(_this.options.playerId); + _this.playerInfo.currentSize = { width: options.width, height: options.height }; + _this.playerInfo.options = _this.options; + if (_this.options.parentId) _this.setParentId(_this.options.parentId);else if (_this.options.parent) _this.attachTo(_this.options.parent); + + return _this; + } + + /** + * Specify a `parentId` to the player. + * @method setParentId + * @param {String} parentId the element parent id. + * @return {Player} itself + */ + + + Player.prototype.setParentId = function setParentId(parentId) { + var el = document.querySelector(parentId); + if (el) this.attachTo(el); + + return this; + }; + + /** + * You can use this method to attach the player to a given element. You don't need to do this when you specify it during the player instantiation passing the `parentId` param. + * @method attachTo + * @param {Object} element a given element. + * @return {Player} itself + */ + + + Player.prototype.attachTo = function attachTo(element) { + this.options.parentElement = element; + this.core = this._coreFactory.create(); + this._addEventListeners(); + return this; + }; + + Player.prototype._addEventListeners = function _addEventListeners() { + if (!this.core.isReady) this.listenToOnce(this.core, _events2.default.CORE_READY, this._onReady);else this._onReady(); + + this.listenTo(this.core, _events2.default.CORE_ACTIVE_CONTAINER_CHANGED, this._containerChanged); + this.listenTo(this.core, _events2.default.CORE_FULLSCREEN, this._onFullscreenChange); + this.listenTo(this.core, _events2.default.CORE_RESIZE, this._onResize); + return this; + }; + + Player.prototype._addContainerEventListeners = function _addContainerEventListeners() { + var container = this.core.activeContainer; + if (container) { + this.listenTo(container, _events2.default.CONTAINER_PLAY, this._onPlay); + this.listenTo(container, _events2.default.CONTAINER_PAUSE, this._onPause); + this.listenTo(container, _events2.default.CONTAINER_STOP, this._onStop); + this.listenTo(container, _events2.default.CONTAINER_ENDED, this._onEnded); + this.listenTo(container, _events2.default.CONTAINER_SEEK, this._onSeek); + this.listenTo(container, _events2.default.CONTAINER_ERROR, this._onError); + this.listenTo(container, _events2.default.CONTAINER_TIMEUPDATE, this._onTimeUpdate); + this.listenTo(container, _events2.default.CONTAINER_VOLUME, this._onVolumeUpdate); + this.listenTo(container, _events2.default.CONTAINER_SUBTITLE_AVAILABLE, this._onSubtitleAvailable); + } + return this; + }; + + Player.prototype._registerOptionEventListeners = function _registerOptionEventListeners() { + var _this2 = this; + + var newEvents = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var hasNewEvents = (0, _keys2.default)(newEvents).length > 0; + hasNewEvents && (0, _keys2.default)(events).forEach(function (userEvent) { + var eventType = _this2.eventsMapping[userEvent]; + eventType && _this2.off(eventType, events[userEvent]); + }); + + (0, _keys2.default)(newEvents).forEach(function (userEvent) { + var eventType = _this2.eventsMapping[userEvent]; + if (eventType) { + var eventFunction = newEvents[userEvent]; + eventFunction = typeof eventFunction === 'function' && eventFunction; + eventFunction && _this2.on(eventType, eventFunction); + } + }); + return this; + }; + + Player.prototype._containerChanged = function _containerChanged() { + this.stopListening(); + this._addEventListeners(); + }; + + Player.prototype._onReady = function _onReady() { + this._ready = true; + this._addContainerEventListeners(); + this.trigger(_events2.default.PLAYER_READY); + }; + + Player.prototype._onFullscreenChange = function _onFullscreenChange(fullscreen) { + this.trigger(_events2.default.PLAYER_FULLSCREEN, fullscreen); + }; + + Player.prototype._onVolumeUpdate = function _onVolumeUpdate(volume) { + this.trigger(_events2.default.PLAYER_VOLUMEUPDATE, volume); + }; + + Player.prototype._onSubtitleAvailable = function _onSubtitleAvailable() { + this.trigger(_events2.default.PLAYER_SUBTITLE_AVAILABLE); + }; + + Player.prototype._onResize = function _onResize(size) { + this.trigger(_events2.default.PLAYER_RESIZE, size); + }; + + Player.prototype._onPlay = function _onPlay() { + this.trigger(_events2.default.PLAYER_PLAY); + }; + + Player.prototype._onPause = function _onPause() { + this.trigger(_events2.default.PLAYER_PAUSE); + }; + + Player.prototype._onStop = function _onStop() { + this.trigger(_events2.default.PLAYER_STOP, this.getCurrentTime()); + }; + + Player.prototype._onEnded = function _onEnded() { + this.trigger(_events2.default.PLAYER_ENDED); + }; + + Player.prototype._onSeek = function _onSeek(time) { + this.trigger(_events2.default.PLAYER_SEEK, time); + }; + + Player.prototype._onTimeUpdate = function _onTimeUpdate(timeProgress) { + this.trigger(_events2.default.PLAYER_TIMEUPDATE, timeProgress); + }; + + Player.prototype._onError = function _onError(error) { + this.trigger(_events2.default.PLAYER_ERROR, error); + }; + + Player.prototype._normalizeSources = function _normalizeSources(options) { + var sources = options.sources || (options.source !== undefined ? [options.source] : []); + return sources.length === 0 ? [{ source: '', mimeType: '' }] : sources; + }; + + /** + * resizes the current player canvas. + * @method resize + * @param {Object} size should be a literal object with `height` and `width`. + * @return {Player} itself + * @example + * ```javascript + * player.resize({height: 360, width: 640}) + * ``` + */ + + + Player.prototype.resize = function resize(size) { + this.core.resize(size); + return this; + }; + + /** + * loads a new source. + * @method load + * @param {Array|String} sources source or sources of video. + * An array item can be a string or {source: <>, mimeType: <>} + * @param {String} mimeType a mime type, example: `'application/vnd.apple.mpegurl'` + * @param {Boolean} [autoPlay=false] whether playing should be started immediately + * @return {Player} itself + */ + + + Player.prototype.load = function load(sources, mimeType, autoPlay) { + if (autoPlay !== undefined) this.configure({ autoPlay: !!autoPlay }); + + this.core.load(sources, mimeType); + return this; + }; + + /** + * destroys the current player and removes it from the DOM. + * @method destroy + * @return {Player} itself + */ + + + Player.prototype.destroy = function destroy() { + this.stopListening(); + this.core.destroy(); + return this; + }; + + /** + * Gives user consent to playback. Required by mobile device after a click event before Player.load(). + * @method consent + * @return {Player} itself + */ + + + Player.prototype.consent = function consent() { + this.core.getCurrentPlayback().consent(); + return this; + }; + + /** + * plays the current video (`source`). + * @method play + * @return {Player} itself + */ + + + Player.prototype.play = function play() { + this.core.activeContainer.play(); + return this; + }; + + /** + * pauses the current video (`source`). + * @method pause + * @return {Player} itself + */ + + + Player.prototype.pause = function pause() { + this.core.activeContainer.pause(); + return this; + }; + + /** + * stops the current video (`source`). + * @method stop + * @return {Player} itself + */ + + + Player.prototype.stop = function stop() { + this.core.activeContainer.stop(); + return this; + }; + + /** + * seeks the current video (`source`). For example, `player.seek(120)` will seek to second 120 (2minutes) of the current video. + * @method seek + * @param {Number} time should be a number between 0 and the video duration. + * @return {Player} itself + */ + + + Player.prototype.seek = function seek(time) { + this.core.activeContainer.seek(time); + return this; + }; + + /** + * seeks the current video (`source`). For example, `player.seek(50)` will seek to the middle of the current video. + * @method seekPercentage + * @param {Number} time should be a number between 0 and 100. + * @return {Player} itself + */ + + + Player.prototype.seekPercentage = function seekPercentage(percentage) { + this.core.activeContainer.seekPercentage(percentage); + return this; + }; + + /** + * mutes the current video (`source`). + * @method mute + * @return {Player} itself + */ + + + Player.prototype.mute = function mute() { + this._mutedVolume = this.getVolume(); + this.setVolume(0); + return this; + }; + + /** + * unmutes the current video (`source`). + * @method unmute + * @return {Player} itself + */ + + + Player.prototype.unmute = function unmute() { + this.setVolume(typeof this._mutedVolume === 'number' ? this._mutedVolume : 100); + this._mutedVolume = null; + return this; + }; + + /** + * checks if the player is playing. + * @method isPlaying + * @return {Boolean} `true` if the current source is playing, otherwise `false` + */ + + + Player.prototype.isPlaying = function isPlaying() { + return this.core.activeContainer.isPlaying(); + }; + + /** + * returns `true` if DVR is enable otherwise `false`. + * @method isDvrEnabled + * @return {Boolean} + */ + + + Player.prototype.isDvrEnabled = function isDvrEnabled() { + return this.core.activeContainer.isDvrEnabled(); + }; + + /** + * returns `true` if DVR is in use otherwise `false`. + * @method isDvrInUse + * @return {Boolean} + */ + + + Player.prototype.isDvrInUse = function isDvrInUse() { + return this.core.activeContainer.isDvrInUse(); + }; + + /** + * enables to configure a player after its creation + * @method configure + * @param {Object} options all the options to change in form of a javascript object + * @return {Player} itself + */ + + + Player.prototype.configure = function configure() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this._registerOptionEventListeners(options.events, this.options.events); + this.core.configure(options); + return this; + }; + + /** + * get a plugin by its name. + * @method getPlugin + * @param {String} name of the plugin. + * @return {Object} the plugin instance + * @example + * ```javascript + * var poster = player.getPlugin('poster'); + * poster.hidePlayButton(); + * ``` + */ + + + Player.prototype.getPlugin = function getPlugin(name) { + var plugins = this.core.plugins.concat(this.core.activeContainer.plugins); + return plugins.filter(function (plugin) { + return plugin.name === name; + })[0]; + }; + + /** + * the current time in seconds. + * @method getCurrentTime + * @return {Number} current time (in seconds) of the current source + */ + + + Player.prototype.getCurrentTime = function getCurrentTime() { + return this.core.activeContainer.getCurrentTime(); + }; + + /** + * The time that "0" now represents relative to when playback started. + * For a stream with a sliding window this will increase as content is + * removed from the beginning. + * @method getStartTimeOffset + * @return {Number} time (in seconds) that time "0" represents. + */ + + + Player.prototype.getStartTimeOffset = function getStartTimeOffset() { + return this.core.activeContainer.getStartTimeOffset(); + }; + + /** + * the duration time in seconds. + * @method getDuration + * @return {Number} duration time (in seconds) of the current source + */ + + + Player.prototype.getDuration = function getDuration() { + return this.core.activeContainer.getDuration(); + }; + + return Player; +}(_base_object2.default); + +exports.default = Player; + + +(0, _assign2.default)(Player.prototype, _error_mixin2.default); +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/components/player_info.js": +/*!***************************************!*\ + !*** ./src/components/player_info.js ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var PlayerInfo = function PlayerInfo() { + (0, _classCallCheck3.default)(this, PlayerInfo); + + this.options = {}; + this.playbackPlugins = []; + this.currentSize = { width: 0, height: 0 }; +}; + +PlayerInfo._players = {}; + +PlayerInfo.getInstance = function (playerId) { + return PlayerInfo._players[playerId] || (PlayerInfo._players[playerId] = new PlayerInfo()); +}; + +exports.default = PlayerInfo; +module.exports = exports["default"]; + +/***/ }), + +/***/ "./src/icons/01-play.svg": +/*!*******************************!*\ + !*** ./src/icons/01-play.svg ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/02-pause.svg": +/*!********************************!*\ + !*** ./src/icons/02-pause.svg ***! + \********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/03-stop.svg": +/*!*******************************!*\ + !*** ./src/icons/03-stop.svg ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/04-volume.svg": +/*!*********************************!*\ + !*** ./src/icons/04-volume.svg ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/05-mute.svg": +/*!*******************************!*\ + !*** ./src/icons/05-mute.svg ***! + \*******************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/06-expand.svg": +/*!*********************************!*\ + !*** ./src/icons/06-expand.svg ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/07-shrink.svg": +/*!*********************************!*\ + !*** ./src/icons/07-shrink.svg ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/08-hd.svg": +/*!*****************************!*\ + !*** ./src/icons/08-hd.svg ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/09-cc.svg": +/*!*****************************!*\ + !*** ./src/icons/09-cc.svg ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/icons/10-reload.svg": +/*!*********************************!*\ + !*** ./src/icons/10-reload.svg ***! + \*********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "" + +/***/ }), + +/***/ "./src/main.js": +/*!*********************!*\ + !*** ./src/main.js ***! + \*********************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _player = __webpack_require__(/*! ./components/player */ "./src/components/player.js"); + +var _player2 = _interopRequireDefault(_player); + +var _utils = __webpack_require__(/*! ./base/utils */ "./src/base/utils.js"); + +var _utils2 = _interopRequireDefault(_utils); + +var _events = __webpack_require__(/*! ./base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _playback = __webpack_require__(/*! ./base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _container_plugin = __webpack_require__(/*! ./base/container_plugin */ "./src/base/container_plugin.js"); + +var _container_plugin2 = _interopRequireDefault(_container_plugin); + +var _core_plugin = __webpack_require__(/*! ./base/core_plugin */ "./src/base/core_plugin.js"); + +var _core_plugin2 = _interopRequireDefault(_core_plugin); + +var _ui_core_plugin = __webpack_require__(/*! ./base/ui_core_plugin */ "./src/base/ui_core_plugin.js"); + +var _ui_core_plugin2 = _interopRequireDefault(_ui_core_plugin); + +var _ui_container_plugin = __webpack_require__(/*! ./base/ui_container_plugin */ "./src/base/ui_container_plugin.js"); + +var _ui_container_plugin2 = _interopRequireDefault(_ui_container_plugin); + +var _base_object = __webpack_require__(/*! ./base/base_object */ "./src/base/base_object.js"); + +var _base_object2 = _interopRequireDefault(_base_object); + +var _ui_object = __webpack_require__(/*! ./base/ui_object */ "./src/base/ui_object.js"); + +var _ui_object2 = _interopRequireDefault(_ui_object); + +var _browser = __webpack_require__(/*! ./components/browser */ "./src/components/browser/index.js"); + +var _browser2 = _interopRequireDefault(_browser); + +var _container = __webpack_require__(/*! ./components/container */ "./src/components/container/index.js"); + +var _container2 = _interopRequireDefault(_container); + +var _core = __webpack_require__(/*! ./components/core */ "./src/components/core/index.js"); + +var _core2 = _interopRequireDefault(_core); + +var _error = __webpack_require__(/*! ./components/error */ "./src/components/error/index.js"); + +var _error2 = _interopRequireDefault(_error); + +var _loader = __webpack_require__(/*! ./components/loader */ "./src/components/loader/index.js"); + +var _loader2 = _interopRequireDefault(_loader); + +var _mediator = __webpack_require__(/*! ./components/mediator */ "./src/components/mediator.js"); + +var _mediator2 = _interopRequireDefault(_mediator); + +var _player_info = __webpack_require__(/*! ./components/player_info */ "./src/components/player_info.js"); + +var _player_info2 = _interopRequireDefault(_player_info); + +var _base_flash_playback = __webpack_require__(/*! ./playbacks/base_flash_playback */ "./src/playbacks/base_flash_playback/index.js"); + +var _base_flash_playback2 = _interopRequireDefault(_base_flash_playback); + +var _flash = __webpack_require__(/*! ./playbacks/flash */ "./src/playbacks/flash/index.js"); + +var _flash2 = _interopRequireDefault(_flash); + +var _flashls = __webpack_require__(/*! ./playbacks/flashls */ "./src/playbacks/flashls/index.js"); + +var _flashls2 = _interopRequireDefault(_flashls); + +var _hls = __webpack_require__(/*! ./playbacks/hls */ "./src/playbacks/hls/index.js"); + +var _hls2 = _interopRequireDefault(_hls); + +var _html5_audio = __webpack_require__(/*! ./playbacks/html5_audio */ "./src/playbacks/html5_audio/index.js"); + +var _html5_audio2 = _interopRequireDefault(_html5_audio); + +var _html5_video = __webpack_require__(/*! ./playbacks/html5_video */ "./src/playbacks/html5_video/index.js"); + +var _html5_video2 = _interopRequireDefault(_html5_video); + +var _html_img = __webpack_require__(/*! ./playbacks/html_img */ "./src/playbacks/html_img/index.js"); + +var _html_img2 = _interopRequireDefault(_html_img); + +var _no_op = __webpack_require__(/*! ./playbacks/no_op */ "./src/playbacks/no_op/index.js"); + +var _no_op2 = _interopRequireDefault(_no_op); + +var _media_control = __webpack_require__(/*! ./plugins/media_control */ "./src/plugins/media_control/index.js"); + +var _media_control2 = _interopRequireDefault(_media_control); + +var _click_to_pause = __webpack_require__(/*! ./plugins/click_to_pause */ "./src/plugins/click_to_pause/index.js"); + +var _click_to_pause2 = _interopRequireDefault(_click_to_pause); + +var _dvr_controls = __webpack_require__(/*! ./plugins/dvr_controls */ "./src/plugins/dvr_controls/index.js"); + +var _dvr_controls2 = _interopRequireDefault(_dvr_controls); + +var _favicon = __webpack_require__(/*! ./plugins/favicon */ "./src/plugins/favicon/index.js"); + +var _favicon2 = _interopRequireDefault(_favicon); + +var _log = __webpack_require__(/*! ./plugins/log */ "./src/plugins/log/index.js"); + +var _log2 = _interopRequireDefault(_log); + +var _poster = __webpack_require__(/*! ./plugins/poster */ "./src/plugins/poster/index.js"); + +var _poster2 = _interopRequireDefault(_poster); + +var _spinner_three_bounce = __webpack_require__(/*! ./plugins/spinner_three_bounce */ "./src/plugins/spinner_three_bounce/index.js"); + +var _spinner_three_bounce2 = _interopRequireDefault(_spinner_three_bounce); + +var _watermark = __webpack_require__(/*! ./plugins/watermark */ "./src/plugins/watermark/index.js"); + +var _watermark2 = _interopRequireDefault(_watermark); + +var _styler = __webpack_require__(/*! ./base/styler */ "./src/base/styler.js"); + +var _styler2 = _interopRequireDefault(_styler); + +var _vendor = __webpack_require__(/*! ./vendor */ "./src/vendor/index.js"); + +var _vendor2 = _interopRequireDefault(_vendor); + +var _template = __webpack_require__(/*! ./base/template */ "./src/base/template.js"); + +var _template2 = _interopRequireDefault(_template); + +var _clapprZepto = __webpack_require__(/*! clappr-zepto */ "./node_modules/clappr-zepto/zepto.js"); + +var _clapprZepto2 = _interopRequireDefault(_clapprZepto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var version = "0.3.7"; // Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +exports.default = { + Player: _player2.default, + Mediator: _mediator2.default, + Events: _events2.default, + Browser: _browser2.default, + PlayerInfo: _player_info2.default, + MediaControl: _media_control2.default, + ContainerPlugin: _container_plugin2.default, + UIContainerPlugin: _ui_container_plugin2.default, + CorePlugin: _core_plugin2.default, + UICorePlugin: _ui_core_plugin2.default, + Playback: _playback2.default, + Container: _container2.default, + Core: _core2.default, + PlayerError: _error2.default, + Loader: _loader2.default, + BaseObject: _base_object2.default, + UIObject: _ui_object2.default, + Utils: _utils2.default, + BaseFlashPlayback: _base_flash_playback2.default, + Flash: _flash2.default, + FlasHLS: _flashls2.default, + HLS: _hls2.default, + HTML5Audio: _html5_audio2.default, + HTML5Video: _html5_video2.default, + HTMLImg: _html_img2.default, + NoOp: _no_op2.default, + ClickToPausePlugin: _click_to_pause2.default, + DVRControls: _dvr_controls2.default, + Favicon: _favicon2.default, + Log: _log2.default, + Poster: _poster2.default, + SpinnerThreeBouncePlugin: _spinner_three_bounce2.default, + WaterMarkPlugin: _watermark2.default, + Styler: _styler2.default, + Vendor: _vendor2.default, + version: version, + template: _template2.default, + $: _clapprZepto2.default +}; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/base_flash_playback/base_flash_playback.js": +/*!******************************************************************!*\ + !*** ./src/playbacks/base_flash_playback/base_flash_playback.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _template = __webpack_require__(/*! ../../base/template */ "./src/base/template.js"); + +var _template2 = _interopRequireDefault(_template); + +var _browser = __webpack_require__(/*! ../../components/browser */ "./src/components/browser/index.js"); + +var _browser2 = _interopRequireDefault(_browser); + +var _flash = __webpack_require__(/*! ./public/flash.html */ "./src/playbacks/base_flash_playback/public/flash.html"); + +var _flash2 = _interopRequireDefault(_flash); + +__webpack_require__(/*! ./public/flash.scss */ "./src/playbacks/base_flash_playback/public/flash.scss"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var IE_CLASSID = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; // Copyright 2015 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var BaseFlashPlayback = function (_Playback) { + (0, _inherits3.default)(BaseFlashPlayback, _Playback); + + function BaseFlashPlayback() { + (0, _classCallCheck3.default)(this, BaseFlashPlayback); + return (0, _possibleConstructorReturn3.default)(this, _Playback.apply(this, arguments)); + } + + BaseFlashPlayback.prototype.setElement = function setElement(element) { + this.$el = element; + this.el = element[0]; + }; + + BaseFlashPlayback.prototype.render = function render() { + this.$el.attr('data', this.swfPath); + this.$el.html(this.template({ + cid: this.cid, + swfPath: this.swfPath, + baseUrl: this.baseUrl, + playbackId: this.uniqueId, + wmode: this.wmode, + callbackName: 'window.Clappr.flashlsCallbacks.' + this.cid })); + + if (_browser2.default.isIE) { + this.$('embed').remove(); + + if (_browser2.default.isLegacyIE) this.$el.attr('classid', IE_CLASSID); + } + + this.el.id = this.cid; + + return this; + }; + + (0, _createClass3.default)(BaseFlashPlayback, [{ + key: 'tagName', + get: function get() { + return 'object'; + } + }, { + key: 'swfPath', + get: function get() { + return ''; + } + }, { + key: 'wmode', + get: function get() { + return 'transparent'; + } + }, { + key: 'template', + get: function get() { + return (0, _template2.default)(_flash2.default); + } + }, { + key: 'attributes', + get: function get() { + var type = 'application/x-shockwave-flash'; + + if (_browser2.default.isLegacyIE) type = ''; + + return { + class: 'clappr-flash-playback', + type: type, + width: '100%', + height: '100%', + data: this.swfPath, + 'data-flash-playback': this.name + }; + } + }]); + return BaseFlashPlayback; +}(_playback2.default); + +exports.default = BaseFlashPlayback; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/base_flash_playback/index.js": +/*!****************************************************!*\ + !*** ./src/playbacks/base_flash_playback/index.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = __webpack_require__(/*! ./base_flash_playback */ "./src/playbacks/base_flash_playback/base_flash_playback.js"); +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/base_flash_playback/public/flash.html": +/*!*************************************************************!*\ + !*** ./src/playbacks/base_flash_playback/public/flash.html ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "\">\n\n\n\n\n\n\">\n\n&callback=<%= callbackName %>\">\n\"\n type=\"application/x-shockwave-flash\"\n disabled=\"disabled\"\n tabindex=\"-1\"\n enablecontextmenu=\"false\"\n allowScriptAccess=\"always\"\n quality=\"autohigh\"\n pluginspage=\"http://www.macromedia.com/go/getflashplayer\"\n wmode=\"<%= wmode %>\"\n swliveconnect=\"true\"\n allowfullscreen=\"false\"\n bgcolor=\"#000000\"\n FlashVars=\"playbackId=<%= playbackId %>&callback=<%= callbackName %>\"\n data=\"<%= swfPath %>\"\n src=\"<%= swfPath %>\"\n width=\"100%\"\n height=\"100%\">\n\n"; + +/***/ }), + +/***/ "./src/playbacks/base_flash_playback/public/flash.scss": +/*!*************************************************************!*\ + !*** ./src/playbacks/base_flash_playback/public/flash.scss ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + + +var content = __webpack_require__(/*! !../../../../node_modules/css-loader!../../../../node_modules/postcss-loader/lib!../../../../node_modules/sass-loader/lib/loader.js?includePaths[]=/Users/bruno/workspace/clappr/clappr/src/base/scss!./flash.scss */ "./node_modules/css-loader/index.js!./node_modules/postcss-loader/lib/index.js!./node_modules/sass-loader/lib/loader.js?includePaths[]=/Users/bruno/workspace/clappr/clappr/src/base/scss!./src/playbacks/base_flash_playback/public/flash.scss"); + +if(typeof content === 'string') content = [[module.i, content, '']]; + +var transform; +var insertInto; + + + +var options = {"singleton":true,"hmr":true} + +options.transform = transform +options.insertInto = undefined; + +var update = __webpack_require__(/*! ../../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options); + +if(content.locals) module.exports = content.locals; + +if(false) {} + +/***/ }), + +/***/ "./src/playbacks/flash/flash.js": +/*!**************************************!*\ + !*** ./src/playbacks/flash/flash.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _utils = __webpack_require__(/*! ../../base/utils */ "./src/base/utils.js"); + +var _base_flash_playback = __webpack_require__(/*! ../../playbacks/base_flash_playback */ "./src/playbacks/base_flash_playback/index.js"); + +var _base_flash_playback2 = _interopRequireDefault(_base_flash_playback); + +var _browser = __webpack_require__(/*! ../../components/browser */ "./src/components/browser/index.js"); + +var _browser2 = _interopRequireDefault(_browser); + +var _mediator = __webpack_require__(/*! ../../components/mediator */ "./src/components/mediator.js"); + +var _mediator2 = _interopRequireDefault(_mediator); + +var _template = __webpack_require__(/*! ../../base/template */ "./src/base/template.js"); + +var _template2 = _interopRequireDefault(_template); + +var _clapprZepto = __webpack_require__(/*! clappr-zepto */ "./node_modules/clappr-zepto/zepto.js"); + +var _clapprZepto2 = _interopRequireDefault(_clapprZepto); + +var _events = __webpack_require__(/*! ../../base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _Player = __webpack_require__(/*! ./public/Player.swf */ "./src/playbacks/flash/public/Player.swf"); + +var _Player2 = _interopRequireDefault(_Player); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var MAX_ATTEMPTS = 60; // Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var Flash = function (_BaseFlashPlayback) { + (0, _inherits3.default)(Flash, _BaseFlashPlayback); + (0, _createClass3.default)(Flash, [{ + key: 'name', + get: function get() { + return 'flash'; + } + }, { + key: 'swfPath', + get: function get() { + return (0, _template2.default)(_Player2.default)({ baseUrl: this._baseUrl }); + } + + /** + * Determine if the playback has ended. + * @property ended + * @type Boolean + */ + + }, { + key: 'ended', + get: function get() { + return this._currentState === 'ENDED'; + } + + /** + * Determine if the playback is buffering. + * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events + * @property buffering + * @type Boolean + */ + + }, { + key: 'buffering', + get: function get() { + return !!this._bufferingState && this._currentState !== 'ENDED'; + } + }]); + + function Flash() { + (0, _classCallCheck3.default)(this, Flash); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _this = (0, _possibleConstructorReturn3.default)(this, _BaseFlashPlayback.call.apply(_BaseFlashPlayback, [this].concat(args))); + + _this._src = _this.options.src; + _this._baseUrl = _this.options.baseUrl; + _this._autoPlay = _this.options.autoPlay; + _this.settings = { default: ['seekbar'] }; + _this.settings.left = ['playpause', 'position', 'duration']; + _this.settings.right = ['fullscreen', 'volume']; + _this.settings.seekEnabled = true; + _this._isReadyState = false; + _this._addListeners(); + return _this; + } + + Flash.prototype._bootstrap = function _bootstrap() { + var _this2 = this; + + if (this.el.playerPlay) { + this.el.width = '100%'; + this.el.height = '100%'; + if (this._currentState === 'PLAYING') { + this._firstPlay(); + } else { + this._currentState = 'IDLE'; + this._autoPlay && this.play(); + } + (0, _clapprZepto2.default)('
      ').insertAfter(this.$el); + if (this.getDuration() > 0) this._metadataLoaded();else _mediator2.default.once(this.uniqueId + ':timeupdate', this._metadataLoaded, this); + } else { + this._attempts = this._attempts || 0; + if (++this._attempts <= MAX_ATTEMPTS) setTimeout(function () { + return _this2._bootstrap(); + }, 50);else this.trigger(_events2.default.PLAYBACK_ERROR, { message: 'Max number of attempts reached' }, this.name); + } + }; + + Flash.prototype._metadataLoaded = function _metadataLoaded() { + this._isReadyState = true; + this.trigger(_events2.default.PLAYBACK_READY, this.name); + this.trigger(_events2.default.PLAYBACK_SETTINGSUPDATE, this.name); + }; + + Flash.prototype.getPlaybackType = function getPlaybackType() { + return _playback2.default.VOD; + }; + + Flash.prototype.isHighDefinitionInUse = function isHighDefinitionInUse() { + return false; + }; + + Flash.prototype._updateTime = function _updateTime() { + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: this.el.getPosition(), total: this.el.getDuration() }, this.name); + }; + + Flash.prototype._addListeners = function _addListeners() { + _mediator2.default.on(this.uniqueId + ':progress', this._progress, this); + _mediator2.default.on(this.uniqueId + ':timeupdate', this._updateTime, this); + _mediator2.default.on(this.uniqueId + ':statechanged', this._checkState, this); + _mediator2.default.on(this.uniqueId + ':flashready', this._bootstrap, this); + }; + + Flash.prototype.stopListening = function stopListening() { + _BaseFlashPlayback.prototype.stopListening.call(this); + _mediator2.default.off(this.uniqueId + ':progress'); + _mediator2.default.off(this.uniqueId + ':timeupdate'); + _mediator2.default.off(this.uniqueId + ':statechanged'); + _mediator2.default.off(this.uniqueId + ':flashready'); + }; + + Flash.prototype._checkState = function _checkState() { + if (this._isIdle || this._currentState === 'PAUSED') { + return; + } else if (this._currentState !== 'PLAYING_BUFFERING' && this.el.getState() === 'PLAYING_BUFFERING') { + this._bufferingState = true; + this.trigger(_events2.default.PLAYBACK_BUFFERING, this.name); + this._currentState = 'PLAYING_BUFFERING'; + } else if (this.el.getState() === 'PLAYING') { + this._bufferingState = false; + this.trigger(_events2.default.PLAYBACK_BUFFERFULL, this.name); + this._currentState = 'PLAYING'; + } else if (this.el.getState() === 'IDLE') { + this._currentState = 'IDLE'; + } else if (this.el.getState() === 'ENDED') { + this.trigger(_events2.default.PLAYBACK_ENDED, this.name); + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: 0, total: this.el.getDuration() }, this.name); + this._currentState = 'ENDED'; + this._isIdle = true; + } + }; + + Flash.prototype._progress = function _progress() { + if (this._currentState !== 'IDLE' && this._currentState !== 'ENDED') { + this.trigger(_events2.default.PLAYBACK_PROGRESS, { + start: 0, + current: this.el.getBytesLoaded(), + total: this.el.getBytesTotal() + }); + } + }; + + Flash.prototype._firstPlay = function _firstPlay() { + var _this3 = this; + + if (this.el.playerPlay) { + this._isIdle = false; + this.el.playerPlay(this._src); + this.listenToOnce(this, _events2.default.PLAYBACK_BUFFERFULL, function () { + return _this3._checkInitialSeek(); + }); + this._currentState = 'PLAYING'; + } else { + this.listenToOnce(this, _events2.default.PLAYBACK_READY, this._firstPlay); + } + }; + + Flash.prototype._checkInitialSeek = function _checkInitialSeek() { + var seekTime = (0, _utils.seekStringToSeconds)(window.location.href); + if (seekTime !== 0) this.seekSeconds(seekTime); + }; + + Flash.prototype.play = function play() { + this.trigger(_events2.default.PLAYBACK_PLAY_INTENT); + if (this._currentState === 'PAUSED' || this._currentState === 'PLAYING_BUFFERING') { + this._currentState = 'PLAYING'; + this.el.playerResume(); + this.trigger(_events2.default.PLAYBACK_PLAY, this.name); + } else if (this._currentState !== 'PLAYING') { + this._firstPlay(); + this.trigger(_events2.default.PLAYBACK_PLAY, this.name); + } + }; + + Flash.prototype.volume = function volume(value) { + var _this4 = this; + + if (this.isReady) this.el.playerVolume(value);else this.listenToOnce(this, _events2.default.PLAYBACK_BUFFERFULL, function () { + return _this4.volume(value); + }); + }; + + Flash.prototype.pause = function pause() { + this._currentState = 'PAUSED'; + this.el.playerPause(); + this.trigger(_events2.default.PLAYBACK_PAUSE, this.name); + }; + + Flash.prototype.stop = function stop() { + this.el.playerStop(); + this.trigger(_events2.default.PLAYBACK_STOP); + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: 0, total: 0 }, this.name); + }; + + Flash.prototype.isPlaying = function isPlaying() { + return !!(this.isReady && this._currentState.indexOf('PLAYING') > -1); + }; + + Flash.prototype.getDuration = function getDuration() { + return this.el.getDuration(); + }; + + Flash.prototype.seekPercentage = function seekPercentage(percentage) { + var _this5 = this; + + if (this.el.getDuration() > 0) { + var seekSeconds = this.el.getDuration() * (percentage / 100); + this.seek(seekSeconds); + } else { + this.listenToOnce(this, _events2.default.PLAYBACK_BUFFERFULL, function () { + return _this5.seekPercentage(percentage); + }); + } + }; + + Flash.prototype.seek = function seek(time) { + var _this6 = this; + + if (this.isReady && this.el.playerSeek) { + this.el.playerSeek(time); + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: time, total: this.el.getDuration() }, this.name); + if (this._currentState === 'PAUSED') this.el.playerPause(); + } else { + this.listenToOnce(this, _events2.default.PLAYBACK_BUFFERFULL, function () { + return _this6.seek(time); + }); + } + }; + + Flash.prototype.destroy = function destroy() { + clearInterval(this.bootstrapId); + _BaseFlashPlayback.prototype.stopListening.call(this); + this.$el.remove(); + }; + + (0, _createClass3.default)(Flash, [{ + key: 'isReady', + get: function get() { + return this._isReadyState; + } + }]); + return Flash; +}(_base_flash_playback2.default); + +exports.default = Flash; + + +Flash.canPlay = function (resource) { + if (!_browser2.default.hasFlash || !resource || resource.constructor !== String) { + return false; + } else { + var resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || []; + return resourceParts.length > 1 && !_browser2.default.isMobile && resourceParts[1].toLowerCase().match(/^(mp4|mov|f4v|3gpp|3gp)$/); + } +}; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/flash/index.js": +/*!**************************************!*\ + !*** ./src/playbacks/flash/index.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _flash = __webpack_require__(/*! ./flash */ "./src/playbacks/flash/flash.js"); + +var _flash2 = _interopRequireDefault(_flash); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _flash2.default; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/flash/public/Player.swf": +/*!***********************************************!*\ + !*** ./src/playbacks/flash/public/Player.swf ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "<%=baseUrl%>/4b76590b32dab62bc95c1b7951efae78.swf"; + +/***/ }), + +/***/ "./src/playbacks/flashls/flashls.js": +/*!******************************************!*\ + !*** ./src/playbacks/flashls/flashls.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _base_flash_playback = __webpack_require__(/*! ../../playbacks/base_flash_playback */ "./src/playbacks/base_flash_playback/index.js"); + +var _base_flash_playback2 = _interopRequireDefault(_base_flash_playback); + +var _events = __webpack_require__(/*! ../../base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _template = __webpack_require__(/*! ../../base/template */ "./src/base/template.js"); + +var _template2 = _interopRequireDefault(_template); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _mediator = __webpack_require__(/*! ../../components/mediator */ "./src/components/mediator.js"); + +var _mediator2 = _interopRequireDefault(_mediator); + +var _browser = __webpack_require__(/*! ../../components/browser */ "./src/components/browser/index.js"); + +var _browser2 = _interopRequireDefault(_browser); + +var _error = __webpack_require__(/*! ../../components/error */ "./src/components/error/index.js"); + +var _error2 = _interopRequireDefault(_error); + +var _flashls_events = __webpack_require__(/*! ./flashls_events */ "./src/playbacks/flashls/flashls_events.js"); + +var _flashls_events2 = _interopRequireDefault(_flashls_events); + +var _HLSPlayer = __webpack_require__(/*! ./public/HLSPlayer.swf */ "./src/playbacks/flashls/public/HLSPlayer.swf"); + +var _HLSPlayer2 = _interopRequireDefault(_HLSPlayer); + +var _clapprZepto = __webpack_require__(/*! clappr-zepto */ "./node_modules/clappr-zepto/zepto.js"); + +var _clapprZepto2 = _interopRequireDefault(_clapprZepto); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var MAX_ATTEMPTS = 60; +var AUTO = -1; + +var FlasHLS = function (_BaseFlashPlayback) { + (0, _inherits3.default)(FlasHLS, _BaseFlashPlayback); + (0, _createClass3.default)(FlasHLS, [{ + key: 'name', + get: function get() { + return 'flashls'; + } + }, { + key: 'swfPath', + get: function get() { + return (0, _template2.default)(_HLSPlayer2.default)({ baseUrl: this._baseUrl }); + } + }, { + key: 'levels', + get: function get() { + return this._levels || []; + } + }, { + key: 'currentLevel', + get: function get() { + if (this._currentLevel === null || this._currentLevel === undefined) return AUTO;else return this._currentLevel; //0 is a valid level ID + }, + set: function set(id) { + this._currentLevel = id; + this.trigger(_events2.default.PLAYBACK_LEVEL_SWITCH_START); + this.el.playerSetCurrentLevel(id); + } + + /** + * Determine if the playback has ended. + * @property ended + * @type Boolean + */ + + }, { + key: 'ended', + get: function get() { + return this._hasEnded; + } + + /** + * Determine if the playback is buffering. + * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events + * @property buffering + * @type Boolean + */ + + }, { + key: 'buffering', + get: function get() { + return !!this._bufferingState && !this._hasEnded; + } + }]); + + function FlasHLS() { + (0, _classCallCheck3.default)(this, FlasHLS); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _this = (0, _possibleConstructorReturn3.default)(this, _BaseFlashPlayback.call.apply(_BaseFlashPlayback, [this].concat(args))); + + _this._src = _this.options.src; + _this._baseUrl = _this.options.baseUrl; + _this._initHlsParameters(_this.options); + // TODO can this be private? + _this.highDefinition = false; + _this._autoPlay = _this.options.autoPlay; + _this._loop = _this.options.loop; + _this._defaultSettings = { + left: ['playstop'], + default: ['seekbar'], + right: ['fullscreen', 'volume', 'hd-indicator'], + seekEnabled: false + }; + _this.settings = _clapprZepto2.default.extend({}, _this._defaultSettings); + _this._playbackType = _playback2.default.LIVE; + _this._hasEnded = false; + _this._addListeners(); + return _this; + } + + FlasHLS.prototype._initHlsParameters = function _initHlsParameters(options) { + this._autoStartLoad = options.autoStartLoad === undefined ? true : options.autoStartLoad; + this._capLevelToStage = options.capLevelToStage === undefined ? false : options.capLevelToStage; + this._maxLevelCappingMode = options.maxLevelCappingMode === undefined ? 'downscale' : options.maxLevelCappingMode; + this._minBufferLength = options.minBufferLength === undefined ? -1 : options.minBufferLength; + this._minBufferLengthCapping = options.minBufferLengthCapping === undefined ? -1 : options.minBufferLengthCapping; + this._maxBufferLength = options.maxBufferLength === undefined ? 120 : options.maxBufferLength; + this._maxBackBufferLength = options.maxBackBufferLength === undefined ? 30 : options.maxBackBufferLength; + this._lowBufferLength = options.lowBufferLength === undefined ? 3 : options.lowBufferLength; + this._mediaTimePeriod = options.mediaTimePeriod === undefined ? 100 : options.mediaTimePeriod; + this._fpsDroppedMonitoringPeriod = options.fpsDroppedMonitoringPeriod === undefined ? 5000 : options.fpsDroppedMonitoringPeriod; + this._fpsDroppedMonitoringThreshold = options.fpsDroppedMonitoringThreshold === undefined ? 0.2 : options.fpsDroppedMonitoringThreshold; + this._capLevelonFPSDrop = options.capLevelonFPSDrop === undefined ? false : options.capLevelonFPSDrop; + this._smoothAutoSwitchonFPSDrop = options.smoothAutoSwitchonFPSDrop === undefined ? this.capLevelonFPSDrop : options.smoothAutoSwitchonFPSDrop; + this._switchDownOnLevelError = options.switchDownOnLevelError === undefined ? true : options.switchDownOnLevelError; + this._seekMode = options.seekMode === undefined ? 'ACCURATE' : options.seekMode; + this._keyLoadMaxRetry = options.keyLoadMaxRetry === undefined ? 3 : options.keyLoadMaxRetry; + this._keyLoadMaxRetryTimeout = options.keyLoadMaxRetryTimeout === undefined ? 64000 : options.keyLoadMaxRetryTimeout; + this._fragmentLoadMaxRetry = options.fragmentLoadMaxRetry === undefined ? 3 : options.fragmentLoadMaxRetry; + this._fragmentLoadMaxRetryTimeout = options.fragmentLoadMaxRetryTimeout === undefined ? 4000 : options.fragmentLoadMaxRetryTimeout; + this._fragmentLoadSkipAfterMaxRetry = options.fragmentLoadSkipAfterMaxRetry === undefined ? true : options.fragmentLoadSkipAfterMaxRetry; + this._maxSkippedFragments = options.maxSkippedFragments === undefined ? 5 : options.maxSkippedFragments; + this._flushLiveURLCache = options.flushLiveURLCache === undefined ? false : options.flushLiveURLCache; + this._initialLiveManifestSize = options.initialLiveManifestSize === undefined ? 1 : options.initialLiveManifestSize; + this._manifestLoadMaxRetry = options.manifestLoadMaxRetry === undefined ? 3 : options.manifestLoadMaxRetry; + this._manifestLoadMaxRetryTimeout = options.manifestLoadMaxRetryTimeout === undefined ? 64000 : options.manifestLoadMaxRetryTimeout; + this._manifestRedundantLoadmaxRetry = options.manifestRedundantLoadmaxRetry === undefined ? 3 : options.manifestRedundantLoadmaxRetry; + this._startFromBitrate = options.startFromBitrate === undefined ? -1 : options.startFromBitrate; + this._startFromLevel = options.startFromLevel === undefined ? -1 : options.startFromLevel; + this._autoStartMaxDuration = options.autoStartMaxDuration === undefined ? -1 : options.autoStartMaxDuration; + this._seekFromLevel = options.seekFromLevel === undefined ? -1 : options.seekFromLevel; + this._useHardwareVideoDecoder = options.useHardwareVideoDecoder === undefined ? false : options.useHardwareVideoDecoder; + this._hlsLogEnabled = options.hlsLogEnabled === undefined ? true : options.hlsLogEnabled; + this._logDebug = options.logDebug === undefined ? false : options.logDebug; + this._logDebug2 = options.logDebug2 === undefined ? false : options.logDebug2; + this._logWarn = options.logWarn === undefined ? true : options.logWarn; + this._logError = options.logError === undefined ? true : options.logError; + this._hlsMinimumDvrSize = options.hlsMinimumDvrSize === undefined ? 60 : options.hlsMinimumDvrSize; + }; + + FlasHLS.prototype._addListeners = function _addListeners() { + var _this2 = this; + + _mediator2.default.on(this.cid + ':flashready', function () { + return _this2._bootstrap(); + }); + _mediator2.default.on(this.cid + ':timeupdate', function (timeMetrics) { + return _this2._updateTime(timeMetrics); + }); + _mediator2.default.on(this.cid + ':playbackstate', function (state) { + return _this2._setPlaybackState(state); + }); + _mediator2.default.on(this.cid + ':levelchanged', function (level) { + return _this2._levelChanged(level); + }); + _mediator2.default.on(this.cid + ':error', function (code, url, message) { + return _this2._flashPlaybackError(code, url, message); + }); + _mediator2.default.on(this.cid + ':fragmentloaded', function (loadmetrics) { + return _this2._onFragmentLoaded(loadmetrics); + }); + _mediator2.default.on(this.cid + ':levelendlist', function (level) { + return _this2._onLevelEndlist(level); + }); + }; + + FlasHLS.prototype.stopListening = function stopListening() { + _BaseFlashPlayback.prototype.stopListening.call(this); + _mediator2.default.off(this.cid + ':flashready'); + _mediator2.default.off(this.cid + ':timeupdate'); + _mediator2.default.off(this.cid + ':playbackstate'); + _mediator2.default.off(this.cid + ':levelchanged'); + _mediator2.default.off(this.cid + ':playbackerror'); + _mediator2.default.off(this.cid + ':fragmentloaded'); + _mediator2.default.off(this.cid + ':manifestloaded'); + _mediator2.default.off(this.cid + ':levelendlist'); + }; + + FlasHLS.prototype._bootstrap = function _bootstrap() { + var _this3 = this; + + if (this.el.playerLoad) { + this.el.width = '100%'; + this.el.height = '100%'; + this._isReadyState = true; + this._srcLoaded = false; + this._currentState = 'IDLE'; + this._setFlashSettings(); + this._updatePlaybackType(); + if (this._autoPlay || this._shouldPlayOnManifestLoaded) this.play(); + + this.trigger(_events2.default.PLAYBACK_READY, this.name); + } else { + this._bootstrapAttempts = this._bootstrapAttempts || 0; + if (++this._bootstrapAttempts <= MAX_ATTEMPTS) { + setTimeout(function () { + return _this3._bootstrap(); + }, 50); + } else { + var formattedError = this.createError({ + code: 'playerLoadFail_maxNumberAttemptsReached', + description: this.name + ' error: Max number of attempts reached', + level: _error2.default.Levels.FATAL, + raw: {} + }); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + } + } + }; + + FlasHLS.prototype._setFlashSettings = function _setFlashSettings() { + this.el.playerSetAutoStartLoad(this._autoStartLoad); + this.el.playerSetCapLevelToStage(this._capLevelToStage); + this.el.playerSetMaxLevelCappingMode(this._maxLevelCappingMode); + this.el.playerSetMinBufferLength(this._minBufferLength); + this.el.playerSetMinBufferLengthCapping(this._minBufferLengthCapping); + this.el.playerSetMaxBufferLength(this._maxBufferLength); + this.el.playerSetMaxBackBufferLength(this._maxBackBufferLength); + this.el.playerSetLowBufferLength(this._lowBufferLength); + this.el.playerSetMediaTimePeriod(this._mediaTimePeriod); + this.el.playerSetFpsDroppedMonitoringPeriod(this._fpsDroppedMonitoringPeriod); + this.el.playerSetFpsDroppedMonitoringThreshold(this._fpsDroppedMonitoringThreshold); + this.el.playerSetCapLevelonFPSDrop(this._capLevelonFPSDrop); + this.el.playerSetSmoothAutoSwitchonFPSDrop(this._smoothAutoSwitchonFPSDrop); + this.el.playerSetSwitchDownOnLevelError(this._switchDownOnLevelError); + this.el.playerSetSeekMode(this._seekMode); + this.el.playerSetKeyLoadMaxRetry(this._keyLoadMaxRetry); + this.el.playerSetKeyLoadMaxRetryTimeout(this._keyLoadMaxRetryTimeout); + this.el.playerSetFragmentLoadMaxRetry(this._fragmentLoadMaxRetry); + this.el.playerSetFragmentLoadMaxRetryTimeout(this._fragmentLoadMaxRetryTimeout); + this.el.playerSetFragmentLoadSkipAfterMaxRetry(this._fragmentLoadSkipAfterMaxRetry); + this.el.playerSetMaxSkippedFragments(this._maxSkippedFragments); + this.el.playerSetFlushLiveURLCache(this._flushLiveURLCache); + this.el.playerSetInitialLiveManifestSize(this._initialLiveManifestSize); + this.el.playerSetManifestLoadMaxRetry(this._manifestLoadMaxRetry); + this.el.playerSetManifestLoadMaxRetryTimeout(this._manifestLoadMaxRetryTimeout); + this.el.playerSetManifestRedundantLoadmaxRetry(this._manifestRedundantLoadmaxRetry); + this.el.playerSetStartFromBitrate(this._startFromBitrate); + this.el.playerSetStartFromLevel(this._startFromLevel); + this.el.playerSetAutoStartMaxDuration(this._autoStartMaxDuration); + this.el.playerSetSeekFromLevel(this._seekFromLevel); + this.el.playerSetUseHardwareVideoDecoder(this._useHardwareVideoDecoder); + this.el.playerSetLogInfo(this._hlsLogEnabled); + this.el.playerSetLogDebug(this._logDebug); + this.el.playerSetLogDebug2(this._logDebug2); + this.el.playerSetLogWarn(this._logWarn); + this.el.playerSetLogError(this._logError); + }; + + FlasHLS.prototype.setAutoStartLoad = function setAutoStartLoad(autoStartLoad) { + this._autoStartLoad = autoStartLoad; + this.el.playerSetAutoStartLoad(this._autoStartLoad); + }; + + FlasHLS.prototype.setCapLevelToStage = function setCapLevelToStage(capLevelToStage) { + this._capLevelToStage = capLevelToStage; + this.el.playerSetCapLevelToStage(this._capLevelToStage); + }; + + FlasHLS.prototype.setMaxLevelCappingMode = function setMaxLevelCappingMode(maxLevelCappingMode) { + this._maxLevelCappingMode = maxLevelCappingMode; + this.el.playerSetMaxLevelCappingMode(this._maxLevelCappingMode); + }; + + FlasHLS.prototype.setSetMinBufferLength = function setSetMinBufferLength(minBufferLength) { + this._minBufferLength = minBufferLength; + this.el.playerSetMinBufferLength(this._minBufferLength); + }; + + FlasHLS.prototype.setMinBufferLengthCapping = function setMinBufferLengthCapping(minBufferLengthCapping) { + this._minBufferLengthCapping = minBufferLengthCapping; + this.el.playerSetMinBufferLengthCapping(this._minBufferLengthCapping); + }; + + FlasHLS.prototype.setMaxBufferLength = function setMaxBufferLength(maxBufferLength) { + this._maxBufferLength = maxBufferLength; + this.el.playerSetMaxBufferLength(this._maxBufferLength); + }; + + FlasHLS.prototype.setMaxBackBufferLength = function setMaxBackBufferLength(maxBackBufferLength) { + this._maxBackBufferLength = maxBackBufferLength; + this.el.playerSetMaxBackBufferLength(this._maxBackBufferLength); + }; + + FlasHLS.prototype.setLowBufferLength = function setLowBufferLength(lowBufferLength) { + this._lowBufferLength = lowBufferLength; + this.el.playerSetLowBufferLength(this._lowBufferLength); + }; + + FlasHLS.prototype.setMediaTimePeriod = function setMediaTimePeriod(mediaTimePeriod) { + this._mediaTimePeriod = mediaTimePeriod; + this.el.playerSetMediaTimePeriod(this._mediaTimePeriod); + }; + + FlasHLS.prototype.setFpsDroppedMonitoringPeriod = function setFpsDroppedMonitoringPeriod(fpsDroppedMonitoringPeriod) { + this._fpsDroppedMonitoringPeriod = fpsDroppedMonitoringPeriod; + this.el.playerSetFpsDroppedMonitoringPeriod(this._fpsDroppedMonitoringPeriod); + }; + + FlasHLS.prototype.setFpsDroppedMonitoringThreshold = function setFpsDroppedMonitoringThreshold(fpsDroppedMonitoringThreshold) { + this._fpsDroppedMonitoringThreshold = fpsDroppedMonitoringThreshold; + this.el.playerSetFpsDroppedMonitoringThreshold(this._fpsDroppedMonitoringThreshold); + }; + + FlasHLS.prototype.setCapLevelonFPSDrop = function setCapLevelonFPSDrop(capLevelonFPSDrop) { + this._capLevelonFPSDrop = capLevelonFPSDrop; + this.el.playerSetCapLevelonFPSDrop(this._capLevelonFPSDrop); + }; + + FlasHLS.prototype.setSmoothAutoSwitchonFPSDrop = function setSmoothAutoSwitchonFPSDrop(smoothAutoSwitchonFPSDrop) { + this._smoothAutoSwitchonFPSDrop = smoothAutoSwitchonFPSDrop; + this.el.playerSetSmoothAutoSwitchonFPSDrop(this._smoothAutoSwitchonFPSDrop); + }; + + FlasHLS.prototype.setSwitchDownOnLevelError = function setSwitchDownOnLevelError(switchDownOnLevelError) { + this._switchDownOnLevelError = switchDownOnLevelError; + this.el.playerSetSwitchDownOnLevelError(this._switchDownOnLevelError); + }; + + FlasHLS.prototype.setSeekMode = function setSeekMode(seekMode) { + this._seekMode = seekMode; + this.el.playerSetSeekMode(this._seekMode); + }; + + FlasHLS.prototype.setKeyLoadMaxRetry = function setKeyLoadMaxRetry(keyLoadMaxRetry) { + this._keyLoadMaxRetry = keyLoadMaxRetry; + this.el.playerSetKeyLoadMaxRetry(this._keyLoadMaxRetry); + }; + + FlasHLS.prototype.setKeyLoadMaxRetryTimeout = function setKeyLoadMaxRetryTimeout(keyLoadMaxRetryTimeout) { + this._keyLoadMaxRetryTimeout = keyLoadMaxRetryTimeout; + this.el.playerSetKeyLoadMaxRetryTimeout(this._keyLoadMaxRetryTimeout); + }; + + FlasHLS.prototype.setFragmentLoadMaxRetry = function setFragmentLoadMaxRetry(fragmentLoadMaxRetry) { + this._fragmentLoadMaxRetry = fragmentLoadMaxRetry; + this.el.playerSetFragmentLoadMaxRetry(this._fragmentLoadMaxRetry); + }; + + FlasHLS.prototype.setFragmentLoadMaxRetryTimeout = function setFragmentLoadMaxRetryTimeout(fragmentLoadMaxRetryTimeout) { + this._fragmentLoadMaxRetryTimeout = fragmentLoadMaxRetryTimeout; + this.el.playerSetFragmentLoadMaxRetryTimeout(this._fragmentLoadMaxRetryTimeout); + }; + + FlasHLS.prototype.setFragmentLoadSkipAfterMaxRetry = function setFragmentLoadSkipAfterMaxRetry(fragmentLoadSkipAfterMaxRetry) { + this._fragmentLoadSkipAfterMaxRetry = fragmentLoadSkipAfterMaxRetry; + this.el.playerSetFragmentLoadSkipAfterMaxRetry(this._fragmentLoadSkipAfterMaxRetry); + }; + + FlasHLS.prototype.setMaxSkippedFragments = function setMaxSkippedFragments(maxSkippedFragments) { + this._maxSkippedFragments = maxSkippedFragments; + this.el.playerSetMaxSkippedFragments(this._maxSkippedFragments); + }; + + FlasHLS.prototype.setFlushLiveURLCache = function setFlushLiveURLCache(flushLiveURLCache) { + this._flushLiveURLCache = flushLiveURLCache; + this.el.playerSetFlushLiveURLCache(this._flushLiveURLCache); + }; + + FlasHLS.prototype.setInitialLiveManifestSize = function setInitialLiveManifestSize(initialLiveManifestSize) { + this._initialLiveManifestSize = initialLiveManifestSize; + this.el.playerSetInitialLiveManifestSize(this._initialLiveManifestSize); + }; + + FlasHLS.prototype.setManifestLoadMaxRetry = function setManifestLoadMaxRetry(manifestLoadMaxRetry) { + this._manifestLoadMaxRetry = manifestLoadMaxRetry; + this.el.playerSetManifestLoadMaxRetry(this._manifestLoadMaxRetry); + }; + + FlasHLS.prototype.setManifestLoadMaxRetryTimeout = function setManifestLoadMaxRetryTimeout(manifestLoadMaxRetryTimeout) { + this._manifestLoadMaxRetryTimeout = manifestLoadMaxRetryTimeout; + this.el.playerSetManifestLoadMaxRetryTimeout(this._manifestLoadMaxRetryTimeout); + }; + + FlasHLS.prototype.setManifestRedundantLoadmaxRetry = function setManifestRedundantLoadmaxRetry(manifestRedundantLoadmaxRetry) { + this._manifestRedundantLoadmaxRetry = manifestRedundantLoadmaxRetry; + this.el.playerSetManifestRedundantLoadmaxRetry(this._manifestRedundantLoadmaxRetry); + }; + + FlasHLS.prototype.setStartFromBitrate = function setStartFromBitrate(startFromBitrate) { + this._startFromBitrate = startFromBitrate; + this.el.playerSetStartFromBitrate(this._startFromBitrate); + }; + + FlasHLS.prototype.setStartFromLevel = function setStartFromLevel(startFromLevel) { + this._startFromLevel = startFromLevel; + this.el.playerSetStartFromLevel(this._startFromLevel); + }; + + FlasHLS.prototype.setAutoStartMaxDuration = function setAutoStartMaxDuration(autoStartMaxDuration) { + this._autoStartMaxDuration = autoStartMaxDuration; + this.el.playerSetAutoStartMaxDuration(this._autoStartMaxDuration); + }; + + FlasHLS.prototype.setSeekFromLevel = function setSeekFromLevel(seekFromLevel) { + this._seekFromLevel = seekFromLevel; + this.el.playerSetSeekFromLevel(this._seekFromLevel); + }; + + FlasHLS.prototype.setUseHardwareVideoDecoder = function setUseHardwareVideoDecoder(useHardwareVideoDecoder) { + this._useHardwareVideoDecoder = useHardwareVideoDecoder; + this.el.playerSetUseHardwareVideoDecoder(this._useHardwareVideoDecoder); + }; + + FlasHLS.prototype.setSetLogInfo = function setSetLogInfo(hlsLogEnabled) { + this._hlsLogEnabled = hlsLogEnabled; + this.el.playerSetLogInfo(this._hlsLogEnabled); + }; + + FlasHLS.prototype.setLogDebug = function setLogDebug(logDebug) { + this._logDebug = logDebug; + this.el.playerSetLogDebug(this._logDebug); + }; + + FlasHLS.prototype.setLogDebug2 = function setLogDebug2(logDebug2) { + this._logDebug2 = logDebug2; + this.el.playerSetLogDebug2(this._logDebug2); + }; + + FlasHLS.prototype.setLogWarn = function setLogWarn(logWarn) { + this._logWarn = logWarn; + this.el.playerSetLogWarn(this._logWarn); + }; + + FlasHLS.prototype.setLogError = function setLogError(logError) { + this._logError = logError; + this.el.playerSetLogError(this._logError); + }; + + FlasHLS.prototype._levelChanged = function _levelChanged(level) { + var currentLevel = this.el.getLevels()[level]; + if (currentLevel) { + this.highDefinition = currentLevel.height >= 720 || currentLevel.bitrate / 1000 >= 2000; + this.trigger(_events2.default.PLAYBACK_HIGHDEFINITIONUPDATE, this.highDefinition); + + if (!this._levels || this._levels.length === 0) this._fillLevels(); + + this.trigger(_events2.default.PLAYBACK_BITRATE, { + height: currentLevel.height, + width: currentLevel.width, + bandwidth: currentLevel.bitrate, + bitrate: currentLevel.bitrate, + level: level + }); + this.trigger(_events2.default.PLAYBACK_LEVEL_SWITCH_END); + } + }; + + FlasHLS.prototype._updateTime = function _updateTime(timeMetrics) { + if (this._currentState === 'IDLE') return; + + var duration = this._normalizeDuration(timeMetrics.duration); + var position = Math.min(Math.max(timeMetrics.position, 0), duration); + var previousDVRStatus = this._dvrEnabled; + var livePlayback = this._playbackType === _playback2.default.LIVE; + this._dvrEnabled = livePlayback && duration > this._hlsMinimumDvrSize; + + if (duration === 100 || livePlayback === undefined) return; + + if (this._dvrEnabled !== previousDVRStatus) { + this._updateSettings(); + this.trigger(_events2.default.PLAYBACK_SETTINGSUPDATE, this.name); + } + + if (livePlayback && !this._dvrEnabled) position = duration; + + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: position, total: duration }, this.name); + }; + + FlasHLS.prototype.play = function play() { + this.trigger(_events2.default.PLAYBACK_PLAY_INTENT); + if (this._currentState === 'PAUSED') this.el.playerResume();else if (!this._srcLoaded && this._currentState !== 'PLAYING') this._firstPlay();else this.el.playerPlay(); + }; + + FlasHLS.prototype.getPlaybackType = function getPlaybackType() { + return this._playbackType ? this._playbackType : null; + }; + + FlasHLS.prototype.getCurrentTime = function getCurrentTime() { + return this.el.getPosition(); + }; + + FlasHLS.prototype.getCurrentLevelIndex = function getCurrentLevelIndex() { + return this._currentLevel; + }; + + FlasHLS.prototype.getCurrentLevel = function getCurrentLevel() { + return this.levels[this.currentLevel]; + }; + + FlasHLS.prototype.getCurrentBitrate = function getCurrentBitrate() { + return this.levels[this.currentLevel].bitrate; + }; + + FlasHLS.prototype.setCurrentLevel = function setCurrentLevel(level) { + this.currentLevel = level; + }; + + FlasHLS.prototype.isHighDefinitionInUse = function isHighDefinitionInUse() { + return this.highDefinition; + }; + + FlasHLS.prototype.getLevels = function getLevels() { + return this.levels; + }; + + FlasHLS.prototype._setPlaybackState = function _setPlaybackState(state) { + if (['PLAYING_BUFFERING', 'PAUSED_BUFFERING'].indexOf(state) >= 0) { + this._bufferingState = true; + this.trigger(_events2.default.PLAYBACK_BUFFERING, this.name); + this._updateCurrentState(state); + } else if (['PLAYING', 'PAUSED'].indexOf(state) >= 0) { + if (['PLAYING_BUFFERING', 'PAUSED_BUFFERING', 'IDLE'].indexOf(this._currentState) >= 0) { + this._bufferingState = false; + this.trigger(_events2.default.PLAYBACK_BUFFERFULL, this.name); + } + this._updateCurrentState(state); + } else if (state === 'IDLE') { + this._srcLoaded = false; + if (this._loop && ['PLAYING_BUFFERING', 'PLAYING'].indexOf(this._currentState) >= 0) { + this.play(); + this.seek(0); + } else { + this._updateCurrentState(state); + this._hasEnded = true; + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: 0, total: this.getDuration() }, this.name); + this.trigger(_events2.default.PLAYBACK_ENDED, this.name); + } + } + }; + + FlasHLS.prototype._updateCurrentState = function _updateCurrentState(state) { + this._currentState = state; + if (state !== 'IDLE') this._hasEnded = false; + + this._updatePlaybackType(); + if (state === 'PLAYING') this.trigger(_events2.default.PLAYBACK_PLAY, this.name);else if (state === 'PAUSED') this.trigger(_events2.default.PLAYBACK_PAUSE, this.name); + }; + + FlasHLS.prototype._updatePlaybackType = function _updatePlaybackType() { + this._playbackType = this.el.getType(); + if (this._playbackType) { + this._playbackType = this._playbackType.toLowerCase(); + if (this._playbackType === _playback2.default.VOD) this._startReportingProgress();else this._stopReportingProgress(); + } + this.trigger(_events2.default.PLAYBACK_PLAYBACKSTATE, { type: this._playbackType }); + }; + + FlasHLS.prototype._startReportingProgress = function _startReportingProgress() { + if (!this._reportingProgress) this._reportingProgress = true; + }; + + FlasHLS.prototype._stopReportingProgress = function _stopReportingProgress() { + this._reportingProgress = false; + }; + + FlasHLS.prototype._onFragmentLoaded = function _onFragmentLoaded(loadmetrics) { + this.trigger(_events2.default.PLAYBACK_FRAGMENT_LOADED, loadmetrics); + if (this._reportingProgress && this.getCurrentTime()) { + var buffered = this.getCurrentTime() + this.el.getbufferLength(); + this.trigger(_events2.default.PLAYBACK_PROGRESS, { + start: this.getCurrentTime(), + current: buffered, + total: this.el.getDuration() + }); + } + }; + + FlasHLS.prototype._onLevelEndlist = function _onLevelEndlist() { + this._updatePlaybackType(); + }; + + FlasHLS.prototype._firstPlay = function _firstPlay() { + var _this4 = this; + + this._shouldPlayOnManifestLoaded = true; + if (this.el.playerLoad) { + _mediator2.default.once(this.cid + ':manifestloaded', function (duration, loadmetrics) { + return _this4._manifestLoaded(duration, loadmetrics); + }); + this._setFlashSettings(); //ensure flushLiveURLCache will work (#327) + this.el.playerLoad(this._src); + this._srcLoaded = true; + } + }; + + FlasHLS.prototype.volume = function volume(value) { + var _this5 = this; + + if (this.isReady) this.el.playerVolume(value);else this.listenToOnce(this, _events2.default.PLAYBACK_BUFFERFULL, function () { + return _this5.volume(value); + }); + }; + + FlasHLS.prototype.pause = function pause() { + if (this._playbackType !== _playback2.default.LIVE || this._dvrEnabled) { + this.el.playerPause(); + if (this._playbackType === _playback2.default.LIVE && this._dvrEnabled) this._updateDvr(true); + } + }; + + FlasHLS.prototype.stop = function stop() { + this._srcLoaded = false; + this.el.playerStop(); + this.trigger(_events2.default.PLAYBACK_STOP); + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: 0, total: 0 }, this.name); + }; + + FlasHLS.prototype.isPlaying = function isPlaying() { + if (this._currentState) return !!this._currentState.match(/playing/i); + + return false; + }; + + FlasHLS.prototype.getDuration = function getDuration() { + return this._normalizeDuration(this.el.getDuration()); + }; + + FlasHLS.prototype._normalizeDuration = function _normalizeDuration(duration) { + if (this._playbackType === _playback2.default.LIVE) { + // estimate 10 seconds of buffer time for live streams for seek positions + duration = Math.max(0, duration - 10); + } + return duration; + }; + + FlasHLS.prototype.seekPercentage = function seekPercentage(percentage) { + var duration = this.el.getDuration(); + var time = 0; + if (percentage > 0) time = duration * percentage / 100; + + this.seek(time); + }; + + FlasHLS.prototype.seek = function seek(time) { + var duration = this.getDuration(); + if (this._playbackType === _playback2.default.LIVE) { + // seek operations to a time within 3 seconds from live stream will position playhead back to live + var dvrInUse = duration - time > 3; + this._updateDvr(dvrInUse); + } + this.el.playerSeek(time); + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, { current: time, total: duration }, this.name); + }; + + FlasHLS.prototype._updateDvr = function _updateDvr(dvrInUse) { + var previousDvrInUse = !!this._dvrInUse; + this._dvrInUse = dvrInUse; + if (this._dvrInUse !== previousDvrInUse) { + this._updateSettings(); + this.trigger(_events2.default.PLAYBACK_DVR, this._dvrInUse); + this.trigger(_events2.default.PLAYBACK_STATS_ADD, { 'dvr': this._dvrInUse }); + } + }; + + FlasHLS.prototype._flashPlaybackError = function _flashPlaybackError(code, url, message) { + var error = { + code: code, + description: message, + level: _error2.default.Levels.FATAL, + raw: { code: code, url: url, message: message } + }; + var formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.trigger(_events2.default.PLAYBACK_STOP); + }; + + FlasHLS.prototype._manifestLoaded = function _manifestLoaded(duration, loadmetrics) { + if (this._shouldPlayOnManifestLoaded) { + this._shouldPlayOnManifestLoaded = false; + // this method initialises the player (and starts playback) + // this needs to happen before PLAYBACK_LOADEDMETADATA is fired + // as the user may call seek() in a LOADEDMETADATA listener. + /// when playerPlay() is called the player seeks to 0 + this.el.playerPlay(); + } + + this._fillLevels(); + this.trigger(_events2.default.PLAYBACK_LOADEDMETADATA, { duration: duration, data: loadmetrics }); + }; + + FlasHLS.prototype._fillLevels = function _fillLevels() { + var levels = this.el.getLevels(); + var levelsLength = levels.length; + this._levels = []; + + for (var index = 0; index < levelsLength; index++) { + this._levels.push({ id: index, label: levels[index].height + 'p', level: levels[index] }); + }this.trigger(_events2.default.PLAYBACK_LEVELS_AVAILABLE, this._levels); + }; + + FlasHLS.prototype.destroy = function destroy() { + this.stopListening(); + this.$el.remove(); + }; + + FlasHLS.prototype._updateSettings = function _updateSettings() { + this.settings = _clapprZepto2.default.extend({}, this._defaultSettings); + if (this._playbackType === _playback2.default.VOD || this._dvrInUse) { + this.settings.left = ['playpause', 'position', 'duration']; + this.settings.seekEnabled = true; + } else if (this._dvrEnabled) { + this.settings.left = ['playpause']; + this.settings.seekEnabled = true; + } else { + this.settings.seekEnabled = false; + } + }; + + FlasHLS.prototype._createCallbacks = function _createCallbacks() { + var _this6 = this; + + if (!window.Clappr) window.Clappr = {}; + + if (!window.Clappr.flashlsCallbacks) window.Clappr.flashlsCallbacks = {}; + + this.flashlsEvents = new _flashls_events2.default(this.cid); + window.Clappr.flashlsCallbacks[this.cid] = function (eventName, args) { + _this6.flashlsEvents[eventName].apply(_this6.flashlsEvents, args); + }; + }; + + FlasHLS.prototype.render = function render() { + _BaseFlashPlayback.prototype.render.call(this); + this._createCallbacks(); + return this; + }; + + (0, _createClass3.default)(FlasHLS, [{ + key: 'isReady', + get: function get() { + return this._isReadyState; + } + }, { + key: 'dvrEnabled', + get: function get() { + return !!this._dvrEnabled; + } + }]); + return FlasHLS; +}(_base_flash_playback2.default); + +exports.default = FlasHLS; + + +FlasHLS.canPlay = function (resource, mimeType) { + var resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || []; + return _browser2.default.hasFlash && (resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'm3u8' || mimeType === 'application/x-mpegURL' || mimeType === 'application/vnd.apple.mpegurl'); +}; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/flashls/flashls_events.js": +/*!*************************************************!*\ + !*** ./src/playbacks/flashls/flashls_events.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _mediator = __webpack_require__(/*! ../../components/mediator */ "./src/components/mediator.js"); + +var _mediator2 = _interopRequireDefault(_mediator); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var HLSEvents = function () { + function HLSEvents(instanceId) { + (0, _classCallCheck3.default)(this, HLSEvents); + + this.instanceId = instanceId; + } + + HLSEvents.prototype.ready = function ready() { + _mediator2.default.trigger(this.instanceId + ':flashready'); + }; + + HLSEvents.prototype.videoSize = function videoSize(width, height) { + _mediator2.default.trigger(this.instanceId + ':videosizechanged', width, height); + }; + + HLSEvents.prototype.complete = function complete() { + _mediator2.default.trigger(this.instanceId + ':complete'); + }; + + HLSEvents.prototype.error = function error(code, url, message) { + _mediator2.default.trigger(this.instanceId + ':error', code, url, message); + }; + + HLSEvents.prototype.manifest = function manifest(duration, loadmetrics) { + _mediator2.default.trigger(this.instanceId + ':manifestloaded', duration, loadmetrics); + }; + + HLSEvents.prototype.audioLevelLoaded = function audioLevelLoaded(loadmetrics) { + _mediator2.default.trigger(this.instanceId + ':audiolevelloaded', loadmetrics); + }; + + HLSEvents.prototype.levelLoaded = function levelLoaded(loadmetrics) { + _mediator2.default.trigger(this.instanceId + ':levelloaded', loadmetrics); + }; + + HLSEvents.prototype.levelEndlist = function levelEndlist(level) { + _mediator2.default.trigger(this.instanceId + ':levelendlist', level); + }; + + HLSEvents.prototype.fragmentLoaded = function fragmentLoaded(loadmetrics) { + _mediator2.default.trigger(this.instanceId + ':fragmentloaded', loadmetrics); + }; + + HLSEvents.prototype.fragmentPlaying = function fragmentPlaying(playmetrics) { + _mediator2.default.trigger(this.instanceId + ':fragmentplaying', playmetrics); + }; + + HLSEvents.prototype.position = function position(timemetrics) { + _mediator2.default.trigger(this.instanceId + ':timeupdate', timemetrics); + }; + + HLSEvents.prototype.state = function state(newState) { + _mediator2.default.trigger(this.instanceId + ':playbackstate', newState); + }; + + HLSEvents.prototype.seekState = function seekState(newState) { + _mediator2.default.trigger(this.instanceId + ':seekstate', newState); + }; + + HLSEvents.prototype.switch = function _switch(newLevel) { + _mediator2.default.trigger(this.instanceId + ':levelchanged', newLevel); + }; + + HLSEvents.prototype.audioTracksListChange = function audioTracksListChange(trackList) { + _mediator2.default.trigger(this.instanceId + ':audiotracklistchanged', trackList); + }; + + HLSEvents.prototype.audioTrackChange = function audioTrackChange(trackId) { + _mediator2.default.trigger(this.instanceId + ':audiotrackchanged', trackId); + }; + + return HLSEvents; +}(); + +exports.default = HLSEvents; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/flashls/index.js": +/*!****************************************!*\ + !*** ./src/playbacks/flashls/index.js ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _flashls = __webpack_require__(/*! ./flashls */ "./src/playbacks/flashls/flashls.js"); + +var _flashls2 = _interopRequireDefault(_flashls); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _flashls2.default; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/flashls/public/HLSPlayer.swf": +/*!****************************************************!*\ + !*** ./src/playbacks/flashls/public/HLSPlayer.swf ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = "<%=baseUrl%>/8fa12a459188502b9f0d39b8a67d9e6c.swf"; + +/***/ }), + +/***/ "./src/playbacks/hls/hls.js": +/*!**********************************!*\ + !*** ./src/playbacks/hls/hls.js ***! + \**********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ "./node_modules/babel-runtime/helpers/toConsumableArray.js"); + +var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); + +var _stringify = __webpack_require__(/*! babel-runtime/core-js/json/stringify */ "./node_modules/babel-runtime/core-js/json/stringify.js"); + +var _stringify2 = _interopRequireDefault(_stringify); + +var _extends2 = __webpack_require__(/*! babel-runtime/helpers/extends */ "./node_modules/babel-runtime/helpers/extends.js"); + +var _extends3 = _interopRequireDefault(_extends2); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _html5_video = __webpack_require__(/*! ../../playbacks/html5_video */ "./src/playbacks/html5_video/index.js"); + +var _html5_video2 = _interopRequireDefault(_html5_video); + +var _hls = __webpack_require__(/*! hls.js */ "./node_modules/hls.js/dist/hls.js"); + +var _hls2 = _interopRequireDefault(_hls); + +var _events = __webpack_require__(/*! ../../base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _utils = __webpack_require__(/*! ../../base/utils */ "./src/base/utils.js"); + +var _log = __webpack_require__(/*! ../../plugins/log */ "./src/plugins/log/index.js"); + +var _log2 = _interopRequireDefault(_log); + +var _error = __webpack_require__(/*! ../../components/error */ "./src/components/error/index.js"); + +var _error2 = _interopRequireDefault(_error); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var AUTO = -1; // Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var HLS = function (_HTML5VideoPlayback) { + (0, _inherits3.default)(HLS, _HTML5VideoPlayback); + (0, _createClass3.default)(HLS, [{ + key: 'name', + get: function get() { + return 'hls'; + } + }, { + key: 'levels', + get: function get() { + return this._levels || []; + } + }, { + key: 'currentLevel', + get: function get() { + if (this._currentLevel === null || this._currentLevel === undefined) return AUTO;else return this._currentLevel; //0 is a valid level ID + }, + set: function set(id) { + this._currentLevel = id; + this.trigger(_events2.default.PLAYBACK_LEVEL_SWITCH_START); + if (this.options.playback.hlsUseNextLevel) this._hls.nextLevel = this._currentLevel;else this._hls.currentLevel = this._currentLevel; + } + }, { + key: 'isReady', + get: function get() { + return this._isReadyState; + } + }, { + key: '_startTime', + get: function get() { + if (this._playbackType === _playback2.default.LIVE && this._playlistType !== 'EVENT') return this._extrapolatedStartTime; + + return this._playableRegionStartTime; + } + }, { + key: '_now', + get: function get() { + return (0, _utils.now)(); + } + + // the time in the video element which should represent the start of the sliding window + // extrapolated to increase in real time (instead of jumping as the early segments are removed) + + }, { + key: '_extrapolatedStartTime', + get: function get() { + if (!this._localStartTimeCorrelation) return this._playableRegionStartTime; + + var corr = this._localStartTimeCorrelation; + var timePassed = this._now - corr.local; + var extrapolatedWindowStartTime = (corr.remote + timePassed) / 1000; + // cap at the end of the extrapolated window duration + return Math.min(extrapolatedWindowStartTime, this._playableRegionStartTime + this._extrapolatedWindowDuration); + } + + // the time in the video element which should represent the end of the content + // extrapolated to increase in real time (instead of jumping as segments are added) + + }, { + key: '_extrapolatedEndTime', + get: function get() { + var actualEndTime = this._playableRegionStartTime + this._playableRegionDuration; + if (!this._localEndTimeCorrelation) return actualEndTime; + + var corr = this._localEndTimeCorrelation; + var timePassed = this._now - corr.local; + var extrapolatedEndTime = (corr.remote + timePassed) / 1000; + return Math.max(actualEndTime - this._extrapolatedWindowDuration, Math.min(extrapolatedEndTime, actualEndTime)); + } + }, { + key: '_duration', + get: function get() { + return this._extrapolatedEndTime - this._startTime; + } + + // Returns the duration (seconds) of the window that the extrapolated start time is allowed + // to move in before being capped. + // The extrapolated start time should never reach the cap at the end of the window as the + // window should slide as chunks are removed from the start. + // This also applies to the extrapolated end time in the same way. + // + // If chunks aren't being removed for some reason that the start time will reach and remain fixed at + // playableRegionStartTime + extrapolatedWindowDuration + // + // <-- window duration --> + // I.e playableRegionStartTime |-----------------------| + // | --> . . . + // . --> | --> . . + // . . --> | --> . + // . . . --> | + // . . . . + // extrapolatedStartTime + + }, { + key: '_extrapolatedWindowDuration', + get: function get() { + if (this._segmentTargetDuration === null) return 0; + + return this._extrapolatedWindowNumSegments * this._segmentTargetDuration; + } + }], [{ + key: 'HLSJS', + get: function get() { + return _hls2.default; + } + }]); + + function HLS() { + (0, _classCallCheck3.default)(this, HLS); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + // backwards compatibility (TODO: remove on 0.3.0) + var _this = (0, _possibleConstructorReturn3.default)(this, _HTML5VideoPlayback.call.apply(_HTML5VideoPlayback, [this].concat(args))); + + _this.options.playback = (0, _extends3.default)({}, _this.options, _this.options.playback); + _this._minDvrSize = typeof _this.options.hlsMinimumDvrSize === 'undefined' ? 60 : _this.options.hlsMinimumDvrSize; + // The size of the start time extrapolation window measured as a multiple of segments. + // Should be 2 or higher, or 0 to disable. Should only need to be increased above 2 if more than one segment is + // removed from the start of the playlist at a time. E.g if the playlist is cached for 10 seconds and new chunks are + // added/removed every 5. + _this._extrapolatedWindowNumSegments = !_this.options.playback || typeof _this.options.playback.extrapolatedWindowNumSegments === 'undefined' ? 2 : _this.options.playback.extrapolatedWindowNumSegments; + + _this._playbackType = _playback2.default.VOD; + _this._lastTimeUpdate = { current: 0, total: 0 }; + _this._lastDuration = null; + // for hls streams which have dvr with a sliding window, + // the content at the start of the playlist is removed as new + // content is appended at the end. + // this means the actual playable start time will increase as the + // start content is deleted + // For streams with dvr where the entire recording is kept from the + // beginning this should stay as 0 + _this._playableRegionStartTime = 0; + // {local, remote} remote is the time in the video element that should represent 0 + // local is the system time when the 'remote' measurment took place + _this._localStartTimeCorrelation = null; + // {local, remote} remote is the time in the video element that should represents the end + // local is the system time when the 'remote' measurment took place + _this._localEndTimeCorrelation = null; + // if content is removed from the beginning then this empty area should + // be ignored. "playableRegionDuration" excludes the empty area + _this._playableRegionDuration = 0; + // #EXT-X-PROGRAM-DATE-TIME + _this._programDateTime = 0; + // true when the actual duration is longer than hlsjs's live sync point + // when this is false playableRegionDuration will be the actual duration + // when this is true playableRegionDuration will exclude the time after the sync point + _this._durationExcludesAfterLiveSyncPoint = false; + // #EXT-X-TARGETDURATION + _this._segmentTargetDuration = null; + // #EXT-X-PLAYLIST-TYPE + _this._playlistType = null; + _this._recoverAttemptsRemaining = _this.options.hlsRecoverAttempts || 16; + return _this; + } + + HLS.prototype._setup = function _setup() { + var _this2 = this; + + this._ccIsSetup = false; + this._ccTracksUpdated = false; + this._hls = new _hls2.default((0, _utils.assign)({}, this.options.playback.hlsjsConfig)); + this._hls.on(_hls2.default.Events.MEDIA_ATTACHED, function () { + return _this2._hls.loadSource(_this2.options.src); + }); + this._hls.on(_hls2.default.Events.LEVEL_LOADED, function (evt, data) { + return _this2._updatePlaybackType(evt, data); + }); + this._hls.on(_hls2.default.Events.LEVEL_UPDATED, function (evt, data) { + return _this2._onLevelUpdated(evt, data); + }); + this._hls.on(_hls2.default.Events.LEVEL_SWITCHING, function (evt, data) { + return _this2._onLevelSwitch(evt, data); + }); + this._hls.on(_hls2.default.Events.FRAG_LOADED, function (evt, data) { + return _this2._onFragmentLoaded(evt, data); + }); + this._hls.on(_hls2.default.Events.ERROR, function (evt, data) { + return _this2._onHLSJSError(evt, data); + }); + this._hls.on(_hls2.default.Events.SUBTITLE_TRACK_LOADED, function (evt, data) { + return _this2._onSubtitleLoaded(evt, data); + }); + this._hls.on(_hls2.default.Events.SUBTITLE_TRACKS_UPDATED, function () { + return _this2._ccTracksUpdated = true; + }); + this._hls.attachMedia(this.el); + }; + + HLS.prototype.render = function render() { + this._ready(); + return _HTML5VideoPlayback.prototype.render.call(this); + }; + + HLS.prototype._ready = function _ready() { + this._isReadyState = true; + this.trigger(_events2.default.PLAYBACK_READY, this.name); + }; + + HLS.prototype._recover = function _recover(evt, data, error) { + if (!this._recoveredDecodingError) { + this._recoveredDecodingError = true; + this._hls.recoverMediaError(); + } else if (!this._recoveredAudioCodecError) { + this._recoveredAudioCodecError = true; + this._hls.swapAudioCodec(); + this._hls.recoverMediaError(); + } else { + _log2.default.error('hlsjs: failed to recover', { evt: evt, data: data }); + error.level = _error2.default.Levels.FATAL; + var formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.stop(); + } + }; + + // override + + + HLS.prototype._setupSrc = function _setupSrc(srcUrl) {// eslint-disable-line no-unused-vars + // this playback manages the src on the video element itself + }; + + HLS.prototype._startTimeUpdateTimer = function _startTimeUpdateTimer() { + var _this3 = this; + + if (this._timeUpdateTimer) return; + + this._timeUpdateTimer = setInterval(function () { + _this3._onDurationChange(); + _this3._onTimeUpdate(); + }, 100); + }; + + HLS.prototype._stopTimeUpdateTimer = function _stopTimeUpdateTimer() { + if (!this._timeUpdateTimer) return; + + clearInterval(this._timeUpdateTimer); + this._timeUpdateTimer = null; + }; + + HLS.prototype.getProgramDateTime = function getProgramDateTime() { + return this._programDateTime; + }; + // the duration on the video element itself should not be used + // as this does not necesarily represent the duration of the stream + // https://github.com/clappr/clappr/issues/668#issuecomment-157036678 + + + HLS.prototype.getDuration = function getDuration() { + return this._duration; + }; + + HLS.prototype.getCurrentTime = function getCurrentTime() { + // e.g. can be < 0 if user pauses near the start + // eventually they will then be kicked to the end by hlsjs if they run out of buffer + // before the official start time + return Math.max(0, this.el.currentTime - this._startTime); + }; + + // the time that "0" now represents relative to when playback started + // for a stream with a sliding window this will increase as content is + // removed from the beginning + + + HLS.prototype.getStartTimeOffset = function getStartTimeOffset() { + return this._startTime; + }; + + HLS.prototype.seekPercentage = function seekPercentage(percentage) { + var seekTo = this._duration; + if (percentage > 0) seekTo = this._duration * (percentage / 100); + + this.seek(seekTo); + }; + + HLS.prototype.seek = function seek(time) { + if (time < 0) { + _log2.default.warn('Attempt to seek to a negative time. Resetting to live point. Use seekToLivePoint() to seek to the live point.'); + time = this.getDuration(); + } + // assume live if time within 3 seconds of end of stream + this.dvrEnabled && this._updateDvr(time < this.getDuration() - 3); + time += this._startTime; + _HTML5VideoPlayback.prototype.seek.call(this, time); + }; + + HLS.prototype.seekToLivePoint = function seekToLivePoint() { + this.seek(this.getDuration()); + }; + + HLS.prototype._updateDvr = function _updateDvr(status) { + this.trigger(_events2.default.PLAYBACK_DVR, status); + this.trigger(_events2.default.PLAYBACK_STATS_ADD, { 'dvr': status }); + }; + + HLS.prototype._updateSettings = function _updateSettings() { + if (this._playbackType === _playback2.default.VOD) this.settings.left = ['playpause', 'position', 'duration'];else if (this.dvrEnabled) this.settings.left = ['playpause'];else this.settings.left = ['playstop']; + + this.settings.seekEnabled = this.isSeekEnabled(); + this.trigger(_events2.default.PLAYBACK_SETTINGSUPDATE); + }; + + HLS.prototype._onHLSJSError = function _onHLSJSError(evt, data) { + var error = { + code: data.type + '_' + data.details, + description: this.name + ' error: type: ' + data.type + ', details: ' + data.details, + raw: data + }; + var formattedError = void 0; + if (data.response) error.description += ', response: ' + (0, _stringify2.default)(data.response); + // only report/handle errors if they are fatal + // hlsjs should automatically handle non fatal errors + if (data.fatal) { + if (this._recoverAttemptsRemaining > 0) { + this._recoverAttemptsRemaining -= 1; + switch (data.type) { + case _hls2.default.ErrorTypes.NETWORK_ERROR: + switch (data.details) { + // The following network errors cannot be recovered with HLS.startLoad() + // For more details, see https://github.com/video-dev/hls.js/blob/master/doc/design.md#error-detection-and-handling + // For "level load" fatal errors, see https://github.com/video-dev/hls.js/issues/1138 + case _hls2.default.ErrorDetails.MANIFEST_LOAD_ERROR: + case _hls2.default.ErrorDetails.MANIFEST_LOAD_TIMEOUT: + case _hls2.default.ErrorDetails.MANIFEST_PARSING_ERROR: + case _hls2.default.ErrorDetails.LEVEL_LOAD_ERROR: + case _hls2.default.ErrorDetails.LEVEL_LOAD_TIMEOUT: + _log2.default.error('hlsjs: unrecoverable network fatal error.', { evt: evt, data: data }); + formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.stop(); + break; + default: + _log2.default.warn('hlsjs: trying to recover from network error.', { evt: evt, data: data }); + error.level = _error2.default.Levels.WARN; + this.createError(error); + this._hls.startLoad(); + break; + } + break; + case _hls2.default.ErrorTypes.MEDIA_ERROR: + _log2.default.warn('hlsjs: trying to recover from media error.', { evt: evt, data: data }); + error.level = _error2.default.Levels.WARN; + this.createError(error); + this._recover(evt, data, error); + break; + default: + _log2.default.error('hlsjs: could not recover from error.', { evt: evt, data: data }); + formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.stop(); + break; + } + } else { + _log2.default.error('hlsjs: could not recover from error after maximum number of attempts.', { evt: evt, data: data }); + formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.stop(); + } + } else { + // Transforms HLSJS.ErrorDetails.KEY_LOAD_ERROR non-fatal error to + // playback fatal error if triggerFatalErrorOnResourceDenied playback + // option is set. HLSJS.ErrorTypes.KEY_SYSTEM_ERROR are fatal errors + // and therefore already handled. + if (this.options.playback.triggerFatalErrorOnResourceDenied && this._keyIsDenied(data)) { + _log2.default.error('hlsjs: could not load decrypt key.', { evt: evt, data: data }); + formattedError = this.createError(error); + this.trigger(_events2.default.PLAYBACK_ERROR, formattedError); + this.stop(); + return; + } + + error.level = _error2.default.Levels.WARN; + this.createError(error); + _log2.default.warn('hlsjs: non-fatal error occurred', { evt: evt, data: data }); + } + }; + + HLS.prototype._keyIsDenied = function _keyIsDenied(data) { + return data.type === _hls2.default.ErrorTypes.NETWORK_ERROR && data.details === _hls2.default.ErrorDetails.KEY_LOAD_ERROR && data.response && data.response.code >= 400; + }; + + HLS.prototype._onTimeUpdate = function _onTimeUpdate() { + var update = { current: this.getCurrentTime(), total: this.getDuration(), firstFragDateTime: this.getProgramDateTime() }; + var isSame = this._lastTimeUpdate && update.current === this._lastTimeUpdate.current && update.total === this._lastTimeUpdate.total; + if (isSame) return; + + this._lastTimeUpdate = update; + this.trigger(_events2.default.PLAYBACK_TIMEUPDATE, update, this.name); + }; + + HLS.prototype._onDurationChange = function _onDurationChange() { + var duration = this.getDuration(); + if (this._lastDuration === duration) return; + + this._lastDuration = duration; + _HTML5VideoPlayback.prototype._onDurationChange.call(this); + }; + + HLS.prototype._onProgress = function _onProgress() { + if (!this.el.buffered.length) return; + + var buffered = []; + var bufferedPos = 0; + for (var i = 0; i < this.el.buffered.length; i++) { + buffered = [].concat((0, _toConsumableArray3.default)(buffered), [{ + // for a stream with sliding window dvr something that is buffered my slide off the start of the timeline + start: Math.max(0, this.el.buffered.start(i) - this._playableRegionStartTime), + end: Math.max(0, this.el.buffered.end(i) - this._playableRegionStartTime) + }]); + if (this.el.currentTime >= buffered[i].start && this.el.currentTime <= buffered[i].end) bufferedPos = i; + } + var progress = { + start: buffered[bufferedPos].start, + current: buffered[bufferedPos].end, + total: this.getDuration() + }; + this.trigger(_events2.default.PLAYBACK_PROGRESS, progress, buffered); + }; + + HLS.prototype.play = function play() { + if (!this._hls) this._setup(); + + _HTML5VideoPlayback.prototype.play.call(this); + this._startTimeUpdateTimer(); + }; + + HLS.prototype.pause = function pause() { + if (!this._hls) return; + + _HTML5VideoPlayback.prototype.pause.call(this); + if (this.dvrEnabled) this._updateDvr(true); + }; + + HLS.prototype.stop = function stop() { + this._stopTimeUpdateTimer(); + if (this._hls) { + _HTML5VideoPlayback.prototype.stop.call(this); + this._hls.destroy(); + delete this._hls; + } + }; + + HLS.prototype.destroy = function destroy() { + this._stopTimeUpdateTimer(); + if (this._hls) { + this._hls.destroy(); + delete this._hls; + } + _HTML5VideoPlayback.prototype.destroy.call(this); + }; + + HLS.prototype._updatePlaybackType = function _updatePlaybackType(evt, data) { + this._playbackType = data.details.live ? _playback2.default.LIVE : _playback2.default.VOD; + this._onLevelUpdated(evt, data); + + // Live stream subtitle tracks detection hack (may not immediately available) + if (this._ccTracksUpdated && this._playbackType === _playback2.default.LIVE && this.hasClosedCaptionsTracks) this._onSubtitleLoaded(); + }; + + HLS.prototype._fillLevels = function _fillLevels() { + this._levels = this._hls.levels.map(function (level, index) { + return { id: index, level: level, label: level.bitrate / 1000 + 'Kbps' }; + }); + this.trigger(_events2.default.PLAYBACK_LEVELS_AVAILABLE, this._levels); + }; + + HLS.prototype._onLevelUpdated = function _onLevelUpdated(evt, data) { + this._segmentTargetDuration = data.details.targetduration; + this._playlistType = data.details.type || null; + + var startTimeChanged = false; + var durationChanged = false; + var fragments = data.details.fragments; + var previousPlayableRegionStartTime = this._playableRegionStartTime; + var previousPlayableRegionDuration = this._playableRegionDuration; + + if (fragments.length === 0) return; + + // #EXT-X-PROGRAM-DATE-TIME + if (fragments[0].rawProgramDateTime) this._programDateTime = fragments[0].rawProgramDateTime; + + if (this._playableRegionStartTime !== fragments[0].start) { + startTimeChanged = true; + this._playableRegionStartTime = fragments[0].start; + } + + if (startTimeChanged) { + if (!this._localStartTimeCorrelation) { + // set the correlation to map to middle of the extrapolation window + this._localStartTimeCorrelation = { + local: this._now, + remote: (fragments[0].start + this._extrapolatedWindowDuration / 2) * 1000 + }; + } else { + // check if the correlation still works + var corr = this._localStartTimeCorrelation; + var timePassed = this._now - corr.local; + // this should point to a time within the extrapolation window + var startTime = (corr.remote + timePassed) / 1000; + if (startTime < fragments[0].start) { + // our start time is now earlier than the first chunk + // (maybe the chunk was removed early) + // reset correlation so that it sits at the beginning of the first available chunk + this._localStartTimeCorrelation = { + local: this._now, + remote: fragments[0].start * 1000 + }; + } else if (startTime > previousPlayableRegionStartTime + this._extrapolatedWindowDuration) { + // start time was past the end of the old extrapolation window (so would have been capped) + // see if now that time would be inside the window, and if it would be set the correlation + // so that it resumes from the time it was at at the end of the old window + // update the correlation so that the time starts counting again from the value it's on now + this._localStartTimeCorrelation = { + local: this._now, + remote: Math.max(fragments[0].start, previousPlayableRegionStartTime + this._extrapolatedWindowDuration) * 1000 + }; + } + } + } + + var newDuration = data.details.totalduration; + // if it's a live stream then shorten the duration to remove access + // to the area after hlsjs's live sync point + // seeks to areas after this point sometimes have issues + if (this._playbackType === _playback2.default.LIVE) { + var fragmentTargetDuration = data.details.targetduration; + var hlsjsConfig = this.options.playback.hlsjsConfig || {}; + var liveSyncDurationCount = hlsjsConfig.liveSyncDurationCount || _hls2.default.DefaultConfig.liveSyncDurationCount; + var hiddenAreaDuration = fragmentTargetDuration * liveSyncDurationCount; + if (hiddenAreaDuration <= newDuration) { + newDuration -= hiddenAreaDuration; + this._durationExcludesAfterLiveSyncPoint = true; + } else { + this._durationExcludesAfterLiveSyncPoint = false; + } + } + + if (newDuration !== this._playableRegionDuration) { + durationChanged = true; + this._playableRegionDuration = newDuration; + } + + // Note the end time is not the playableRegionDuration + // The end time will always increase even if content is removed from the beginning + var endTime = fragments[0].start + newDuration; + var previousEndTime = previousPlayableRegionStartTime + previousPlayableRegionDuration; + var endTimeChanged = endTime !== previousEndTime; + if (endTimeChanged) { + if (!this._localEndTimeCorrelation) { + // set the correlation to map to the end + this._localEndTimeCorrelation = { + local: this._now, + remote: endTime * 1000 + }; + } else { + // check if the correlation still works + var _corr = this._localEndTimeCorrelation; + var _timePassed = this._now - _corr.local; + // this should point to a time within the extrapolation window from the end + var extrapolatedEndTime = (_corr.remote + _timePassed) / 1000; + if (extrapolatedEndTime > endTime) { + this._localEndTimeCorrelation = { + local: this._now, + remote: endTime * 1000 + }; + } else if (extrapolatedEndTime < endTime - this._extrapolatedWindowDuration) { + // our extrapolated end time is now earlier than the extrapolation window from the actual end time + // (maybe a chunk became available early) + // reset correlation so that it sits at the beginning of the extrapolation window from the end time + this._localEndTimeCorrelation = { + local: this._now, + remote: (endTime - this._extrapolatedWindowDuration) * 1000 + }; + } else if (extrapolatedEndTime > previousEndTime) { + // end time was past the old end time (so would have been capped) + // set the correlation so that it resumes from the time it was at at the end of the old window + this._localEndTimeCorrelation = { + local: this._now, + remote: previousEndTime * 1000 + }; + } + } + } + + // now that the values have been updated call any methods that use on them so they get the updated values + // immediately + durationChanged && this._onDurationChange(); + startTimeChanged && this._onProgress(); + }; + + HLS.prototype._onFragmentLoaded = function _onFragmentLoaded(evt, data) { + this.trigger(_events2.default.PLAYBACK_FRAGMENT_LOADED, data); + }; + + HLS.prototype._onSubtitleLoaded = function _onSubtitleLoaded() { + // This event may be triggered multiple times + // Setup CC only once (disable CC by default) + if (!this._ccIsSetup) { + this.trigger(_events2.default.PLAYBACK_SUBTITLE_AVAILABLE); + var trackId = this._playbackType === _playback2.default.LIVE ? -1 : this.closedCaptionsTrackId; + this.closedCaptionsTrackId = trackId; + this._ccIsSetup = true; + } + }; + + HLS.prototype._onLevelSwitch = function _onLevelSwitch(evt, data) { + if (!this.levels.length) this._fillLevels(); + + this.trigger(_events2.default.PLAYBACK_LEVEL_SWITCH_END); + this.trigger(_events2.default.PLAYBACK_LEVEL_SWITCH, data); + var currentLevel = this._hls.levels[data.level]; + if (currentLevel) { + // TODO should highDefinition be private and maybe have a read only accessor if it's used somewhere + this.highDefinition = currentLevel.height >= 720 || currentLevel.bitrate / 1000 >= 2000; + this.trigger(_events2.default.PLAYBACK_HIGHDEFINITIONUPDATE, this.highDefinition); + this.trigger(_events2.default.PLAYBACK_BITRATE, { + height: currentLevel.height, + width: currentLevel.width, + bandwidth: currentLevel.bitrate, + bitrate: currentLevel.bitrate, + level: data.level + }); + } + }; + + HLS.prototype.getPlaybackType = function getPlaybackType() { + return this._playbackType; + }; + + HLS.prototype.isSeekEnabled = function isSeekEnabled() { + return this._playbackType === _playback2.default.VOD || this.dvrEnabled; + }; + + (0, _createClass3.default)(HLS, [{ + key: 'dvrEnabled', + get: function get() { + // enabled when: + // - the duration does not include content after hlsjs's live sync point + // - the playable region duration is longer than the configured duration to enable dvr after + // - the playback type is LIVE. + return this._durationExcludesAfterLiveSyncPoint && this._duration >= this._minDvrSize && this.getPlaybackType() === _playback2.default.LIVE; + } + }]); + return HLS; +}(_html5_video2.default); + +exports.default = HLS; + + +HLS.canPlay = function (resource, mimeType) { + var resourceParts = resource.split('?')[0].match(/.*\.(.*)$/) || []; + var isHls = resourceParts.length > 1 && resourceParts[1].toLowerCase() === 'm3u8' || (0, _utils.listContainsIgnoreCase)(mimeType, ['application/vnd.apple.mpegurl', 'application/x-mpegURL']); + + return !!(_hls2.default.isSupported() && isHls); +}; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/hls/index.js": +/*!************************************!*\ + !*** ./src/playbacks/hls/index.js ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _hls = __webpack_require__(/*! ./hls */ "./src/playbacks/hls/hls.js"); + +var _hls2 = _interopRequireDefault(_hls); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _hls2.default; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/html5_audio/html5_audio.js": +/*!**************************************************!*\ + !*** ./src/playbacks/html5_audio/html5_audio.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _events = __webpack_require__(/*! ../../base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _html5_video = __webpack_require__(/*! ../../playbacks/html5_video */ "./src/playbacks/html5_video/index.js"); + +var _html5_video2 = _interopRequireDefault(_html5_video); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// TODO: remove this playback and change HTML5Video to HTML5Playback (breaking change, only after 0.3.0) +var HTML5Audio = function (_HTML5Video) { + (0, _inherits3.default)(HTML5Audio, _HTML5Video); + + function HTML5Audio() { + (0, _classCallCheck3.default)(this, HTML5Audio); + return (0, _possibleConstructorReturn3.default)(this, _HTML5Video.apply(this, arguments)); + } + + HTML5Audio.prototype.updateSettings = function updateSettings() { + this.settings.left = ['playpause', 'position', 'duration']; + this.settings.seekEnabled = this.isSeekEnabled(); + this.trigger(_events2.default.PLAYBACK_SETTINGSUPDATE); + }; + + HTML5Audio.prototype.getPlaybackType = function getPlaybackType() { + return _playback2.default.AOD; + }; + + (0, _createClass3.default)(HTML5Audio, [{ + key: 'name', + get: function get() { + return 'html5_audio'; + } + }, { + key: 'tagName', + get: function get() { + return 'audio'; + } + }, { + key: 'isAudioOnly', + get: function get() { + return true; + } + }]); + return HTML5Audio; +}(_html5_video2.default); // Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +exports.default = HTML5Audio; + + +HTML5Audio.canPlay = function (resourceUrl, mimeType) { + var mimetypes = { + 'wav': ['audio/wav'], + 'mp3': ['audio/mp3', 'audio/mpeg;codecs="mp3"'], + 'aac': ['audio/mp4;codecs="mp4a.40.5"'], + 'oga': ['audio/ogg'] + }; + return _html5_video2.default._canPlay('audio', mimetypes, resourceUrl, mimeType); +}; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/html5_audio/index.js": +/*!********************************************!*\ + !*** ./src/playbacks/html5_audio/index.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _html5_audio = __webpack_require__(/*! ./html5_audio */ "./src/playbacks/html5_audio/html5_audio.js"); + +var _html5_audio2 = _interopRequireDefault(_html5_audio); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _html5_audio2.default; +module.exports = exports['default']; + +/***/ }), + +/***/ "./src/playbacks/html5_video/html5_video.js": +/*!**************************************************!*\ + !*** ./src/playbacks/html5_video/html5_video.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(process) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _from = __webpack_require__(/*! babel-runtime/core-js/array/from */ "./node_modules/babel-runtime/core-js/array/from.js"); + +var _from2 = _interopRequireDefault(_from); + +var _classCallCheck2 = __webpack_require__(/*! babel-runtime/helpers/classCallCheck */ "./node_modules/babel-runtime/helpers/classCallCheck.js"); + +var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); + +var _possibleConstructorReturn2 = __webpack_require__(/*! babel-runtime/helpers/possibleConstructorReturn */ "./node_modules/babel-runtime/helpers/possibleConstructorReturn.js"); + +var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); + +var _createClass2 = __webpack_require__(/*! babel-runtime/helpers/createClass */ "./node_modules/babel-runtime/helpers/createClass.js"); + +var _createClass3 = _interopRequireDefault(_createClass2); + +var _inherits2 = __webpack_require__(/*! babel-runtime/helpers/inherits */ "./node_modules/babel-runtime/helpers/inherits.js"); + +var _inherits3 = _interopRequireDefault(_inherits2); + +var _toConsumableArray2 = __webpack_require__(/*! babel-runtime/helpers/toConsumableArray */ "./node_modules/babel-runtime/helpers/toConsumableArray.js"); + +var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); + +var _keys = __webpack_require__(/*! babel-runtime/core-js/object/keys */ "./node_modules/babel-runtime/core-js/object/keys.js"); + +var _keys2 = _interopRequireDefault(_keys); + +var _utils = __webpack_require__(/*! ../../base/utils */ "./src/base/utils.js"); + +var _playback = __webpack_require__(/*! ../../base/playback */ "./src/base/playback.js"); + +var _playback2 = _interopRequireDefault(_playback); + +var _browser = __webpack_require__(/*! ../../components/browser */ "./src/components/browser/index.js"); + +var _browser2 = _interopRequireDefault(_browser); + +var _error = __webpack_require__(/*! ../../components/error */ "./src/components/error/index.js"); + +var _error2 = _interopRequireDefault(_error); + +var _events = __webpack_require__(/*! ../../base/events */ "./src/base/events.js"); + +var _events2 = _interopRequireDefault(_events); + +var _log = __webpack_require__(/*! ../../plugins/log */ "./src/plugins/log/index.js"); + +var _log2 = _interopRequireDefault(_log); + +var _clapprZepto = __webpack_require__(/*! clappr-zepto */ "./node_modules/clappr-zepto/zepto.js"); + +var _clapprZepto2 = _interopRequireDefault(_clapprZepto); + +var _template = __webpack_require__(/*! ../../base/template */ "./src/base/template.js"); + +var _template2 = _interopRequireDefault(_template); + +var _tracks = __webpack_require__(/*! ./public/tracks.html */ "./src/playbacks/html5_video/public/tracks.html"); + +var _tracks2 = _interopRequireDefault(_tracks); + +__webpack_require__(/*! ./public/style.scss */ "./src/playbacks/html5_video/public/style.scss"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// Copyright 2014 Globo.com Player authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var MIMETYPES = { + 'mp4': ['avc1.42E01E', 'avc1.58A01E', 'avc1.4D401E', 'avc1.64001E', 'mp4v.20.8', 'mp4v.20.240', 'mp4a.40.2'].map(function (codec) { + return 'video/mp4; codecs="' + codec + ', mp4a.40.2"'; + }), + 'ogg': ['video/ogg; codecs="theora, vorbis"', 'video/ogg; codecs="dirac"', 'video/ogg; codecs="theora, speex"'], + '3gpp': ['video/3gpp; codecs="mp4v.20.8, samr"'], + 'webm': ['video/webm; codecs="vp8, vorbis"'], + 'mkv': ['video/x-matroska; codecs="theora, vorbis"'], + 'm3u8': ['application/x-mpegurl'] +}; +MIMETYPES['ogv'] = MIMETYPES['ogg']; +MIMETYPES['3gp'] = MIMETYPES['3gpp']; + +var AUDIO_MIMETYPES = { + 'wav': ['audio/wav'], + 'mp3': ['audio/mp3', 'audio/mpeg;codecs="mp3"'], + 'aac': ['audio/mp4;codecs="mp4a.40.5"'], + 'oga': ['audio/ogg'] +}; + +var KNOWN_AUDIO_MIMETYPES = (0, _keys2.default)(AUDIO_MIMETYPES).reduce(function (acc, k) { + return [].concat((0, _toConsumableArray3.default)(acc), (0, _toConsumableArray3.default)(AUDIO_MIMETYPES[k])); +}, []); + +var UNKNOWN_ERROR = { code: 'unknown', message: 'unknown' + + // TODO: rename this Playback to HTML5Playback (breaking change, only after 0.3.0) +}; +var HTML5Video = function (_Playback) { + (0, _inherits3.default)(HTML5Video, _Playback); + (0, _createClass3.default)(HTML5Video, [{ + key: 'name', + get: function get() { + return 'html5_video'; + } + }, { + key: 'tagName', + get: function get() { + return this.isAudioOnly ? 'audio' : 'video'; + } + }, { + key: 'isAudioOnly', + get: function get() { + var resourceUrl = this.options.src; + var mimeTypes = HTML5Video._mimeTypesForUrl(resourceUrl, AUDIO_MIMETYPES, this.options.mimeType); + return this.options.playback && this.options.playback.audioOnly || this.options.audioOnly || KNOWN_AUDIO_MIMETYPES.indexOf(mimeTypes[0]) >= 0; + } + }, { + key: 'attributes', + get: function get() { + return { + 'data-html5-video': '' + }; + } + }, { + key: 'events', + get: function get() { + return { + 'canplay': '_onCanPlay', + 'canplaythrough': '_handleBufferingEvents', + 'durationchange': '_onDurationChange', + 'ended': '_onEnded', + 'error': '_onError', + 'loadeddata': '_onLoadedData', + 'loadedmetadata': '_onLoadedMetadata', + 'pause': '_onPause', + 'playing': '_onPlaying', + 'progress': '_onProgress', + 'seeking': '_onSeeking', + 'seeked': '_onSeeked', + 'stalled': '_handleBufferingEvents', + 'timeupdate': '_onTimeUpdate', + 'waiting': '_onWaiting' + }; + } + + /** + * Determine if the playback has ended. + * @property ended + * @type Boolean + */ + + }, { + key: 'ended', + get: function get() { + return this.el.ended; + } + + /** + * Determine if the playback is having to buffer in order for + * playback to be smooth. + * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events + * @property buffering + * @type Boolean + */ + + }, { + key: 'buffering', + get: function get() { + return this._isBuffering; + } + }]); + + function HTML5Video() { + (0, _classCallCheck3.default)(this, HTML5Video); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var _this = (0, _possibleConstructorReturn3.default)(this, _Playback.call.apply(_Playback, [this].concat(args))); + + _this._destroyed = false; + _this._loadStarted = false; + _this._isBuffering = false; + _this._playheadMoving = false; + _this._playheadMovingTimer = null; + _this._stopped = false; + _this._ccTrackId = -1; + _this._setupSrc(_this.options.src); + // backwards compatibility (TODO: remove on 0.3.0) + _this.options.playback || (_this.options.playback = _this.options || {}); + _this.options.playback.disableContextMenu = _this.options.playback.disableContextMenu || _this.options.disableVideoTagContextMenu; + + var playbackConfig = _this.options.playback; + var preload = playbackConfig.preload || (_browser2.default.isSafari ? 'auto' : _this.options.preload); + + var posterUrl = void 0; // FIXME: poster plugin should always convert poster to object with expected properties ? + if (_this.options.poster) { + if (typeof _this.options.poster === 'string') posterUrl = _this.options.poster;else if (typeof _this.options.poster.url === 'string') posterUrl = _this.options.poster.url; + } + + _clapprZepto2.default.extend(_this.el, { + muted: _this.options.mute, + defaultMuted: _this.options.mute, + loop: _this.options.loop, + poster: posterUrl, + preload: preload || 'metadata', + controls: (playbackConfig.controls || _this.options.useVideoTagDefaultControls) && 'controls', + crossOrigin: playbackConfig.crossOrigin, + 'x-webkit-playsinline': playbackConfig.playInline + }); + + playbackConfig.playInline && _this.$el.attr({ playsinline: 'playsinline' }); + playbackConfig.crossOrigin && _this.$el.attr({ crossorigin: playbackConfig.crossOrigin }); + + // TODO should settings be private? + _this.settings = { default: ['seekbar'] }; + _this.settings.left = ['playpause', 'position', 'duration']; + _this.settings.right = ['fullscreen', 'volume', 'hd-indicator']; + + playbackConfig.externalTracks && _this._setupExternalTracks(playbackConfig.externalTracks); + + _this.options.autoPlay && _this.attemptAutoPlay(); + return _this; + } + + // See Playback.attemptAutoPlay() + + + HTML5Video.prototype.attemptAutoPlay = function attemptAutoPlay() { + var _this2 = this; + + this.canAutoPlay(function (result, error) { + error && _log2.default.warn(_this2.name, 'autoplay error.', { result: result, error: error }); + + // https://github.com/clappr/clappr/issues/1076 + result && process.nextTick(function () { + return !_this2._destroyed && _this2.play(); + }); + }); + }; + + // See Playback.canAutoPlay() + + + HTML5Video.prototype.canAutoPlay = function canAutoPlay(cb) { + if (this.options.disableCanAutoPlay) cb(true, null); + + var opts = { + timeout: this.options.autoPlayTimeout || 500, + inline: this.options.playback.playInline || false, + muted: this.options.mute || false // Known issue: mediacontrols may asynchronously mute video + + + // Use current video element if recycling feature enabled with mobile devices + };if (_browser2.default.isMobile && _utils.DomRecycler.options.recycleVideo) opts.element = this.el; + + // Desktop browser autoplay policy may require user action + // Mobile browser autoplay require user consent and video recycling feature enabled + // It may returns a false positive with source-less player consent + (0, _utils.canAutoPlayMedia)(cb, opts); + }; + + HTML5Video.prototype._setupExternalTracks = function _setupExternalTracks(tracks) { + this._externalTracks = tracks.map(function (track) { + return { + kind: track.kind || 'subtitles', // Default is 'subtitles' + label: track.label, + lang: track.lang, + src: track.src + }; + }); + }; + + /** + * Sets the source url on the
      - {content1 &&
      + {content1 &&
      {content1}
      } - {content2 &&
      + {content2 &&
      {content2}
      } - {content3 &&
      + {content3 &&
      {content3}
      }
      diff --git a/public/react/src/modules/page/MainContentContainer.js b/public/react/src/modules/page/MainContentContainer.js index 829b84b16..0211b3801 100644 --- a/public/react/src/modules/page/MainContentContainer.js +++ b/public/react/src/modules/page/MainContentContainer.js @@ -368,17 +368,20 @@ class MainContentContainer extends Component { } componentDidMount() { - - - window.$(window.documents).bind("submitChoose",function(){ - - alert("hello world!"); - - }); - - - + // if (this.binded == true) { + // return; + // } else { + // this.binded = true + // window.$(window).unload( ()=>{ + // alert(111) + // var fileUpdatePromise = this.doFileUpdateRequest(true) + // }); + // } + } + componentWillUnmount() { + // window.$(window).off( "unload" ) } + doFileUpdateRequestOnCodeMirrorBlur = () => { var fileUpdatePromise = this.doFileUpdateRequest(true) From a3b6d5aa368931b34d684c44e43cc61143e91252 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 09:39:17 +0800 Subject: [PATCH 160/623] modify user project package apig --- app/views/users/project_packages/index.json.jbuilder | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/users/project_packages/index.json.jbuilder b/app/views/users/project_packages/index.json.jbuilder index a2574d558..ad56be7d2 100644 --- a/app/views/users/project_packages/index.json.jbuilder +++ b/app/views/users/project_packages/index.json.jbuilder @@ -16,5 +16,11 @@ json.project_packages do json.deadline_at package.display_deadline_at json.published_at package.display_published_at + + json.operation do + can_manage = current_user&.id == observed_user.id || current_user&.admin_or_business? + json.can_edit can_manage && package.editable? + json.can_delete can_manage && package.deletable? + end end end \ No newline at end of file From f9cb02bf96b621a64c081115213c91637a500019 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 09:41:24 +0800 Subject: [PATCH 161/623] comment --- public/react/src/common/components/media/Clappr.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/public/react/src/common/components/media/Clappr.js b/public/react/src/common/components/media/Clappr.js index c420bebc0..2c4d89e92 100644 --- a/public/react/src/common/components/media/Clappr.js +++ b/public/react/src/common/components/media/Clappr.js @@ -16,15 +16,12 @@ class Clappr extends Component{ } componentDidMount() { - - + return; const source = this.props.source || "http://your.video/here.mp4" const { id, type } = this.props const _id = `#_player${id}` - - return; if (!window['Clappr'] && window['ClapprLoading'] == true) { setTimeout(() => { this.componentDidMount() @@ -91,6 +88,7 @@ class Clappr extends Component{ const _id = `_player${id}` return( + {/* https://github.com/CookPete/react-player/issues/686 */} {/*
      12?"cdefault ":"cdefault "}> -
      +
        { diff --git a/public/react/src/modules/user/usersInfo/Infos.js b/public/react/src/modules/user/usersInfo/Infos.js index df376e4e5..6078f7d6d 100644 --- a/public/react/src/modules/user/usersInfo/Infos.js +++ b/public/react/src/modules/user/usersInfo/Infos.js @@ -384,11 +384,11 @@ class Infos extends Component{ to={`/users/${username}/projects`}>项目 - {/*
      • */} - {/* this.setState({moduleName: 'package'})}*/} - {/*to={`/users/${username}/package`}>众包*/} - {/*
      • */} +
      • + this.setState({moduleName: 'package'})} + to={`/users/${username}/package`}>众包 +
      • {/*{ data && data.identity!="学生" &&
      • 题库
      • }*/} @@ -404,11 +404,11 @@ class Infos extends Component{ {/* 众包 */} {/* http://localhost:3007/courses/1309/homework/9300/setting */} - {/* ()*/} - {/*}*/} - {/*>*/} + () + } + > {/* 课堂 */} {/* http://localhost:3007/courses/1309/homework/9300/setting */} diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index bef2bf366..7c243faef 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -4,7 +4,8 @@ import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; import {Tooltip,Menu,Pagination,Spin} from 'antd'; import axios from 'axios'; import {getImageUrl} from 'educoder'; -import NoneData from '../../courses/coursesPublic/NoneData' +import Modals from '../../modals/Modals'; +import NoneData from '../../courses/coursesPublic/NoneData'; import "./usersInfo.css" import moment from 'moment'; let categorylist=[ @@ -113,6 +114,37 @@ class InfosPackage extends Component{ } } + + delectprojectModal=(id)=>{ + this.setState({ + Modalstype: true, + Modalstopval: '是否确认删除?', + ModalSave: () => this.delectproject(id), + ModalCancel: this.cancelProject + }) + } + + cancelProject=()=>{ + this.setState({ + Modalstype: false, + }) + } + + delectproject=(id)=>{ + + let {cate,status}=this.state; + let url=`/project_packages/${id}.json` + + axios.delete(url).then((response) => { + if (response.data.status == 0) { + this.getCourses(cate,status,1); + } + }) + .catch(function (error) { + console.log(error); + }); + + } render(){ let{ category, @@ -127,6 +159,13 @@ class InfosPackage extends Component{ // console.log(data) return(
        + {/*提示*/} +
      • this.changeCategory()}>全部
      • @@ -160,21 +199,27 @@ class InfosPackage extends Component{ {/*type: "bidden"*/} - {data===undefined?:data.project_packages.length===0?:data.project_packages.map((item,key)=>{ return(
        -
        +
        +
        图片
        +
        +
        + {item.bidden_status==="pending"?竞标中:""} + {item.bidden_status==="bidding_won"?已中标:""} + {item.bidden_status==="bidding_lost"?未中标:""}
        +
        {item.min_price===null?"":¥{item.min_price}} @@ -205,6 +250,28 @@ class InfosPackage extends Component{
        + + {category=="manage"?item.operation.can_edit===true&&item.operation.can_delete===true? + :"":""} + + {category=="manage"?item.operation.can_edit===true? +
        + + + +
        :"":""} + +
        )})} diff --git a/public/react/src/modules/user/usersInfo/usersInfo.css b/public/react/src/modules/user/usersInfo/usersInfo.css index 3485f6d16..25cfd6e21 100644 --- a/public/react/src/modules/user/usersInfo/usersInfo.css +++ b/public/react/src/modules/user/usersInfo/usersInfo.css @@ -94,4 +94,29 @@ .mtf15{ margin-top:-15px; +} + +.project-package-item.with-operator .item-operator { + width: 0; + transition: width .2s; + -moz-transition: width .2s; /* Firefox 4 */ + -webkit-transition: width .2s; /* Safari 和 Chrome */ + -o-transition: width .2s; /* Opera */ +} +.project-package-item.with-operator:hover .item-operator { + margin: -20px -20px -20px 20px; + padding: 20px 0; + width: 100px; + display: flex; + justify-content: space-around; + flex-direction: column; + align-items: center; + background: #f0f0f0; +} +.project-package-item.with-operator .item-operator a { + display: none; +} +.project-package-item.with-operator:hover .item-operator a { + display: block; + font-size: 20px; } \ No newline at end of file From 9fb497e22425f59d14812346d9e8450d88d5a6a2 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 11:04:40 +0800 Subject: [PATCH 170/623] fix --- app/decorators/tiding_decorator.rb | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index c9ad806ee..677812217 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -2,6 +2,9 @@ module TidingDecorator def content method_name = "#{container_type.underscore}_content" respond_to?(method_name) ? send(method_name) : '' + rescue => ex + Util.logger_error(ex) + '' end def how_long_time @@ -261,16 +264,16 @@ module TidingDecorator def journal_content case tiding_type when 'Mentioned' then - I18n.t(locale_format(tiding_type)) % message_content_helper(container.notes) + I18n.t(locale_format(tiding_type)) % message_content_helper(container&.notes) when 'Comment' then - I18n.t(locale_format(tiding_type, container.parent.present?)) % message_content_helper(container.notes) + I18n.t(locale_format(tiding_type, container.parent.present?)) % message_content_helper(container&.notes) else - I18n.t(locale_format) % container.issue.subject + I18n.t(locale_format) % container&.issue&.subject end end def issue_content - I18n.t(locale_format) % container.subject + I18n.t(locale_format) % container&.subject end def pull_request_content @@ -291,15 +294,15 @@ module TidingDecorator end def poll_content - I18n.t(locale_format(parent_container_type)) % container.polls_name + I18n.t(locale_format(parent_container_type)) % container&.polls_name end def exercise_content - I18n.t(locale_format(parent_container_type)) % container.exercise_name + I18n.t(locale_format(parent_container_type)) % container&.exercise_name end def student_graduation_topic_content - I18n.t(locale_format) % container.graduation_topic.try(:name) + I18n.t(locale_format) % container&.graduation_topic.try(:name) end def deal_student_topic_select_content @@ -307,27 +310,27 @@ module TidingDecorator end def graduation_task_content - I18n.t(locale_format(parent_container_type)) % container.name + I18n.t(locale_format(parent_container_type)) % container&.name end def graduation_work_content - I18n.t(locale_format(extra.nil?)) % container.graduation_task.try(:name) + I18n.t(locale_format(extra.nil?)) % container&.graduation_task.try(:name) end def graduation_work_score_content - I18n.t(locale_format) % container.graduation_work.graduation_task.try(:name) + I18n.t(locale_format) % container&.graduation_work&.graduation_task.try(:name) end def homework_common_content - I18n.t(locale_format(parent_container_type), name: container.name, reason: extra) + I18n.t(locale_format(parent_container_type), name: container&.name, reason: extra) end def student_work_content - I18n.t(locale_format(extra.nil?)) % container.homework_common.try(:name) + I18n.t(locale_format(extra.nil?)) % container&.homework_common.try(:name) end def student_works_score_content - I18n.t(locale_format(extra)) % container.student_work.homework_common.try(:name) + I18n.t(locale_format(extra)) % container&.student_work&.homework_common.try(:name) end def challenge_work_score_content From 8db1823226e64cc1ba9c83ff64c07bbfcebd8c5c Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 11:07:48 +0800 Subject: [PATCH 171/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/memos_controller.rb | 8 ++------ dump.rdb | Bin 551 -> 668 bytes 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb index 0475eb0da..9d7beb6c1 100644 --- a/app/controllers/memos_controller.rb +++ b/app/controllers/memos_controller.rb @@ -3,7 +3,7 @@ class MemosController < ApplicationController before_action :set_memo, only: [:show, :edit, :update, :destroy, :sticky_or_cancel, :hidden, :more_reply] before_action :validate_memo_params, only: [:create, :update] before_action :owner_or_admin, only: [:edit, :update, :destroy] - before_action :is_admin, only: [:sticky_or_cancel, :hidden] + before_action :require_business, only: [:sticky_or_cancel, :hidden] include ApplicationHelper # GET /memos @@ -132,7 +132,7 @@ class MemosController < ApplicationController def hidden tip_exception("不能对主贴进行隐藏操作") if @memo.parent_id.nil? begin - @memo.update_attributes!(hidden: !@memo.hidden) + @memo.update_attributes!(hidden: @memo.hidden == 0 ? 1 : 0) normal_status("更新成功") rescue Exception => e tip_exception("更新失败,原因:#{e}") @@ -182,10 +182,6 @@ class MemosController < ApplicationController tip_exception(403, "无权限操作") unless @memo.author == current_user || current_user.admin? || current_user.business? end - def is_admin - tip_exception(403, "无权限操作") unless current_user.admin? || current_user.business? - end - # Never trust parameters from the scary internet, only allow the white list through. def memo_params params.require(:memo).permit(:subject, :content, :forum_id) diff --git a/dump.rdb b/dump.rdb index a799840b19b627ba79861403e776c55d27442bac..4687968bdc78f7e61538606ad77386166339f236 100644 GIT binary patch delta 421 zcmWmAO=}ZD7y#hiP11&>B7*c}$#%hm9~0+uXC^1pDyX0!3Oz|WGy86vrb%=^T574b z;7Ko*UOd=yz4;f4SAT)GvR(!63a$A3gy*FGx$zNSIry^t;!m^8Awgppe>=5@{aa+| z^1b$KyY6|-!1KbO)Bn30xlNPjQ7`JdVz>p5rnc96T0#l^#Jrq4JYKsF$}+5z7=d66 zaibMd%%q6A)at~tnx<)dbi=3Jdh{5^)9`tNam}LJs}GyIQ8q1$;biUf&ZU9b800%+ zJKY?NU}sevz4sU1zH7W*N6Sy5yNk69iY$CnE3y*8-}}GjQ)vw6I$?rX!%_*_GEPnS z;hM|96p#!|5%q|Oxg>%x+2t(8l!Oy+Vz$m&ou;N5tG)AczxwL86Ba9#!~$VVBL8ZN zQ)IZ@7RbiV38e{_ST2UueShXzX*a+X;fhBp2i7dkpob!ByBL1bZYk)3BHWHUB6IAk_8Eif=KGc7b` zFlH@bG&eOZVm4!AH8?pj12i`}P9i`d19D|_av*;LbaHiNAn;)A z7c?QZee%e3X^vN9SB{g@}Rpw8d??$RI>m8 From 1897c7d7c169d89964b60d03849ad90739ca18e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 11:08:00 +0800 Subject: [PATCH 172/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/Leftdialogue.js | 2 +- public/react/src/modules/message/js/MessagChat.js | 2 +- public/react/src/modules/message/js/MessagSub.js | 2 +- public/react/src/modules/message/js/MessagePrivate.js | 2 +- public/react/src/modules/message/js/Messagerouting.js | 2 +- public/react/src/modules/message/js/Rightdialogue.js | 2 +- .../modules/message/messagemodal/WriteaprivateletterModal.js | 4 ++-- public/react/src/modules/user/usersInfo/InfosPackage.js | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/message/js/Leftdialogue.js b/public/react/src/modules/message/js/Leftdialogue.js index 2e586aa40..aa7b0782b 100644 --- a/public/react/src/modules/message/js/Leftdialogue.js +++ b/public/react/src/modules/message/js/Leftdialogue.js @@ -46,7 +46,7 @@ class Leftdialogue extends Component{ { this.props.objeysl&&this.props.objeysl.sender.image_url ? 头像:"" + src={getImageUrl("images/" + this.props.objeysl.sender.image_url)} />:"" }
        diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index 377f3cd3a..e7c6dc147 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -639,7 +639,7 @@ class MessagChat extends Component{ return(
        this.Clickedontheuser(item.target)}>
        - +

        diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 88e339b20..091d3ee06 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -121,7 +121,7 @@ class MessagSub extends Component{ return(

        - this.myCome(item)} src={getImageUrl("/images/"+item.trigger_user.image_url)} className="radius mr10 fl myimgw48 myimgh48"/> + this.myCome(item)} src={getImageUrl("images/"+item.trigger_user.image_url)} className="radius mr10 fl myimgw48 myimgh48"/>

        this.myCome(item)}>{item.trigger_user.name} diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js index fa5531c80..4e2197d3b 100644 --- a/public/react/src/modules/message/js/MessagePrivate.js +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -135,7 +135,7 @@ class MessagePrivate extends Component{

        this.smyJump(3,item.target.id)}> this.myCome(item)}> - this.myCome(item)} src={getImageUrl("/images/"+item.target.image_url)} className="radius myimgw48 myimgh48"/> + this.myCome(item)} src={getImageUrl("images/"+item.target.image_url)} className="radius myimgw48 myimgh48"/>

        diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index 2c649c23c..2e75fe624 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -160,7 +160,7 @@ class Messagerouting extends Component{ { this.props.current_user!== undefined? - + :"" } diff --git a/public/react/src/modules/message/js/Rightdialogue.js b/public/react/src/modules/message/js/Rightdialogue.js index d177e7c4f..c33b9d7cf 100644 --- a/public/react/src/modules/message/js/Rightdialogue.js +++ b/public/react/src/modules/message/js/Rightdialogue.js @@ -46,7 +46,7 @@ class Rightdialogue extends Component{ this.myCome(this.props.objeysl.sender)}> {this.props.objeysl&&this.props.objeysl.sender.image_url ? 头像:"" + src={getImageUrl("images/" + this.props.objeysl.sender.image_url)}/>:"" }

        diff --git a/public/react/src/modules/message/messagemodal/WriteaprivateletterModal.js b/public/react/src/modules/message/messagemodal/WriteaprivateletterModal.js index a89614745..dfa27ba9a 100644 --- a/public/react/src/modules/message/messagemodal/WriteaprivateletterModal.js +++ b/public/react/src/modules/message/messagemodal/WriteaprivateletterModal.js @@ -283,7 +283,7 @@ class WriteaprivateletterModal extends Component { onFocus={this.myonFocus} onChange={this.setdatafunsval} suffix={ - this.search_message_person()}/> + this.search_message_person()}/> } />
        @@ -296,7 +296,7 @@ class WriteaprivateletterModal extends Component { users.map((item,key)=>{ return(

        this.Getuserinformation(item)}> - 1?1558048024 {item.name}

        diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 7c243faef..272c827f4 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -264,7 +264,7 @@ class InfosPackage extends Component{
        :"":""} - {category=="manage"?item.operation.can_edit===true? + {category=="manage"?item.operation.can_edit===true&&item.operation.can_delete===false?
        From af6bcfdf2b3ef15f671542351c8a88ace789ffa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 12:48:49 +0800 Subject: [PATCH 173/623] b --- public/react/src/modules/courses/Resource/index.js | 2 +- .../react/src/modules/courses/graduation/tasks/index.js | 2 +- .../react/src/modules/courses/graduation/topics/index.js | 6 +++--- .../src/modules/courses/shixunHomework/shixunHomework.js | 2 +- public/react/src/modules/message/js/Leftdialogue.js | 6 ++++-- public/react/src/modules/message/js/MessagChat.js | 9 ++++++--- public/react/src/modules/message/js/Rightdialogue.js | 6 ++++-- 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js index f83b525ee..d93c30d75 100644 --- a/public/react/src/modules/courses/Resource/index.js +++ b/public/react/src/modules/courses/Resource/index.js @@ -950,7 +950,7 @@ class Fileslists extends Component{
        diff --git a/public/react/src/modules/courses/graduation/tasks/index.js b/public/react/src/modules/courses/graduation/tasks/index.js index 08639b521..80dceb562 100644 --- a/public/react/src/modules/courses/graduation/tasks/index.js +++ b/public/react/src/modules/courses/graduation/tasks/index.js @@ -767,7 +767,7 @@ class GraduationTasks extends Component{
        diff --git a/public/react/src/modules/courses/graduation/topics/index.js b/public/react/src/modules/courses/graduation/topics/index.js index 84b500716..6587ed0c6 100644 --- a/public/react/src/modules/courses/graduation/topics/index.js +++ b/public/react/src/modules/courses/graduation/topics/index.js @@ -28,7 +28,7 @@ class Boards extends Component{ checkAllValue: false, checkBoxValues: [], data:[], - topicList: [], + topicList: undefined, course_public:1, page:1, totalCount:undefined, @@ -412,7 +412,7 @@ onBoardsNew=()=>{ } onPressEnter={this.onPressEnter} searchPlaceholder={"请输入名称进行搜索"} - showSearchInput={topicList.length >= pageSize} + showSearchInput={topicList&&topicList.length >= pageSize} > { @@ -475,7 +475,7 @@ onBoardsNew=()=>{ >
        - ):() + ):(topicList && topicList.length===0?:
        ) } { diff --git a/public/react/src/modules/courses/shixunHomework/shixunHomework.js b/public/react/src/modules/courses/shixunHomework/shixunHomework.js index 61133acd2..48c988114 100644 --- a/public/react/src/modules/courses/shixunHomework/shixunHomework.js +++ b/public/react/src/modules/courses/shixunHomework/shixunHomework.js @@ -1205,7 +1205,7 @@ class ShixunHomework extends Component{
        diff --git a/public/react/src/modules/message/js/Leftdialogue.js b/public/react/src/modules/message/js/Leftdialogue.js index aa7b0782b..5523ec615 100644 --- a/public/react/src/modules/message/js/Leftdialogue.js +++ b/public/react/src/modules/message/js/Leftdialogue.js @@ -5,7 +5,7 @@ import { } from "antd"; import axios from 'axios'; import moment from 'moment'; -import {getImageUrl,markdownToHTML} from 'educoder'; +import {getImageUrl,markdownToHTML,ImageLayerHook} from 'educoder'; import "../css/messagemy.css" import WriteaprivateletterModal from '../messagemodal/WriteaprivateletterModal'; //私信页面 @@ -51,7 +51,9 @@ class Leftdialogue extends Component{
        -
        + + +
        diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index e7c6dc147..315da2166 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -575,12 +575,12 @@ class MessagChat extends Component{ } { parseInt(item.sender_id)===parseInt(this.props.match.params.userid)? - this.DELETEsetreplyfun(user_id,id)}> + this.DELETEsetreplyfun(user_id,id)}> {/*自己的*/} - :this.DELETEsetreplyfun(user_id,id)}> + :this.DELETEsetreplyfun(user_id,id)}> {/*他人的*/} @@ -650,7 +650,10 @@ class MessagChat extends Component{ {moment(item.send_time).fromNow()}

        -

        + + +

        +

        diff --git a/public/react/src/modules/message/js/Rightdialogue.js b/public/react/src/modules/message/js/Rightdialogue.js index c33b9d7cf..d53a8a435 100644 --- a/public/react/src/modules/message/js/Rightdialogue.js +++ b/public/react/src/modules/message/js/Rightdialogue.js @@ -5,7 +5,7 @@ import { } from "antd"; import axios from 'axios'; import moment from 'moment'; -import {getImageUrl,markdownToHTML} from 'educoder'; +import {getImageUrl,markdownToHTML,ImageLayerHook} from 'educoder'; import "../css/messagemy.css" import WriteaprivateletterModal from '../messagemodal/WriteaprivateletterModal'; //私信页面 @@ -51,7 +51,9 @@ class Rightdialogue extends Component{
        -
        + + +
        this.mydelete(this.props.objeysl.sender.id,this.props.objeysl.id)} >删除 From fe96a49cde60ef4edb9639fedb855666aa0df6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 13:02:23 +0800 Subject: [PATCH 174/623] b --- public/react/src/modules/message/js/Leftdialogue.js | 4 ++-- public/react/src/modules/message/js/MessagChat.js | 4 ++-- public/react/src/modules/message/js/Rightdialogue.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/message/js/Leftdialogue.js b/public/react/src/modules/message/js/Leftdialogue.js index 5523ec615..b16746c70 100644 --- a/public/react/src/modules/message/js/Leftdialogue.js +++ b/public/react/src/modules/message/js/Leftdialogue.js @@ -51,9 +51,9 @@ class Leftdialogue extends Component{
        - + -
        +
        diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index 315da2166..612a87f2b 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -575,12 +575,12 @@ class MessagChat extends Component{ } { parseInt(item.sender_id)===parseInt(this.props.match.params.userid)? - this.DELETEsetreplyfun(user_id,id)}> + this.DELETEsetreplyfun(user_id,id)}> {/*自己的*/} - :this.DELETEsetreplyfun(user_id,id)}> + :this.DELETEsetreplyfun(user_id,id)}> {/*他人的*/} diff --git a/public/react/src/modules/message/js/Rightdialogue.js b/public/react/src/modules/message/js/Rightdialogue.js index d53a8a435..04c5f966d 100644 --- a/public/react/src/modules/message/js/Rightdialogue.js +++ b/public/react/src/modules/message/js/Rightdialogue.js @@ -51,9 +51,9 @@ class Rightdialogue extends Component{
        - + -
        +
        this.mydelete(this.props.objeysl.sender.id,this.props.objeysl.id)} >删除 From 90e19611d26727bf93a6e45e44b9c96532f323a0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 2 Aug 2019 13:40:34 +0800 Subject: [PATCH 175/623] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index fca143623..913013442 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -406,9 +406,10 @@ class ShixunsController < ApplicationController end end @shixun.update_attributes(shixun_params) + logger.info("##########shixun_info_params: #{shixun_info_params}") + logger.info("##########params[:shixun_info][:evaluate_script]: #{params[:shixun_info][:evaluate_script]}") @shixun.shixun_info.update_attributes(shixun_info_params) @shixun.shixun_schools.delete_all - logger.info("##########scope_partment:###{params[:scope_partment]}") # scope_partment: 高校的名称 if params[:scope_partment].present? arr = [] From 79608b15ec2cb4a0b582416c7cfc858df0a5037a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 13:42:39 +0800 Subject: [PATCH 176/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index 9f129eabc..1c19799b8 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -577,7 +577,7 @@ p .activity-item:first-child{border-top: 1px solid #eee;} .recently_name{float: left;line-height: 48px;display: block} .recently_item:hover{background-color: #F9F9F9;} /*私信对话框*/ -.private-list{min-height: 660px;max-height: 810px;overflow-y: auto} +.private-list{min-height: 660px;max-height: 810px;overflow-y: auto;overflow-x: hidden;} .private-list .private-part{padding-left:20px;cursor: pointer} .private-part:hover{background-color: #F5F5F5;} .private-part.active{background-color: #F5F5F5;} diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index fa879a9e5..29d389202 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -580,7 +580,7 @@ p .activity-item:first-child{border-top: 1px solid #eee;} .recently_name{float: left;line-height: 48px;display: block} .recently_item:hover{background-color: #F9F9F9;} /*私信对话框*/ -.private-list{min-height: 660px;max-height: 810px;overflow-y: auto} +.private-list{min-height: 660px;max-height: 810px;overflow-y: auto;overflow-x: hidden;} .private-list .private-part{padding-left:20px;cursor: pointer} .private-part:hover{background-color: #F5F5F5;} .private-part.active{background-color: #F5F5F5;} From ae69c3918729dc766dfdec5adacca088a1883319 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 13:50:20 +0800 Subject: [PATCH 177/623] fix library praise thread --- app/views/libraries/show.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/libraries/show.json.jbuilder b/app/views/libraries/show.json.jbuilder index a5181b548..fd20d7bf2 100644 --- a/app/views/libraries/show.json.jbuilder +++ b/app/views/libraries/show.json.jbuilder @@ -38,7 +38,7 @@ json.operation do json.can_deletable manageable json.can_editable manageable - json.user_praised PraiseTread.exists?(user_id: current_user&.id) + json.user_praised library.praise_treads.exists?(user_id: current_user&.id) else json.can_deletable false json.can_editable false From fef63f7786a4a81ead58ea8d1c06c8d838769e8f Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 14:15:02 +0800 Subject: [PATCH 178/623] =?UTF-8?q?=E5=85=B3=E6=B3=A8=20=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/forums/ForumsIndex.css | 3 + public/react/src/modules/forums/MemoDetail.js | 23 ++++++-- public/react/src/modules/forums/PostItem.js | 4 +- .../src/modules/forums/RecommendShixun.js | 4 +- .../react/src/modules/forums/UserSection.js | 55 ++++++++++++++----- .../src/modules/forums/shixun/MemoShixun.css | 2 +- .../src/modules/forums/shixun/MemoShixun.js | 2 +- .../modules/forums/shixun/ShiXunPostItem.js | 2 +- 8 files changed, 68 insertions(+), 27 deletions(-) diff --git a/public/react/src/modules/forums/ForumsIndex.css b/public/react/src/modules/forums/ForumsIndex.css index c4af188eb..22925f882 100644 --- a/public/react/src/modules/forums/ForumsIndex.css +++ b/public/react/src/modules/forums/ForumsIndex.css @@ -5,6 +5,9 @@ .discuss-tab { height: 90px; } + .discuss-tab ._forum_tab a.navItem { + line-height: 2; + } .discuss-tab ._forum_tab a.navItem:hover { color: #4CACFF !important; border-bottom: none !important; diff --git a/public/react/src/modules/forums/MemoDetail.js b/public/react/src/modules/forums/MemoDetail.js index 15e412981..0b53d9507 100644 --- a/public/react/src/modules/forums/MemoDetail.js +++ b/public/react/src/modules/forums/MemoDetail.js @@ -444,7 +444,7 @@ class MemoDetail extends Component { showSnackbar(response.data.message) return; } - if (response.data.status === 1) { + if (response.data.status === 0) { if (!childCommentId) { comment.hidden = !comment.hidden; @@ -677,7 +677,13 @@ class MemoDetail extends Component { memo.isDetailPage = true; // TODO 图片上传地址 return ( -
        {/* fl with100 */} +
        {/* fl with100 */} + + {memo.reward} } { _current_user && (_current_user.admin === true || _current_user.user_id === author_info.user_id) && -
        +
          { _current_user.admin === true && @@ -713,13 +719,20 @@ class MemoDetail extends Component {
        } + || _current_user.user_id === author_info.user_id) ? '': 'no_mr'} `} to="/forums" + style={{ marginRight: '10px'}} + > 返回
        {moment(memo.time).fromNow()} 发布 -
        +
        + { _current_user.admin && diff --git a/public/react/src/modules/forums/PostItem.js b/public/react/src/modules/forums/PostItem.js index a56badb80..02d9fa273 100644 --- a/public/react/src/modules/forums/PostItem.js +++ b/public/react/src/modules/forums/PostItem.js @@ -29,7 +29,7 @@ class PostItem extends Component { 用户头像
        -

        +

        {/* target="_blank" */} @@ -55,7 +55,7 @@ class PostItem extends Component { {/*C++*/} -

        +

        {/* data-tip-down="回复数" {memo.replies_count} {memo.praise_count}*/} {memo.replies_count ? diff --git a/public/react/src/modules/forums/RecommendShixun.js b/public/react/src/modules/forums/RecommendShixun.js index 9ebaf3cae..aa9dec952 100644 --- a/public/react/src/modules/forums/RecommendShixun.js +++ b/public/react/src/modules/forums/RecommendShixun.js @@ -33,7 +33,7 @@ class RecommendShixun extends Component {

        + className="color-grey-6 task-hide mb10 recomment-name" style={{maxWidth:'147px'}}> {_shixun.name}

        {_shixun.myshixuns_count} 人学习

        @@ -50,7 +50,7 @@ class RecommendShixun extends Component { // 参考 TPMShixunDiscuss.js 推荐实训, 页面路径:http://localhost:3007/shixuns/uznmbg54/shixun_discuss return (
        -

        推荐实训

        +

        推荐实训

        {this.showRecommandShixun()}
        diff --git a/public/react/src/modules/forums/UserSection.js b/public/react/src/modules/forums/UserSection.js index 4e8bdb45c..8376a2369 100644 --- a/public/react/src/modules/forums/UserSection.js +++ b/public/react/src/modules/forums/UserSection.js @@ -21,21 +21,46 @@ class UserSection extends Component { const { author_info } = this.props /*http://localhost:3000/api/v1/users/155/watch?object_id=156&object_type=user*/ - const focusUrl = `/api/v1/users/${author_info.user_id}/${this.props.author_info.watched ? 'unwatch' : 'watch'}?object_id=${author_info.user_id}&object_type=user` - - axios.get(focusUrl,{ - }) - .then((response) => { - const status = response.data.status; - console.log(status); - if(status == 1){ - const new_author_info = Object.assign({}, this.props.author_info) - new_author_info.watched = !new_author_info.watched - this.props.initForumState({author_info: new_author_info}) - } - }).catch((error) => { - console.log(error) - }) + // const focusUrl = `/api/v1/users/${author_info.user_id}/${this.props.author_info.watched ? 'unwatch' : 'watch'}?object_id=${author_info.user_id}&object_type=user` + + // axios.get(focusUrl,{ + // }) + // .then((response) => { + // const status = response.data.status; + // console.log(status); + // if(status == 1){ + // const new_author_info = Object.assign({}, this.props.author_info) + // new_author_info.watched = !new_author_info.watched + // this.props.initForumState({author_info: new_author_info}) + // } + // }).catch((error) => { + // console.log(error) + // }) + + let url=`/users/${author_info.user_id}/watch.json`; + // 取消关注 + if(author_info.watched){ + axios.delete(url).then((result)=>{ + if(result){ + const new_author_info = Object.assign({}, this.props.author_info) + new_author_info.watched = !new_author_info.watched + this.props.initForumState({author_info: new_author_info}) + } + }).catch((error)=>{ + console.log(error) + }) + }else{ + // 关注 + axios.post(url).then((result)=>{ + if(result){ + const new_author_info = Object.assign({}, this.props.author_info) + new_author_info.watched = !new_author_info.watched + this.props.initForumState({author_info: new_author_info}) + } + }).catch((error)=>{ + console.log(error); + }) + } } diff --git a/public/react/src/modules/forums/shixun/MemoShixun.css b/public/react/src/modules/forums/shixun/MemoShixun.css index c76000ccf..c1421e02f 100644 --- a/public/react/src/modules/forums/shixun/MemoShixun.css +++ b/public/react/src/modules/forums/shixun/MemoShixun.css @@ -11,7 +11,7 @@ height:48px; width: 48px; float: left; - margin-top: 7px; + margin-top: 4px; } .shixunReply{ max-width: 604px; diff --git a/public/react/src/modules/forums/shixun/MemoShixun.js b/public/react/src/modules/forums/shixun/MemoShixun.js index f82ed2e34..664b844ac 100644 --- a/public/react/src/modules/forums/shixun/MemoShixun.js +++ b/public/react/src/modules/forums/shixun/MemoShixun.js @@ -83,7 +83,7 @@ class MemoShixun extends Component { } const stringifid = queryString.stringify(paramsObject); - const url = `/discusses.json?${stringifid}` // /${challenge.identifier}/star + const url = `/discusses/forum_discusses.json?${stringifid}` // /${challenge.identifier}/star // 获取memo list this.setState({ diff --git a/public/react/src/modules/forums/shixun/ShiXunPostItem.js b/public/react/src/modules/forums/shixun/ShiXunPostItem.js index 1f8c0d379..961e16ff1 100644 --- a/public/react/src/modules/forums/shixun/ShiXunPostItem.js +++ b/public/react/src/modules/forums/shixun/ShiXunPostItem.js @@ -39,7 +39,7 @@ class ShiXunPostItem extends Component width="48px" height="48px" className="radius"/>
        -
        +

        {memo.subject}

        From 024c24665b8fdc66b4c7eb32fc06305f05cc8238 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 2 Aug 2019 14:22:06 +0800 Subject: [PATCH 179/623] =?UTF-8?q?mp3=E3=80=81mp4=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/games/picture_display.json.jbuilder | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/views/games/picture_display.json.jbuilder b/app/views/games/picture_display.json.jbuilder index 2bc88fdf4..34a22ef12 100644 --- a/app/views/games/picture_display.json.jbuilder +++ b/app/views/games/picture_display.json.jbuilder @@ -25,25 +25,30 @@ elsif @type == "txt" elsif @type =="qrcode" json.qrcode_str @qrcode_str elsif @type == "mp3" || @type == "mp4" + # if @type == "mp4" + # json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378171/123.mp4"}] + # json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] + # json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378173/789.mp4"}] + # else + # json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378174/58099.mp3"}] + # json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + # json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + # end + json.orignal_file do + json.array! @orignal_picture do |file| + json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) + end + end + json.user_file do + json.array! @user_picture do |file| + json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) + end + end if @type == "mp4" - json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378171/123.mp4"}] - json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378173/789.mp4"}] else - json.orignal_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378174/58099.mp3"}] - json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] end - # json.orignal_file do - # json.array! @orignal_picture do |file| - # json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) - # end - # end - # json.user_file do - # json.array! @user_picture do |file| - # json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) - # end - # end # json.answer_file do # json.array! @answer_picture do |file| # json.file_url attachment_show_users_path(:file_name => file, :path => @answer_path) From f20341088b447b7aedf4cfad31d8a802d67b58ca Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 2 Aug 2019 14:28:09 +0800 Subject: [PATCH 180/623] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/games/picture_display.json.jbuilder | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/views/games/picture_display.json.jbuilder b/app/views/games/picture_display.json.jbuilder index 34a22ef12..838cfeda0 100644 --- a/app/views/games/picture_display.json.jbuilder +++ b/app/views/games/picture_display.json.jbuilder @@ -39,19 +39,19 @@ elsif @type == "mp3" || @type == "mp4" json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) end end - json.user_file do - json.array! @user_picture do |file| - json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) - end - end + # json.user_file do + # json.array! @user_picture do |file| + # json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) + # end + # end if @type == "mp4" - json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378173/789.mp4"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] else - json.answer_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + end + json.answer_file do + json.array! @answer_picture do |file| + json.file_url attachment_show_users_path(:file_name => file, :path => @answer_path) + end end - # json.answer_file do - # json.array! @answer_picture do |file| - # json.file_url attachment_show_users_path(:file_name => file, :path => @answer_path) - # end - # end end \ No newline at end of file From b3c91e54db06015842aa0403be0fabe342338619 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 14:30:30 +0800 Subject: [PATCH 181/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dump.rdb | Bin 668 -> 764 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dump.rdb b/dump.rdb index 4687968bdc78f7e61538606ad77386166339f236..63b8abb0ac1774c1ce21048cfe8c89e5356d4737 100644 GIT binary patch delta 347 zcmWN^JugF17y#gVdRwhZ2U8=_v~CQD!}+}ToNkve*hIu6oO{k&A=-+5EC{h$(8R>x z7ud{L{0*s&egV?(Y|nk>H*-zKZ=aX9zjK`yI9!MN+l#x2=Sg$5P%eykUOw%4zURe1 zCxJaQtyWMCV%y&D!df#aR;%kB=s@hu(apo&G>sT_ARVR}3>H8fHY_sOS?;VgiO-ns z&7iyU-LInMN=rkuOt>~8)WiUlM7YY;q&)`H2Df9{L6yo-L{u^^7KG$VMU{rvFx`)_ za#o8_oehVm|Ab1Q5>B)WF-Xp_Fj`^7O${?!OSGGsMXc6;MMbDZ#t6}SN8_b_0gX}~ zEeIYGM*nwF_BGQaKq!^!jiu%m2P^)_MkhG{+pcVRbO7nRpg;s;3K*Hr=M+nnkdbgp UpMz|==TanhaJqCkF}3;l2M<1EBme*a delta 237 zcmVMLtXj^b#rB8Ep26O!oXsYK`by2L<|OVRLgLIwC=1bZK^FN^fF1I#G3Hb!9tQooAB|0v-lpGXps?W|JrZmQ8@{ z7G^hLVKg*3WHU7}Vqr68H)T0uGc+<`Ad4Jha%Ew3Wn^DrbRs%2H8wOiF*PwWH!d_Y zHZU?VAZ`F|VRqmO9|$=zIWRbV{{8`zYXT}S;za=lQ*~l$Wn*+8R{$~MWdas7F=a3` nGBP-2GB9B Date: Fri, 2 Aug 2019 14:36:37 +0800 Subject: [PATCH 182/623] require login for project package show api --- app/controllers/project_packages_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/project_packages_controller.rb b/app/controllers/project_packages_controller.rb index de896c920..3cc7e79cb 100644 --- a/app/controllers/project_packages_controller.rb +++ b/app/controllers/project_packages_controller.rb @@ -1,7 +1,7 @@ class ProjectPackagesController < ApplicationController include PaginateHelper - before_action :require_login, :check_auth, only: %i[create update destroy] + before_action :require_login, :check_auth, only: %i[show create update destroy] helper_method :current_package, :package_manageable? From a99771f90d8d9a7b4018de144ad002504855b6d1 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 14:41:26 +0800 Subject: [PATCH 183/623] =?UTF-8?q?=E5=8E=9F=E7=94=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/common/components/media/Clappr.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/public/react/src/common/components/media/Clappr.js b/public/react/src/common/components/media/Clappr.js index 2c4d89e92..312ea9007 100644 --- a/public/react/src/common/components/media/Clappr.js +++ b/public/react/src/common/components/media/Clappr.js @@ -90,12 +90,19 @@ class Clappr extends Component{ {/* https://github.com/CookPete/react-player/issues/686 */} + {/*
        */} + + {/* 原生 */} + {/* { type == 'mp3' ? + : } */}
        ) } From e277b9db33f8af6fdc41f4b0c8767fb54974d583 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 14:44:03 +0800 Subject: [PATCH 184/623] require login for tiding list api --- app/controllers/tidings_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/tidings_controller.rb b/app/controllers/tidings_controller.rb index 795010b3f..9324b2755 100644 --- a/app/controllers/tidings_controller.rb +++ b/app/controllers/tidings_controller.rb @@ -1,6 +1,7 @@ class TidingsController < ApplicationController include PaginateHelper + before_action :require_login after_action :update_onclick_time!, only: [:index] def index From 16388a95305cb4642993ebcc5e3462c59bfca5a2 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 14:57:45 +0800 Subject: [PATCH 185/623] modify tiding list api --- app/views/tidings/_tiding.json.jbuilder | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/tidings/_tiding.json.jbuilder b/app/views/tidings/_tiding.json.jbuilder index cdaa48299..4a392edfd 100644 --- a/app/views/tidings/_tiding.json.jbuilder +++ b/app/views/tidings/_tiding.json.jbuilder @@ -1,4 +1,5 @@ -json.extract! tiding, :id, :status, :viewed, :user_id, :tiding_type, :container_id, :container_type, :parent_container_id, :parent_container_type +json.extract! tiding, :id, :status, :viewed, :user_id, :tiding_type, :container_id, :container_type, + :parent_container_id, :parent_container_type, :belong_container_id, :belong_container_type json.content tiding.content json.identifier tiding.identifier From ea9f8adb1bfcd82a6e015c7fbb894de592e3074d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 15:16:34 +0800 Subject: [PATCH 186/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageIndexNEITaskDetails.js | 32 +++++++++++-------- public/react/src/modules/tpm/TPMBanner.js | 11 +++++-- .../modules/tpm/TPMsettings/TPMsettings.js | 16 ++++++++-- public/stylesheets/educoder/edu-all.css | 4 +-- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 13bec2dd9..2eee9d882 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -55,9 +55,11 @@ class PackageIndexNEITaskDetails extends Component { getdatas=()=>{ let url =`/project_packages/${this.props.match.params.id}.json`; axios.get(url).then((response) => { - this.setState({ - data:response.data - }) + if(response.data.status!=401&&response.data.status!=403&&response.data.status!=408&&response.data.status!=409)[ + this.setState({ + data:response.data + }) + ] }).catch((error) => { console.log(error); @@ -236,8 +238,12 @@ class PackageIndexNEITaskDetails extends Component { render() { let {overtype,data}=this.state; - // console.log(data&&data.creator.login) - console.log(data) + // console.log(data&&data.creator.id) + let datalogin=data&&data.creator.id; + let userlogin=this.props.current_user&&this.props.current_user.user_id; + + console.log(datalogin===userlogin) + // console.log(this.props.current_user&&this.props.current_user.user_id) return ( data===undefined?"":
        @@ -258,11 +264,9 @@ class PackageIndexNEITaskDetails extends Component { {data&&data.title} - 返回 + 返回
        - -

        - +

        @@ -289,12 +293,12 @@ class PackageIndexNEITaskDetails extends Component { {data&&data.creator.name}
        - {data&&data.creator.login===this.props.current_user&&this.props.current_user.login?"":
        - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}
        }
        @@ -304,7 +308,7 @@ class PackageIndexNEITaskDetails extends Component {
        -
        +
        :""}

        {item.name}

        - {this.props.current_user&&this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""}
        diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 33dc7fc5b..6e73b754a 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -692,7 +692,7 @@ class TPMBanner extends Component {
        { - startbtn === false ? + startbtn === false && shixunsDetails.shixun_status != -1 ? 发送至 @@ -913,7 +913,12 @@ class TPMBanner extends Component { 已关闭 } - {this.props.identity < 8?
        已删除 + } + + + {this.props.identity < 8&&shixunsDetails.shixun_status != -1 ?
        { + + if(this.state.status===-1){ + this.props.showSnackbar("该实训已被删除,保存失败!"); + return + } + let { name, choice_main_type, choice_small_type, choice_standard_scripts, scope_partment, choice_standard_scriptssum, evaluate_script, webssh, use_scope, trainee, can_copy, task_pass, test_set_permission, hide_code, code_hidden, forbid_copy, vnc,multi_webssh, @@ -739,13 +745,15 @@ export default class TPMsettings extends Component { return v1 }); - let operateauthority=this.props.identity<5&&this.state.status==0||this.props.identity===1&&this.state.status==2||this.props.identity===1&&this.state.status==1; + // let operateauthority= + // this.props.identity===1?true:this.props.identity<5&&this.state.status==0?true:false; + // this.props.identity<5&&this.state.status==0||this.props.identity===1&&this.state.status==2||this.props.identity===1&&this.state.status==1; const description_editormd = this.description_editormd.getValue(); let evaluate_script_editormd; - if(operateauthority===true){ + if(this.state.status==0||this.state.status==1||this.state.status==2&&this.props.identity===1){ // evaluate_script_editormd = this.evaluate_script_editormd.getValue(); evaluate_script_editormd = shixunmemoMDvalue }else{ @@ -753,6 +761,7 @@ export default class TPMsettings extends Component { } + if (name === "") { this.setState({ shixunnametype: true @@ -826,6 +835,7 @@ export default class TPMsettings extends Component { if(newmulti_webssh===null){ newmulti_webssh=false } + //exec_time: exec_time, let Url = `/shixuns/` + id + `.json`; let data = { @@ -1625,8 +1635,8 @@ export default class TPMsettings extends Component { options={ { selectOnLineNumbers: true }} - onChange={operateauthority===true?this.getshixunmemoMDvalue:""} + // onChange={this.getshixunmemoMDvalue} />
        diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index ef9f74870..1889df4a5 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -3122,7 +3122,7 @@ a.singlepublishtwo{ height: 40px; } .project-package-item .item-head-title { - max-width: 700px; + max-width: 650px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -3213,7 +3213,7 @@ a.singlepublishtwo{ font-size: 20px; } .project-package-item.with-operator:hover .item-head-title { - max-width: 600px; + max-width: 650px; } .list-count { From 18f9a5d215916389884cd59c885ae27829e07c57 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 15:18:37 +0800 Subject: [PATCH 187/623] modify tiding content --- config/locales/tidings/zh-CN.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index 07e3c2f6d..21d2d0879 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -6,9 +6,9 @@ "2_end": "申请职业认证:%s %s" System: "1_1_end": "你提交的实名认证申请,审核已通过" - "1_2_end": "你提交的实名认证申请,审核未通过    原因:%{reason}" + "1_2_end": "你提交的实名认证申请,审核未通过
        原因:%{reason}" "2_1_end": "你提交的职业认证申请,审核已通过" - "2_2_end": "你提交的职业认证申请,审核未通过    原因:%{reason}" + "2_2_end": "你提交的职业认证申请,审核未通过
        原因:%{reason}" CancelUserAuthentication_end: "取消了你的实名认证:%s %s" CancelUserProCertification_end: "取消了你的实名认证:%s %s" JoinCourse: @@ -28,31 +28,31 @@ Apply_end: "申请添加二级单位:%s(%s)" System: "1_end": "你提交的添加二级单位申请:%s(%s),审核已通过" - "2_false_end": "你提交的添加二级单位申请:%s(%s),审核未通过    原因:%{reason}" + "2_false_end": "你提交的添加二级单位申请:%s(%s),审核未通过
        原因:%{reason}" "2_true_end": "你提交的添加二级单位申请:%s(%s),审核未通过" "3_end": "你提交的添加二级单位申请:%s(%s),已被更改为%{reason}" ApplyAddSchools: Apply_end: "申请添加单位:%s" System: "1_end": "你提交的添加单位申请:%{name},审核已通过" - "2_reason_end": "你提交的添加单位申请:%{name},审核未通过    原因:%{reason}" + "2_reason_end": "你提交的添加单位申请:%{name},审核未通过
        原因:%{reason}" "2_no_reason_end": "你提交的添加单位申请:%{name},审核未通过" "3_end": "你提交的添加单位申请:%{name},已被更改为:%{reason}" ApplyAction: ApplyShixun: System: "1_end": "你提交的实训发布申请:%{name},审核已通过" - "2_end": "你提交的实训发布申请:%{name},审核未通过    原因:%{reason}" + "2_end": "你提交的实训发布申请:%{name},审核未通过
        原因:%{reason}" Apply_end: "申请发布实训:%{name}" ApplySubject: System: "1_end": "你提交的实训课程发布申请:%{name},审核已通过" - "2_end": "你提交的实训课程发布申请:%{name},审核未通过    原因:%{reason}" + "2_end": "你提交的实训课程发布申请:%{name},审核未通过
        原因:%{reason}" Apply_end: "申请发布实训课程:%{name}" TrialAuthorization: System: "1_end": "你提交的试用授权申请,审核已通过" - "2_end": "你提交的试用授权申请,审核未通过    原因:%{reason}" + "2_end": "你提交的试用授权申请,审核未通过
        原因:%{reason}" Apply_end: "提交了试用授权申请" Course_end: "成功创建了课堂:%s" Shixun_end: "成功创建了实训:%s" @@ -174,7 +174,7 @@ GraduationWorkScore_end: "评阅了你的作品:%s" HomeworkCommon: AnonymousComment_end: "开启了作业匿评:%{name}" - AnonymousCommentFail_end: "开启作业匿评失败:%{name},
        原因:%{reason}" + AnonymousCommentFail_end: "开启作业匿评失败:%{name}
        原因:%{reason}" AnonymousAppeal_end: "开启了匿评申诉:%{name}" HomeworkPublish_end: "发布了作业:%{name}" NearlyEnd_end: "作业的提交截止时间快到啦:%{name}" @@ -203,12 +203,12 @@ Apply_end: "申请发布教学案例:%s" System: 1_end: "你提交的发布教学案例申请:%s,审核已通过" - 2_end: "你提交的发布教学案例申请:%s,审核未通过,原因:%{reason}" + 2_end: "你提交的发布教学案例申请:%s,审核未通过
        原因:%{reason}" ProjectPackage: Apply_end: "申请发布众包需求:%s" System: 1_end: "你提交的众包需求申请:%s,审核已通过" - 2_end: "你提交的众包需求申请:%s,审核未通过,原因:%{reason}" + 2_end: "你提交的众包需求申请:%s,审核未通过
        原因:%{reason}" Created_end: "你创建了众包需求:%s" Destroyed_end: "你删除了众包需求:%s" Bidding_end: "应征了你发布的众包任务:%s" From e523282877aa004a9a46ecd216ca6595e4b4df6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 15:38:43 +0800 Subject: [PATCH 188/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 20 ++++++------ public/react/src/modules/login/LoginDialog.js | 32 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 97cfa8eeb..d97c7a223 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -20,16 +20,16 @@ function locationurl(list){ // TODO 开发期多个身份切换 let debugType ="" -if (isDev) { - const _search = window.location.search; - let parsed = {}; - if (_search) { - parsed = queryString.parse(_search); - } - debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : - window.location.search.indexOf('debug=s') != -1 ? 'student' : - window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' -} +// if (isDev) { +// const _search = window.location.search; +// let parsed = {}; +// if (_search) { +// parsed = queryString.parse(_search); +// } +// debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : +// window.location.search.indexOf('debug=s') != -1 ? 'student' : +// window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' +// } window._debugType = debugType; export function initAxiosInterceptors(props) { diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index 58cd9b7fb..3bc77c52e 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -398,23 +398,23 @@ class LoginDialog extends Component { }); } handleDialogClose = () => { - // if(this.props.match===undefined){ - // window.location.href="/"; - // }else if(this.props.match.path==="/"){ - // this.setState({ - // isRender: false - // }) - // }else{ - // window.location.href="/"; - // } - this.setState({ - isRender: false - }) - try { - this.props.Modifyloginvalue(); - }catch (e) { - + + if(this.props.match===undefined){ + window.location.href="/"; + }else{ + this.setState({ + isRender: false + }) + this.props.Modifyloginvalue(); } + // this.setState({ + // isRender: false + // }) + // try { + // this.props.Modifyloginvalue(); + // }catch (e) { + // + // } } loginEDU=()=>{ From ab8cd784f6dc91d470f2c648cd2a7d36e850efdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 15:39:09 +0800 Subject: [PATCH 189/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 20 +++++++++---------- public/react/src/modules/login/LoginDialog.js | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index d97c7a223..97cfa8eeb 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -20,16 +20,16 @@ function locationurl(list){ // TODO 开发期多个身份切换 let debugType ="" -// if (isDev) { -// const _search = window.location.search; -// let parsed = {}; -// if (_search) { -// parsed = queryString.parse(_search); -// } -// debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : -// window.location.search.indexOf('debug=s') != -1 ? 'student' : -// window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' -// } +if (isDev) { + const _search = window.location.search; + let parsed = {}; + if (_search) { + parsed = queryString.parse(_search); + } + debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : + window.location.search.indexOf('debug=s') != -1 ? 'student' : + window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' +} window._debugType = debugType; export function initAxiosInterceptors(props) { diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index 3bc77c52e..f4f8a3f1c 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -398,7 +398,7 @@ class LoginDialog extends Component { }); } handleDialogClose = () => { - + if(this.props.match===undefined){ window.location.href="/"; }else{ From 5333e28f0030c9d34158ed1c6ac99bedef8270cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 15:56:30 +0800 Subject: [PATCH 190/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PackageIndex/PackageConcent.js | 15 +++++++++++++-- .../PackageIndexNEITaskDetails.js | 2 +- .../projectPackages/ProjectPackageIndex.js | 3 ++- .../modules/projectPackages/packageconcnet.css | 4 ++-- .../src/modules/user/usersInfo/InfosPackage.js | 1 + 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index ea9de38fe..1950d7ed8 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -185,6 +185,17 @@ class PackageConcent extends Component { }) } + onChangePagelist=(pageNum)=> { + + this.setState({ + page: pageNum + }) + let {category, keyword, sort_by, sort_direction} = this.state; + this.setdatas(category, keyword, sort_by, sort_direction, pageNum) + + } + + render() { let {data,page,category,sort_by,sort_direction,project_packages, isRender,AccountProfiletype @@ -286,7 +297,7 @@ class PackageConcent extends Component {
        - this.onReleaseRequirements("/crowdsourcing/"+item.id)} title={item.title} >{item.title} @@ -346,7 +357,7 @@ class PackageConcent extends Component {
        :""}
        - +
        diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 2eee9d882..2ad696538 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -311,7 +311,7 @@ class PackageIndexNEITaskDetails extends Component {
        - {data&&data.title} diff --git a/public/react/src/modules/projectPackages/ProjectPackageIndex.js b/public/react/src/modules/projectPackages/ProjectPackageIndex.js index 097e012e0..29d4efa17 100644 --- a/public/react/src/modules/projectPackages/ProjectPackageIndex.js +++ b/public/react/src/modules/projectPackages/ProjectPackageIndex.js @@ -36,7 +36,8 @@ class ProjectPackageIndex extends Component { } render() { - +console.log(this.props) + console.log(this.state) return (
        diff --git a/public/react/src/modules/projectPackages/packageconcnet.css b/public/react/src/modules/projectPackages/packageconcnet.css index 2fc8a8ebb..f7ee4cc06 100644 --- a/public/react/src/modules/projectPackages/packageconcnet.css +++ b/public/react/src/modules/projectPackages/packageconcnet.css @@ -31,8 +31,8 @@ color:#8F8F8F !important; } -.maxwidth700{ - max-width: 700px; +.maxwidth670{ + max-width: 670px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 272c827f4..6bd11a926 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -138,6 +138,7 @@ class InfosPackage extends Component{ axios.delete(url).then((response) => { if (response.data.status == 0) { this.getCourses(cate,status,1); + this.cancelProject; } }) .catch(function (error) { From 15f28ffa9d71c6458267f70f9b5bedb3cd946114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 15:58:49 +0800 Subject: [PATCH 191/623] b --- public/react/src/modules/user/usersInfo/InfosPackage.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 6bd11a926..36175295b 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -138,13 +138,12 @@ class InfosPackage extends Component{ axios.delete(url).then((response) => { if (response.data.status == 0) { this.getCourses(cate,status,1); - this.cancelProject; } }) .catch(function (error) { console.log(error); }); - + this.cancelProject; } render(){ let{ From ece14919f78d1934ac16f4144d804c463db8b769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 16:05:46 +0800 Subject: [PATCH 192/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/projectPackages/PackageIndex/PackageConcent.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js index 1950d7ed8..ba8655d9b 100644 --- a/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js +++ b/public/react/src/modules/projectPackages/PackageIndex/PackageConcent.js @@ -18,7 +18,7 @@ let categorylist=[ {name:"云计算和大数据",value:"cloud_compute_and_big_data"}, {name:"人工智能",value:"ai"}, {name:"运维与测试",value:"devops_and_test"}, - {name:"其他",value:"other"}, + {name:"其它",value:"other"}, ] // function setcategorylist(val){ @@ -30,7 +30,6 @@ function setcategorylist(val){ } } ) - return vals } From 7a1d8064caa7ca79d95b27cd37eca92911922684 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 16:06:25 +0800 Subject: [PATCH 193/623] resize --- public/react/public/js/js_min_all.js | 2 ++ .../react/src/modules/page/main/ActionView.js | 20 +++++++++++++++++-- .../src/modules/page/tpiPageForMobile.css | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/public/react/public/js/js_min_all.js b/public/react/public/js/js_min_all.js index dfead438a..63c1207af 100755 --- a/public/react/public/js/js_min_all.js +++ b/public/react/public/js/js_min_all.js @@ -209,6 +209,7 @@ $(function(){ // window resize $(window).on('resize', function() { + window._tpiWidthResize && window._tpiWidthResize() $('#games_repository_contents .CodeMirror.cm-s-railscasts').css("height", $("#games_repository_contents").height() - repositoryTabHeight); }) @@ -1221,6 +1222,7 @@ $(function(){ // 这里重新加一次事件监听,不在原有事件的基 ); doc.live("mousemove", function(e) { if (dragging === true && lab == dragDom) { + window._tpiWidthResize && window._tpiWidthResize() // React 组件中需要resize,搜索该引用可以找到初始化的位置 window._currentChildcommentMDEditor && window._currentChildcommentMDEditor.resize() } diff --git a/public/react/src/modules/page/main/ActionView.js b/public/react/src/modules/page/main/ActionView.js index d8638efb8..1e587bfbe 100644 --- a/public/react/src/modules/page/main/ActionView.js +++ b/public/react/src/modules/page/main/ActionView.js @@ -51,6 +51,13 @@ class ActionView extends Component { componentDidMount() { // request + window._tpiWidthResize = () => { + if (window.$('#actionView').width() < 580) { + window.$('.time_limit').hide() + } else { + window.$('.time_limit').show() + } + } } showWebDisplay(challenge) { @@ -59,10 +66,17 @@ class ActionView extends Component { /*耗时:0 天 3 小时 11 分钟 57 秒 */ render() { const { onRunCodeTest, onShowPrevStage, onShowNextStage, gameBuilding - , game, classes, st, shixun, record, challenge } = this.props; + , game, classes, st, shixun, record, challenge, time_limit } = this.props; return (
        + + {!!time_limit && + {`本关最大执行时间:${time_limit}秒`}} {!gameBuilding && record ? { record } 秒 @@ -73,7 +87,9 @@ class ActionView extends Component { {/*将第一个按钮改为visibility方式隐藏,不然加载时测评按钮会出现没有垂直居中的情况*/} diff --git a/public/react/src/modules/page/tpiPageForMobile.css b/public/react/src/modules/page/tpiPageForMobile.css index 3f1c9364d..c30f40636 100644 --- a/public/react/src/modules/page/tpiPageForMobile.css +++ b/public/react/src/modules/page/tpiPageForMobile.css @@ -14,7 +14,7 @@ min-width: 280px; } - #time-consuming span{ + #time-consuming .time_limit { display: none; } .actionViewfirstButton { From 16109dbe9fb3d958aba3c94b27936d02f5f433b0 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 16:13:35 +0800 Subject: [PATCH 194/623] modify tiding list apu --- app/views/tidings/_tiding.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/tidings/_tiding.json.jbuilder b/app/views/tidings/_tiding.json.jbuilder index 4a392edfd..c00670433 100644 --- a/app/views/tidings/_tiding.json.jbuilder +++ b/app/views/tidings/_tiding.json.jbuilder @@ -4,6 +4,7 @@ json.content tiding.content json.identifier tiding.identifier json.auth_type tiding.container_type == 'ApplyUserAuthentication' ? tiding.container.auth_type : nil +json.homework_type tiding.container_type == 'HomeworkCommon' ? tiding.container.homework_type : nil json.time tiding.how_long_time json.new_tiding tiding.unread?(@onclick_time) From 531cdbf4ab22d87d69532de311ecb7c37dbb5635 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 16:19:16 +0800 Subject: [PATCH 195/623] visibility --- public/react/src/modules/page/main/ActionView.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/page/main/ActionView.js b/public/react/src/modules/page/main/ActionView.js index 1e587bfbe..0a1faa7ea 100644 --- a/public/react/src/modules/page/main/ActionView.js +++ b/public/react/src/modules/page/main/ActionView.js @@ -87,8 +87,9 @@ class ActionView extends Component { {/*将第一个按钮改为visibility方式隐藏,不然加载时测评按钮会出现没有垂直居中的情况*/} From 983246dd8360d630dfb94558274f17efa9c8253b Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 16:43:33 +0800 Subject: [PATCH 196/623] none data --- public/react/src/modules/courses/boards/index.js | 2 +- public/react/src/modules/courses/members/studentsList.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/boards/index.js b/public/react/src/modules/courses/boards/index.js index 94c8c4c00..db3232b23 100644 --- a/public/react/src/modules/courses/boards/index.js +++ b/public/react/src/modules/courses/boards/index.js @@ -440,7 +440,7 @@ class Boards extends Component{
        { - ( !messages || messages.length == 0 ) && + ( !this.state.isSpin && (!messages || messages.length == 0) ) && } {/* { haveMore &&

        diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index d7c4cb85b..c3dc2c6ab 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -677,9 +677,9 @@ class studentsList extends Component{

        - + {!this.state.isSpin &&
        -
        +
        }
        From 9f039a49aa9b113e9e090bda5d874f02f2951a65 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 16:45:17 +0800 Subject: [PATCH 197/623] add delete course tiding --- app/controllers/courses_controller.rb | 2 ++ app/decorators/tiding_decorator.rb | 6 +++++- config/locales/tidings/zh-CN.yml | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index abc3e4856..9f62a03bb 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -234,6 +234,8 @@ class CoursesController < ApplicationController def destroy if @course.is_delete == 0 @course.delete! + Tiding.create!(user_id: @course.tea_id, trigger_user_id: 1, container_id: @course.id, + container_type: 'Course', tiding_type: 'Delete', extra: @course.name) normal_status(0, "成功") else normal_status(-1, "课堂已删除,无需重复操作") diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 677812217..c7d914089 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -126,7 +126,11 @@ module TidingDecorator end def course_content - I18n.t(locale_format) % container.name + if tiding_type == 'Delete' + I18n.t(locale_format(tiding_type)) % extra + else + I18n.t(locale_format) % container.name + end end def shixun_content diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index 21d2d0879..e00407b28 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -55,6 +55,8 @@ "2_end": "你提交的试用授权申请,审核未通过
        原因:%{reason}" Apply_end: "提交了试用授权申请" Course_end: "成功创建了课堂:%s" + Course: + Delete_end: "你删除了课堂:%s" Shixun_end: "成功创建了实训:%s" Subject_end: "成功创建了实训课程:%s" ArchiveCourse_end: "你的课堂已经归档:%s" From b5e9c29b772c41ea8686349205d746ee939fddc6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 16:47:25 +0800 Subject: [PATCH 198/623] modify user update account api check --- app/forms/users/update_account_form.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/forms/users/update_account_form.rb b/app/forms/users/update_account_form.rb index d82459fcf..16c3c8013 100644 --- a/app/forms/users/update_account_form.rb +++ b/app/forms/users/update_account_form.rb @@ -5,8 +5,8 @@ class Users::UpdateAccountForm attr_accessor :nickname, :name, :show_realname, :gender, :location, :location_city, :identity, :student_id, :technical_title, :school_id, :department_id - validates :nickname, presence: true - validates :name, presence: true + validates :nickname, presence: true, length: { maximum: 20 } + validates :name, presence: true, length: { maximum: 10 } validates :gender, presence: true, numericality: { only_integer: true }, inclusion: { in: [0, 1] } validates :location, presence: true validates :location_city, presence: true From 9dd1999feecaa3c22ce45746bd46ec0c5d2e9a14 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 16:48:59 +0800 Subject: [PATCH 199/623] watch={false} --- public/react/src/modules/courses/boards/BoardsNew.js | 2 +- public/react/src/modules/courses/busyWork/NewWork.js | 4 ++-- public/react/src/modules/courses/exercise/new/JudgeEditor.js | 2 +- public/react/src/modules/courses/exercise/new/MainEditor.js | 4 ++-- .../react/src/modules/courses/exercise/new/NullChildEditor.js | 2 +- public/react/src/modules/courses/exercise/new/NullEditor.js | 2 +- public/react/src/modules/courses/exercise/new/ShixunEditor.js | 2 +- public/react/src/modules/courses/exercise/new/SingleEditor.js | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/react/src/modules/courses/boards/BoardsNew.js b/public/react/src/modules/courses/boards/BoardsNew.js index 7c48d372b..56dddff7c 100644 --- a/public/react/src/modules/courses/boards/BoardsNew.js +++ b/public/react/src/modules/courses/boards/BoardsNew.js @@ -416,7 +416,7 @@ class BoardsNew extends Component{ max: 10000, message: '最大限制为10000个字符', }], })( - )} diff --git a/public/react/src/modules/courses/busyWork/NewWork.js b/public/react/src/modules/courses/busyWork/NewWork.js index 164b3f61e..410d12a3f 100644 --- a/public/react/src/modules/courses/busyWork/NewWork.js +++ b/public/react/src/modules/courses/busyWork/NewWork.js @@ -446,7 +446,7 @@ class NewWork extends Component{ }], })( + className="courseMessageMD" initValue={this.state.description}> )} } @@ -508,7 +508,7 @@ class NewWork extends Component{ required: false }], })( - )} diff --git a/public/react/src/modules/courses/exercise/new/JudgeEditor.js b/public/react/src/modules/courses/exercise/new/JudgeEditor.js index 586d77ed0..50224e125 100644 --- a/public/react/src/modules/courses/exercise/new/JudgeEditor.js +++ b/public/react/src/modules/courses/exercise/new/JudgeEditor.js @@ -187,7 +187,7 @@ class SingleEditor extends Component{ (客观题,由系统自动评分,请设置标准答案)

        - this.setState({ question_title: val})} ref="titleEditor" > diff --git a/public/react/src/modules/courses/exercise/new/MainEditor.js b/public/react/src/modules/courses/exercise/new/MainEditor.js index e9dd3b105..9a3eda659 100644 --- a/public/react/src/modules/courses/exercise/new/MainEditor.js +++ b/public/react/src/modules/courses/exercise/new/MainEditor.js @@ -152,14 +152,14 @@ class MainEditor extends Component{ (主观题,未作答的情况下自动评为零分)

        - this.setState({ question_title: val})} noStorage={true} ref="titleEditor" >
        参考答案
        - this.setState({ standard_answers: [val]})} noStorage={true} > diff --git a/public/react/src/modules/courses/exercise/new/NullChildEditor.js b/public/react/src/modules/courses/exercise/new/NullChildEditor.js index 9e50e2ad3..5146f05ec 100644 --- a/public/react/src/modules/courses/exercise/new/NullChildEditor.js +++ b/public/react/src/modules/courses/exercise/new/NullChildEditor.js @@ -57,7 +57,7 @@ class NullChildEditor extends Component{ className={'nullChildEditor'} placeholder={`请输入参考答案${itemIndex == 0 ?'':'(可选)'}`} toMDMode={toMDMode} noStorage={true} - mdID={`answer_${index}${itemIndex}`} height={155} watch={false} + mdID={`answer_${index}${itemIndex}`} height={155} initValue={item} onChange={(val) => onAnswerChange(index, itemIndex, val)} >
        diff --git a/public/react/src/modules/courses/exercise/new/NullEditor.js b/public/react/src/modules/courses/exercise/new/NullEditor.js index 299daf904..8cfb21a5f 100644 --- a/public/react/src/modules/courses/exercise/new/NullEditor.js +++ b/public/react/src/modules/courses/exercise/new/NullEditor.js @@ -297,7 +297,7 @@ class NullEditor extends Component{ (客观题,由系统自动评分,允许手动调分,请设置标准答案 ;支持最多5个空,每空得分按照本题的总分平均计算)

        - this.setState({ question_title: val})} onPlaceholderChange={this.onPlaceholderChange} showNullButton={exerciseIsPublish ? false : true} ref="titleEditor" diff --git a/public/react/src/modules/courses/exercise/new/ShixunEditor.js b/public/react/src/modules/courses/exercise/new/ShixunEditor.js index 29ba724af..543e840bc 100644 --- a/public/react/src/modules/courses/exercise/new/ShixunEditor.js +++ b/public/react/src/modules/courses/exercise/new/ShixunEditor.js @@ -250,7 +250,7 @@ class ShixunEditor extends Component{ style={{ marginBottom: '10px'}} > {/*
        {shixun_name}
        */} - this.setState({ question_title: val})} noStorage={true} > diff --git a/public/react/src/modules/courses/exercise/new/SingleEditor.js b/public/react/src/modules/courses/exercise/new/SingleEditor.js index 8e68a593c..f339e5680 100644 --- a/public/react/src/modules/courses/exercise/new/SingleEditor.js +++ b/public/react/src/modules/courses/exercise/new/SingleEditor.js @@ -242,7 +242,7 @@ class SingleEditor extends Component{ (客观题,由系统自动评分,请设置标准答案)

        - this.setState({ question_title: val})} ref="titleEditor" @@ -265,7 +265,7 @@ class SingleEditor extends Component{ this.onOptionContentChange(value, index)} initValue={item} > From cf7c93d141aac09ee608f5d07122581014ceb5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:07:22 +0800 Subject: [PATCH 200/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/message/js/MessagChat.js | 1 + .../react/src/modules/message/js/MessagSub.js | 378 +++++++++++++++++- .../src/modules/message/js/MessagePrivate.js | 35 ++ .../src/modules/message/js/Messagerouting.js | 40 +- 4 files changed, 439 insertions(+), 15 deletions(-) diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index 377f3cd3a..e7d1dd082 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -48,6 +48,7 @@ class MessagChat extends Component{ // console.log(this.props); // console.log(this.props.match.params.userid); this.scrollToBottom(); + this.props.triggerRef(this) } componentDidUpdate() { diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 88e339b20..0a0dec81e 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -30,6 +30,7 @@ class MessagSub extends Component{ }catch (e) { } + this.props.triggerRef(this) } //塞选页数 @@ -70,6 +71,36 @@ class MessagSub extends Component{ isSpin:false, }) }) + }; + getdatas=()=>{ + this.setState({ + isSpin:true, + }) + let{typeysl,page,limit}=this.state; + let url = `/users/tidings.json`; + axios.get((url),{params:{ + type:typeysl, + page:page, + per_page:limit, + }}).then((result) => { + if (result) { + // if (result.data.status === 0) { + + this.setState({ + page: page, + count: result.data.count, + typeysl: typeysl, + isSpin: false, + data: result.data.tidings === null ? undefined : result.data.tidings === undefined ? undefined : result.data.tidings === [] ? undefined : result.data.tidings === "[]" ? undefined : result.data.tidings.length === 0 ? undefined : result.data.tidings, + }) + // } + } + }).catch((error) => { + console.log(error); + this.setState({ + isSpin:false, + }) + }) } componentWillUnmount(){ @@ -78,6 +109,339 @@ class MessagSub extends Component{ return; } } + + gettourl=(item)=>{ + switch (item.container_type) { + case "ApplyUserAuthentication" : + if(item.tiding_type==="Apply"){ + if(item.auth_type===1){ + //系统管理页面 + return window.location.href="/managements/identity_authentication"; + } + if(item.auth_type===2){ + //系统管理页面 + return window.location.href="/managements/professional_authentication"; + } + } + if(item.tiding_type ==="System"){ + // 账号管理页-认证信息 + return window.location.href="/account/certification"; + } + case "CancelUserAuthentication" : + // 账号管理页-认证信息 + return window.location.href="/account/certification"; + case "CancelUserProCertification" : + // 账号管理页-认证信息 + return window.location.href="/account/certification"; + case "ApplyAddDepartment" : + if(item.tiding_type==="Apply"){ + //部门审批 + return window.location.href="/managements/depart"; + } + if(item.tiding_type==="System"){ + // 账号管理页/account/profile + return window.location.href="/account/profile"; + } + case "ApplyAddSchools" : + if(item.tiding_type==="Apply"){ + // 单位审批 + return window.location.href=" /managements/unit"; + } + if(item.tiding_type==="System"){ + // 账号管理页 + return window.location.href="/account/profile"; + } + case "ApplyAction" : + switch (item.parent_container_type) { + case "ApplyShixun" : + if(item.tiding_type==="Apply"){ + return window.location.href="/managements/shixun_authorization"; + } + if(item.tiding_type==="System"){ + // 实训详情页 :identifier = identifier + return window.location.href=`/shixuns/${item.identifier}/challenges`; + } + case "ApplySubject" : + if(item.tiding_type==="Apply"){ + // 实训课程发布 + return window.location.href="/managements/subject_authorization"; + } + if(item.tiding_type==="System"){ + // 实践课程详情页 :identifier = identifier + + return window.location.href=`/paths/${item.identifier}`; + } + case "TrialAuthorization" : + if(item.tiding_type==="Apply"){ + // 试用授权页面 + return window.location.href="/managements/trial_authorization"; + } + if(item.tiding_type==="System"){ + // 账号管理页 + return window.location.href="/account/profile"; + } + } + case 'JoinCourse' : + // 课堂详情页 :id = + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case 'StudentJoinCourse': + // 课堂详情页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case 'DealCourse': + // 课堂详情页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case 'TeacherJoinCourse': + // 课堂详情页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case 'Course' : + // 课堂详情页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case 'ArchiveCourse' : + // 课堂详情页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case "Shixun" : + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + case "Subject" : + // 实践课程详情页 :id = container_id + return window.location.href=`/paths/${item.identifier}`; + case "JournalsForMessage" : + switch (item.parent_container_type) { + case "Principal" : + // 反馈页 :id = parent_container_id + // 不用跳了 + return ''; + case "HomeworkCommon" : + //学生作业页 homework = parent_container_id + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + return ''; + case "GraduationTopic" : + // 毕业目标页 parent_container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + case "StudentWorksScore" : + //学生作业页 + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + } + case "Memo" : + // 交流问答页 :id = parent_container_id + return window.location.href="/forums/categories/all?order=newest"; + case "Watcher" : + // 用户个人中心页 :id = item.trigger_user.login + return window.location.href=`/users/${item.trigger_user.login}/courses`; + case "PraiseTread" : + // 这块太复杂 不好处理 + return ''; + case "Grade" : + //个人中心页 :id = item.trigger_user.login + return window.location.href=`/users/${item.trigger_user.login}/courses`; + case "JoinProject" : + //项目详情-申请加入项目审核页 :id = container_id + return window.location.href=`/projects/${item.container_id}`; + case 'ReporterJoinProject': + //项目详情页 :id = container_id + return window.location.href=`/projects/${item.container_id}`; + case 'DealProject': + //项目详情页 :id = container_id + return window.location.href=`/projects/${item.container_id}`; + case 'ManagerJoinProject': + //项目详情页 :id = container_id + return window.location.href=`/projects/${item.container_id}`; + case "Poll": + switch (item.parent_container_type) { + case "CommitPoll" : + // 课堂id belong_container_id + //课堂-学生已提交问卷列表 :id = container_id + return window.location.href=` /courses/${item.belong_container_id}/polls/${item.container_id}`; + default : + // 课堂-问卷列表 :id = container_id + return window.location.href=` /courses/${item.belong_container_id}/polls/${item.container_id}`; + } + case "Exercise" : + switch (item.parent_container_type) { + case "CommitExercise": + // 课堂-学生试卷详情 :id = container_id :user_id = trigger_user.id + return window.location.href=` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`; + case "ExerciseScore": + // 课堂-学生试卷详情 :id = container_id :user_id = trigger_user.id + return window.location.href=` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`; + default : + // 课堂-试卷列表详情 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/exercises/${item.container_id}`; + } + case 'StudentGraduationTopic' : + //课堂-毕业选题详情 :id = parent_container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + case 'DealStudentTopicSelect' : + //课堂-毕业选题详情 :id = parent_container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + case 'GraduationTask' : + //课堂-毕业任务页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`; + case "GraduationWork" : + //课堂-毕业xx页 :id = container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`; + case "GraduationWorkScore" : + // 课堂-毕业xx页 :id = parent_container_id + return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`; + case "HomeworkCommon" : + switch (item.parent_container_type) { + case "AnonymousCommentFail" : + // 课堂-作业列表 homework = container_id + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + case "HomeworkPublish" : + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + case "AnonymousAppeal" : + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + default : + // 课堂-作业列表 homework = container_id + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + } + case "StudentWork" : + //课堂-作业 :id = container_id + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + case "StudentWorksScore" : + //课堂-作业 :id = parent_container_id + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + case "StudentWorksScoresAppeal" : + if(item.homework_type===1){ + //普通作业 + return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===3){ + //分组作业 + return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + } + if(item.homework_type===4){ + //实训作业 + return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + } + case "ChallengeWorkScore" : + return ''; + case "SendMessage" : + // /managements/mirror_repository + return window.location.href=`/managements/mirror_repository`; + case "Journal" : + //项目Issue页 :id = parent_container_id + return window.location.href=`/projects/${item.parent_container_id}/issues?remote=true`; + case "Issue" : + //项目Issue页 :id = container_id + return window.location.href=`/projects/${item.container_id}/issues?remote=true`; + case "PullRequest" : + // 项目pull request页 :id = parent_container_id + return window.location.href=`/projects/${item.parent_container_id}/pull_requests`; + case "Department" : + //账号管理页 + return window.location.href=`/account/profile`; + case "Library" : + if (item.tiding_type === 'Apply') { + // /managements/library_applies + return window.location.href=`/managements/library_applies`; + } + if(item.tiding_type === 'System'){ + //教学案例详情 :id = container_id + return window.location.href=`/moop_cases/${item.container_id}`; + } + case "ProjectPackage" : + if (item.tiding_type === 'Apply') { + ///managements/project_package_applies + return window.location.href=`/managements/project_package_applies`; + } + if(item.tiding_type === 'System'){ + //众包详情 :id = container_id + return window.location.href=`/crowdsourcing/${item.container_id}`; + } + default : + return window.location.href="/"; + } + + } render() { let{page,limit,typeysl,count,isSpin,data}=this.state; // console.log("6868686868"); @@ -117,10 +481,9 @@ class MessagSub extends Component{

        暂无数据哦~

        :data.map((item,key)=>{ - console.log(data) return(
        -
        +
        this.gettourl(item)}> this.myCome(item)} src={getImageUrl("/images/"+item.trigger_user.image_url)} className="radius mr10 fl myimgw48 myimgh48"/>

        @@ -136,12 +499,15 @@ class MessagSub extends Component{ ):""}

        -

        + +

        diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js index fa5531c80..0d2889cef 100644 --- a/public/react/src/modules/message/js/MessagePrivate.js +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -31,6 +31,7 @@ class MessagePrivate extends Component{ }catch (e) { } + this.props.triggerRef(this) // console.log("MessagePrivate"); // console.log(this.props); // console.log(this.props.match.params.userid); @@ -80,6 +81,40 @@ class MessagePrivate extends Component{ }) }) }; + getdatas2=()=>{ + this.setState({ + isSpin:true, + }); + let{limit,page}=this.state; + let url = `/users/${this.props.match&&this.props.match.params.userid}/private_messages.json`; + // let url = `/users/71519/private_messages.json`; + axios.get((url),{params:{ + page:page, + per_page:limit, + }}).then((result) => { + if (result) { + // console.log(types); + // console.log(result); + + // console.log("调用了消失的方法"); + // console.log("5454545454"); + // if (result.data.status === 0) { + + this.setState({ + page: page, + count: result.data.count, + isSpin: false, + data: result.data.private_messages === null ? undefined : result.data.private_messages === undefined ? undefined : result.data.private_messages === [] ? undefined : result.data.private_messages === "[]" ? undefined : result.data.private_messages.length === 0 ? undefined : result.data.private_messages, + }) + // } + } + }).catch((error) => { + console.log(error); + this.setState({ + isSpin:false, + }) + }) + }; paginationonChanges=(pageNumber)=>{ this.setState({ diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index 2c649c23c..651253ae3 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -45,6 +45,9 @@ class Messagerouting extends Component{ // console.log(courstype); + } + getdatas2=()=>{ + } componentDidUpdate(prevProps) { // console.log("11111111111"); @@ -74,17 +77,21 @@ class Messagerouting extends Component{ }) }; - SwitchonClick=(value)=>{ + SwitchonClick=(value,child)=>{ this.setState({ routing:value, }); this.Messageprivatemessageunreadmessage(this.props.current_user.user_id); if(value===1){ this.props.history.replace(`/message/${this.props.current_user.user_id}/user_tidings`); + this.homeworkendss1(child); } if(value===2){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`);; + this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`); + this.homeworkendss2(child); } + + }; @@ -145,6 +152,21 @@ class Messagerouting extends Component{ routing:3, }); } + }; + bindRef = ref => { this.child = ref }; + homeworkendss1(child){ + // console.log(child); + // // console.log(this.refs.childModel); + // console.log(child); + child.getdatas(); + // + } + homeworkendss2(child){ + // console.log(child); + // // console.log(this.refs.childModel); + // console.log(child); + child.getdatas2(); + // } render() { let{routing,unread_message_count,unread_tiding_count} =this.state; @@ -171,12 +193,12 @@ class Messagerouting extends Component{ {/*路由跳转*/}
        @@ -197,19 +219,19 @@ class Messagerouting extends Component{ {/*/!*消息自路由*! name 是 /message/info/:userid/*/} (this.Message2()} Mtab={(i)=>this.myxiaoxisixintab(i)}>) + (props) => (this.Message2()} Mtab={(i)=>this.myxiaoxisixintab(i)}>) } > {/*/!*私信*! name 是letter/*/} (this.Message2()} Modifyur={(i,item)=>this.Modifyur(i,item)} Mtab={(i)=>this.myxiaoxisixintab(i)}> ) + (props) => (this.Message2()} Modifyur={(i,item)=>this.Modifyur(i,item)} Mtab={(i)=>this.myxiaoxisixintab(i)}> ) } > {/*/!*私信聊天页面*! letters/*/} (this.Message2()} Modifyur={(i)=>this.Modifyur(i)} Mtab={(i)=>this.myxiaoxisixintab(i)}>) + (props) => (this.Message2()} Modifyur={(i)=>this.Modifyur(i)} Mtab={(i)=>this.myxiaoxisixintab(i)}>) } > From aa48c32dc42404d23a3239a753b5e3684204b010 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 17:09:34 +0800 Subject: [PATCH 201/623] ... --- .../react/src/modules/user/account/AccountCertification.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/user/account/AccountCertification.js b/public/react/src/modules/user/account/AccountCertification.js index 15a78b564..e1bdc1372 100644 --- a/public/react/src/modules/user/account/AccountCertification.js +++ b/public/react/src/modules/user/account/AccountCertification.js @@ -83,7 +83,7 @@ class AccountCertification extends Component {
        实名认证
        -
        有些课程需要实名认证才能加入哟,还能获得500金币的奖励~
        +
        实名认证可以增强你在平台的江湖地位,还可以获得500金币的奖励~
        { basicInfo && basicInfo.authentication =="uncertified" ? @@ -96,7 +96,10 @@ class AccountCertification extends Component {
        职业认证
        -
        教师认证完毕之后,可创建课堂、发布实训、免金币查看所有实训答案..
        + + {basicInfo && (basicInfo.identity == "teacher" + ?
        教师通过认证,可以克隆实训、免金币查看实训答案和隐藏测试集...
        + :
        通过认证,可以获得500金币的奖励~
        )}
        { basicInfo && basicInfo.professional_certification =="uncertified" ? From 57dc6723f1cb834e972501c7aded0d531fb2e0d6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 17:10:13 +0800 Subject: [PATCH 202/623] fix --- app/models/course_message.rb | 2 +- config/locales/tidings/zh-CN.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/course_message.rb b/app/models/course_message.rb index acb45d5f4..77c86e3e5 100644 --- a/app/models/course_message.rb +++ b/app/models/course_message.rb @@ -28,7 +28,7 @@ class CourseMessage < ApplicationRecord def send_deal_tiding # 发送申请处理结果消息 Tiding.create!( - user_id: user_id, trigger_user: User.current, container_id: course_id, container_type: 'DealCourse', + user_id: course_message_id, trigger_user: User.current, container_id: course_id, container_type: 'DealCourse', belong_container: course, extra: content.to_i == 2 ? '7' : '9', tiding_type: 'System', status: status == :PASSED ? 1 : 2 ) # 将申请消息置为已处理 diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index e00407b28..456f15887 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -21,6 +21,9 @@ "7_2_end": "你提交的加入课堂申请:%s(助教), 审核未通过" StudentJoinCourse_end: "加入了课堂:%s(学生)" TeacherJoinCourse: + "2_end": "%s将你加入课堂:%s(教师)" + "3_end": "%s将你加入课堂:%s(助教)" + "4_end": "%s将你加入课堂:%s(学生)" "9_end": "%s将你加入课堂:%s(教师)" "7_end": "%s将你加入课堂:%s(助教)" "10_end": "%s将你加入课堂:%s(学生)" From cf76f3db60cf96e578dd9aa904de5a4a95bc8fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 17:11:09 +0800 Subject: [PATCH 203/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMIndex.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/react/src/modules/tpm/TPMIndex.css b/public/react/src/modules/tpm/TPMIndex.css index 2f6eccfd6..5c2580093 100644 --- a/public/react/src/modules/tpm/TPMIndex.css +++ b/public/react/src/modules/tpm/TPMIndex.css @@ -200,6 +200,10 @@ body>.-task-title { .HeaderSearch{ width: 325px; + /*right: 20px;*/ +} +.HeaderSearch .ant-input-search{ + right: 20px; } .mainheighs{ height: 100%; From 11f20d7fd00cdbdc1a8bf5785f5cf6cdd3d99681 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 17:12:32 +0800 Subject: [PATCH 204/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/graduation_topics/_graduation_comments.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/graduation_topics/_graduation_comments.json.jbuilder b/app/views/graduation_topics/_graduation_comments.json.jbuilder index ee9ed7529..51551d95d 100644 --- a/app/views/graduation_topics/_graduation_comments.json.jbuilder +++ b/app/views/graduation_topics/_graduation_comments.json.jbuilder @@ -11,6 +11,6 @@ if message.m_parent_id json.can_delete message.can_delete(identity) else json.praise_count message.praise_treads.select{|pt| pt.praise_or_tread == 1}.count - json.user_praise message.praise_treads.select{|pt| pt.praise_or_tread == 1 && user_id == current_user.id}.count + json.user_praise message.praise_treads.select{|pt| pt.praise_or_tread == 1 && pt.user_id == current_user.id}.count json.child_message_count message.m_reply_count end From a0f073438824294d0b92046baf7275bbe2eee92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:17:27 +0800 Subject: [PATCH 205/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/message/js/MessagChat.js | 3 +++ public/react/src/modules/message/js/MessagSub.js | 16 ++++++++++------ .../src/modules/message/js/Messagerouting.js | 2 -- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index e7d1dd082..b731ace23 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -110,6 +110,7 @@ class MessagChat extends Component{ // } }; + shuaxingetChatList=(page,listl,target_ids,bool)=>{ this.setState({ isSpin:true, @@ -385,7 +386,9 @@ class MessagChat extends Component{ // console.log(i); this.props.Modifyur(i); }; + getdatas2=()=>{ + } // 点击了用户 Clickedontheuser=(user)=>{ // debugger diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 0a0dec81e..cf8c77fc3 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -428,14 +428,18 @@ class MessagSub extends Component{ //教学案例详情 :id = container_id return window.location.href=`/moop_cases/${item.container_id}`; } - case "ProjectPackage" : - if (item.tiding_type === 'Apply') { - ///managements/project_package_applies - return window.location.href=`/managements/project_package_applies`; - } - if(item.tiding_type === 'System'){ + case "ProjectPackage" : + if(item.tiding_type==="Destroyed_end"){ + return ; + }else { + // if (item.tiding_type === 'Apply') { + // ///managements/project_package_applies + // return window.location.href=`/managements/project_package_applies`; + // } + // if(item.tiding_type === 'System'){ //众包详情 :id = container_id return window.location.href=`/crowdsourcing/${item.container_id}`; + // } } default : return window.location.href="/"; diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index 651253ae3..430bf7836 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -46,9 +46,7 @@ class Messagerouting extends Component{ } - getdatas2=()=>{ - } componentDidUpdate(prevProps) { // console.log("11111111111"); // console.log(prevProps); From d3c082a0e89d4082f80ed1234a66c6e0a35eb59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:25:41 +0800 Subject: [PATCH 206/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagSub.js --- public/react/src/modules/message/js/Messagerouting.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index 5d3076268..c9806445c 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -156,14 +156,14 @@ class Messagerouting extends Component{ // console.log(child); // // console.log(this.refs.childModel); // console.log(child); - child.getdatas(); + // child.getdatas(); // } homeworkendss2(child){ // console.log(child); // // console.log(this.refs.childModel); // console.log(child); - child.getdatas2(); + // child.getdatas2(); // } render() { From 2eb8948aa6cbc310a69d8a4dc185339dd5c6968e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 17:27:00 +0800 Subject: [PATCH 207/623] b --- public/react/src/search/SearchPage.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/search/SearchPage.js b/public/react/src/search/SearchPage.js index ccdb9e12a..68efca036 100644 --- a/public/react/src/search/SearchPage.js +++ b/public/react/src/search/SearchPage.js @@ -150,9 +150,9 @@ class SearchPage extends Component{
        - 开发社区 - 实践课程 - 翻转课堂 + 实践课程 + 翻转课堂 + 开发社区 交流问答
        From 7d34d8ea3cb8083ab315f28b828e597d82ec1d5b Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 17:35:25 +0800 Subject: [PATCH 208/623] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E8=AF=BE=E5=A0=82?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 8 +++++--- app/models/user.rb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 9f62a03bb..6c2eb5299 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -928,12 +928,14 @@ class CoursesController < ApplicationController course_message.save! - role = course_message.content == 2 ? '7' : '9' # 7:助教 9:教师 + role = course_message.content == 2 ? '9' : '7' # 7:助教 9:教师 ApplyTeacherRoleJoinCourseNotifyJob.perform_later(current_user.id, course.id, role) - message = "#{course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" + message = "#{course_message.content == 2 ? '教师' : '助教'}申请已提交,请等待审核" else - message = "#{existing_course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" + message = "#{existing_course_message.content == 2 ? '教师' : '助教'}申请已提交,请等待审核" end + else + message = "您已是课堂成员" end teacher_role = 1 end diff --git a/app/models/user.rb b/app/models/user.rb index b453f9998..e9d6ce54b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -234,7 +234,7 @@ class User < ApplicationRecord # 课堂的老师(创建者、老师、助教),不用考虑当前身份 def teacher_of_course_non_active?(course) - course.course_members.exists?(user_id: id, role: [1,2,3]) || admin? || business? + course.course_members.exists?(user_id: id, role: [1,2,3]) end # 是否是教师,课堂管理员或者超级管理员 From 9a9e547fad4cc5ee333bcc29edb6b72326e3041f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:36:17 +0800 Subject: [PATCH 209/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagSub.js --- .../react/src/modules/message/js/Messagerouting.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index c9806445c..a4d7fd6f9 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -156,14 +156,24 @@ class Messagerouting extends Component{ // console.log(child); // // console.log(this.refs.childModel); // console.log(child); - // child.getdatas(); + try { + child.getdatas(); + }catch (e) { + + } + // } homeworkendss2(child){ // console.log(child); // // console.log(this.refs.childModel); // console.log(child); - // child.getdatas2(); + try { + child.getdatas2(); + }catch (e) { + + } + // } render() { From 7f591bd4b261fbc2f919160e062b33f6603ff456 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 17:44:53 +0800 Subject: [PATCH 210/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 6c2eb5299..d49e28d80 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -911,6 +911,7 @@ class CoursesController < ApplicationController CourseAddStudentCreateWorksJob.perform_later(course.id, [current_user.id]) StudentJoinCourseNotifyJob.perform_later(current_user.id, course.id) end + student_role = 1 end # 创建教师身份 @@ -940,9 +941,9 @@ class CoursesController < ApplicationController teacher_role = 1 end - if teacher_role && current_user.student_of_course?(course) + if teacher_role && student_role render json: { status: 0, message: message, course_id: course.id} - elsif current_user.student_of_course?(course) + elsif student_role render json: { status: 0, message: "加入成功", course_id: course.id} else normal_status(message) From 8b94dc48a160381aeddad78ac096781150dfe359 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 17:47:08 +0800 Subject: [PATCH 211/623] send tiding when create shixun --- app/models/shixun.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 82f689e3f..392807479 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -62,6 +62,8 @@ class Shixun < ApplicationRecord scope :field_for_recommend, lambda{ select([:id, :name, :identifier, :myshixuns_count]) } scope :find_by_ids,lambda{|k| where(id:k)} + after_create :send_tiding + # REDO:  def propaedeutics shixun_info.try(:propaedeutics) @@ -242,4 +244,11 @@ class Shixun < ApplicationRecord def finished_challenges_count(user) Game.joins(:myshixun).where(user_id: user.id, status: 2, myshixuns: { shixun_id: id }).count end + + private + + def send_tiding + self.tidings << Tiding.new(:user_id => self.user_id, :trigger_user_id => self.user_id, :belong_container_id => self.id, :belong_container_type =>'Shixun', :tiding_type => "System", :viewed => 0) + end + end From 1f3ca2c64eceee65acc396746c42490c7511132f Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 17:55:20 +0800 Subject: [PATCH 212/623] fix --- app/models/shixun.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 392807479..61d15de55 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -38,6 +38,7 @@ class Shixun < ApplicationRecord belongs_to :user # 实训服务配置 has_many :shixun_service_configs, :dependent => :destroy + has_many :tidings, as: :container, dependent: :destroy scope :search_by_name, ->(keyword) { where("name like ? or description like ? ", "%#{keyword}%", "%#{keyword}%") } @@ -248,7 +249,7 @@ class Shixun < ApplicationRecord private def send_tiding - self.tidings << Tiding.new(:user_id => self.user_id, :trigger_user_id => self.user_id, :belong_container_id => self.id, :belong_container_type =>'Shixun', :tiding_type => "System", :viewed => 0) + self.tidings << Tiding.new(:user_id => user_id, :trigger_user_id => 1, :belong_container_id => id, :belong_container_type =>'Shixun', :tiding_type => "System", :viewed => 0) end end From 292a78243599260b55835fbfd429a25f9c334636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:57:18 +0800 Subject: [PATCH 213/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagSub.js --- .../src/modules/message/js/Messagerouting.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index a4d7fd6f9..fa0c607d4 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -43,7 +43,8 @@ class Messagerouting extends Component{ // // courstype=courstype[3]; // // console.log("45"); // console.log(courstype); - + // console.log("Messagerouting46"); + // console.log(this.props.current_user); } @@ -54,7 +55,9 @@ class Messagerouting extends Component{ // console.log(this.props); // console.log("33333333333"); if(prevProps.current_user !== this.props.current_user){ - this.Messageprivatemessageunreadmessage(this.props.current_user.user_id); + this.Messageprivatemessageunreadmessage(this.props.current_user.login); + // console.log("Messagerouting59"); + // console.log(this.props.current_user); } } //消息未读 @@ -79,13 +82,13 @@ class Messagerouting extends Component{ this.setState({ routing:value, }); - this.Messageprivatemessageunreadmessage(this.props.current_user.user_id); + this.Messageprivatemessageunreadmessage(this.props.current_user.login); if(value===1){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/user_tidings`); + this.props.history.replace(`/message/${this.props.current_user.login}/user_tidings`); this.homeworkendss1(child); } if(value===2){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`); + this.props.history.replace(`/message/${this.props.current_user.login}/private_messages`); this.homeworkendss2(child); } @@ -114,10 +117,10 @@ class Messagerouting extends Component{ routing:i, }); if(i===1){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/user_tidings`); + this.props.history.replace(`/message/${this.props.current_user.login}/user_tidings`); } if(i===2){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`); + this.props.history.replace(`/message/${this.props.current_user.login}/private_messages`); } }else { @@ -125,7 +128,7 @@ class Messagerouting extends Component{ routing:i, }); console.log("22222222222"); - this.props.history.replace(`/message/${this.props.current_user.user_id}/message_detail?target_ids=${id}`); + this.props.history.replace(`/message/${this.props.current_user.login}/message_detail?target_ids=${id}`); } }; From 69e90953899712cda441e7cfa5d2fb4a912654d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 17:59:26 +0800 Subject: [PATCH 214/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagSub.js --- public/react/src/modules/message/js/MessagChat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index cf09ecc5d..ae7944b2d 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -402,7 +402,7 @@ class MessagChat extends Component{ myuserl:user, }) - this.props.history.replace(`/message/${this.props.current_user.user_id}/message_detail?target_ids=${user.id}`); + this.props.history.replace(`/message/${this.props.current_user.login}/message_detail?target_ids=${user.id}`); // this.getdatatwo(this.state.page); this.getChatListtwo(1,this.state.mypagey,user.id); From 23a5835ba915f333b4aa4cddc168d3d24914ed10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 18:04:23 +0800 Subject: [PATCH 215/623] Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagSub.js --- public/react/src/modules/message/js/MessagSub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 8b9b31da5..c44685361 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -200,7 +200,7 @@ class MessagSub extends Component{ // 课堂详情页 :id = container_id return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; case "Shixun" : - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.location.href=`/shixuns/${item.identifier}/challenges`; case "Subject" : // 实践课程详情页 :id = container_id return window.location.href=`/paths/${item.identifier}`; From 64e232a5afc6946f1ee416070682f7172e1b802a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 18:06:03 +0800 Subject: [PATCH 216/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.js | 2 +- public/react/src/modules/forums/UserSection.js | 2 +- .../react/src/modules/message/js/MessagChat.js | 2 +- .../src/modules/message/js/Messagerouting.js | 16 ++++++++-------- .../react/src/modules/modals/DownloadMessage.js | 2 +- .../src/modules/modals/DownloadMessageysl.js | 2 +- .../PackageIndexNEITaskDetails.js | 6 +++--- public/react/src/modules/tpm/NewHeader.js | 2 +- public/react/src/modules/user/usersInfo/Infos.js | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index 0612fdfca..dc5d1f4a8 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -360,7 +360,7 @@ class App extends Component { - () } diff --git a/public/react/src/modules/forums/UserSection.js b/public/react/src/modules/forums/UserSection.js index 4610c2441..13cda2e03 100644 --- a/public/react/src/modules/forums/UserSection.js +++ b/public/react/src/modules/forums/UserSection.js @@ -52,7 +52,7 @@ class UserSection extends Component { { author_info.user_id !== current_user.user_id &&

        {this.AboutFocus()}}>{ author_info.watched == true ? "取消关注" : "关注" } - 私信 + 私信

        }
        ); diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index cf09ecc5d..cd46aca5a 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -402,7 +402,7 @@ class MessagChat extends Component{ myuserl:user, }) - this.props.history.replace(`/message/${this.props.current_user.user_id}/message_detail?target_ids=${user.id}`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/message_detail?target_ids=${user.id}`); // this.getdatatwo(this.state.page); this.getChatListtwo(1,this.state.mypagey,user.id); diff --git a/public/react/src/modules/message/js/Messagerouting.js b/public/react/src/modules/message/js/Messagerouting.js index 5d3076268..a902c1266 100644 --- a/public/react/src/modules/message/js/Messagerouting.js +++ b/public/react/src/modules/message/js/Messagerouting.js @@ -81,11 +81,11 @@ class Messagerouting extends Component{ }); this.Messageprivatemessageunreadmessage(this.props.current_user.user_id); if(value===1){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/user_tidings`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/user_tidings`); this.homeworkendss1(child); } if(value===2){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/private_messages`); this.homeworkendss2(child); } @@ -114,10 +114,10 @@ class Messagerouting extends Component{ routing:i, }); if(i===1){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/user_tidings`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/user_tidings`); } if(i===2){ - this.props.history.replace(`/message/${this.props.current_user.user_id}/private_messages`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/private_messages`); } }else { @@ -125,7 +125,7 @@ class Messagerouting extends Component{ routing:i, }); console.log("22222222222"); - this.props.history.replace(`/message/${this.props.current_user.user_id}/message_detail?target_ids=${id}`); + this.props.history.replace(`/messages/${this.props.current_user.user_id}/message_detail?target_ids=${id}`); } }; @@ -215,19 +215,19 @@ class Messagerouting extends Component{ {/*/!*消息自路由*! name 是 /message/info/:userid/*/} - (this.Message2()} Mtab={(i)=>this.myxiaoxisixintab(i)}>) } > {/*/!*私信*! name 是letter/*/} - (this.Message2()} Modifyur={(i,item)=>this.Modifyur(i,item)} Mtab={(i)=>this.myxiaoxisixintab(i)}> ) } > {/*/!*私信聊天页面*! letters/*/} - (this.Message2()} Modifyur={(i)=>this.Modifyur(i)} Mtab={(i)=>this.myxiaoxisixintab(i)}>) } diff --git a/public/react/src/modules/modals/DownloadMessage.js b/public/react/src/modules/modals/DownloadMessage.js index 0e975be09..4655d7478 100644 --- a/public/react/src/modules/modals/DownloadMessage.js +++ b/public/react/src/modules/modals/DownloadMessage.js @@ -18,7 +18,7 @@ class DownloadMessage extends Component { setDownload=()=>{ this.modalCancel(); - window.open(`/message/${this.props.user.login}/message_detail?target_ids=1`) + window.open(`/messages/${this.props.user.login}/message_detail?target_ids=1`) } modalCancel = () => { this.setState({ diff --git a/public/react/src/modules/modals/DownloadMessageysl.js b/public/react/src/modules/modals/DownloadMessageysl.js index db715297f..549a1478a 100644 --- a/public/react/src/modules/modals/DownloadMessageysl.js +++ b/public/react/src/modules/modals/DownloadMessageysl.js @@ -11,7 +11,7 @@ class DownloadMessageysl extends Component { setDownload=()=>{ this.props.modalCancel(); - window.open(`/message/${this.props.user.login}/message_detail?target_ids=1`) + window.open(`/messages/${this.props.user.login}/message_detail?target_ids=1`) } render() { diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 2ad696538..954bffcb7 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -297,8 +297,8 @@ class PackageIndexNEITaskDetails extends Component { onMouseOver={this.setover} onMouseOut={this.setout} > - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}
        }
        @@ -411,7 +411,7 @@ class PackageIndexNEITaskDetails extends Component { {item.status==="bidding_won"?:""}

        {item.name}

        - {this.props.current_user&&this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""}
        diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 910799be9..d725201ff 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -934,7 +934,7 @@ submittojoinclass=(value)=>{ From 882b4d38a889779ff3ce61bd990a50670cb71319 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 18:23:17 +0800 Subject: [PATCH 217/623] fix tiding --- app/models/tiding.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/models/tiding.rb b/app/models/tiding.rb index 90abdf809..d885f93fd 100644 --- a/app/models/tiding.rb +++ b/app/models/tiding.rb @@ -9,16 +9,15 @@ class Tiding < ApplicationRecord def identifier value = nil - if Object.const_defined?(container_type) - value = container.try(:identifier) - end - if value.blank? && parent_container_type && Object.const_defined?(parent_container_type) - value = parent_container_type.try(:identifier) + value = container.try(:identifier) rescue nil + + if value.blank? && parent_container_type + value = parent_container_type.try(:identifier) rescue nil end - if value.blank? && belong_container_type && Object.const_defined?(belong_container_type) - value = belong_container.try(:identifier) + if value.blank? && belong_container_type + value = belong_container.try(:identifier) rescue nil end value From 8d57899cbb1a4277397d3eea8c9dbe79be571c46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 18:43:21 +0800 Subject: [PATCH 218/623] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/NewHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index d725201ff..212b17036 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -934,7 +934,7 @@ submittojoinclass=(value)=>{
        { user===undefined?"":user.login===""?"": From eb5b1aa6f906ec3685f1ff87d0b8d2eb358eddc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 19:00:52 +0800 Subject: [PATCH 219/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/usersInfo/InfosPackage.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/InfosPackage.js b/public/react/src/modules/user/usersInfo/InfosPackage.js index 36175295b..0355e2d76 100644 --- a/public/react/src/modules/user/usersInfo/InfosPackage.js +++ b/public/react/src/modules/user/usersInfo/InfosPackage.js @@ -132,18 +132,19 @@ class InfosPackage extends Component{ delectproject=(id)=>{ - let {cate,status}=this.state; + let {category,status}=this.state; + debugger let url=`/project_packages/${id}.json` axios.delete(url).then((response) => { if (response.data.status == 0) { - this.getCourses(cate,status,1); + this.getCourses(category,status,1); } }) .catch(function (error) { console.log(error); }); - this.cancelProject; + this.cancelProject(); } render(){ let{ From f9fa3ebcc22b5351b81f07303eb30badf1f9763a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 19:01:02 +0800 Subject: [PATCH 220/623] Merge branches 'dev_Ysl' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagChat.js # public/react/src/modules/message/js/Messagerouting.js --- .../react/src/modules/message/js/MessagSub.js | 156 +++++++++--------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index c44685361..cb2d18105 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -116,94 +116,94 @@ class MessagSub extends Component{ if(item.tiding_type==="Apply"){ if(item.auth_type===1){ //系统管理页面 - return window.location.href="/managements/identity_authentication"; + return window.open("/managements/identity_authentication"); } if(item.auth_type===2){ //系统管理页面 - return window.location.href="/managements/professional_authentication"; + return window.open("/managements/professional_authentication") } } if(item.tiding_type ==="System"){ // 账号管理页-认证信息 - return window.location.href="/account/certification"; + return window.open("/account/certification") } case "CancelUserAuthentication" : // 账号管理页-认证信息 - return window.location.href="/account/certification"; + return window.open("/account/certification") case "CancelUserProCertification" : // 账号管理页-认证信息 - return window.location.href="/account/certification"; + return window.open("/account/certification") case "ApplyAddDepartment" : if(item.tiding_type==="Apply"){ //部门审批 - return window.location.href="/managements/depart"; + return window.open("/managements/depart") } if(item.tiding_type==="System"){ // 账号管理页/account/profile - return window.location.href="/account/profile"; + return window.open("/account/profile") } case "ApplyAddSchools" : if(item.tiding_type==="Apply"){ // 单位审批 - return window.location.href=" /managements/unit"; + return window.open(" /managements/unit") } if(item.tiding_type==="System"){ // 账号管理页 - return window.location.href="/account/profile"; + return window.open("/account/profile") } case "ApplyAction" : switch (item.parent_container_type) { case "ApplyShixun" : if(item.tiding_type==="Apply"){ - return window.location.href="/managements/shixun_authorization"; + return window.open("/managements/shixun_authorization") } if(item.tiding_type==="System"){ // 实训详情页 :identifier = identifier - return window.location.href=`/shixuns/${item.identifier}/challenges`; + return window.open(`/shixuns/${item.identifier}/challenges`) } case "ApplySubject" : if(item.tiding_type==="Apply"){ // 实训课程发布 - return window.location.href="/managements/subject_authorization"; + return window.open("/managements/subject_authorization") } if(item.tiding_type==="System"){ // 实践课程详情页 :identifier = identifier - return window.location.href=`/paths/${item.identifier}`; + return window.open(`/paths/${item.identifier}`) } case "TrialAuthorization" : if(item.tiding_type==="Apply"){ // 试用授权页面 - return window.location.href="/managements/trial_authorization"; + return window.open("/managements/trial_authorization") } if(item.tiding_type==="System"){ // 账号管理页 - return window.location.href="/account/profile"; + return window.open("/account/profile") } } case 'JoinCourse' : // 课堂详情页 :id = - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case 'StudentJoinCourse': // 课堂详情页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case 'DealCourse': // 课堂详情页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case 'TeacherJoinCourse': // 课堂详情页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case 'Course' : // 课堂详情页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case 'ArchiveCourse' : // 课堂详情页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}`) case "Shixun" : - return window.location.href=`/shixuns/${item.identifier}/challenges`; + return window.open(`/shixuns/${item.identifier}/challenges`) case "Subject" : // 实践课程详情页 :id = container_id - return window.location.href=`/paths/${item.identifier}`; + return window.open(`/paths/${item.identifier}`) case "JournalsForMessage" : switch (item.parent_container_type) { case "Principal" : @@ -214,219 +214,219 @@ class MessagSub extends Component{ //学生作业页 homework = parent_container_id if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } return ''; case "GraduationTopic" : // 毕业目标页 parent_container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + return window.open(`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`) case "StudentWorksScore" : //学生作业页 if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } } case "Memo" : // 交流问答页 :id = parent_container_id - return window.location.href="/forums/categories/all?order=newest"; + return window.open("/forums/categories/all?order=newest") case "Watcher" : // 用户个人中心页 :id = item.trigger_user.login - return window.location.href=`/users/${item.trigger_user.login}/courses`; + return window.open(`/users/${item.trigger_user.login}/courses`) case "PraiseTread" : // 这块太复杂 不好处理 return ''; case "Grade" : //个人中心页 :id = item.trigger_user.login - return window.location.href=`/users/${item.trigger_user.login}/courses`; + // return window.open(`/users/${item.trigger_user.login}/courses`; case "JoinProject" : //项目详情-申请加入项目审核页 :id = container_id - return window.location.href=`/projects/${item.container_id}`; + return window.open(`/projects/${item.container_id}`) case 'ReporterJoinProject': //项目详情页 :id = container_id - return window.location.href=`/projects/${item.container_id}`; + return window.open(`/projects/${item.container_id}`) case 'DealProject': //项目详情页 :id = container_id - return window.location.href=`/projects/${item.container_id}`; + return window.open(`/projects/${item.container_id}`) case 'ManagerJoinProject': //项目详情页 :id = container_id - return window.location.href=`/projects/${item.container_id}`; + return window.open(`/projects/${item.container_id}`) case "Poll": switch (item.parent_container_type) { case "CommitPoll" : // 课堂id belong_container_id //课堂-学生已提交问卷列表 :id = container_id - return window.location.href=` /courses/${item.belong_container_id}/polls/${item.container_id}`; + return window.open(` /courses/${item.belong_container_id}/polls/${item.container_id}`) default : // 课堂-问卷列表 :id = container_id - return window.location.href=` /courses/${item.belong_container_id}/polls/${item.container_id}`; + return window.open(` /courses/${item.belong_container_id}/polls/${item.container_id}`) } case "Exercise" : switch (item.parent_container_type) { case "CommitExercise": // 课堂-学生试卷详情 :id = container_id :user_id = trigger_user.id - return window.location.href=` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`; + return window.open(` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`) case "ExerciseScore": // 课堂-学生试卷详情 :id = container_id :user_id = trigger_user.id - return window.location.href=` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`; + return window.open(` /courses/${item.belong_container_id}/exercises/${item.container_id}/student_exercise_list?tab=0`) default : // 课堂-试卷列表详情 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/exercises/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/exercises/${item.container_id}`) } case 'StudentGraduationTopic' : //课堂-毕业选题详情 :id = parent_container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + return window.open(`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`) case 'DealStudentTopicSelect' : //课堂-毕业选题详情 :id = parent_container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`; + return window.open(`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`) case 'GraduationTask' : //课堂-毕业任务页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`) case "GraduationWork" : //课堂-毕业xx页 :id = container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`; + return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}`) case "GraduationWorkScore" : // 课堂-毕业xx页 :id = parent_container_id - return window.location.href=`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`; + return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`) case "HomeworkCommon" : switch (item.parent_container_type) { case "AnonymousCommentFail" : // 课堂-作业列表 homework = container_id if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "HomeworkPublish" : if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "AnonymousAppeal" : if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } default : // 课堂-作业列表 homework = container_id if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } } case "StudentWork" : //课堂-作业 :id = container_id if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "StudentWorksScore" : //课堂-作业 :id = parent_container_id if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "StudentWorksScoresAppeal" : if(item.homework_type===1){ //普通作业 - return window.location.href=`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`; + return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.location.href=`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`; + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.location.href=`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`; + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "ChallengeWorkScore" : return ''; case "SendMessage" : // /managements/mirror_repository - return window.location.href=`/managements/mirror_repository`; + return window.open(`/managements/mirror_repository`) case "Journal" : //项目Issue页 :id = parent_container_id - return window.location.href=`/projects/${item.parent_container_id}/issues?remote=true`; + return window.open(`/projects/${item.parent_container_id}/issues?remote=true`) case "Issue" : //项目Issue页 :id = container_id - return window.location.href=`/projects/${item.container_id}/issues?remote=true`; + return window.open(`/projects/${item.container_id}/issues?remote=true`) case "PullRequest" : // 项目pull request页 :id = parent_container_id - return window.location.href=`/projects/${item.parent_container_id}/pull_requests`; + return window.open(`/projects/${item.parent_container_id}/pull_requests`) case "Department" : //账号管理页 - return window.location.href=`/account/profile`; + return window.open(`/account/profile`) case "Library" : if (item.tiding_type === 'Apply') { // /managements/library_applies - return window.location.href=`/managements/library_applies`; + return window.open(`/managements/library_applies`) } if(item.tiding_type === 'System'){ //教学案例详情 :id = container_id - return window.location.href=`/moop_cases/${item.container_id}`; + return window.open(`/moop_cases/${item.container_id}`) } case "ProjectPackage" : if(item.tiding_type==="Destroyed_end"){ @@ -434,15 +434,15 @@ class MessagSub extends Component{ }else { // if (item.tiding_type === 'Apply') { // ///managements/project_package_applies - // return window.location.href=`/managements/project_package_applies`; + // return window.open(`/managements/project_package_applies`; // } // if(item.tiding_type === 'System'){ //众包详情 :id = container_id - return window.location.href=`/crowdsourcing/${item.container_id}`; + return window.open(`/crowdsourcing/${item.container_id}`) // } } default : - return window.location.href="/"; + return window.open("/") } } From 1fa5ba918a62494e3fc2d8c0508d211ce31e1757 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 19:03:59 +0800 Subject: [PATCH 221/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7e9fd652b..ee0abd903 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -129,16 +129,15 @@ module ApplicationHelper if File.exist?(disk_filename(source.class, source.id)) if source.class.to_s == 'User' File.join(relative_path, ["#{source.class}", "#{source.id}"]) - else - File.join("images/avatars", ["#{source.class}", "#{source.id}"]) + elseavatars", ["#{source.class}", "#{source.id}"]) end elsif source.class.to_s == 'User' str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g" File.join(relative_path, "#{source.class}", str) elsif source.class.to_s == 'Subject' - File.join("images","educoder", "index", "subject", "subject#{rand(17)}.jpg") + File.join("educoder", "index", "subject", "subject#{rand(17)}.jpg") elsif source.class.to_s == 'Shixun' - File.join("images","educoder", "index", "shixun", "shixun#{rand(23)}.jpg") + File.join("educoder","index", "shixun", "shixun#{rand(23)}.jpg") end end From 20e3985a23951af0984abfb37d53c5803cf5ab4c Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 19:05:15 +0800 Subject: [PATCH 222/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ee0abd903..5040acec0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -129,7 +129,8 @@ module ApplicationHelper if File.exist?(disk_filename(source.class, source.id)) if source.class.to_s == 'User' File.join(relative_path, ["#{source.class}", "#{source.id}"]) - elseavatars", ["#{source.class}", "#{source.id}"]) + else + File.join("avatars", ["#{source.class}", "#{source.id}"]) end elsif source.class.to_s == 'User' str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g" From 9b6836fc70534a46ea6eabdbe516b4cad8f21f05 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 19:08:30 +0800 Subject: [PATCH 223/623] delete --- public/react/src/modules/forums/PostPaginationHOC.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/forums/PostPaginationHOC.js b/public/react/src/modules/forums/PostPaginationHOC.js index 3922eae41..1f67c8d7d 100644 --- a/public/react/src/modules/forums/PostPaginationHOC.js +++ b/public/react/src/modules/forums/PostPaginationHOC.js @@ -267,7 +267,7 @@ return function wrap(WrappedComponent) { this.setTop(memo); } onMemoDelete(memo) { - const deleteUrl = `/api/v1/memos/${memo.id}`; + const deleteUrl = `/memos/${memo.id}.json`; // 获取memo list axios.delete(deleteUrl, { // withCredentials: true, From 981be28c668e626aa051729431d1ac328c9b5f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 19:11:31 +0800 Subject: [PATCH 224/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/coursesPublic/Addcourses.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/react/src/modules/courses/coursesPublic/Addcourses.js b/public/react/src/modules/courses/coursesPublic/Addcourses.js index 8225907b8..a9d30f2b6 100644 --- a/public/react/src/modules/courses/coursesPublic/Addcourses.js +++ b/public/react/src/modules/courses/coursesPublic/Addcourses.js @@ -75,6 +75,7 @@ class Addcourses extends Component{ if(e.target.checked===true){ this.setState({ assistant_professor:1, + professor:null, Checkboxteachingchecked:e.target.checked, Checkboxteachertype:true }) @@ -95,6 +96,7 @@ class Addcourses extends Component{ if(e.target.checked===true){ this.setState({ professor:1, + assistant_professor:null, Checkboxteacherchecked:e.target.checked, Checkboxteachingtype:true }) From d484af9a0d7dfa838404d34f8e74efcb6a7dd466 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 19:15:28 +0800 Subject: [PATCH 225/623] fix --- app/decorators/tiding_decorator.rb | 1 + app/models/apply_add_school.rb | 3 ++- db/migrate/20190802105008_tranfer_tiding_data.rb | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20190802105008_tranfer_tiding_data.rb diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index c7d914089..30a325cd3 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -30,6 +30,7 @@ module TidingDecorator end def strip_html(text, len = 0, suffix = "...") + text = text.to_s str = "" if !text.nil? && text.length > 0 str = text.gsub(/<\/?.*?>/, '').strip diff --git a/app/models/apply_add_school.rb b/app/models/apply_add_school.rb index bae65d24f..c303283ca 100644 --- a/app/models/apply_add_school.rb +++ b/app/models/apply_add_school.rb @@ -9,6 +9,7 @@ class ApplyAddSchool < ApplicationRecord private def send_notify - tidings.create!(user_id: 1, status: 0, trigger_user_id: user_id, belong_container: school, tiding_type: 'Apply') + Tiding.create!(user_id: 1, status: 0, container_id: id, container_type: 'ApplyAddSchools', + trigger_user_id: user_id, belong_container: school, tiding_type: 'Apply') end end \ No newline at end of file diff --git a/db/migrate/20190802105008_tranfer_tiding_data.rb b/db/migrate/20190802105008_tranfer_tiding_data.rb new file mode 100644 index 000000000..ef7682530 --- /dev/null +++ b/db/migrate/20190802105008_tranfer_tiding_data.rb @@ -0,0 +1,5 @@ +class TranferTidingData < ActiveRecord::Migration[5.2] + def change + Tiding.where(container_type: 'ApplyAddSchool').update_all(container_type: 'ApplyAddSchools') + end +end From db61139032f5c0e2dcd0619517276c3e92d9613d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 19:18:36 +0800 Subject: [PATCH 226/623] page --- public/react/src/modules/forums/PostPaginationHOC.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/forums/PostPaginationHOC.js b/public/react/src/modules/forums/PostPaginationHOC.js index 1f67c8d7d..cdba0a35a 100644 --- a/public/react/src/modules/forums/PostPaginationHOC.js +++ b/public/react/src/modules/forums/PostPaginationHOC.js @@ -136,7 +136,7 @@ return function wrap(WrappedComponent) { const params = { // replies_count最热 created_at 最新 // s_order: 'replies_count', - page: currentPage - 1, + page: currentPage, // forum: // forum_id // user_id From d54e4c58ebeca3a8d4647788b3f29e09244f2e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 19:34:56 +0800 Subject: [PATCH 227/623] Merge branches 'dev_Ysl' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagChat.js # public/react/src/modules/message/js/Messagerouting.js --- .../src/modules/message/css/messagemy.css | 4 ++ .../react/src/modules/message/js/MessagSub.js | 48 +++++++++++++------ 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/public/react/src/modules/message/css/messagemy.css b/public/react/src/modules/message/css/messagemy.css index 9f6736ec3..05d6c3511 100644 --- a/public/react/src/modules/message/css/messagemy.css +++ b/public/react/src/modules/message/css/messagemy.css @@ -20,6 +20,10 @@ .ant-modal-header{ border-radius: 0px !important; } +.ridinglist-subs{ + border-bottom: 1px solid #F5F5F5; + padding: 25px 0px; +} .search-new{ width: 100% !important; margin-bottom: 0px !important; diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index cb2d18105..de23f4764 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -167,9 +167,9 @@ class MessagSub extends Component{ return window.open("/managements/subject_authorization") } if(item.tiding_type==="System"){ - // 实践课程详情页 :identifier = identifier + // 实践课程详情页 :parent_container_id = parent_container_id - return window.open(`/paths/${item.identifier}`) + return window.open(`/paths/${item.parent_container_id}`) } case "TrialAuthorization" : if(item.tiding_type==="Apply"){ @@ -203,7 +203,7 @@ class MessagSub extends Component{ return window.open(`/shixuns/${item.identifier}/challenges`) case "Subject" : // 实践课程详情页 :id = container_id - return window.open(`/paths/${item.identifier}`) + return window.open(`/paths/${item.container_id}`) case "JournalsForMessage" : switch (item.parent_container_type) { case "Principal" : @@ -224,7 +224,6 @@ class MessagSub extends Component{ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } - return ''; case "GraduationTopic" : // 毕业目标页 parent_container_id return window.open(`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`) @@ -245,7 +244,7 @@ class MessagSub extends Component{ } case "Memo" : // 交流问答页 :id = parent_container_id - return window.open("/forums/categories/all?order=newest") + return window.open(`/forums/${item.parent_container_id}`) case "Watcher" : // 用户个人中心页 :id = item.trigger_user.login return window.open(`/users/${item.trigger_user.login}/courses`) @@ -255,6 +254,7 @@ class MessagSub extends Component{ case "Grade" : //个人中心页 :id = item.trigger_user.login // return window.open(`/users/${item.trigger_user.login}/courses`; + return ""; case "JoinProject" : //项目详情-申请加入项目审核页 :id = container_id return window.open(`/projects/${item.container_id}`) @@ -365,15 +365,15 @@ class MessagSub extends Component{ //课堂-作业 :id = container_id if(item.homework_type===1){ //普通作业 - return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.container_id}/list`) } if(item.homework_type===3){ //分组作业 - return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.container_id}/list`) } if(item.homework_type===4){ //实训作业 - return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) + return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}/list?tab=0`) } case "StudentWorksScore" : //课堂-作业 :id = parent_container_id @@ -432,10 +432,10 @@ class MessagSub extends Component{ if(item.tiding_type==="Destroyed_end"){ return ; }else { - // if (item.tiding_type === 'Apply') { - // ///managements/project_package_applies - // return window.open(`/managements/project_package_applies`; - // } + if (item.tiding_type === 'Apply') { + ///managements/project_package_applies + return window.open(`/managements/project_package_applies`) + } // if(item.tiding_type === 'System'){ //众包详情 :id = container_id return window.open(`/crowdsourcing/${item.container_id}`) @@ -485,10 +485,30 @@ class MessagSub extends Component{

        暂无数据哦~

        :data.map((item,key)=>{ - console.log(data) + // console.log(data) + // ridinglist-subs + var boolps=true; + if(item.container_type==="PraiseTread"||item.container_type==="Grade"||item.container_type==="ChallengeWorkScore"){ + boolps=false; + } + if(item.container_type==="JournalsForMessage"){ + if(item.parent_container_type==="Principal"){ + boolps=false; + } + } + // if(item.container_type==="HomeworkCommon"){ + // if(item.parent_container_type==="AnonymousAppeal"){ + // boolps=false; + // } + // } + if(item.container_type==="ProjectPackage"){ + if(item.tiding_type==="Destroyed_end"){ + boolps=false; + } + } return(
        -
        this.gettourl(item)}> +
        this.gettourl(item)}> this.myCome(item)} src={getImageUrl("images/"+item.trigger_user.image_url)} className="radius mr10 fl myimgw48 myimgh48"/>

        From 84cbf79f395239f876256695fad3b50225bf3275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 19:36:34 +0800 Subject: [PATCH 228/623] Merge branches 'dev_Ysl' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagChat.js # public/react/src/modules/message/js/Messagerouting.js --- public/react/src/modules/message/js/MessagSub.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index de23f4764..469d94914 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -214,7 +214,7 @@ class MessagSub extends Component{ //学生作业页 homework = parent_container_id if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -231,7 +231,7 @@ class MessagSub extends Component{ //学生作业页 if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -310,7 +310,7 @@ class MessagSub extends Component{ // 课堂-作业列表 homework = container_id if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -323,7 +323,7 @@ class MessagSub extends Component{ case "HomeworkPublish" : if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -336,7 +336,7 @@ class MessagSub extends Component{ case "AnonymousAppeal" : if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -350,7 +350,7 @@ class MessagSub extends Component{ // 课堂-作业列表 homework = container_id if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -379,7 +379,7 @@ class MessagSub extends Component{ //课堂-作业 :id = parent_container_id if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 @@ -392,7 +392,7 @@ class MessagSub extends Component{ case "StudentWorksScoresAppeal" : if(item.homework_type===1){ //普通作业 - return window.open(`t/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + return window.open(`courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } if(item.homework_type===3){ //分组作业 From d842784e29a34d032ed1b16f7623c7e669300adf Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 19:37:38 +0800 Subject: [PATCH 229/623] fix --- app/models/journals_for_message.rb | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb index 1da26fd22..d5697d87f 100644 --- a/app/models/journals_for_message.rb +++ b/app/models/journals_for_message.rb @@ -25,6 +25,8 @@ class JournalsForMessage < ApplicationRecord # "is_comprehensive_evaluation", # 1 教师评论、2 匿评、3 留言 # "hidden", 隐藏 + after_create :send_tiding + # course_identity 课堂用户身份 def contents_show course_identity @@ -47,4 +49,29 @@ class JournalsForMessage < ApplicationRecord JournalsForMessage.includes(:user).where(m_parent_id: self.id).page(page).per(limit).reorder("created_on asc") end + + def send_tiding + # 回复和@同一个人时:只发@的消息(因@的消息先创建) + case self.jour_type + # 用户留言当做私信处理 不发消息 + when "Principal" +=begin + user_id = self.m_parent_id.present? ? JournalsForMessage.find(self.m_parent_id).user_id : self.jour_id + if user_id != self.user_id && !self.tidings.where(:user_id => user_id, :trigger_user_id => self.user_id, :tiding_type => "Mentioned").first.present? + self.tidings << Tiding.new(:trigger_user_id => self.user_id, :user_id => user_id, :parent_container_id => self.jour_id, :parent_container_type => self.jour_type, :belong_container_id => self.jour_id, :belong_container_type => "User", :viewed => 0, :tiding_type => self.m_parent_id.present? ? "Comment" : "Journal") + end +=end + when "HomeworkCommon", "GraduationTopic" + user_id = self.m_parent_id.present? ? JournalsForMessage.find(self.m_parent_id).user_id : (self.jour_type == "HomeworkCommon" ? self.jour.user_id : self.jour.tea_id) + if user_id != self.user_id && !self.tidings.where(:user_id => user_id, :trigger_user_id => self.user_id, :tiding_type => "Mentioned").first.present? + self.tidings << Tiding.new(:trigger_user_id => self.user_id, :user_id => user_id, :parent_container_id => self.jour_id, :parent_container_type => self.jour_type, :belong_container_id => self.jour.course_id, :belong_container_type => "Course", :viewed => 0, :tiding_type => "Comment") + end + when "StudentWorksScore" + course_id = self.jour.try(:student_work).try(:homework_common).try(:course_id) + user_id = self.m_parent_id.present? ? JournalsForMessage.find(self.m_parent_id).user_id : self.jour.user_id + if user_id != self.user_id && !self.tidings.where(:user_id => user_id, :trigger_user_id => self.user_id, :tiding_type => "Mentioned").first.present? + self.tidings << Tiding.new(:trigger_user_id => self.user_id, :user_id => user_id, :parent_container_id => self.jour_id, :parent_container_type => self.jour_type, :belong_container_id => course_id, :belong_container_type => "Course", :viewed => 0, :tiding_type => "Comment") + end + end + end end From a5e0a0cfffa38d330f7e410fd1195e1bbe4e3d69 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 19:39:25 +0800 Subject: [PATCH 230/623] =?UTF-8?q?=E7=82=B9=E8=B5=9E=E8=B7=B3404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/discusses_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/discusses_controller.rb b/app/controllers/discusses_controller.rb index 6a270f619..4af27b919 100644 --- a/app/controllers/discusses_controller.rb +++ b/app/controllers/discusses_controller.rb @@ -1,7 +1,7 @@ class DiscussesController < ApplicationController LIMIT = 10 before_action :find_container, only: [:index, :hidden] - before_action :find_discuss, except: [:create, :index, :new_message, :reward_code, :forum_discusses] + before_action :find_discuss, except: [:create, :index, :new_message, :reward_code, :forum_discusses, :plus] def index page = params[:page].to_i From 81bd737bc7fd96056678f1d498ebc36660e1ab1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 19:41:37 +0800 Subject: [PATCH 231/623] b --- .../PackageIndexNEITaskDetails.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js index 1f7851303..ac498b4ee 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js +++ b/public/react/src/modules/projectPackages/PackageIndexNEITaskDetails/PackageIndexNEITaskDetails.js @@ -297,8 +297,8 @@ class PackageIndexNEITaskDetails extends Component { onMouseOver={this.setover} onMouseOut={this.setout} > - {overtype===false? 头像联系TA: - 头像 头像联系TA: + 头像联系TA}

        }
        @@ -411,7 +411,7 @@ class PackageIndexNEITaskDetails extends Component { {item.status==="bidding_won"?:""}

        {item.name}

        - {this.props.current_user&&this.props.current_user.login!=item.login? + {this.props.current_user&&this.props.current_user.login!=item.login? 头像联系TA :""}
        From a0902f907993b0a11afe9d1d0b78d921c81e6395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 19:44:26 +0800 Subject: [PATCH 232/623] Merge branches 'dev_Ysl' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_Ysl # Conflicts: # public/react/src/modules/message/js/MessagChat.js # public/react/src/modules/message/js/Messagerouting.js --- public/react/src/modules/message/js/MessagChat.js | 2 +- public/react/src/modules/message/js/MessagSub.js | 2 +- public/react/src/modules/message/js/MessagePrivate.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index ad966f7c9..76057f38a 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -656,7 +656,7 @@ class MessagChat extends Component{

        -

        +

        diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 469d94914..bbbb7caa3 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -532,7 +532,7 @@ class MessagSub extends Component{ ` } -

        +

        diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js index 4ff3a73cc..b41ba41a5 100644 --- a/public/react/src/modules/message/js/MessagePrivate.js +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -179,7 +179,7 @@ class MessagePrivate extends Component{ [{item.message_count}{"条"}] {moment(item.send_time).fromNow()}

        - +
        {item.unread === true ?:""} From 9de5f06a56bea273088840dac22bb70a558e1e8a Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 19:44:28 +0800 Subject: [PATCH 233/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/memos/_memo.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/memos/_memo.json.jbuilder b/app/views/memos/_memo.json.jbuilder index a33de2492..f0ac5cd3d 100644 --- a/app/views/memos/_memo.json.jbuilder +++ b/app/views/memos/_memo.json.jbuilder @@ -9,6 +9,6 @@ json.memo do json.tag memo.tag_repertoires.map(&:name) json.time memo.created_at json.replies_count memo.all_replies_count - json.user_praise memo.praise_treads.user_liker(@user.try(:id)).count > 1 ? true : false + json.user_praise memo.praise_treads.user_liker(@user.try(:id)).count > 0 ? true : false json.memo_praise_count memo.praise_treads.liker.count end From ae2c877639bee865f45dea3e9424fdd276a7b52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 19:46:35 +0800 Subject: [PATCH 234/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/new/CoursesNew.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/new/CoursesNew.js b/public/react/src/modules/courses/new/CoursesNew.js index f37f1a1db..fc4719013 100644 --- a/public/react/src/modules/courses/new/CoursesNew.js +++ b/public/react/src/modules/courses/new/CoursesNew.js @@ -203,7 +203,7 @@ class CoursesNew extends Component { // debugger if (response.data.status === 0) { // this.goback() - this.props.history.push(first_category_url); + window.location.href=first_category_url; } }).catch((error) => { console.log(error) @@ -247,7 +247,7 @@ class CoursesNew extends Component { ).then((response) => { if (response.status === 200) { // this.goback - this.props.history.push(response.data.first_category_url); + window.location.href=response.data.first_category_url; } }).catch((error) => { console.log(error) From ace93f1b948792234c24f5622442b16ec069ad2f Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Fri, 2 Aug 2019 19:49:54 +0800 Subject: [PATCH 235/623] =?UTF-8?q?Mp3mp4=E7=B1=BB=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E5=BC=80=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 2 +- app/views/games/picture_display.json.jbuilder | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 913013442..a0377e4e4 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -164,7 +164,7 @@ class ShixunsController < ApplicationController @new_shixun = Shixun.new @new_shixun.attributes = @shixun.attributes.dup.except("id","user_id","visits","gpid","status", "identifier", "averge_star", "homepage_show","repo_name", "myshixuns_count", "challenges_count", - "can_copy") + "can_copy", "created_at", "updated_at") @new_shixun.user_id = User.current.id @new_shixun.averge_star = 5 @new_shixun.identifier = generate_identifier Shixun, 8 diff --git a/app/views/games/picture_display.json.jbuilder b/app/views/games/picture_display.json.jbuilder index 838cfeda0..770f0d71b 100644 --- a/app/views/games/picture_display.json.jbuilder +++ b/app/views/games/picture_display.json.jbuilder @@ -39,15 +39,10 @@ elsif @type == "mp3" || @type == "mp4" json.file_url attachment_show_users_path(:file_name => file, :path => @original_path) end end - # json.user_file do - # json.array! @user_picture do |file| - # json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) - # end - # end - if @type == "mp4" - json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378172/456.mp4"}] - else - json.user_file [{"file_url": "http://120.27.231.56:48080/attachments/download/378175/654058514.mp3"}] + json.user_file do + json.array! @user_picture do |file| + json.file_url attachment_show_users_path(:file_name => file, :path => @user_path, :time => Time.now.to_i) + end end json.answer_file do json.array! @answer_picture do |file| From 6958276a63d1f441025d78c9f70cb6a82a7a955d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 19:51:25 +0800 Subject: [PATCH 236/623] images --- public/react/src/modules/forums/RecommendShixun.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/forums/RecommendShixun.js b/public/react/src/modules/forums/RecommendShixun.js index aa9dec952..af0ca0007 100644 --- a/public/react/src/modules/forums/RecommendShixun.js +++ b/public/react/src/modules/forums/RecommendShixun.js @@ -28,7 +28,7 @@ class RecommendShixun extends Component {
        - {`${_shixun.id}`} + {`${_shixun.id}`}
        From 6836318b209fdba4a67885a3de93fbd53a16ad9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 19:58:19 +0800 Subject: [PATCH 237/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/message/js/MessagSub.js | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index bbbb7caa3..07ab9e890 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -212,15 +212,15 @@ class MessagSub extends Component{ return ''; case "HomeworkCommon" : //学生作业页 homework = parent_container_id - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } @@ -229,15 +229,15 @@ class MessagSub extends Component{ return window.open(`/courses/${item.belong_container_id}/graduation_topics/${item.parent_container_id}/detail`) case "StudentWorksScore" : //学生作业页 - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } @@ -308,97 +308,97 @@ class MessagSub extends Component{ switch (item.parent_container_type) { case "AnonymousCommentFail" : // 课堂-作业列表 homework = container_id - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "HomeworkPublish" : - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "AnonymousAppeal" : - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } default : // 课堂-作业列表 homework = container_id - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } } case "StudentWork" : //课堂-作业 :id = container_id - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.container_id}/list?tab=0`) } case "StudentWorksScore" : //课堂-作业 :id = parent_container_id - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } case "StudentWorksScoresAppeal" : - if(item.homework_type===1){ + if(item.homework_type==="normal"){ //普通作业 return window.open(`courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===3){ + if(item.homework_type==="group"){ //分组作业 return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) } - if(item.homework_type===4){ + if(item.homework_type==="practice"){ //实训作业 return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) } From 925582c1f42cbb01ab7a14bb9f14093a907a657e Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 2 Aug 2019 20:02:30 +0800 Subject: [PATCH 238/623] evaluation_end --- public/react/src/modules/courses/busyWork/CommonWorkSetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js index 17a944d41..8baee4b45 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js @@ -722,7 +722,7 @@ class CommonWorkSetting extends Component{ late_time: late_time ? new Date(late_time) : late_time, // 补交截止时间 anonymous_comment: anonymous_comment, // true: 启用匿评 false:未启用匿评 evaluation_start: evaluation_start ? new Date(evaluation_start) : evaluation_start, //匿评开始时间 - evaluation_end: evaluation_end, + evaluation_end: evaluation_end ? new Date(evaluation_end) : evaluation_end, evaluation_num: evaluation_num, // 匿评数 absence_penalty: absence_penalty, // 匿评扣分 anonymous_appeal: anonymous_appeal, // true: 启用匿评申诉, false:未启用 From aeaf0a322fdb9e10a7c1649a08ba38650cae3c0b Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 20:06:09 +0800 Subject: [PATCH 239/623] =?UTF-8?q?=E5=A4=B4=E5=83=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/application_helper.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5040acec0..7e9fd652b 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -130,15 +130,15 @@ module ApplicationHelper if source.class.to_s == 'User' File.join(relative_path, ["#{source.class}", "#{source.id}"]) else - File.join("avatars", ["#{source.class}", "#{source.id}"]) + File.join("images/avatars", ["#{source.class}", "#{source.id}"]) end elsif source.class.to_s == 'User' str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g" File.join(relative_path, "#{source.class}", str) elsif source.class.to_s == 'Subject' - File.join("educoder", "index", "subject", "subject#{rand(17)}.jpg") + File.join("images","educoder", "index", "subject", "subject#{rand(17)}.jpg") elsif source.class.to_s == 'Shixun' - File.join("educoder","index", "shixun", "shixun#{rand(23)}.jpg") + File.join("images","educoder", "index", "shixun", "shixun#{rand(23)}.jpg") end end From 558135dc1fa7004104227307e35b02de8f6e13a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 20:06:20 +0800 Subject: [PATCH 240/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 07ab9e890..c072902e0 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -412,7 +412,7 @@ class MessagSub extends Component{ return window.open(`/projects/${item.parent_container_id}/issues?remote=true`) case "Issue" : //项目Issue页 :id = container_id - return window.open(`/projects/${item.container_id}/issues?remote=true`) + return window.open(`/issues/${item.container_id}`) case "PullRequest" : // 项目pull request页 :id = parent_container_id return window.open(`/projects/${item.parent_container_id}/pull_requests`) From 11d2976b2be32c54120002c26ebdbf72ecc071f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 20:15:02 +0800 Subject: [PATCH 241/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index c072902e0..55b0754d6 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -441,6 +441,8 @@ class MessagSub extends Component{ return window.open(`/crowdsourcing/${item.container_id}`) // } } + case "Discuss": + return window.open(`/shixuns/${item.identifier}/shixun_discuss`); default : return window.open("/") } From 93ea9a2ad8705381112322032e4d696045f04155 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 20:38:38 +0800 Subject: [PATCH 242/623] fix tiding --- app/decorators/tiding_decorator.rb | 4 ++-- config/locales/tidings/zh-CN.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 30a325cd3..2e800c4b4 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -106,9 +106,9 @@ module TidingDecorator if tiding_type == 'Apply' I18n.t(locale_format(tiding_type)) % name elsif status == 2 - I18n.t(locale_format(tiding_type, "#{status}_#{extra.nil?}"), reason: extra) % name + I18n.t(locale_format(tiding_type, "#{status}_#{extra.nil?}"), name: name, reason: extra) else - I18n.t(locale_format(tiding_type, status)) % name + I18n.t(locale_format(tiding_type, status), name: name, reason: extra) end end diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index 456f15887..8d7d1950f 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -38,8 +38,8 @@ Apply_end: "申请添加单位:%s" System: "1_end": "你提交的添加单位申请:%{name},审核已通过" - "2_reason_end": "你提交的添加单位申请:%{name},审核未通过
        原因:%{reason}" - "2_no_reason_end": "你提交的添加单位申请:%{name},审核未通过" + "2_false_end": "你提交的添加单位申请:%{name},审核未通过
        原因:%{reason}" + "2_true_end": "你提交的添加单位申请:%{name},审核未通过" "3_end": "你提交的添加单位申请:%{name},已被更改为:%{reason}" ApplyAction: ApplyShixun: From 6b02e495a8ce15c44905858b9b5b01b5c8319ba3 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 20:41:16 +0800 Subject: [PATCH 243/623] fix --- app/decorators/tiding_decorator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 2e800c4b4..77bbcf9e3 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -97,7 +97,7 @@ module TidingDecorator elsif status == 2 I18n.t(locale_format(tiding_type, "#{status}_#{extra.nil?}"), reason: extra) % [name, second_name] else - I18n.t(locale_format(tiding_type, status)) % [name, second_name] + I18n.t(locale_format(tiding_type, status), reason: extra) % [name, second_name] end end From e459f48ac9802af92795beba934f2b03aa2703c6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 20:45:01 +0800 Subject: [PATCH 244/623] fix --- app/models/apply_user_authentication.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/models/apply_user_authentication.rb b/app/models/apply_user_authentication.rb index c7fb5019e..d467eb850 100644 --- a/app/models/apply_user_authentication.rb +++ b/app/models/apply_user_authentication.rb @@ -3,8 +3,18 @@ class ApplyUserAuthentication < ApplicationRecord belongs_to :user + has_many :tidings, :as => :container, :dependent => :destroy + scope :real_name_auth, -> { where(auth_type: 1) } scope :professional_auth, -> { where(auth_type: 2) } scope :processing, -> { where(status: 0) } scope :passed, -> { where(status: 1) } + + after_create :send_tiding + + private + + def send_tiding + self.tidings << Tiding.new(:user_id => '1', :status=> 0, :trigger_user_id => user_id, :belong_container_id => 1, :belong_container_type =>'User', :tiding_type => "Apply") + end end From aec6029a00152dbc14c40534b1163f5756ba7b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 21:03:07 +0800 Subject: [PATCH 245/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/message/js/MessagSub.js | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 55b0754d6..69dcf0b36 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -377,31 +377,34 @@ class MessagSub extends Component{ } case "StudentWorksScore" : //课堂-作业 :id = parent_container_id - if(item.homework_type==="normal"){ - //普通作业 - return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) - } - if(item.homework_type==="group"){ - //分组作业 - return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) - } - if(item.homework_type==="practice"){ - //实训作业 - return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) - } + // if(item.homework_type==="normal"){ + // //普通作业 + // return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + // } + // if(item.homework_type==="group"){ + // //分组作业 + // return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) + // } + // if(item.homework_type==="practice"){ + // //实训作业 + // return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) + // } + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/${item.trigger_user.id}/appraise`); + case "StudentWorksScoresAppeal" : - if(item.homework_type==="normal"){ - //普通作业 - return window.open(`courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) - } - if(item.homework_type==="group"){ - //分组作业 - return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) - } - if(item.homework_type==="practice"){ - //实训作业 - return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) - } + // if(item.homework_type==="normal"){ + // //普通作业 + // return window.open(`courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/list`) + // } + // if(item.homework_type==="group"){ + // //分组作业 + // return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/list`) + // } + // if(item.homework_type==="practice"){ + // //实训作业 + // return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) + // } + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/${item.trigger_user.id}/appraise`); case "ChallengeWorkScore" : return ''; case "SendMessage" : From 1304c93f15b5e01e94581d89b73116675b4cbadc Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 2 Aug 2019 21:05:23 +0800 Subject: [PATCH 246/623] fix --- app/decorators/tiding_decorator.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 77bbcf9e3..d1f6f08e6 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -47,13 +47,13 @@ module TidingDecorator # ================ 各种类消息内容方法 ================ def apply_user_authentication_content - return if trigger_user_id.zero? + t_user = trigger_user || User.find(1) if tiding_type == 'Apply' str1, str2 = if container.auth_type == 1 - [trigger_user.show_real_name, trigger_user.ID_number] + [t_user.show_real_name, t_user.ID_number] elsif container.auth_type == 2 - ue = trigger_user.user_extension + ue = t_user.user_extension [[ue.school&.name, ue.department&.name].join('_'), ue.identity_text] end I18n.t(locale_format(tiding_type, container.auth_type)) % [str1, str2] From 77f9ec58da1a88a89f2bd08f58765ef2cc27e186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 21:08:28 +0800 Subject: [PATCH 247/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 69dcf0b36..e8b3b4d7e 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -389,7 +389,7 @@ class MessagSub extends Component{ // //实训作业 // return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) // } - return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/${item.trigger_user.id}/appraise`); + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.trigger_user.id}/${item.parent_container_id}/appraise`); case "StudentWorksScoresAppeal" : // if(item.homework_type==="normal"){ @@ -404,7 +404,7 @@ class MessagSub extends Component{ // //实训作业 // return window.open(`/courses/${item.belong_container_id}/shixun_homeworks/${item.parent_container_id}/list?tab=0`) // } - return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/${item.trigger_user.id}/appraise`); + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.trigger_user.id}/${item.parent_container_id}/appraise`); case "ChallengeWorkScore" : return ''; case "SendMessage" : From c263a62514c1b0d34a27a1c2a044c98f7c89ca3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 21:17:09 +0800 Subject: [PATCH 248/623] b --- .../src/modules/courses/busyWork/common/WorkDetailPageHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js b/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js index eef99bfcd..56460a44a 100644 --- a/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js +++ b/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js @@ -90,7 +90,7 @@ class WorkDetailPageHeader extends Component{ } `} Date: Fri, 2 Aug 2019 21:19:40 +0800 Subject: [PATCH 249/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index e8b3b4d7e..28eb3fb2d 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -467,7 +467,7 @@ class MessagSub extends Component{
      • this.getdata("project_package",1)}>众包提醒
      • -
      • this.getdata("interactive",1)}>互动提醒
      • +
      • this.getdata("interaction",1)}>互动提醒
      • this.getdata("apply",1)}>审核
      • From e7d3a06259e916eb6469fb2341b82915009e4c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 21:20:06 +0800 Subject: [PATCH 250/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 28eb3fb2d..ea280af75 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -467,7 +467,7 @@ class MessagSub extends Component{
      • this.getdata("project_package",1)}>众包提醒
      • -
      • this.getdata("interaction",1)}>互动提醒
      • +
      • this.getdata("interaction",1)}>互动提醒
      • this.getdata("apply",1)}>审核
      • From c7036f25525a0fd8e16ee139157a34c3ffa3c1e1 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 21:26:49 +0800 Subject: [PATCH 251/623] =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 5 +++- app/controllers/polls_controller.rb | 1 + app/jobs/commit_exercsie_notify_job_job.rb | 26 +++++++++++++++++++ app/jobs/commit_poll_notify_job_job.rb | 26 +++++++++++++++++++ app/models/student_graduation_topic.rb | 5 ++++ config/locales/tidings/zh-CN.yml | 10 +++---- .../commit_exercsie_notify_job_job_spec.rb | 5 ++++ spec/jobs/commit_poll_notify_job_job_spec.rb | 5 ++++ 8 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 app/jobs/commit_exercsie_notify_job_job.rb create mode 100644 app/jobs/commit_poll_notify_job_job.rb create mode 100644 spec/jobs/commit_exercsie_notify_job_job_spec.rb create mode 100644 spec/jobs/commit_poll_notify_job_job_spec.rb diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 6f121db5f..e92c3b266 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -703,12 +703,14 @@ class ExercisesController < ApplicationController end if ex_status == 1 #如果试卷存在已发布的,或者是已截止的,那么则直接跳过 g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数,那么试卷的统一设置需修改 + tiding_group_ids = g_course if g_course user_course_groups = @course.charge_group_ids(current_user) if g_course.map(&:to_i).sort == user_course_groups.sort # 如果是设置为全部班级,则试卷不用分组,且试卷设定为统一设置,否则则分组设置 exercise.exercise_group_settings.destroy_all ex_unified = true e_time = ex_end_time + tiding_group_ids = [] else ex_unified = false g_course.each do |i| @@ -748,7 +750,7 @@ class ExercisesController < ApplicationController if exercise.course_acts.size == 0 exercise.course_acts << CourseActivity.new(:user_id => exercise.user_id,:course_id => exercise.course_id) end - ExercisePublishNotifyJob.perform_later(exercise.id, g_course) + ExercisePublishNotifyJob.perform_later(exercise.id, tiding_group_ids) end end end @@ -1084,6 +1086,7 @@ class ExercisesController < ApplicationController :subjective_score => subjective_score } @answer_committed_user.update_attributes(commit_option) + CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) normal_status(0,"试卷提交成功!") end rescue Exception => e diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 7d978d722..ba3030424 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -919,6 +919,7 @@ class PollsController < ApplicationController :end_at => Time.now } poll_user_current.update_attributes(poll_user_params) + CommitPollNotifyJobJob.perform_later(@poll.id, current_user.id) normal_status(0, "问卷提交成功!") end ## 需添加发送消息的接口,稍后添加 diff --git a/app/jobs/commit_exercsie_notify_job_job.rb b/app/jobs/commit_exercsie_notify_job_job.rb new file mode 100644 index 000000000..1be0bb2bc --- /dev/null +++ b/app/jobs/commit_exercsie_notify_job_job.rb @@ -0,0 +1,26 @@ +class CommitExercsieNotifyJobJob < ApplicationJob + queue_as :notify + + def perform(exercise_id, user_id) + exercise = Exercise.find_by(id: exercise_id) + user = User.find_by(id: user_id) + return if [exercise, user].any?(&:blank?) + course = exercise.course + + attrs = %i[user_id trigger_user_id container_id container_type parent_container_id parent_container_type + belong_container_id belong_container_type tiding_type viewed status created_at updated_at] + + same_attrs = { + trigger_user_id: user.id, + container_id: exercise.id, container_type: 'Exercise', + parent_container_id: exercise.id, parent_container_type: 'CommitExercise', + belong_container_id: course.id, belong_container_type: 'Course', + tiding_type: 'Exercise', viewed: 0, status: 0 + } + Tiding.bulk_insert(*attrs) do |worker| + course.course_member(user).member_teachers.each do |teacher| + worker.add same_attrs.merge(user_id: teacher.user_id) + end + end + end +end diff --git a/app/jobs/commit_poll_notify_job_job.rb b/app/jobs/commit_poll_notify_job_job.rb new file mode 100644 index 000000000..6953fa9e9 --- /dev/null +++ b/app/jobs/commit_poll_notify_job_job.rb @@ -0,0 +1,26 @@ +class CommitPollNotifyJobJob < ApplicationJob + queue_as :notify + + def perform(poll_id, user_id) + poll = Poll.find_by(id: poll_id) + user = User.find_by(id: user_id) + return if [poll, user].any?(&:blank?) + course = poll.course + + attrs = %i[user_id trigger_user_id container_id container_type parent_container_id parent_container_type + belong_container_id belong_container_type tiding_type viewed status created_at updated_at] + + same_attrs = { + trigger_user_id: user.id, + container_id: poll.id, container_type: 'Poll', + parent_container_id: poll.id, parent_container_type: 'CommitPoll', + belong_container_id: course.id, belong_container_type: 'Course', + tiding_type: 'Poll', viewed: 0, status: 0 + } + Tiding.bulk_insert(*attrs) do |worker| + course.course_member(user).member_teachers.each do |teacher| + worker.add same_attrs.merge(user_id: teacher.user_id) + end + end + end +end diff --git a/app/models/student_graduation_topic.rb b/app/models/student_graduation_topic.rb index ea1774695..50f150f92 100644 --- a/app/models/student_graduation_topic.rb +++ b/app/models/student_graduation_topic.rb @@ -17,7 +17,12 @@ class StudentGraduationTopic < ApplicationRecord scope :is_refused, -> {where(status: 2)} scope :is_accepted, -> {where(status: 1)} scope :is_accepting, -> {where(status: 0)} + after_create :send_tiding + def send_tiding + self.tidings << Tiding.new(:user_id => self.graduation_topic.tea_id, :trigger_user_id => self.user_id, :parent_container_id => self.graduation_topic_id, :parent_container_type => "GraduationTopic", + :belong_container_id => self.graduation_topic.course_id, :belong_container_type => "Course", :viewed => 0, :status => 0, :tiding_type => "GraduationTopic") + end # 学生名称 def name diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index 456f15887..d6b44b26c 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -164,7 +164,7 @@ NearlyEnd_end: "试卷的截止时间快到啦:%s" CommitExercise_end: "提交了试卷答题:%s" ExerciseScore_end: "评阅了你的试卷:%s" - StudentGraduationTopic_end: "选择了毕设选题:%s" + StudentGraduationTopic_end: "申请选择毕设选题:%s" DealStudentTopicSelect: 1_end: "你提交的选题申请:%s,审核已通过" 2_end: "你提交的选题申请:%s,审核未通过" @@ -195,11 +195,11 @@ ChallengeWorkScore_end: "调整了你的作品分数:%s" StudentWorksScoresAppeal: UserAppealResult: - 1_end: "同意了你提交的匿评申诉申请:%s" - 2_end: "拒绝了你提交的匿评申诉:%s" + 1_end: "你提交的匿评申诉申请:%s,审核已通过" + 2_end: "你提交的匿评申诉:%s,审核未通过" AppealResult: - 1_end: "同意了他人对你的匿评申诉申请:%s" - 2_end: "拒绝了他人对你的匿评申诉:%s" + 1_end: "别人对你的匿评发起的申诉申请:%s,审核已通过" + 2_end: "别人对你的匿评发起的申诉申请:%s,审核未通过" StudentWork: Apply_end: "发起了匿评申诉申请:%s" HomeworkCommon_end: "有人对你的匿评发起了申诉:%s" diff --git a/spec/jobs/commit_exercsie_notify_job_job_spec.rb b/spec/jobs/commit_exercsie_notify_job_job_spec.rb new file mode 100644 index 000000000..17894c9ad --- /dev/null +++ b/spec/jobs/commit_exercsie_notify_job_job_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe CommitExercsieNotifyJobJob, type: :job do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/jobs/commit_poll_notify_job_job_spec.rb b/spec/jobs/commit_poll_notify_job_job_spec.rb new file mode 100644 index 000000000..da292f7fb --- /dev/null +++ b/spec/jobs/commit_poll_notify_job_job_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe CommitPollNotifyJobJob, type: :job do + pending "add some examples to (or delete) #{__FILE__}" +end From de9a841c6fd5162c8c66ef6da8e5c5081e420fbf Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 2 Aug 2019 21:31:07 +0800 Subject: [PATCH 252/623] =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/journals_for_message.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb index d5697d87f..4300ae9cc 100644 --- a/app/models/journals_for_message.rb +++ b/app/models/journals_for_message.rb @@ -11,6 +11,7 @@ class JournalsForMessage < ApplicationRecord scope :parent_comment, -> { where(m_parent_id: nil)} scope :search_by_jour_type, lambda{|type,ids| where(jour_type:type,jour_id: ids)} + has_many :tidings, as: :container, dependent: :destroy # "jour_type", # 留言所属类型 # "jour_id", # 留言所属类型的id From 8e20a561c30b8ce471f612aaadca58f6882606ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 2 Aug 2019 21:44:02 +0800 Subject: [PATCH 253/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/Leftdialogue.js | 2 +- public/react/src/modules/message/js/MessagChat.js | 4 ++-- public/react/src/modules/message/js/MessagSub.js | 6 +++--- public/react/src/modules/message/js/MessagePrivate.js | 4 ++-- public/react/src/modules/message/js/Rightdialogue.js | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/message/js/Leftdialogue.js b/public/react/src/modules/message/js/Leftdialogue.js index b16746c70..c809bc9c9 100644 --- a/public/react/src/modules/message/js/Leftdialogue.js +++ b/public/react/src/modules/message/js/Leftdialogue.js @@ -53,7 +53,7 @@ class Leftdialogue extends Component{ -
        +
        diff --git a/public/react/src/modules/message/js/MessagChat.js b/public/react/src/modules/message/js/MessagChat.js index 76057f38a..52c8d9870 100644 --- a/public/react/src/modules/message/js/MessagChat.js +++ b/public/react/src/modules/message/js/MessagChat.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import "../css/messagemy.css" -import {getImageUrl} from 'educoder'; +import {getImageUrl,markdownToHTML} from 'educoder'; import { Modal,Input,Icon,Tooltip,Spin} from 'antd'; import axios from 'axios'; import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor'; @@ -656,7 +656,7 @@ class MessagChat extends Component{

        -

        +

        diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index ea280af75..72a7e373e 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -4,7 +4,7 @@ import { Pagination, } from "antd"; import axios from 'axios'; -import {getImageUrl} from 'educoder'; +import {getImageUrl,markdownToHTML} from 'educoder'; import "../css/messagemy.css" //消息页面 class MessagSub extends Component{ @@ -471,7 +471,7 @@ class MessagSub extends Component{
      • this.getdata("apply",1)}>审核
      • -
      • this.getdata("system",1)}>通知
      • +
      • this.getdata("notice",1)}>通知
      • @@ -537,7 +537,7 @@ class MessagSub extends Component{ ` } -

        +

        diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js index b41ba41a5..036ae99aa 100644 --- a/public/react/src/modules/message/js/MessagePrivate.js +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -5,7 +5,7 @@ import { } from "antd"; import axios from 'axios'; import moment from 'moment'; -import {getImageUrl} from 'educoder'; +import {getImageUrl,markdownToHTML} from 'educoder'; import "../css/messagemy.css" import WriteaprivateletterModal from '../messagemodal/WriteaprivateletterModal'; //私信页面 @@ -179,7 +179,7 @@ class MessagePrivate extends Component{ [{item.message_count}{"条"}] {moment(item.send_time).fromNow()}

        - +
        {item.unread === true ?:""} diff --git a/public/react/src/modules/message/js/Rightdialogue.js b/public/react/src/modules/message/js/Rightdialogue.js index 04c5f966d..a414f5d52 100644 --- a/public/react/src/modules/message/js/Rightdialogue.js +++ b/public/react/src/modules/message/js/Rightdialogue.js @@ -53,7 +53,7 @@ class Rightdialogue extends Component{ -
        +
        this.mydelete(this.props.objeysl.sender.id,this.props.objeysl.id)} >删除 From 55b6c641593b02dd701f698416bcbe772377e75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 2 Aug 2019 21:46:17 +0800 Subject: [PATCH 254/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/boards/BoardsNew.js | 896 +++++----- .../src/modules/courses/boards/TopicDetail.js | 1452 ++++++++--------- .../courses/busyWork/CommonWorkDetailIndex.js | 2 +- .../modules/courses/exercise/ExerciseNew.js | 1140 ++++++------- .../graduation/topics/GraduateTopicDetail.js | 2 +- .../graduation/topics/GraduateTopicNew.js | 2 +- 6 files changed, 1747 insertions(+), 1747 deletions(-) diff --git a/public/react/src/modules/courses/boards/BoardsNew.js b/public/react/src/modules/courses/boards/BoardsNew.js index 56dddff7c..cea4f47aa 100644 --- a/public/react/src/modules/courses/boards/BoardsNew.js +++ b/public/react/src/modules/courses/boards/BoardsNew.js @@ -1,449 +1,449 @@ -import React,{ Component } from "react"; - -import { - Form, Input, InputNumber, Switch, Radio, - Slider, Button, Upload, Icon, Rate, Checkbox, message, - Row, Col, Select, Modal, Divider -} from 'antd'; -import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor'; -import axios from 'axios' -import './board.css' -import "../common/formCommon.css" -import AddDirModal from './AddDirModal' -import { RouteHOC } from './common.js' -import CBreadcrumb from '../common/CBreadcrumb' -import {getUploadActionUrl, bytesToSize, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll} from 'educoder'; - -const confirm = Modal.confirm; -const $ = window.$ -const { Option } = Select; -// https://lanhuapp.com/web/#/item/project/board/detail?pid=a3bcd4b1-99ce-4e43-8ead-5b8b0a410807&project_id=a3bcd4b1-99ce-4e43-8ead-5b8b0a410807&image_id=71072679-b925-4824-aceb-4649535e3652 -class BoardsNew extends Component{ - constructor(props){ - super(props); - - this.mdRef = React.createRef(); - - this.state = { - fileList: [], - boards: [], - title_num: 60 - } - } - addSuccess = () => { - this.fetchBoards() - } - fetchBoards = () => { - const isEdit = this.isEdit - const boardId = this.props.match.params.boardId - - const boardsUrl = `/courses/board_list.json?board_id=${boardId}` - axios.get(boardsUrl, { }) - .then((response) => { - if (response.data.status == 0) { - this.setState({ - boards: response.data.data.boards || [], - course_id: response.data.data.course_id - }) - if (!isEdit) { - response.data.data.boards.forEach( board => { - if (board.id == boardId) { - this.setState({ board_name: board.name }) - } - }) - // board_name - } - } - }) - .catch(function (error) { - console.log(error); - }); - } - componentDidMount = () => { - - const topicId = this.props.match.params.topicId - const isEdit = !!topicId - this.isEdit = isEdit - - const boardId = this.props.match.params.boardId - - this.fetchBoards() - - if (isEdit) { - const url = `/messages/${topicId}.json` - axios.get(url, { - }) - .then((response) => { - if (response.data.status == 0) { - const { id, data } = response.data; - if (data) { - this.editTopic = data; - this.props.form.setFieldsValue({ - sticky: !!data.sticky, - content: data.content, - subject: data.subject, - select_board_id: data.board_id // TODO 没返回给前端 - }); - this.mdRef.current.setValue(data.content) - const _fileList = data.attachments.map(item => { - return { - id: item.id, - uid: item.id, - name: appendFileSizeToUploadFile(item), - url: item.url, - status: 'done' - } - }) - - this.setState({ fileList: _fileList, board_name: data.board_name, title_num: 60 - parseInt(data.subject.length) }) - } - } - }) - .catch(function (error) { - console.log(error); - }); - } else { - const boardId = this.props.match.params.boardId - - this.props.form.setFieldsValue({ - select_board_id: parseInt(boardId) - }); - } - } - handleSubmit = (e) => { - e.preventDefault(); - const cid = this.state.course_id - const boardId = this.props.match.params.boardId - - this.props.form.validateFieldsAndScroll((err, values) => { - if (!err) { - console.log('Received values of form: ', values); - if (this.isEdit == true) { - const editTopic = this.editTopic - const editUrl = `/messages/${editTopic.id}.json` - - let attachment_ids = undefined - if (this.state.fileList) { - attachment_ids = this.state.fileList.map(item => { - return item.response ? item.response.id : item.id - }) - } - axios.put(editUrl, { - subject: values.subject, - select_board_id: values.select_board_id, - content: values.content, - sticky: values.sticky, - attachment_ids, - }) - .then((response) => { - if (response.data.status == 0) { - const { id } = response.data; - console.log('--- success') - - this.props.toDetailPage(cid, values.select_board_id, editTopic.id) - } - }) - .catch(function (error) { - console.log(error); - }); - } else { - const url = `/boards/${boardId}/messages.json` - let attachment_ids = undefined - if (this.state.fileList) { - attachment_ids = this.state.fileList.map(item => { - return item.response.id - }) - } - - axios.post(url, { - ...values, - course_id: cid, - attachment_ids, - }) - .then((response) => { - if (response.data.data && response.data.status == 0) { - const { id } = response.data.data; - if (id) { - console.log('--- success') - this.props.toDetailPage(cid, values.select_board_id, id) - } - } - }) - .catch(function (error) { - console.log(error); - }); - } - } else { - $("html").animate({ scrollTop: $('html').scrollTop() - 100 }) - } - }); - } - // 附件相关 START - handleChange = (info) => { - let fileList = info.fileList; - this.setState({ fileList: appendFileSizeToUploadFileAll(fileList) - }); - } - onAttachmentRemove = (file) => { - confirm({ - // title: '确定要删除这个附件吗?', - title: '是否确认删除?', - - okText: '确定', - cancelText: '取消', - // content: 'Some descriptions', - onOk: () => { - this.deleteAttachment(file) - }, - onCancel() { - console.log('Cancel'); - }, - }); - - - return false; - } - deleteAttachment = (file) => { - // 初次上传不能直接取uid - const url = `/attachments/${file.response ? file.response.id : file.uid}.json` - axios.delete(url, { - }) - .then((response) => { - if (response.data) { - const { status } = response.data; - if (status == 0) { - console.log('--- success') - - this.setState((state) => { - const index = state.fileList.indexOf(file); - const newFileList = state.fileList.slice(); - newFileList.splice(index, 1); - return { - fileList: newFileList, - }; - }); - } - } - }) - .catch(function (error) { - console.log(error); - }); - } - // 附件相关 ------------ END - changeTitle=(e)=>{ - console.log(e.target.value.length); - this.setState({ - title_num: 60 - parseInt(e.target.value.length) - }) - } - render() { - let { addGroup, fileList, course_id, title_num } = this.state; - const { getFieldDecorator } = this.props.form; - const { current_user } = this.props - - const formItemLayout = { - labelCol: { - xs: { span: 24 }, - // sm: { span: 8 }, - sm: { span: 24 }, - }, - wrapperCol: { - xs: { span: 24 }, - // sm: { span: 16 }, - sm: { span: 24 }, - }, - }; - - const uploadProps = { - width: 600, - fileList, - multiple: true, - // https://github.com/ant-design/ant-design/issues/15505 - // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 - // showUploadList: false, - action: `${getUploadActionUrl()}`, - onChange: this.handleChange, - onRemove: this.onAttachmentRemove, - beforeUpload: (file) => { - console.log('beforeUpload', file.name); - const isLt150M = file.size / 1024 / 1024 < 150; - if (!isLt150M) { - message.error('文件大小必须小于150MB!'); - } - return isLt150M; - }, - }; - const isAdmin = this.props.isAdmin() - const courseId=this.props.match.params.coursesId; - const boardId = this.props.match.params.boardId - - return( -
        - - -
        - - -

        - {this.isEdit ? "编辑" : "新建"}帖子 - this.props.history.goBack()}> - 返回 - -

        - {/* notRequired */} -
        -
        - { isAdmin && - - {getFieldDecorator('sticky', { - valuePropName: 'checked', - })( - isAdmin && 置顶 - )} - {/* checkbox 有个边距样式 .ant-checkbox-wrapper + span, */} - - - } - - - {getFieldDecorator('subject', { - rules: [{ - required: true, message: '请输入标题', - }, { - max: 60, message: '最大限制为60个字符', - }], - })( - - )} - - - - {getFieldDecorator('select_board_id', { - // initialValue: '3779', - })( - - )} - - - {/* { isAdmin && - {getFieldDecorator('sticky', { - })( - 置顶 - )} - } */} -
        - - - -
        - - - {getFieldDecorator('content', { - rules: [{ - required: true, message: '请输入帖子内容', - }, { - max: 10000, message: '最大限制为10000个字符', - }], - })( - - )} - - - - - (单个文件150M以内) - -
        - - - - - -
        -
        - ) - } -} - -const WrappedBoardsNew = Form.create({ name: 'boardsNew' })(BoardsNew); +import React,{ Component } from "react"; + +import { + Form, Input, InputNumber, Switch, Radio, + Slider, Button, Upload, Icon, Rate, Checkbox, message, + Row, Col, Select, Modal, Divider +} from 'antd'; +import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor'; +import axios from 'axios' +import './board.css' +import "../common/formCommon.css" +import AddDirModal from './AddDirModal' +import { RouteHOC } from './common.js' +import CBreadcrumb from '../common/CBreadcrumb' +import {getUploadActionUrl, bytesToSize, uploadNameSizeSeperator, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll} from 'educoder'; + +const confirm = Modal.confirm; +const $ = window.$ +const { Option } = Select; +// https://lanhuapp.com/web/#/item/project/board/detail?pid=a3bcd4b1-99ce-4e43-8ead-5b8b0a410807&project_id=a3bcd4b1-99ce-4e43-8ead-5b8b0a410807&image_id=71072679-b925-4824-aceb-4649535e3652 +class BoardsNew extends Component{ + constructor(props){ + super(props); + + this.mdRef = React.createRef(); + + this.state = { + fileList: [], + boards: [], + title_num: 60 + } + } + addSuccess = () => { + this.fetchBoards() + } + fetchBoards = () => { + const isEdit = this.isEdit + const boardId = this.props.match.params.boardId + + const boardsUrl = `/courses/board_list.json?board_id=${boardId}` + axios.get(boardsUrl, { }) + .then((response) => { + if (response.data.status == 0) { + this.setState({ + boards: response.data.data.boards || [], + course_id: response.data.data.course_id + }) + if (!isEdit) { + response.data.data.boards.forEach( board => { + if (board.id == boardId) { + this.setState({ board_name: board.name }) + } + }) + // board_name + } + } + }) + .catch(function (error) { + console.log(error); + }); + } + componentDidMount = () => { + + const topicId = this.props.match.params.topicId + const isEdit = !!topicId + this.isEdit = isEdit + + const boardId = this.props.match.params.boardId + + this.fetchBoards() + + if (isEdit) { + const url = `/messages/${topicId}.json` + axios.get(url, { + }) + .then((response) => { + if (response.data.status == 0) { + const { id, data } = response.data; + if (data) { + this.editTopic = data; + this.props.form.setFieldsValue({ + sticky: !!data.sticky, + content: data.content, + subject: data.subject, + select_board_id: data.board_id // TODO 没返回给前端 + }); + this.mdRef.current.setValue(data.content) + const _fileList = data.attachments.map(item => { + return { + id: item.id, + uid: item.id, + name: appendFileSizeToUploadFile(item), + url: item.url, + status: 'done' + } + }) + + this.setState({ fileList: _fileList, board_name: data.board_name, title_num: 60 - parseInt(data.subject.length) }) + } + } + }) + .catch(function (error) { + console.log(error); + }); + } else { + const boardId = this.props.match.params.boardId + + this.props.form.setFieldsValue({ + select_board_id: parseInt(boardId) + }); + } + } + handleSubmit = (e) => { + e.preventDefault(); + const cid = this.state.course_id + const boardId = this.props.match.params.boardId + + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + console.log('Received values of form: ', values); + if (this.isEdit == true) { + const editTopic = this.editTopic + const editUrl = `/messages/${editTopic.id}.json` + + let attachment_ids = undefined + if (this.state.fileList) { + attachment_ids = this.state.fileList.map(item => { + return item.response ? item.response.id : item.id + }) + } + axios.put(editUrl, { + subject: values.subject, + select_board_id: values.select_board_id, + content: values.content, + sticky: values.sticky, + attachment_ids, + }) + .then((response) => { + if (response.data.status == 0) { + const { id } = response.data; + console.log('--- success') + + this.props.toDetailPage(cid, values.select_board_id, editTopic.id) + } + }) + .catch(function (error) { + console.log(error); + }); + } else { + const url = `/boards/${boardId}/messages.json` + let attachment_ids = undefined + if (this.state.fileList) { + attachment_ids = this.state.fileList.map(item => { + return item.response.id + }) + } + + axios.post(url, { + ...values, + course_id: cid, + attachment_ids, + }) + .then((response) => { + if (response.data.data && response.data.status == 0) { + const { id } = response.data.data; + if (id) { + console.log('--- success') + this.props.toDetailPage(cid, values.select_board_id, id) + } + } + }) + .catch(function (error) { + console.log(error); + }); + } + } else { + $("html").animate({ scrollTop: $('html').scrollTop() - 100 }) + } + }); + } + // 附件相关 START + handleChange = (info) => { + let fileList = info.fileList; + this.setState({ fileList: appendFileSizeToUploadFileAll(fileList) + }); + } + onAttachmentRemove = (file) => { + confirm({ + // title: '确定要删除这个附件吗?', + title: '是否确认删除?', + + okText: '确定', + cancelText: '取消', + // content: 'Some descriptions', + onOk: () => { + this.deleteAttachment(file) + }, + onCancel() { + console.log('Cancel'); + }, + }); + + + return false; + } + deleteAttachment = (file) => { + // 初次上传不能直接取uid + const url = `/attachments/${file.response ? file.response.id : file.uid}.json` + axios.delete(url, { + }) + .then((response) => { + if (response.data) { + const { status } = response.data; + if (status == 0) { + console.log('--- success') + + this.setState((state) => { + const index = state.fileList.indexOf(file); + const newFileList = state.fileList.slice(); + newFileList.splice(index, 1); + return { + fileList: newFileList, + }; + }); + } + } + }) + .catch(function (error) { + console.log(error); + }); + } + // 附件相关 ------------ END + changeTitle=(e)=>{ + console.log(e.target.value.length); + this.setState({ + title_num: 60 - parseInt(e.target.value.length) + }) + } + render() { + let { addGroup, fileList, course_id, title_num } = this.state; + const { getFieldDecorator } = this.props.form; + const { current_user } = this.props + + const formItemLayout = { + labelCol: { + xs: { span: 24 }, + // sm: { span: 8 }, + sm: { span: 24 }, + }, + wrapperCol: { + xs: { span: 24 }, + // sm: { span: 16 }, + sm: { span: 24 }, + }, + }; + + const uploadProps = { + width: 600, + fileList, + multiple: true, + // https://github.com/ant-design/ant-design/issues/15505 + // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 + // showUploadList: false, + action: `${getUploadActionUrl()}`, + onChange: this.handleChange, + onRemove: this.onAttachmentRemove, + beforeUpload: (file) => { + console.log('beforeUpload', file.name); + const isLt150M = file.size / 1024 / 1024 < 150; + if (!isLt150M) { + message.error('文件大小必须小于150MB!'); + } + return isLt150M; + }, + }; + const isAdmin = this.props.isAdmin() + const courseId=this.props.match.params.coursesId; + const boardId = this.props.match.params.boardId + + return( +
        + + +
        + + +

        + {this.isEdit ? "编辑" : "新建"}帖子 + this.props.history.goBack()}> + 返回 + +

        + {/* notRequired */} +
        +
        + { isAdmin && + + {getFieldDecorator('sticky', { + valuePropName: 'checked', + })( + isAdmin && 置顶 + )} + {/* checkbox 有个边距样式 .ant-checkbox-wrapper + span, */} + + + } + + + {getFieldDecorator('subject', { + rules: [{ + required: true, message: '请输入标题', + }, { + max: 60, message: '最大限制为60个字符', + }], + })( + + )} + + + + {getFieldDecorator('select_board_id', { + // initialValue: '3779', + })( + + )} + + + {/* { isAdmin && + {getFieldDecorator('sticky', { + })( + 置顶 + )} + } */} +
        + + + +
        + + + {getFieldDecorator('content', { + rules: [{ + required: true, message: '请输入帖子内容', + }, { + max: 10000, message: '最大限制为10000个字符', + }], + })( + + )} + + + + + (单个文件150M以内) + +
        + + + + + +
        +
        + ) + } +} + +const WrappedBoardsNew = Form.create({ name: 'boardsNew' })(BoardsNew); export default RouteHOC()(WrappedBoardsNew); \ No newline at end of file diff --git a/public/react/src/modules/courses/boards/TopicDetail.js b/public/react/src/modules/courses/boards/TopicDetail.js index 7aaecdd16..970cf798a 100644 --- a/public/react/src/modules/courses/boards/TopicDetail.js +++ b/public/react/src/modules/courses/boards/TopicDetail.js @@ -1,726 +1,726 @@ -import React, { Component } from 'react'; -import { Redirect } from 'react-router'; - -import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; - -import PropTypes from 'prop-types'; - -import classNames from 'classnames' - -import axios from 'axios' - -import moment from 'moment' - -import Comments from '../../comment/Comments' - -import update from 'immutability-helper' -import RewardDialog from '../../common/RewardDialog'; -import {ImageLayerOfCommentHOC} from '../../page/layers/ImageLayerOfCommentHOC' - -import MemoDetailMDEditor from '../../forums/MemoDetailMDEditor' -import { RouteHOC } from './common.js' -import '../../forums/Post.css' -import '../../forums/RightSection.css' -import './TopicDetail.css' -import '../common/courseMessage.css' -import { Pagination, Tooltip } from 'antd' -import { bytesToSize, ConditionToolTip, markdownToHTML, MarkdownToHtml } from 'educoder' -import SendToCourseModal from '../coursesPublic/modal/SendToCourseModal' -import CBreadcrumb from '../common/CBreadcrumb' -import { generateComments, generateChildComments, _findById, handleContentBeforeCreateNew, addNewComment - , addSecondLevelComment, NEED_TO_WRITE_CONTENT, handleContentBeforeCreateSecondLevelComment - , handleDeleteComment, handleCommentPraise, handleHiddenComment } from '../common/CommentsHelper' - -const $ = window.$ -const REPLY_PAGE_COUNT = 10 -function urlStringify(params) { - let noParams = true; - let paramsUrl = ''; - for (let key in params) { - noParams = false; - paramsUrl += `${key}=${params[key]}&` - } - if (noParams) { - return ''; - } - paramsUrl = paramsUrl.substring(0, paramsUrl.length - 1); - return paramsUrl; -} -class TopicDetail extends Component { - constructor(props) { - super(props) - - this.state = { - memo: {}, - memoLoading: true, - hasMoreComments: false, - pageCount: 1, - comments: [], - goldRewardDialogOpen: false, - } - } - componentDidMount() { - window.$("html,body").animate({"scrollTop":0}) - - const topicId = this.props.match.params.topicId - const bid = this.props.match.params.boardId - - const memoUrl = `/messages/${topicId}.json`; - this.setState({ - memoLoading: true - }) - axios.get(memoUrl,{ - }) - .then((response) => { - - if (response.data.status === -1) { - setTimeout(() => { - this.props.showNotification('帖子不存在!') - }, 300) - // this.props.toListPage(response.data.data.course_id, bid) - return; - } else { - - this.setState({ - memo: Object.assign({}, { - ...response.data.data, - replies_count: response.data.data.total_replies_count - }, {...this.state.memo}) - }, () => { - }) - - // const { memo_replies, memo } = response.data; - // let hasMoreComments = false; - // if (memo_replies && memo_replies.length === 10 && memo.total_replies_count > 10) { - // // 遍历一遍,计算下是否还有评论未加载 - // let totalCount = 10; - // memo_replies.forEach(item=>{ - // totalCount += item.children.length - // }) - // if (totalCount < memo.total_replies_count) { - // hasMoreComments = true; - // } - // } - // this.setState({ - // hasMoreComments, - // pageCount: 1, - // comments: memo_replies - // }) - // delete response.data.memo_replies; - // this.setState(response.data) - // const user = response.data.current_user; - // user.tidding_count = response.data.tidding_count; - // this.props.initCommonState(user) - } - this.setState({ - memoLoading: false - }) - - }).catch((error) => { - console.log(error) - }) - - this.fetchReplies() - - $('body>#root').on('onMemoDelete', (event) => { - // const val = $('body>#root').data('onMemoDelete') - const val = window.onMemoDelete ; - this.onMemoDelete( JSON.parse(decodeURIComponent(val)) ) - }) - - - } - - onPaginationChange = (pageCount) => { - this.setState({ pageCount }, () => { - this.fetchReplies() - }) - } - - componentWillUnmount() { - $('body>#root').off('onMemoDelete') - } - onMemoDelete(memo) { - const deleteUrl = `/commons/delete.json`; - // 获取memo list - axios.delete(deleteUrl, { data: { - object_id: memo.id, - object_type: 'message' - } - }) - .then((response) => { - const status = response.data.status - if (status === 0) { - - this.props.showNotification('删除成功'); - const props = Object.assign({}, this.props, {}) - this.props.toListPage( Object.assign({}, this.props.match.params, {'coursesId': this.state.memo.course_id} ) ) - - } else if (status === -1) { - this.props.showNotification('帖子已被删除'); - this.props.history.push(`/forums`) - } - }).catch((error) => { - console.log(error) - }) - } - - componentDidUpdate(prevProps, prevState, snapshot) { - // if (this.state.memo && this.state.memo.content - // && (!prevProps.memo || prevProps.memo.content != this.state.memo.content) ) { - if (this.state.memo && this.state.memo.content && prevState.memoLoading === true && this.state.memoLoading === false) { - // md渲染content,等xhr执行完(即memoLoading变化),memo.content更新后初始化md - - setTimeout(()=>{ - // var shixunDescr = window.editormd.markdownToHTML("memo_content_editorMd", { - // htmlDecode: "style,script,iframe", // you can filter tags decode - // taskList: true, - // tex: true, // 默认不解析 - // flowChart: true, // 默认不解析 - // sequenceDiagram: true // 默认不解析 - // }); - }, 200) - } - - } - - clickPraise(){ - const { memo } = this.state; - // const url = `/api/v1/discusses/${memo.id}/plus`; - const url = memo.user_praise ? '/praise_tread/unlike.json' : `/praise_tread/like.json`; - const _method = memo.user_praise ? axios.delete : axios.post - let _data = { - object_id: memo.id, - object_type: 'message', //Discuss - } - if (memo.user_praise) { - _data = { - data: _data - } - } - _method(url, { - ..._data - }, - { - - } - ).then((response) => { - - const newMemo = Object.assign({}, this.state.memo) - newMemo.praises_count = newMemo.user_praise ? newMemo.praises_count - 1 : newMemo.praises_count + 1 - newMemo.total_praises_count = newMemo.user_praise ? newMemo.total_praises_count - 1 : newMemo.total_praises_count + 1 - newMemo.user_praise = !newMemo.user_praise - this.setState({memo : newMemo }) - }).catch((error) => { - console.log(error) - }) - } - renderAttachment() { - const { memo } = this.state; - const attachments = [] - memo.attachments.forEach((item, index) => { - const ar = item.url.split('/') - const fileName = item.title || ar[ar.length - 1] - let filesize = 0 - if (item.filesize) { - filesize = item.filesize - // filesize = bytesToSize(item.filesize) - } - attachments.push( - //

        - // - // - // {fileName && 30 }> - // {fileName} - // } - // {filesize? ` ${filesize.replace(' ', '')}` : ''} - // - //

        - - - ) - }) - return attachments; - } - // ------------------------------------------------------------------------------------------- comments START - // ------------------------------------------------------------------------------------------- comments START - transformReply = (reply, children = []) => { - const isAdmin = this.props.isAdmin() - const isSuperAdmin = this.props.isSuperAdmin() - return { - isSuperAdmin: isSuperAdmin, - admin: isAdmin, // - permission: true, // - children: children, - child_message_count: reply.total_count, - hidden: reply.is_hidden, - id: reply.id, - image_url: reply.author.image_url, - reward: null, // - time: moment(reply.created_on).fromNow(), - user_id: reply.author.id, - user_login: reply.author.login, - user_praise: reply.liked, - username: reply.author.name, - content: reply.content, - praise_count: reply.praises_count - } - } - - fetchReplies = () => { - const topicId = this.props.match.params.topicId - const url = `/messages/${topicId}/reply_list.json?page=${this.state.pageCount}&page_size=${REPLY_PAGE_COUNT}` - axios.get(url,{ - }) - .then((response) => { - const { replies, liked, total_replies_count, total_count } = response.data.data - - const memo = Object.assign({}, this.state.memo) - memo.user_praise = liked - memo.total_replies_count = total_replies_count; - this.setState({ - memo, - comments: generateComments(replies, this.transformReply, 'replies'), - // : this.state.comments.concat(comments), - total_count: total_count - }) - }).catch((error) => { - console.log(error) - }) - } - - _getUser() { - const { current_user } = this.props; - current_user.user_url = `/users/${current_user.login}`; - return current_user; - } - _findById = _findById - replyComment = (commentContent, id, editor) => { - const { showNotification } = this.props; - // if (!commentContent || commentContent.length === 0) { - // showNotification(NEED_TO_WRITE_CONTENT) - // return; - // } - - if (this.state.memo.id === id ) { // 回复帖子 - this.createNewComment(commentContent, id, editor); - return; - } - const url = `/messages/${id}/reply.json`; - - const { comments } = this.state; - const user = this._getUser(); - /* - 移除末尾的空行 - .replace(/(\n

        \n\t
        \n<\/p>)*$/g,''); - - */ - - commentContent = handleContentBeforeCreateSecondLevelComment(commentContent) - if (!commentContent) { - this.props.showNotification('不能为空') - return; - } - axios.post(url, { - content: commentContent - }, - { - } - ).then((response) => { - if (response.data.data.id) { - let newId = response.data.data.id; - const commentIndex = this._findById(id, comments); - const parentComment = comments[commentIndex] - - this.setState({ - // runTesting: false, - comments: addSecondLevelComment(comments, parentComment, commentIndex, newId, commentContent, user, editor) - }, ()=>{ - // keditor代码美化 - editor.html && window.prettyPrint() - }) - - const newMemo2 = Object.assign({}, this.state.memo); - newMemo2.total_replies_count = newMemo2.total_replies_count + 1; - this.setState({ - memo: newMemo2 - }) - } - - }).catch((error) => { - console.log(error) - }) - } - // 公共接口 --- 删除回复 - deleteComment = (parrentComment, childCommentId) => { - handleDeleteComment(this, parrentComment, childCommentId, 'message') - - } - // 公共接口 --- 回复点赞 - commentPraise = (discussId) => { - handleCommentPraise(this, discussId, 'message', (old_user_praise) => { - const newMemo2 = Object.assign({}, this.state.memo); - - newMemo2.total_praises_count = old_user_praise - ? newMemo2.total_praises_count - 1 : newMemo2.total_praises_count + 1; - this.setState({ - memo: newMemo2 - }) - }) - } - // 公共接口 --- 隐藏回复 - hiddenComment = (item, childCommentId) => { - handleHiddenComment(this, item, childCommentId, 'message') - } - createNewComment = (commentContent, id, editor) => { - let content = handleContentBeforeCreateNew(commentContent); - const { memo } = this.props; - - const url = `/messages/${id}/reply.json`; - - // const url = `/api/v1/memos/${memo.id}/reply`; - let { comments } = this.state; - axios.post(url, { - content: content - }, - { - } - ).then((response) => { - if (response.data.status === -1) { - console.error('服务端异常') - return; - } - // this.props.showNotification('帖子发表成功') - - if (response.data) { - const _id = response.data.data.id; - // ke - editor.html && editor.html(''); - editor.afterBlur && editor.afterBlur() - // md - editor.setValue && editor.setValue('') - - - const user = this._getUser(); - this.setState({ - comments: addNewComment(comments, _id, content, user, this.props.isSuperAdmin(), this) - }) - const newMemo2 = Object.assign({}, this.state.memo); - newMemo2.total_replies_count = newMemo2.total_replies_count + 1; - this.setState({ - memo: newMemo2 - }) - this.refs.editor.showEditor(); - this.refs.editor.close(); - - - } - }).catch((error) => { - console.log(error) - }) - } - - /** - * parent.isAllChildrenLoaded 为 true的时候,表示已经没有更多子回复了 - */ - loadMoreChildComments = (parent) => { - const url = `/messages/${parent.id}/reply_list.json?page=1&page_size=500` - axios.get(url,{ - }) - .then((response) => { - const { replies, liked, total_replies_count } = response.data.data - - // const memo = Object.assign({}, this.state.memo) - // memo.total_replies_count = total_replies_count; - this.setState({ - // memo, - comments: generateChildComments(replies, this.state.comments, parent, this.transformReply) - }) - }).catch((error) => { - console.log(error) - }) - } - // ------------------------------------------------------------------------------------------- comments END - // ------------------------------------------------------------------------------------------- comments END - // 置顶 - setTop(memo) { - // const params = { - // sticky: memo.sticky ? 0 : 1, - // } - // if (this.state.p_s_order) { - // params.order = this.state.p_s_order; - // } - // if (this.state.p_forum_id) { - // params.forum_id = this.state.p_forum_id; - // } - // let paramsUrl = urlStringify(params) - const set_top_or_down_Url = `/messages/${memo.id}/sticky_top.json`; - // 获取memo list - axios.put(set_top_or_down_Url, { - - }) - .then((response) => { - const status = response.data.status - if (status === 0) { - this.props.showNotification( memo.sticky ? '取消置顶成功' : '置顶成功'); - memo.sticky = memo.sticky ? false : true - this.setState({ - memo: Object.assign({}, memo) - }) - } - }).catch((error) => { - console.log(error) - }) - } - - setRewardDialogVisible = (visible) => { - this.setState({ - goldRewardDialogOpen: visible - }) - } - showRewardDialog = () => { - this.setState({ - goldRewardDialogOpen: true - }) - } - // --------------------------------------------------------------------------------------------帖子獎勵 END - showCommentInput = () => { - if (window.__useKindEditor === true) { - this.refs.editor.showEditor(); - } else { - this.refs.editor.showEditor(); - } - } - initReply = (parent) => { - if (!parent.isAllChildrenLoaded) { - this.loadMoreChildComments(parent) - } - } - - - render() { - const { match, history } = this.props - const { recommend_shixun, current_user,author_info } = this.props; - const { memo, comments, hasMoreComments, goldRewardDialogOpen, pageCount, total_count } = this.state; - const messageId = match.params.topicId - if (this.state.memoLoading || !current_user) { - return

        - } - current_user.user_url = `/users/${current_user.login}`; - const isCurrentUserTheAuthor = current_user.login == memo.author.login - const isAdmin = this.props.isAdmin() - // TODO 图片上传地址 - const courseId=this.props.match.params.coursesId; - const boardId = this.props.match.params.boardId - return ( -
        {/* fl with100 */} - - - - -
        -
        -
        -
        - {memo.subject} - { !!memo.sticky && 置顶} - { !!memo.reward && - {memo.reward} - } - {/* || current_user.user_id === author_info.user_id */} - { current_user && (isAdmin || isCurrentUserTheAuthor) && - - } - -
        -
        - {moment(memo.created_on).fromNow()} 发布 -
        - -
        -
        - -
        - - {/* { current_user.admin && - - - - } */} - - - - {memo.visits || '1'} - - - { !!memo.total_replies_count && - - - - { memo.total_replies_count } - - - } - {!!memo.total_praises_count && - - - - { memo.total_praises_count } - - - } - - -
        -
        - - -
        - {memo.is_md == true ? : -
        - } -
        -
        -
        - {/* ${memo.user_praise ? '' : ''} */} - -

        {this.clickPraise()}} > -
        - {memo.praises_count} -

        -
        -
        - - { memo.attachments && !!memo.attachments.length && -
        - {this.renderAttachment()} -
        - } -
        - - - - {/* onClick={ this.createNewComment } - enableReplyTo={true} - */} -
        -
        - 全部回复 - ({memo.total_replies_count}) -
        - - - - - {/* { true ? : -
        -
        写评论
        -
        } */} -
        - - -
        - { total_count > REPLY_PAGE_COUNT && - - } -
        写评论
        -
        - -
        -
        -
        - - ); - } -} - -export default ImageLayerOfCommentHOC() ( RouteHOC()(TopicDetail) ); +import React, { Component } from 'react'; +import { Redirect } from 'react-router'; + +import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; + +import PropTypes from 'prop-types'; + +import classNames from 'classnames' + +import axios from 'axios' + +import moment from 'moment' + +import Comments from '../../comment/Comments' + +import update from 'immutability-helper' +import RewardDialog from '../../common/RewardDialog'; +import {ImageLayerOfCommentHOC} from '../../page/layers/ImageLayerOfCommentHOC' + +import MemoDetailMDEditor from '../../forums/MemoDetailMDEditor' +import { RouteHOC } from './common.js' +import '../../forums/Post.css' +import '../../forums/RightSection.css' +import './TopicDetail.css' +import '../common/courseMessage.css' +import { Pagination, Tooltip } from 'antd' +import { bytesToSize, ConditionToolTip, markdownToHTML, MarkdownToHtml } from 'educoder' +import SendToCourseModal from '../coursesPublic/modal/SendToCourseModal' +import CBreadcrumb from '../common/CBreadcrumb' +import { generateComments, generateChildComments, _findById, handleContentBeforeCreateNew, addNewComment + , addSecondLevelComment, NEED_TO_WRITE_CONTENT, handleContentBeforeCreateSecondLevelComment + , handleDeleteComment, handleCommentPraise, handleHiddenComment } from '../common/CommentsHelper' + +const $ = window.$ +const REPLY_PAGE_COUNT = 10 +function urlStringify(params) { + let noParams = true; + let paramsUrl = ''; + for (let key in params) { + noParams = false; + paramsUrl += `${key}=${params[key]}&` + } + if (noParams) { + return ''; + } + paramsUrl = paramsUrl.substring(0, paramsUrl.length - 1); + return paramsUrl; +} +class TopicDetail extends Component { + constructor(props) { + super(props) + + this.state = { + memo: {}, + memoLoading: true, + hasMoreComments: false, + pageCount: 1, + comments: [], + goldRewardDialogOpen: false, + } + } + componentDidMount() { + window.$("html,body").animate({"scrollTop":0}) + + const topicId = this.props.match.params.topicId + const bid = this.props.match.params.boardId + + const memoUrl = `/messages/${topicId}.json`; + this.setState({ + memoLoading: true + }) + axios.get(memoUrl,{ + }) + .then((response) => { + + if (response.data.status === -1) { + setTimeout(() => { + this.props.showNotification('帖子不存在!') + }, 300) + // this.props.toListPage(response.data.data.course_id, bid) + return; + } else { + + this.setState({ + memo: Object.assign({}, { + ...response.data.data, + replies_count: response.data.data.total_replies_count + }, {...this.state.memo}) + }, () => { + }) + + // const { memo_replies, memo } = response.data; + // let hasMoreComments = false; + // if (memo_replies && memo_replies.length === 10 && memo.total_replies_count > 10) { + // // 遍历一遍,计算下是否还有评论未加载 + // let totalCount = 10; + // memo_replies.forEach(item=>{ + // totalCount += item.children.length + // }) + // if (totalCount < memo.total_replies_count) { + // hasMoreComments = true; + // } + // } + // this.setState({ + // hasMoreComments, + // pageCount: 1, + // comments: memo_replies + // }) + // delete response.data.memo_replies; + // this.setState(response.data) + // const user = response.data.current_user; + // user.tidding_count = response.data.tidding_count; + // this.props.initCommonState(user) + } + this.setState({ + memoLoading: false + }) + + }).catch((error) => { + console.log(error) + }) + + this.fetchReplies() + + $('body>#root').on('onMemoDelete', (event) => { + // const val = $('body>#root').data('onMemoDelete') + const val = window.onMemoDelete ; + this.onMemoDelete( JSON.parse(decodeURIComponent(val)) ) + }) + + + } + + onPaginationChange = (pageCount) => { + this.setState({ pageCount }, () => { + this.fetchReplies() + }) + } + + componentWillUnmount() { + $('body>#root').off('onMemoDelete') + } + onMemoDelete(memo) { + const deleteUrl = `/commons/delete.json`; + // 获取memo list + axios.delete(deleteUrl, { data: { + object_id: memo.id, + object_type: 'message' + } + }) + .then((response) => { + const status = response.data.status + if (status === 0) { + + this.props.showNotification('删除成功'); + const props = Object.assign({}, this.props, {}) + this.props.toListPage( Object.assign({}, this.props.match.params, {'coursesId': this.state.memo.course_id} ) ) + + } else if (status === -1) { + this.props.showNotification('帖子已被删除'); + this.props.history.push(`/forums`) + } + }).catch((error) => { + console.log(error) + }) + } + + componentDidUpdate(prevProps, prevState, snapshot) { + // if (this.state.memo && this.state.memo.content + // && (!prevProps.memo || prevProps.memo.content != this.state.memo.content) ) { + if (this.state.memo && this.state.memo.content && prevState.memoLoading === true && this.state.memoLoading === false) { + // md渲染content,等xhr执行完(即memoLoading变化),memo.content更新后初始化md + + setTimeout(()=>{ + // var shixunDescr = window.editormd.markdownToHTML("memo_content_editorMd", { + // htmlDecode: "style,script,iframe", // you can filter tags decode + // taskList: true, + // tex: true, // 默认不解析 + // flowChart: true, // 默认不解析 + // sequenceDiagram: true // 默认不解析 + // }); + }, 200) + } + + } + + clickPraise(){ + const { memo } = this.state; + // const url = `/api/v1/discusses/${memo.id}/plus`; + const url = memo.user_praise ? '/praise_tread/unlike.json' : `/praise_tread/like.json`; + const _method = memo.user_praise ? axios.delete : axios.post + let _data = { + object_id: memo.id, + object_type: 'message', //Discuss + } + if (memo.user_praise) { + _data = { + data: _data + } + } + _method(url, { + ..._data + }, + { + + } + ).then((response) => { + + const newMemo = Object.assign({}, this.state.memo) + newMemo.praises_count = newMemo.user_praise ? newMemo.praises_count - 1 : newMemo.praises_count + 1 + newMemo.total_praises_count = newMemo.user_praise ? newMemo.total_praises_count - 1 : newMemo.total_praises_count + 1 + newMemo.user_praise = !newMemo.user_praise + this.setState({memo : newMemo }) + }).catch((error) => { + console.log(error) + }) + } + renderAttachment() { + const { memo } = this.state; + const attachments = [] + memo.attachments.forEach((item, index) => { + const ar = item.url.split('/') + const fileName = item.title || ar[ar.length - 1] + let filesize = 0 + if (item.filesize) { + filesize = item.filesize + // filesize = bytesToSize(item.filesize) + } + attachments.push( + //

        + // + // + // {fileName && 30 }> + // {fileName} + // } + // {filesize? ` ${filesize.replace(' ', '')}` : ''} + // + //

        + + + ) + }) + return attachments; + } + // ------------------------------------------------------------------------------------------- comments START + // ------------------------------------------------------------------------------------------- comments START + transformReply = (reply, children = []) => { + const isAdmin = this.props.isAdmin() + const isSuperAdmin = this.props.isSuperAdmin() + return { + isSuperAdmin: isSuperAdmin, + admin: isAdmin, // + permission: true, // + children: children, + child_message_count: reply.total_count, + hidden: reply.is_hidden, + id: reply.id, + image_url: reply.author.image_url, + reward: null, // + time: moment(reply.created_on).fromNow(), + user_id: reply.author.id, + user_login: reply.author.login, + user_praise: reply.liked, + username: reply.author.name, + content: reply.content, + praise_count: reply.praises_count + } + } + + fetchReplies = () => { + const topicId = this.props.match.params.topicId + const url = `/messages/${topicId}/reply_list.json?page=${this.state.pageCount}&page_size=${REPLY_PAGE_COUNT}` + axios.get(url,{ + }) + .then((response) => { + const { replies, liked, total_replies_count, total_count } = response.data.data + + const memo = Object.assign({}, this.state.memo) + memo.user_praise = liked + memo.total_replies_count = total_replies_count; + this.setState({ + memo, + comments: generateComments(replies, this.transformReply, 'replies'), + // : this.state.comments.concat(comments), + total_count: total_count + }) + }).catch((error) => { + console.log(error) + }) + } + + _getUser() { + const { current_user } = this.props; + current_user.user_url = `/users/${current_user.login}`; + return current_user; + } + _findById = _findById + replyComment = (commentContent, id, editor) => { + const { showNotification } = this.props; + // if (!commentContent || commentContent.length === 0) { + // showNotification(NEED_TO_WRITE_CONTENT) + // return; + // } + + if (this.state.memo.id === id ) { // 回复帖子 + this.createNewComment(commentContent, id, editor); + return; + } + const url = `/messages/${id}/reply.json`; + + const { comments } = this.state; + const user = this._getUser(); + /* + 移除末尾的空行 + .replace(/(\n

        \n\t
        \n<\/p>)*$/g,''); + + */ + + commentContent = handleContentBeforeCreateSecondLevelComment(commentContent) + if (!commentContent) { + this.props.showNotification('不能为空') + return; + } + axios.post(url, { + content: commentContent + }, + { + } + ).then((response) => { + if (response.data.data.id) { + let newId = response.data.data.id; + const commentIndex = this._findById(id, comments); + const parentComment = comments[commentIndex] + + this.setState({ + // runTesting: false, + comments: addSecondLevelComment(comments, parentComment, commentIndex, newId, commentContent, user, editor) + }, ()=>{ + // keditor代码美化 + editor.html && window.prettyPrint() + }) + + const newMemo2 = Object.assign({}, this.state.memo); + newMemo2.total_replies_count = newMemo2.total_replies_count + 1; + this.setState({ + memo: newMemo2 + }) + } + + }).catch((error) => { + console.log(error) + }) + } + // 公共接口 --- 删除回复 + deleteComment = (parrentComment, childCommentId) => { + handleDeleteComment(this, parrentComment, childCommentId, 'message') + + } + // 公共接口 --- 回复点赞 + commentPraise = (discussId) => { + handleCommentPraise(this, discussId, 'message', (old_user_praise) => { + const newMemo2 = Object.assign({}, this.state.memo); + + newMemo2.total_praises_count = old_user_praise + ? newMemo2.total_praises_count - 1 : newMemo2.total_praises_count + 1; + this.setState({ + memo: newMemo2 + }) + }) + } + // 公共接口 --- 隐藏回复 + hiddenComment = (item, childCommentId) => { + handleHiddenComment(this, item, childCommentId, 'message') + } + createNewComment = (commentContent, id, editor) => { + let content = handleContentBeforeCreateNew(commentContent); + const { memo } = this.props; + + const url = `/messages/${id}/reply.json`; + + // const url = `/api/v1/memos/${memo.id}/reply`; + let { comments } = this.state; + axios.post(url, { + content: content + }, + { + } + ).then((response) => { + if (response.data.status === -1) { + console.error('服务端异常') + return; + } + // this.props.showNotification('帖子发表成功') + + if (response.data) { + const _id = response.data.data.id; + // ke + editor.html && editor.html(''); + editor.afterBlur && editor.afterBlur() + // md + editor.setValue && editor.setValue('') + + + const user = this._getUser(); + this.setState({ + comments: addNewComment(comments, _id, content, user, this.props.isSuperAdmin(), this) + }) + const newMemo2 = Object.assign({}, this.state.memo); + newMemo2.total_replies_count = newMemo2.total_replies_count + 1; + this.setState({ + memo: newMemo2 + }) + this.refs.editor.showEditor(); + this.refs.editor.close(); + + + } + }).catch((error) => { + console.log(error) + }) + } + + /** + * parent.isAllChildrenLoaded 为 true的时候,表示已经没有更多子回复了 + */ + loadMoreChildComments = (parent) => { + const url = `/messages/${parent.id}/reply_list.json?page=1&page_size=500` + axios.get(url,{ + }) + .then((response) => { + const { replies, liked, total_replies_count } = response.data.data + + // const memo = Object.assign({}, this.state.memo) + // memo.total_replies_count = total_replies_count; + this.setState({ + // memo, + comments: generateChildComments(replies, this.state.comments, parent, this.transformReply) + }) + }).catch((error) => { + console.log(error) + }) + } + // ------------------------------------------------------------------------------------------- comments END + // ------------------------------------------------------------------------------------------- comments END + // 置顶 + setTop(memo) { + // const params = { + // sticky: memo.sticky ? 0 : 1, + // } + // if (this.state.p_s_order) { + // params.order = this.state.p_s_order; + // } + // if (this.state.p_forum_id) { + // params.forum_id = this.state.p_forum_id; + // } + // let paramsUrl = urlStringify(params) + const set_top_or_down_Url = `/messages/${memo.id}/sticky_top.json`; + // 获取memo list + axios.put(set_top_or_down_Url, { + + }) + .then((response) => { + const status = response.data.status + if (status === 0) { + this.props.showNotification( memo.sticky ? '取消置顶成功' : '置顶成功'); + memo.sticky = memo.sticky ? false : true + this.setState({ + memo: Object.assign({}, memo) + }) + } + }).catch((error) => { + console.log(error) + }) + } + + setRewardDialogVisible = (visible) => { + this.setState({ + goldRewardDialogOpen: visible + }) + } + showRewardDialog = () => { + this.setState({ + goldRewardDialogOpen: true + }) + } + // --------------------------------------------------------------------------------------------帖子獎勵 END + showCommentInput = () => { + if (window.__useKindEditor === true) { + this.refs.editor.showEditor(); + } else { + this.refs.editor.showEditor(); + } + } + initReply = (parent) => { + if (!parent.isAllChildrenLoaded) { + this.loadMoreChildComments(parent) + } + } + + + render() { + const { match, history } = this.props + const { recommend_shixun, current_user,author_info } = this.props; + const { memo, comments, hasMoreComments, goldRewardDialogOpen, pageCount, total_count } = this.state; + const messageId = match.params.topicId + if (this.state.memoLoading || !current_user) { + return

        + } + current_user.user_url = `/users/${current_user.login}`; + const isCurrentUserTheAuthor = current_user.login == memo.author.login + const isAdmin = this.props.isAdmin() + // TODO 图片上传地址 + const courseId=this.props.match.params.coursesId; + const boardId = this.props.match.params.boardId + return ( +
        {/* fl with100 */} + + + + +
        +
        +
        +
        + {memo.subject} + { !!memo.sticky && 置顶} + { !!memo.reward && + {memo.reward} + } + {/* || current_user.user_id === author_info.user_id */} + { current_user && (isAdmin || isCurrentUserTheAuthor) && + + } + +
        +
        + {moment(memo.created_on).fromNow()} 发布 +
        + +
        +
        + +
        + + {/* { current_user.admin && + + + + } */} + + + + {memo.visits || '1'} + + + { !!memo.total_replies_count && + + + + { memo.total_replies_count } + + + } + {!!memo.total_praises_count && + + + + { memo.total_praises_count } + + + } + + +
        +
        + + +
        + {memo.is_md == true ? : +
        + } +
        +
        +
        + {/* ${memo.user_praise ? '' : ''} */} + +

        {this.clickPraise()}} > +
        + {memo.praises_count} +

        +
        +
        + + { memo.attachments && !!memo.attachments.length && +
        + {this.renderAttachment()} +
        + } +
        + + + + {/* onClick={ this.createNewComment } + enableReplyTo={true} + */} +
        +
        + 全部回复 + ({memo.total_replies_count}) +
        + + + + + {/* { true ? : +
        +
        写评论
        +
        } */} +
        + + +
        + { total_count > REPLY_PAGE_COUNT && + + } +
        写评论
        +
        + +
        +
        +
        + + ); + } +} + +export default ImageLayerOfCommentHOC() ( RouteHOC()(TopicDetail) ); diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index eb53fa373..4d82f4182 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -223,7 +223,7 @@ class CommonWorkDetailIndex extends Component{ } `} {current_user && { - const Id = this.props.match.params.Id - this.isEdit = !!Id - if (Id) { - const url = `/exercises/${Id}/edit.json` - axios.get(url) - .then((response) => { - if (response.data.status == 0) { - const { exercise, ...others } = response.data - this.setState({ - ...exercise, - ...others, - editMode: false - }) - } - }) - .catch(function (error) { - console.log(error); - }); - } else { - const courseId=this.props.match.params.coursesId; - - const newUrl = `/courses/${courseId}/exercises/new.json` - axios.get(newUrl) - .then((response) => { - if (response.data.status == 0) { - this.setState({ - ...response.data - }) - } - }) - .catch(function (error) { - console.log(error); - }); - } - } - componentDidMount = () => { - this.fetchExercise() - } - handleSubmit = (e) => { - - } - onSaveExercise = () => { - const { exercise_name, exercise_description } = this.state; - const exercise_id = this.props.match.params.Id - const courseId = this.props.match.params.coursesId - if (this.isEdit) { - const editUrl = `/exercises/${exercise_id}.json` - axios.put(editUrl, { - exercise_name, - exercise_description - }) - .then((response) => { - if (response.data.status == 0) { - this.setState({editMode: false}) - this.props.showNotification('试卷编辑成功') - } - }) - .catch(function (error) { - console.log(error); - }); - } else { - const url = `/courses/${courseId}/exercises.json` - axios.post(url, { - exercise_name, - exercise_description - }) - .then((response) => { - if (response.data.status == 0) { - this.setState({editMode: false}) - - this.props.showNotification('试卷新建成功') - const exercise_id = response.data.data.exercise_id; - this.isEdit = true; - - this.props.history.replace(`/courses/${courseId}/exercises/${exercise_id}/edit`); - - } - }) - .catch(function (error) { - console.log(error); - }); - } - } - exercise_name_change = (e) => { - this.setState({exercise_name: e.target.value}) - } - exercise_description_change = (e) => { - this.setState({exercise_description: e.target.value}) - } - // #问题的类型,0为单选题,1为多选题,2为判断题,3为填空题,4为主观题,5为实训题 - _checkIsEditing = () => { - if (this.editingId && $(this.editingId).length ) { - this.props.showNotification('请先保存或取消当前正在编辑的问题。') - $("html").animate({ scrollTop: $(this.editingId).offset().top - 100}) - return true - } - return false - } - onEditorCancel = () => { - this.editingId = null; - // 找到编辑或新建的item,新建就删掉item,编辑就isNew改为false - const { exercise_questions } = this.state - let index = -1; - for(let i = 0; i < exercise_questions.length; i++) { - if (exercise_questions[i].isNew == true) { - index = i; - break; - } - } - if (exercise_questions[index].question_id) { // 编辑 - this.setState( - (prevState) => ({ - exercise_questions : update(prevState.exercise_questions, {[index]: { isNew: {$set: false}}}) - // update(prevState.exercise_questions, {$splice: [[index, 1]]}) - }) - ) - } else { // 新建 - this.setState( - (prevState) => ({ - exercise_questions : update(prevState.exercise_questions, {$splice: [[index, 1]]}) - }) - ) - } - } - addQuestion = (question_id_to_insert_after, type) => { - if (!this.isEdit) { - this.props.showNotification('请先输入试卷标题,并保存试卷') - return; - } - if (this._checkIsEditing()) { - return; - } - if (type == Q_TYPE_SHIXUN) { - this.addShixun(question_id_to_insert_after) - } else { - this.addEditingQuestion(type, question_id_to_insert_after) - } - } - chooseShixun = (array) => { - this.addEditingQuestion(Q_TYPE_SHIXUN, this.question_id_to_insert_after, { - shixun_id: array[0] - }) - } - chooseShixunSuccess = () => { - this.refs.shixunChooseModal.setVisible(false) - } - addShixun = (question_id_to_insert_after) => { - if (!this.isEdit) { - this.props.showNotification('请先输入试卷标题,并保存试卷') - return; - } - // TODO 弹框选择实训 - if (this._checkIsEditing()) { - return; - } - this.refs.shixunChooseModal.setVisible(true) - this.question_id_to_insert_after = question_id_to_insert_after; - return; - // 拉取实训items - this.addEditingQuestion(Q_TYPE_SHIXUN, question_id_to_insert_after, { - shixun_id: 50 - }) - } - editQestion = (index) => { - if (this._checkIsEditing()) { - return; - } - this.editingId = `#question_${index}` - - this.setState( - (prevState) => ({ - exercise_questions : update(prevState.exercise_questions, {[index]: { isNew: {$set: true}}}) - }) - ) - } - onSort = (index, question_id, isUp) => { - if (this._checkIsEditing()) { - return; - } - const url = `/exercise_questions/${question_id}/up_down.json` - axios.post(url, { opr: isUp ? 'up' : 'down'}) - .then((response) => { - if (response.data.status == 0) { - // this.props.showNotification('移动成功') - this.fetchExercise() - } - }) - .catch(function (error) { - console.log(error); - }); - } - onSortDown = (index, question_id) => { - this.onSort(index, question_id, false) - } - onSortUp = (index, question_id) => { - this.onSort(index, question_id, true) - } - getInitScore = (question_type, question_id_to_insert_after) => { - /** - 1.每个题型的首个题目默认值规则如下: - 选择题:5分 01 - 判断题:2分 2 - 填空题:2分 3 - 简答题:10分 4 - 实训题:每个关卡5分 5 - */ - let init_question_score = 0; - if (question_type == 0 || question_type == 1) { - init_question_score = 5 - } else if (question_type == 2) { - init_question_score = 2 - } else if (question_type == 3) { - init_question_score = 2 - } else if (question_type == 4) { - init_question_score = 10 - } else if (question_type == 5) { - init_question_score = 5 - } - const _indexBefore = question_id_to_insert_after ? this.findIndexById(question_id_to_insert_after) : this.state.exercise_questions.length - 1 - for (let i = _indexBefore; i >= 0; i--) { - if(this.state.exercise_questions[i].question_type == question_type) { - init_question_score = this.state.exercise_questions[i].question_score - break; - } - } - return init_question_score; - } - addEditingQuestion = (question_type, question_id_to_insert_after, otherAttributes) => { - - let init_question_score = this.getInitScore(question_type, question_id_to_insert_after) - - let questionObj = { - question_type: question_type, // 需要这个通过类型判断 - init_question_score: init_question_score, - isNew: true, // 新建或编辑,用是否有id区分是新建还是编辑 - question_id_to_insert_after, - ...otherAttributes - } - const { exercise_questions } = this.state; - let new_exercise_questions = exercise_questions.slice(0) - let newIndex = new_exercise_questions.length; - - if (question_id_to_insert_after) { - const _indexBefore = this.findIndexById(question_id_to_insert_after) - new_exercise_questions.splice(_indexBefore + 1, 0, questionObj) - newIndex = _indexBefore + 1 - } else { - new_exercise_questions.push(questionObj) - } - this.editingId = `#question_${newIndex}` - this.setState({ exercise_questions: new_exercise_questions }, () => { - setTimeout(() => { - $(this.editingId).length && $("html").animate({ scrollTop: $(this.editingId).offset().top - 100}) - }, 500) - }) - } - findIndexById = (id) => { - const { exercise_questions } = this.state - for(let i = 0; i < exercise_questions.length; i++) { - if (exercise_questions[i].question_id == id) { - return i; - } - } - } - onQestionDelete = (question_id) => { - this.props.confirm({ - content: `确认要删除这个问题吗?`, - onOk: () => { - const url = `/exercise_questions/${question_id}.json` - axios.delete(url) - .then((response) => { - if (response.data.status == 0) { - this.props.showNotification('删除成功') - const { exercise_questions } = this.state - const index = this.findIndexById(question_id) - - this.setState( - (prevState) => ({ - exercise_questions : update(prevState.exercise_questions, {$splice: [[index, 1]]}) - }) - ) - } - }) - .catch(function (error) { - console.log(error); - }); - } - }) - } - addSuccess = () => { - this.editingId = null; - this.fetchExercise() - } - goToPreview = () => { - const exercise_id = this.props.match.params.Id - const courseId = this.props.match.params.coursesId - this.props.history.push(`/courses/${courseId}/exercises/${exercise_id}/student_exercise_list?tab=2`) - } - render() { - let { exercise_name, exercise_description, course_id, exercise_types, - exercise_questions, left_banner_id } = this.state; - // if (this.isEdit && !exercise_types) { - // return '' - // } - // const { getFieldDecorator } = this.props.form; - const { q_counts, q_scores, q_doubles, q_doubles_scores, q_judges, q_judges_scores, - q_mains, q_mains_scores, q_nulls, q_nulls_scores, q_shixuns, q_shixuns_scores, q_singles, q_singles_scores} = exercise_types; - const formItemLayout = { - labelCol: { - xs: { span: 24 }, - // sm: { span: 8 }, - sm: { span: 24 }, - }, - wrapperCol: { - xs: { span: 24 }, - // sm: { span: 16 }, - sm: { span: 24 }, - }, - }; - - const { current_user } = this.props - const isAdmin = this.props.isAdmin() - const courseId=this.props.match.params.coursesId; - const exercise_id = this.props.match.params.Id - - const isEdit = this.isEdit - const commonHandler = { - onQestionDelete: this.onQestionDelete, - addSuccess: this.addSuccess, - addQuestion: this.addQuestion, - onEditorCancel: this.onEditorCancel, - editQestion: this.editQestion, - onSortDown: this.onSortDown, - onSortUp: this.onSortUp, - displayCount: exercise_questions.length, - exercise_status: this.state.exercise_status, - exerciseIsPublish: this.state.exercise_status >= 2 - } - return( -
        - - -
        - { current_user && } - -

        - {this.isEdit ? "编辑" : "新建"}试卷 - this.props.history.length == 1 ? this.props.history.push(`/courses/${courseId}/exercises/${left_banner_id}`): this.props.history.goBack()}> - 返回 - -

        - - {!this.state.editMode && } - {this.state.editMode &&
        -
        - - {/* {getFieldDecorator('subject', { - rules: [{ - required: true, message: '请输入标题', - }, { - max: 20, message: '最大限制为20个字符', - }], - })( */} - - {/* )} */} - - - - {/* {getFieldDecorator('select_board_id', { - // initialValue: '3779', - })( */} -
        - } +
        From 2b129bd66c4278bf71d31553b47d0a3b46ccac75 Mon Sep 17 00:00:00 2001 From: jingquan huang Date: Mon, 5 Aug 2019 16:08:05 +0800 Subject: [PATCH 331/623] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=E8=AE=B0=E5=BD=95=E5=8F=AF=E6=89=A7=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/myshixuns_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 7ae9df5e3..c36ad09b6 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -265,10 +265,10 @@ class MyshixunsController < ApplicationController # params[:evaluate] 实训评测时更新必须给的参数,需要依据该参数做性能统计,其它类型的更新可以跳过 # 自动保存的时候evaluate为0;点评测的时候为1 if params[:evaluate] == 1 - #exec_time = game.challenge.try(:exec_time) + exec_time = game.challenge.try(:exec_time) @sec_key = generate_identifier(EvaluateRecord, 12) record = EvaluateRecord.create!(:user_id => current_user.id, :shixun_id => @myshixun.shixun_id, :game_id => game_id, - :identifier => @sec_key) + :identifier => @sec_key, :exec_time => exec_time) uid_logger("-- game build: file update #{@sec_key}, record id is #{record.id}, time is **** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") end unless @hide_code From f892faa3c231d186cb3aaa152a4453633c01d757 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 5 Aug 2019 16:10:29 +0800 Subject: [PATCH 332/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7aa89dbd7..024c7c151 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -190,7 +190,7 @@ class ApplicationController < ActionController::Base def check_account if !current_user.profile_completed? info_url = '/account/profile' - tip_exception(402, info_url) + tip_exception(402, '') end end From 39777f17ada9e82d6ed28044ec670777998df57d Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Mon, 5 Aug 2019 16:11:50 +0800 Subject: [PATCH 333/623] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=BF=85=E9=A1=BB=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/moop_cases/CaseNew.js | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/moop_cases/CaseNew.js b/public/react/src/modules/moop_cases/CaseNew.js index 056733283..e855b5b71 100644 --- a/public/react/src/modules/moop_cases/CaseNew.js +++ b/public/react/src/modules/moop_cases/CaseNew.js @@ -40,6 +40,7 @@ class CaseNew extends Component{ imageUrl:undefined, loading: false, checkTag:false, + checkFile:false, coverID:undefined } } @@ -89,10 +90,12 @@ class CaseNew extends Component{ let contentFileList = info.fileList; this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList)}); let list = appendFileSizeToUploadFileAll(contentFileList); + let arr = list.map(item=>{ + return ( item.response && item.response.id ) + }) this.setState({ - filesID:list.map(item=>{ - return ( item.response && item.response.id ) - }) + filesID:arr, + checkFile:arr.length > 0 ? false : true }) console.log("fujian"); console.log(list.map(item=>{ @@ -165,7 +168,7 @@ class CaseNew extends Component{ let caseID = this.props.match.params.caseID; console.log(type); this.props.form.validateFieldsAndScroll((err, values) => { - let { casesTags } = this.state; + let { casesTags , filesID } = this.state; if(casesTags.length == 0){ $("html").animate({ scrollTop: $("#tagFormItem").offset().top - 100 }); this.setState({ @@ -173,6 +176,13 @@ class CaseNew extends Component{ }) return; } + if(filesID.length == 0){ + $("html").animate({ scrollTop: $("#fileFormItem").offset().top - 100 }); + this.setState({ + checkFile:true + }) + return; + } //const mdContnet = this.DescMdRef.current.getValue().trim(); console.log(values); let url = caseID ? `/libraries/${caseID}.json`: `/libraries.json`; @@ -235,7 +245,7 @@ class CaseNew extends Component{ render(){ let { caseID } = this.props.match.params; let { CaseDetail } = this.props; - let { casesTags , contentFileList , imageUrl , checkTag } = this.state; + let { casesTags , contentFileList , imageUrl , checkTag , checkFile } = this.state; const {getFieldDecorator} = this.props.form; @@ -363,11 +373,14 @@ class CaseNew extends Component{ watch={true} className="caseMessageMD" initValue={CaseDetail && CaseDetail.content}> )} -
        +

        上传附件

        从我的电脑选择要上传的文档:按住CTRL可以上传多份文档。单个文件最大限制:150MB

        + { + checkFile &&
        请先上传附件
        + }

        封面图(上传尺寸:120*90 px) From 37381834c58ee66d627a23d1f095923e8fe5e5f7 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 5 Aug 2019 16:22:28 +0800 Subject: [PATCH 334/623] =?UTF-8?q?=E5=85=BC=E5=AE=B9KE=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5010545_modify_ke_contents_for_markdown.rb | 192 ++++++++++++------ 1 file changed, 125 insertions(+), 67 deletions(-) diff --git a/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb b/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb index 40714c4e1..67b57b215 100644 --- a/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb +++ b/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb @@ -1,73 +1,131 @@ class ModifyKeContentsForMarkdown < ActiveRecord::Migration[5.2] include ActionView::Helpers::SanitizeHelper def change - def ke_transform_to_md content - sanitize(content, tags: %w(img a span), attributes: %w(src href target style)) - .gsub(/^(\n)/, "").gsub(/(\n)+/, "
        ").gsub(/$(\n)/, "") - .gsub(/(\n)+/, "
        ").gsub("\t", "    ") - end - - # 课程讨论区 - MessageDetail.find_each do |m| - content = ke_transform_to_md m.content - puts("content:#{content}") - m.update_column(:content, content) - end - - # 试卷的描述 - Exercise.find_each do |e| - exercise_description = ke_transform_to_md e.exercise_description - puts("#exercise_description: #{exercise_description}") - e.update_column(:exercise_description, exercise_description) - end - - # 试卷的标题 - ExerciseQuestion.find_each do |eq| - question_title = ke_transform_to_md eq.question_title - puts("question_title:#{question_title}") - eq.update_column(:question_title, question_title) - end - - # 试卷的答案 - ExerciseStandardAnswer.find_each do |esa| - answer_text = ke_transform_to_md esa.answer_text - puts("answer_text: #{answer_text}") - esa.update_column(:answer_text, answer_text) - end - - # 试卷题库 - ExerciseBankQuestion.find_each do |ebq| - question_title = ke_transform_to_md ebq.question_title - puts("#question_title: #{question_title}") - end - - - # 问卷的标题 - PollQuestion.find_each do |pq| - question_title = ke_transform_to_md pq.question_title - puts("question_title:#{question_title}") - pq.update_column(:question_title, question_title) - end - - - - - StudentWork - HomeworkCommon - JournalsForMessage - GraduationTask - GraduationTopic - GraduationWork - GtaskBank - GtopicBank - HomeworkBank - QuestionBank - - ExerciseBankStandardAnswer - Memo - - - + # def ke_transform_to_md content + # sanitize(content, tags: %w(img a span), attributes: %w(src href target style)) + # .gsub(/^(\n)/, "").gsub(/(\n)+/, "
        ").gsub(/$(\n)/, "") + # .gsub(/(\n)+/, "
        ").gsub("\t", "    ") + # end + # + # # 课程讨论区 + # MessageDetail.find_each do |m| + # content = ke_transform_to_md m.content + # puts("content:#{content}") + # m.update_column(:content, content) + # end + # + # # 试卷的描述 + # Exercise.find_each do |e| + # exercise_description = ke_transform_to_md e.exercise_description + # puts("#exercise_description: #{exercise_description}") + # e.update_column(:exercise_description, exercise_description) + # end + # + # # 试卷的标题 + # ExerciseQuestion.find_each do |eq| + # question_title = ke_transform_to_md eq.question_title + # puts("question_title:#{question_title}") + # eq.update_column(:question_title, question_title) + # end + # + # # 试卷的答案 + # ExerciseStandardAnswer.find_each do |esa| + # answer_text = ke_transform_to_md esa.answer_text + # puts("answer_text: #{answer_text}") + # esa.update_column(:answer_text, answer_text) + # end + # + # # 试卷题库的问题标题 + # ExerciseBankQuestion.find_each do |ebq| + # question_title = ke_transform_to_md ebq.question_title + # puts("#question_title: #{question_title}") + # ebq.update_column(:question_title, question_title) + # end + # + # # 试卷答案 + # ExerciseBankStandardAnswer.find_each do |ebsa| + # answer_text = ke_transform_to_md ebsa.answer_text + # puts("#answer_text: #{answer_text}") + # ebsa.update_column(:answer_text, answer_text) + # end + # + # # 问卷的标题 + # PollQuestion.find_each do |pq| + # question_title = ke_transform_to_md pq.question_title + # puts("question_title:#{question_title}") + # pq.update_column(:question_title, question_title) + # end + # + # # 学生的作品 + # StudentWork.find_each do |sw| + # description = ke_transform_to_md sw.description + # puts("#description: #{description}") + # sw.update_column(:description, description) + # end + # + # # 作业 + # HomeworkCommon.find_each do |hc| + # description = ke_transform_to_md hc.description + # reference_answer = ke_transform_to_md hc.reference_answer + # explanation = ke_transform_to_md hc.explanation + # hc.update_attributes(description: description, reference_answer: reference_answer, explanation: explanation) + # end + # + # # 作业题库 + # HomeworkBank.find_each do |hb| + # description = ke_transform_to_md hb.description + # reference_answer = ke_transform_to_md hb.reference_answer + # hb.update_attributes(description: description, reference_answer: reference_answer) + # end + # + # # 课堂评论 + # JournalsForMessage.find_each do |jfm| + # notes = ke_transform_to_md jfm.notes + # puts("#notes: #{notes}") + # jfm.update_column(:notes, notes) + # end + # + # # 毕业任务 + # GraduationTask.find_each do |gt| + # description = ke_transform_to_md gt.description + # puts("#description: #{description}") + # gt.update_column(:description, description) + # end + # + # # 毕设选题 + # GraduationTopic.find_each do |gt| + # description = ke_transform_to_md gt.description + # puts("#description: #{description}") + # gt.update_column(:description, description) + # end + # + # # 毕设作品 + # GraduationWork.find_each do |gw| + # description = ke_transform_to_md gw.description + # puts("#description: #{description}") + # gw.update_column(:description, description) + # end + # + # # 毕设任务题库 + # GtaskBank.find_each do |gb| + # description = ke_transform_to_md gb.description + # puts("#description: #{description}") + # gb.update_column(:description, description) + # end + # + # # 毕设选题题库 + # GtopicBank.find_each do |gb| + # description = ke_transform_to_md gb.description + # puts("#description: #{description}") + # gb.update_column(:description, description) + # end + # + # # 交流问答 + # Memo.find_each do |m| + # content = ke_transform_to_md m.content + # puts("#description: #{content}") + # m.update_column(:content, content) + # end end end From d163fd4a5472a122ca5304eeb3d259cd882dd059 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 5 Aug 2019 16:26:45 +0800 Subject: [PATCH 335/623] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 024c7c151..7aa89dbd7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -190,7 +190,7 @@ class ApplicationController < ActionController::Base def check_account if !current_user.profile_completed? info_url = '/account/profile' - tip_exception(402, '') + tip_exception(402, info_url) end end From 5b32c98abd84993bd40363bf72e68e53d84362d3 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 16:28:50 +0800 Subject: [PATCH 336/623] h --- public/react/src/modules/forums/shixun/ShiXunPostItem.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/forums/shixun/ShiXunPostItem.js b/public/react/src/modules/forums/shixun/ShiXunPostItem.js index 961e16ff1..9ae343641 100644 --- a/public/react/src/modules/forums/shixun/ShiXunPostItem.js +++ b/public/react/src/modules/forums/shixun/ShiXunPostItem.js @@ -44,7 +44,9 @@ class ShiXunPostItem extends Component {memo.subject}

        { memo.reward && - + {memo.reward} } From 739f59b0043e546a3eeb7b859260caefe30f3efb Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 5 Aug 2019 16:34:25 +0800 Subject: [PATCH 337/623] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20190805010545_modify_ke_contents_for_markdown.rb | 7 ------- 1 file changed, 7 deletions(-) diff --git a/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb b/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb index 67b57b215..4b66add63 100644 --- a/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb +++ b/db/migrate/20190805010545_modify_ke_contents_for_markdown.rb @@ -14,13 +14,6 @@ class ModifyKeContentsForMarkdown < ActiveRecord::Migration[5.2] # m.update_column(:content, content) # end # - # # 试卷的描述 - # Exercise.find_each do |e| - # exercise_description = ke_transform_to_md e.exercise_description - # puts("#exercise_description: #{exercise_description}") - # e.update_column(:exercise_description, exercise_description) - # end - # # # 试卷的标题 # ExerciseQuestion.find_each do |eq| # question_title = ke_transform_to_md eq.question_title From 3046237a56898f6289c3b7afe09ebc124b32b804 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 16:43:36 +0800 Subject: [PATCH 338/623] =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20//=20=E8=A7=A3=E5=86=B3=E6=9C=89=E6=97=B6=E5=80=99?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E6=97=B6=E5=86=85=E5=AE=B9=E4=B8=8D=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.css | 3 +++ public/react/src/modules/forums/MemoNew.js | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/public/react/src/App.css b/public/react/src/App.css index 7b0455bea..c54d8b905 100644 --- a/public/react/src/App.css +++ b/public/react/src/App.css @@ -58,4 +58,7 @@ html, body { /* resize */ .editormd .CodeMirror { border-right: none !important; +} +.editormd-preview { + border-left: 1px solid rgb(221, 221, 221); } \ No newline at end of file diff --git a/public/react/src/modules/forums/MemoNew.js b/public/react/src/modules/forums/MemoNew.js index e6482b8b6..a7b483c77 100644 --- a/public/react/src/modules/forums/MemoNew.js +++ b/public/react/src/modules/forums/MemoNew.js @@ -387,6 +387,11 @@ class MemoNew extends Component { // repertoires: [], // currentSelectRepertoiresIndex: -1, }, ()=> { + // 解决有时候编辑时内容不显示的问题 + setTimeout(() => { + this.mdRef.current && this.mdRef.current.setValue(content || '') + }, 2000) + $('.upload_filename').each((index, item) => { var width = window._textWidth($(item), '14px'); console.log(width) From a0e7afaf22a4a3a47672dcfa4740698cf27f8418 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 16:50:49 +0800 Subject: [PATCH 339/623] md --- public/react/src/modules/courses/boards/TopicDetail.js | 8 ++++---- public/react/src/modules/forums/MemoDetail.js | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/courses/boards/TopicDetail.js b/public/react/src/modules/courses/boards/TopicDetail.js index 58bb0c662..d60c34461 100644 --- a/public/react/src/modules/courses/boards/TopicDetail.js +++ b/public/react/src/modules/courses/boards/TopicDetail.js @@ -648,12 +648,12 @@ class TopicDetail extends Component {
        - - {/* {memo.is_md == true ? - + {/* */} + {memo.is_md == true ? + :
        - } */} + }
        diff --git a/public/react/src/modules/forums/MemoDetail.js b/public/react/src/modules/forums/MemoDetail.js index 3e92d7391..fb435fdf3 100644 --- a/public/react/src/modules/forums/MemoDetail.js +++ b/public/react/src/modules/forums/MemoDetail.js @@ -145,7 +145,7 @@ class MemoDetail extends Component { // && (!prevProps.memo || prevProps.memo.content != this.props.memo.content) ) { if (this.props.memo && this.props.memo.content && prevState.memoLoading === true && this.state.memoLoading === false) { // md渲染content,等xhr执行完(即memoLoading变化),memo.content更新后初始化md - // if (this.props.memo.is_md) { + if (this.props.memo.is_md) { setTimeout(()=>{ var shixunDescr = window.editormd.markdownToHTML("memo_content_editorMd", { htmlDecode: "style,script,iframe", // you can filter tags decode @@ -155,7 +155,7 @@ class MemoDetail extends Component { sequenceDiagram: true // 默认不解析 }); }, 200) - // } + } } } @@ -766,15 +766,15 @@ class MemoDetail extends Component {
        - {/* { !memo.is_md ? + { !memo.is_md ?
        : - } */} +
        - + }
        From 099e5bfbfc92f8dac720108e06105464a2c4d630 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 16:55:22 +0800 Subject: [PATCH 340/623] =?UTF-8?q?=20=20/*=20=E6=9F=90=E4=BA=9B=E6=83=85?= =?UTF-8?q?=E5=86=B5=E4=B8=8B=EF=BC=8C=E8=A2=ABcm=E7=9B=96=E4=BD=8F?= =?UTF-8?q?=E4=BA=86=20*/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/react/src/App.css b/public/react/src/App.css index c54d8b905..50bccfb60 100644 --- a/public/react/src/App.css +++ b/public/react/src/App.css @@ -61,4 +61,6 @@ html, body { } .editormd-preview { border-left: 1px solid rgb(221, 221, 221); + /* 某些情况下,被cm盖住了 */ + z-index: 99; } \ No newline at end of file From ffe398bd528d7b8d7cc9788ab0b6b3ece9ba6b0c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 17:01:04 +0800 Subject: [PATCH 341/623] /moop_cases/new --- public/react/src/modules/moop_cases/CaseList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/moop_cases/CaseList.js b/public/react/src/modules/moop_cases/CaseList.js index b968cc930..bfb453dd8 100644 --- a/public/react/src/modules/moop_cases/CaseList.js +++ b/public/react/src/modules/moop_cases/CaseList.js @@ -93,7 +93,7 @@ class CaseList extends Component{

        教学案例 - this.addQuestion(null, Q_TYPE_SINGLE)}>发布案例 + 发布案例

          From 8256ede4958340073cc9b0a3fc28bb71da9bb4a1 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 17:21:35 +0800 Subject: [PATCH 342/623] =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/forums/MemoNew.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/forums/MemoNew.js b/public/react/src/modules/forums/MemoNew.js index a7b483c77..48c789eae 100644 --- a/public/react/src/modules/forums/MemoNew.js +++ b/public/react/src/modules/forums/MemoNew.js @@ -553,10 +553,12 @@ class MemoNew extends Component { return attachments; } handleChange = (info) => { - let fileList = info.fileList; - this.setState({ - fileList: appendFileSizeToUploadFileAll(fileList) - }); + if (info.file.status === 'uploading' || info.file.status === 'done') { + let fileList = info.fileList; + this.setState({ + fileList: appendFileSizeToUploadFileAll(fileList) + }); + } } onAttachmentRemove = (file) => { this.props.confirm({ @@ -624,7 +626,7 @@ class MemoNew extends Component { console.log('beforeUpload', file.name); const isLt150M = file.size / 1024 / 1024 < 150; if (!isLt150M) { - // message.error('文件大小必须小于150MB!'); + this.props.showNotification('文件大小必须小于150MB!'); } return isLt150M; }, From ad7c52aa14c113a65168b0b1cb5caa9cca462025 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Mon, 5 Aug 2019 17:34:55 +0800 Subject: [PATCH 343/623] =?UTF-8?q?=E8=AF=95=E5=8D=B7-=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/Exercisestatisticalresult.js | 79 ++++++++++++++++--- .../courses/exercise/Exercisetablesmubu.js | 51 +----------- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js index 34f32b234..d2b800b73 100644 --- a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js +++ b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js @@ -154,7 +154,7 @@ class Exercisestatisticalresult extends Component {
        }
        -
        +
        @@ -198,16 +198,70 @@ class Exercisestatisticalresult extends Component { .padtop24{ padding-top: 24px; } - + .exerciseTable .shixunreporttitle{ + padding:0px!important; + } + .exerciseTable .ant-table-thead > tr > th,.exerciseTable .ant-table-tbody > tr > td{ + padding:16px 20px!important; + } `} - + {/* 从子组件将样式提出来,不然会循环多次 */} + {data&&data.commit_results.map((item,key)=>{ - return( -
        -
        -
        +
        +
        +
        {item.ques_position+"."}{item.ques_type===0?"单选":item.ques_type===1?"多选":item.ques_type===2?"判断":item.ques_type===3?"填空":item.ques_type===4?"主观":item.ques_type===5?"实训":""}题
        {/*Q{item.ques_position}:*/} @@ -224,14 +278,15 @@ class Exercisestatisticalresult extends Component { item.ques_details.map((ite,k)=>{ return( -
        -
        -
        +
        +
        +
        {ite.challenge_position}:{ite.challenge_name}
        -
        正确率{ite.challenge_percent}%
        +
        正确率 {ite.challenge_percent}%
        - + {datas===undefined?"": Date: Mon, 5 Aug 2019 17:43:32 +0800 Subject: [PATCH 344/623] =?UTF-8?q?=E8=AF=B7=E8=BE=93=E5=85=A5=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E5=A7=93=E5=90=8D=EF=BC=8C=E6=9C=80=E5=A4=A7=E9=99=90?= =?UTF-8?q?=E5=88=B610=E4=B8=AA=E5=AD=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/account/AccountBasicEdit.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index aa7f9dec1..824e39438 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -398,7 +398,7 @@ class AccountBasic extends Component { callback(); return; } - callback('请输入您的姓名,最大限制10个字符'); + callback('请输入真实姓名,最大限制10个字符'); } render() { @@ -512,11 +512,11 @@ class AccountBasic extends Component { rules: [{ // initialValue: this.state.cityDefaultValue, required: true, - message: '请输入您的姓名,最大限制10个字符', + message: '请输入真实姓名,最大限制10个字符', validator: this.checkNameLength }], })( - this.showOrHide(showRealName)}> }> From 781cdc129de3e34680a7624bf350d69710ddfff0 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Mon, 5 Aug 2019 17:50:34 +0800 Subject: [PATCH 345/623] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/Exercisestatisticalresult.js | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js index d2b800b73..85ea6c902 100644 --- a/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js +++ b/public/react/src/modules/courses/exercise/Exercisestatisticalresult.js @@ -124,7 +124,7 @@ class Exercisestatisticalresult extends Component { } `} -
        +
        {data&&data.course_groups.length===0?"":
        @@ -204,6 +204,9 @@ class Exercisestatisticalresult extends Component { .exerciseTable .ant-table-thead > tr > th,.exerciseTable .ant-table-tbody > tr > td{ padding:16px 20px!important; } + .exerciseTable .editormd-html-preview{ + width:100%!important; + } `} {/* 从子组件将样式提出来,不然会循环多次 */} @@ -260,8 +263,8 @@ class Exercisestatisticalresult extends Component { {data&&data.commit_results.map((item,key)=>{ return(
        -
        -
        +
        +
        {item.ques_position+"."}{item.ques_type===0?"单选":item.ques_type===1?"多选":item.ques_type===2?"判断":item.ques_type===3?"填空":item.ques_type===4?"主观":item.ques_type===5?"实训":""}题
        {/*Q{item.ques_position}:*/} @@ -307,24 +310,20 @@ class Exercisestatisticalresult extends Component { })}
        - -
        - - - -
        + { + data && data.questions_count > 10 && +
        + +
        + } +
        From c0359dc57d1a4046176a9f92442fb55b839014eb Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Mon, 5 Aug 2019 18:01:44 +0800 Subject: [PATCH 346/623] 30 --- public/react/src/modules/paths/PathNew.js | 2 +- .../src/modules/user/account/AccountBasicEdit.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/paths/PathNew.js b/public/react/src/modules/paths/PathNew.js index 3acad7eed..04e391732 100644 --- a/public/react/src/modules/paths/PathNew.js +++ b/public/react/src/modules/paths/PathNew.js @@ -71,7 +71,7 @@ function create_editorMD(id, width, high, placeholder, imageUrl,initValue, callb } }); // 一个页面有多个md时,onload方法只执行了一次 - window.md_elocalStorage(editorName, `MemoQuestion_${id}`, `${id}`); + // window.md_elocalStorage(editorName, `MemoQuestion_${id}`, `${id}`); return editorName; } diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index 824e39438..ed55942c0 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -126,7 +126,7 @@ class AccountBasic extends Component { // 输入昵称时change剩余的字数 changeNickName=(e)=>{ - let num= 20 - parseInt(e.target.value.length); + let num= 30 - parseInt(e.target.value.length); this.setState({ nameLength:num < 0 ? 0 : num }) @@ -394,11 +394,11 @@ class AccountBasic extends Component { } } checkNameLength = (rule, value, callback) => { - if (value && value.length <= 10) { + if (value && value.length <= 30) { callback(); return; } - callback('请输入真实姓名,最大限制10个字符'); + callback('请输入真实姓名,最大限制30个字符'); } render() { @@ -498,8 +498,8 @@ class AccountBasic extends Component { message: '请输入您的昵称', }], })( - {String(nameLength)}/20 + {String(nameLength)}/30 }> )} @@ -512,11 +512,11 @@ class AccountBasic extends Component { rules: [{ // initialValue: this.state.cityDefaultValue, required: true, - message: '请输入真实姓名,最大限制10个字符', + message: '请输入真实姓名,最大限制30个字符', validator: this.checkNameLength }], })( - this.showOrHide(showRealName)}> }> From f946312abdfeaed4fdb241b2b263f98a6b0d93d0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 5 Aug 2019 18:03:16 +0800 Subject: [PATCH 347/623] =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E5=A7=93=E5=90=8D?= =?UTF-8?q?=E5=92=8C=E6=98=B5=E7=A7=B0=E9=95=BF=E5=BA=A6=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=B030?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/forms/users/update_account_form.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/forms/users/update_account_form.rb b/app/forms/users/update_account_form.rb index 16c3c8013..2a75a7d87 100644 --- a/app/forms/users/update_account_form.rb +++ b/app/forms/users/update_account_form.rb @@ -5,8 +5,8 @@ class Users::UpdateAccountForm attr_accessor :nickname, :name, :show_realname, :gender, :location, :location_city, :identity, :student_id, :technical_title, :school_id, :department_id - validates :nickname, presence: true, length: { maximum: 20 } - validates :name, presence: true, length: { maximum: 10 } + validates :nickname, presence: true, length: { maximum: 30 } + validates :name, presence: true, length: { maximum: 30 } validates :gender, presence: true, numericality: { only_integer: true }, inclusion: { in: [0, 1] } validates :location, presence: true validates :location_city, presence: true From d04c4c306d861794cf9e5840ba31a24fc26182eb Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 5 Aug 2019 18:10:27 +0800 Subject: [PATCH 348/623] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=A7=93=E5=90=8D?= =?UTF-8?q?=E5=92=8C=E6=98=B5=E7=A7=B0=E9=AA=8C=E8=AF=81=E5=8E=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/forms/users/update_account_form.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/forms/users/update_account_form.rb b/app/forms/users/update_account_form.rb index 2a75a7d87..16c3c8013 100644 --- a/app/forms/users/update_account_form.rb +++ b/app/forms/users/update_account_form.rb @@ -5,8 +5,8 @@ class Users::UpdateAccountForm attr_accessor :nickname, :name, :show_realname, :gender, :location, :location_city, :identity, :student_id, :technical_title, :school_id, :department_id - validates :nickname, presence: true, length: { maximum: 30 } - validates :name, presence: true, length: { maximum: 30 } + validates :nickname, presence: true, length: { maximum: 20 } + validates :name, presence: true, length: { maximum: 10 } validates :gender, presence: true, numericality: { only_integer: true }, inclusion: { in: [0, 1] } validates :location, presence: true validates :location_city, presence: true From 0ba752503ec44a1d192279f480f2695a1fef5ead Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Mon, 5 Aug 2019 18:32:23 +0800 Subject: [PATCH 349/623] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20190805061306_add_exec_time_to_evaluate_records.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/migrate/20190805061306_add_exec_time_to_evaluate_records.rb b/db/migrate/20190805061306_add_exec_time_to_evaluate_records.rb index 10af1733e..95edeb7d5 100644 --- a/db/migrate/20190805061306_add_exec_time_to_evaluate_records.rb +++ b/db/migrate/20190805061306_add_exec_time_to_evaluate_records.rb @@ -1,7 +1,7 @@ class AddExecTimeToEvaluateRecords < ActiveRecord::Migration[5.2] def change - remove_columns :evaluate_records, :exec_time if User.first.attributes.include?("exec_time") - - add_column :evaluate_records, :exec_time, :integer + # remove_columns :evaluate_records, :exec_time if EvaluateRecord.first.attributes.include?("exec_time") + # + # add_column :evaluate_records, :exec_time, :integer end end From 0fce5d58e7316bb9dae1939b12086b093a986b36 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Tue, 6 Aug 2019 10:29:46 +0800 Subject: [PATCH 350/623] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=A7=93=E5=90=8D=E8=B6=85=E5=87=BA=E7=9C=81=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/usersInfo/InfosPath.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/user/usersInfo/InfosPath.js b/public/react/src/modules/user/usersInfo/InfosPath.js index b7038b0e9..11f50ebf9 100644 --- a/public/react/src/modules/user/usersInfo/InfosPath.js +++ b/public/react/src/modules/user/usersInfo/InfosPath.js @@ -170,7 +170,7 @@ class InfosPath extends Component{

        12 ? item.owner_name : ''} style={{ maxWidth: '198px'}} + title={item.owner_name.length > 12 ? item.owner_name : ''} style={{ maxWidth: '175px'}} >{item.owner_name} From c414beaa5b465c6d6b96e05151708733ef79a5e5 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 10:33:50 +0800 Subject: [PATCH 351/623] https://www.trustie.net/issues/22810 --- .../courses/coursesPublic/Startshixuntask.js | 35 +++++++++++++++---- .../courses/shixunHomework/CommitSummary.js | 3 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/Startshixuntask.js b/public/react/src/modules/courses/coursesPublic/Startshixuntask.js index d146b5ef4..4075eff03 100644 --- a/public/react/src/modules/courses/coursesPublic/Startshixuntask.js +++ b/public/react/src/modules/courses/coursesPublic/Startshixuntask.js @@ -1,5 +1,5 @@ import React,{ Component } from "react"; -import { WordsBtn } from 'educoder'; +import { WordsBtn, getTaskUrlById } from 'educoder'; import {Tooltip,message,Modal,Spin} from 'antd'; import {Link} from 'react-router-dom'; import axios from 'axios'; @@ -44,6 +44,11 @@ class Startshixuntask extends Component{ startbtn:false }) }else{ + setTimeout(() => { + this.setState({ + startbtn: false, + }) + }, 1000) if(response.data.status!=401&&response.data.status!=403){ const w=window.open('about:blank'); @@ -156,13 +161,31 @@ class Startshixuntask extends Component{ {/*知道了*/} {/*

        */} - + + {/* 如果是继续实战和查看实战,实训作业这边,后台会直接返回identity,直接写成a标签 */} {this.props.isStudent? - {this.props.data&&this.props.data.task_operation&&this.props.data.task_operation?startbtn===false?this.taskoperationId( this.props.data&&this.props.data.task_operation[1])}> - {this.props.data&&this.props.data.task_operation[0]} - :"开启中":""} - :"" + {this.props.data&&this.props.data.task_operation&&this.props.data.task_operation?startbtn===false + ? + ((this.props.data && this.props.data.task_operation[1] && this.props.data.task_operation[1].indexOf('/') == -1) ? + + {this.props.data.task_operation[0]} + + : + this.taskoperationId( this.props.data&&this.props.data.task_operation[1])}> + {this.props.data&&this.props.data.task_operation[0]} + ) + :"开启中":""} + + :"" } diff --git a/public/react/src/modules/courses/shixunHomework/CommitSummary.js b/public/react/src/modules/courses/shixunHomework/CommitSummary.js index 728d86f96..db6180a5c 100644 --- a/public/react/src/modules/courses/shixunHomework/CommitSummary.js +++ b/public/react/src/modules/courses/shixunHomework/CommitSummary.js @@ -133,7 +133,8 @@ class CommitSummary extends Component{

        this.gotohome()}>{data === undefined ? "" :data.course_name===undefined?"": data.course_name} > - {data === undefined ? "" :data.category===undefined?"":data.category.category_name} > 作业详情 From 553c13a647f3fa960f85a91994afac7c989bcaae Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 10:33:58 +0800 Subject: [PATCH 352/623] length --- .../src/modules/user/account/AccountBasicEdit.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index ed55942c0..d2e5b0670 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -18,6 +18,8 @@ export function getHiddenName(name) { const newName = name.substr(0,1)+str; return newName } +const MAX_NAME_LENGTH = 10 +const MAX_NICKNAME_LENGTH = 20 class AccountBasic extends Component { constructor(props){ super(props); @@ -126,7 +128,7 @@ class AccountBasic extends Component { // 输入昵称时change剩余的字数 changeNickName=(e)=>{ - let num= 30 - parseInt(e.target.value.length); + let num= MAX_NICKNAME_LENGTH - parseInt(e.target.value.length); this.setState({ nameLength:num < 0 ? 0 : num }) @@ -394,11 +396,11 @@ class AccountBasic extends Component { } } checkNameLength = (rule, value, callback) => { - if (value && value.length <= 30) { + if (value && value.length <= MAX_NAME_LENGTH) { callback(); return; } - callback('请输入真实姓名,最大限制30个字符'); + callback(`请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`); } render() { @@ -498,8 +500,8 @@ class AccountBasic extends Component { message: '请输入您的昵称', }], })( - {String(nameLength)}/30 + {String(nameLength)}/{MAX_NICKNAME_LENGTH} }> )} @@ -512,11 +514,11 @@ class AccountBasic extends Component { rules: [{ // initialValue: this.state.cityDefaultValue, required: true, - message: '请输入真实姓名,最大限制30个字符', + message: `请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`, validator: this.checkNameLength }], })( - this.showOrHide(showRealName)}> }> From c3e287cff8a7db1ae043d82cfc6fe5754002be26 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Tue, 6 Aug 2019 10:47:35 +0800 Subject: [PATCH 353/623] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E5=A7=93=E5=90=8D=E8=BF=87=E9=95=BF=E7=9C=81=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/usersInfo/InfosCourse.js | 2 +- public/react/src/modules/user/usersInfo/InfosProject.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/InfosCourse.js b/public/react/src/modules/user/usersInfo/InfosCourse.js index 2f7d206b8..bff9792e7 100644 --- a/public/react/src/modules/user/usersInfo/InfosCourse.js +++ b/public/react/src/modules/user/usersInfo/InfosCourse.js @@ -157,7 +157,7 @@ class InfosCourse extends Component{ {item.name}

        用户 -

        {item.teacher && item.teacher.real_name}

        +

        {item.teacher && item.teacher.real_name}

        {item.teacher && item.teacher.school_name}

        diff --git a/public/react/src/modules/user/usersInfo/InfosProject.js b/public/react/src/modules/user/usersInfo/InfosProject.js index 195e98b73..c4ce920f0 100644 --- a/public/react/src/modules/user/usersInfo/InfosProject.js +++ b/public/react/src/modules/user/usersInfo/InfosProject.js @@ -151,7 +151,7 @@ class InfosProject extends Component{ {item.name}

        用户 -

        {item.owner.real_name}

        +

        {item.owner.real_name}

        {item.owner.school_name}

        From 90dd68e5b48c5f58e925dbe7a0e7ac360c00cb29 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 11:08:04 +0800 Subject: [PATCH 354/623] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/shixunHomework/CommitSummary.js | 4 ++-- public/react/src/modules/forums/RecommendShixun.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/CommitSummary.js b/public/react/src/modules/courses/shixunHomework/CommitSummary.js index db6180a5c..69c88eb38 100644 --- a/public/react/src/modules/courses/shixunHomework/CommitSummary.js +++ b/public/react/src/modules/courses/shixunHomework/CommitSummary.js @@ -130,7 +130,7 @@ class CommitSummary extends Component{ height:'20px' }} >
        -

        +

        this.gotohome()}>{data === undefined ? "" :data.course_name===undefined?"": data.course_name} > {/* style="grey" */} @@ -143,7 +143,7 @@ class CommitSummary extends Component{

        -

        修改总结

        +

        {this.state.description ? '修改总结' : '提交总结'}

        this.gotohome()} className="color-grey-6 fr font-16 ml30 mt10">返回
        {/*educontentbox*/} diff --git a/public/react/src/modules/forums/RecommendShixun.js b/public/react/src/modules/forums/RecommendShixun.js index af0ca0007..535b027cc 100644 --- a/public/react/src/modules/forums/RecommendShixun.js +++ b/public/react/src/modules/forums/RecommendShixun.js @@ -32,7 +32,7 @@ class RecommendShixun extends Component {
        - 9 ? _shixun.name : ''} className="color-grey-6 task-hide mb10 recomment-name" style={{maxWidth:'147px'}}> {_shixun.name} From e0004e029d16d68ca53700f7d2c4e37697a5e3b3 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 14:28:59 +0800 Subject: [PATCH 355/623] title --- public/react/src/modules/forums/MemoDetail.js | 2 +- public/react/src/modules/forums/PostItem.js | 2 +- public/react/src/modules/forums/RightHotQuestion.js | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/forums/MemoDetail.js b/public/react/src/modules/forums/MemoDetail.js index fb435fdf3..5a042a173 100644 --- a/public/react/src/modules/forums/MemoDetail.js +++ b/public/react/src/modules/forums/MemoDetail.js @@ -693,7 +693,7 @@ class MemoDetail extends Component {
        {/* overflowHidden1 */} - {memo.subject + memo.subject} + {memo.subject} { memo.sticky && 置顶} diff --git a/public/react/src/modules/forums/PostItem.js b/public/react/src/modules/forums/PostItem.js index 43b63c3fa..99dcab46d 100644 --- a/public/react/src/modules/forums/PostItem.js +++ b/public/react/src/modules/forums/PostItem.js @@ -79,7 +79,7 @@ class PostItem extends Component {

        - { user && (user.admin === true || user.user_id === memo.author_id) && + { user && (user.admin === true || user.login === memo.login) &&
          diff --git a/public/react/src/modules/forums/RightHotQuestion.js b/public/react/src/modules/forums/RightHotQuestion.js index 35ab37644..d5e7ce713 100644 --- a/public/react/src/modules/forums/RightHotQuestion.js +++ b/public/react/src/modules/forums/RightHotQuestion.js @@ -24,7 +24,9 @@ class RightHotQuestion extends Component { } return hot_memos.map((item, index) => { return
          - + 15 ? item.subject : '' } + > {item.subject}

          From d77d873787a776df0151bd9fbc388295ce024512 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 14:49:36 +0800 Subject: [PATCH 356/623] index --- public/react/src/modules/page/tpiPage.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/page/tpiPage.css b/public/react/src/modules/page/tpiPage.css index 55e75059d..fe71de64f 100644 --- a/public/react/src/modules/page/tpiPage.css +++ b/public/react/src/modules/page/tpiPage.css @@ -13,9 +13,11 @@ margin-top: -20px; margin-left: -17px; left: 50%; - top: 50%; + top: 50%; + /* .editormd-preview 有个 z-index 99 某些情况下,被cm盖住了 */ z-index: 50; } + .b-label>.resize-helper button{ width: 24px; height: 24px; @@ -64,6 +66,7 @@ ,#game_show_content #tab_con_5 .editormd-preview { width: 100% !important; height: 100% !important; + z-index: 20; } /* tab 样式覆盖 */ From 8960cc62164451b05d38c770e98f0c0e3e26d282 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 14:52:51 +0800 Subject: [PATCH 357/623] showHiddenButton={true} --- public/react/src/modules/comment/CommentContainer.js | 1 + public/react/src/modules/comment/Comments.js | 6 +++++- public/react/src/modules/tpm/TPMShixunDiscuss.js | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/comment/CommentContainer.js b/public/react/src/modules/comment/CommentContainer.js index 0e12d0e7d..b02f4094f 100644 --- a/public/react/src/modules/comment/CommentContainer.js +++ b/public/react/src/modules/comment/CommentContainer.js @@ -15,6 +15,7 @@ class CommentContainer extends Component { diff --git a/public/react/src/modules/comment/Comments.js b/public/react/src/modules/comment/Comments.js index 380b90bd9..ae246197c 100644 --- a/public/react/src/modules/comment/Comments.js +++ b/public/react/src/modules/comment/Comments.js @@ -58,6 +58,9 @@ const _origin = window.location.origin; comment_count_without_reply currentPage comments + + showRewardButton 是否显示奖励按钮 + showHiddenButton 是否显示隐藏按钮 接口 deleteComment 删除 @@ -360,7 +363,8 @@ class Comments extends Component { :""} - { (this.props.onlySuperAdminCouldHide && item.isSuperAdmin || !this.props.onlySuperAdminCouldHide && item.admin === true) ? + { this.props.showHiddenButton == true + && (this.props.onlySuperAdminCouldHide && item.isSuperAdmin || !this.props.onlySuperAdminCouldHide && item.admin === true) ? this.onCommentBtnClick(item, '', item.hidden ? 'hiddenCancel' : 'hidden') }> diff --git a/public/react/src/modules/tpm/TPMShixunDiscuss.js b/public/react/src/modules/tpm/TPMShixunDiscuss.js index 58830620a..9350060cc 100644 --- a/public/react/src/modules/tpm/TPMShixunDiscuss.js +++ b/public/react/src/modules/tpm/TPMShixunDiscuss.js @@ -50,6 +50,7 @@ class TPMShixunDiscuss extends Component { // onPaginationChange={this.onPaginationChange} // Date: Tue, 6 Aug 2019 14:58:20 +0800 Subject: [PATCH 358/623] =?UTF-8?q?=E5=B8=96=E5=AD=90=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=81=9A=E6=98=AF=E5=90=A6=E5=AE=8C=E5=96=84=E8=B5=84=E6=96=99?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/users/banks.js | 2 ++ app/assets/stylesheets/users/banks.scss | 3 +++ app/controllers/memos_controller.rb | 1 + app/controllers/users/banks_controller.rb | 8 ++++++++ app/helpers/users/banks_helper.rb | 2 ++ spec/controllers/users/banks_controller_spec.rb | 5 +++++ spec/helpers/users/banks_helper_spec.rb | 15 +++++++++++++++ 7 files changed, 36 insertions(+) create mode 100644 app/assets/javascripts/users/banks.js create mode 100644 app/assets/stylesheets/users/banks.scss create mode 100644 app/controllers/users/banks_controller.rb create mode 100644 app/helpers/users/banks_helper.rb create mode 100644 spec/controllers/users/banks_controller_spec.rb create mode 100644 spec/helpers/users/banks_helper_spec.rb diff --git a/app/assets/javascripts/users/banks.js b/app/assets/javascripts/users/banks.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/users/banks.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/users/banks.scss b/app/assets/stylesheets/users/banks.scss new file mode 100644 index 000000000..6f7c19148 --- /dev/null +++ b/app/assets/stylesheets/users/banks.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the users/banks controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb index 7bb36a8a0..ac60f9f41 100644 --- a/app/controllers/memos_controller.rb +++ b/app/controllers/memos_controller.rb @@ -1,5 +1,6 @@ class MemosController < ApplicationController before_action :require_login, except: [:show, :index] + before_action :check_account, only: [:new, :create, :reply] before_action :set_memo, only: [:show, :edit, :update, :destroy, :sticky_or_cancel, :hidden, :more_reply] before_action :validate_memo_params, only: [:create, :update] before_action :owner_or_admin, only: [:edit, :update, :destroy] diff --git a/app/controllers/users/banks_controller.rb b/app/controllers/users/banks_controller.rb new file mode 100644 index 000000000..c9a6a8c48 --- /dev/null +++ b/app/controllers/users/banks_controller.rb @@ -0,0 +1,8 @@ +class Users::BanksController < Users::BaseController + def index + + end + + private + +end diff --git a/app/helpers/users/banks_helper.rb b/app/helpers/users/banks_helper.rb new file mode 100644 index 000000000..c57477794 --- /dev/null +++ b/app/helpers/users/banks_helper.rb @@ -0,0 +1,2 @@ +module Users::BanksHelper +end diff --git a/spec/controllers/users/banks_controller_spec.rb b/spec/controllers/users/banks_controller_spec.rb new file mode 100644 index 000000000..80abbaddc --- /dev/null +++ b/spec/controllers/users/banks_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Users::BanksController, type: :controller do + +end diff --git a/spec/helpers/users/banks_helper_spec.rb b/spec/helpers/users/banks_helper_spec.rb new file mode 100644 index 000000000..3148e62e9 --- /dev/null +++ b/spec/helpers/users/banks_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the Users::BanksHelper. For example: +# +# describe Users::BanksHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe Users::BanksHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end From 291c2fa674de5124434f3a6fb03c54ced111a377 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 6 Aug 2019 15:09:05 +0800 Subject: [PATCH 359/623] =?UTF-8?q?=E5=B8=96=E5=AD=90=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=81=9A=E6=98=AF=E5=90=A6=E5=AE=8C=E5=96=84=E8=B5=84=E6=96=99?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/memos_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb index ac60f9f41..88139fe7e 100644 --- a/app/controllers/memos_controller.rb +++ b/app/controllers/memos_controller.rb @@ -1,6 +1,6 @@ class MemosController < ApplicationController before_action :require_login, except: [:show, :index] - before_action :check_account, only: [:new, :create, :reply] + before_action :check_account, only: [:new, :create] before_action :set_memo, only: [:show, :edit, :update, :destroy, :sticky_or_cancel, :hidden, :more_reply] before_action :validate_memo_params, only: [:create, :update] before_action :owner_or_admin, only: [:edit, :update, :destroy] From 5fdbbcd319e775572a405a2ccae58567681aae5c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Tue, 6 Aug 2019 16:12:37 +0800 Subject: [PATCH 360/623] LinkAfterLogin --- .../src/common/components/LinkAfterLogin.js | 23 +++++++++++++++ public/react/src/common/educoder.js | 1 + .../src/modules/forums/RightMyPublish.js | 4 +-- public/react/src/modules/tpm/TPMIndexHOC.js | 29 +++++++++++++++++-- 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 public/react/src/common/components/LinkAfterLogin.js diff --git a/public/react/src/common/components/LinkAfterLogin.js b/public/react/src/common/components/LinkAfterLogin.js new file mode 100644 index 000000000..d0df08f0a --- /dev/null +++ b/public/react/src/common/components/LinkAfterLogin.js @@ -0,0 +1,23 @@ +import React, { Component } from 'react'; + +// 登录后才能跳转 +class LinkAfterLogin extends Component { + + constructor(props) { + super(props); + } + checkAuth = () => { + if (this.props.checkIfLogin()) { + this.props.history.push(this.props.to) + } else { + this.props.showLoginDialog() + } + } + render() { + return( + {this.props.children} + ) + } +} + +export default LinkAfterLogin; \ No newline at end of file diff --git a/public/react/src/common/educoder.js b/public/react/src/common/educoder.js index 2afbca8d1..2074e495a 100644 --- a/public/react/src/common/educoder.js +++ b/public/react/src/common/educoder.js @@ -36,6 +36,7 @@ export { ModalHOC } from './components/ModalHOC' export { SetAppModel } from './components/SetAppModel' +export { default as LinkAfterLogin } from './components/LinkAfterLogin' export { default as Cropper } from './components/Cropper' export { default as ConditionToolTip } from './components/ConditionToolTip' export { default as DragValidator } from './components/DragValidator' diff --git a/public/react/src/modules/forums/RightMyPublish.js b/public/react/src/modules/forums/RightMyPublish.js index 94a09f7d9..fc101ae30 100644 --- a/public/react/src/modules/forums/RightMyPublish.js +++ b/public/react/src/modules/forums/RightMyPublish.js @@ -7,7 +7,7 @@ import PropTypes from 'prop-types'; import classNames from 'classnames' -import { getImageUrl, toPath } from 'educoder' +import { getImageUrl, toPath, LinkAfterLogin } from 'educoder' import match_adImg from '../../images/ad/match_ad.jpg' const $ = window.$ @@ -58,7 +58,7 @@ class RightMyPublish extends Component {

          - 发布话题 + 发布话题 {/*

          我的发布
          {my_memos_count} diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index bbb2eb97d..0361b090f 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -9,6 +9,7 @@ import { getUrl } from 'educoder' import axios from 'axios'; import './TPMIndex.css' +import LoginDialog from '../login/LoginDialog'; import Trialapplication from "../login/Trialapplication"; // import "antd/dist/antd.css"; // import '../../css/educoder/edu-common.css' @@ -74,6 +75,8 @@ export function TPMIndexHOC(WrappedComponent) { Headertop:undefined, Footerdown:undefined, coursedata: {}, + + isRender: false } } @@ -286,9 +289,22 @@ export function TPMIndexHOC(WrappedComponent) { }).catch((error) => { console.log(error) }) + } + hideLoginDialog = () => { + this.setState({ + isRender: false + }) + } + showLoginDialog = () => { + this.setState({ + isRender: true + }) + } + checkIfLogin = () => { + return this.state.current_user && this.state.current_user.login != '' } render() { - let{Headertop,Footerdown}=this.state; + let{Headertop,Footerdown, isRender}=this.state; const common = { isSuperAdmin:this.isSuperAdmin, isAdminOrCreator:this.isAdminOrCreator, @@ -299,11 +315,18 @@ export function TPMIndexHOC(WrappedComponent) { isAdminOrStudent: this.isAdminOrStudent, isNotMember: this.isNotMember, isUserid:this.state.coursedata&&this.state.coursedata.userid, - fetchUser: this.fetchUser + fetchUser: this.fetchUser, + + showLoginDialog: this.showLoginDialog, + checkIfLogin: this.checkIfLogin, } return (

          - + {isRender===true ? this.hideLoginDialog()} + {...this.state} + {...this.props} + /> : ""} {/* 注释掉了1440 影响到了手机屏幕的展示 */} '; +$('link[rel=stylesheet]').eq(0).before(cssHtml); + +}); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-inputmask/inputmask.js b/public/admin/Coco/assets/libs/bootstrap-inputmask/inputmask.js new file mode 100644 index 000000000..a8010ea8f --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-inputmask/inputmask.js @@ -0,0 +1,360 @@ +/* =========================================================== + * Bootstrap: inputmask.js v3.1.0 + * http://jasny.github.io/bootstrap/javascript/#inputmask + * + * Based on Masked Input plugin by Josh Bush (digitalbush.com) + * =========================================================== + * Copyright 2012-2014 Arnold Daniels + * + * Licensed 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 + * + * 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. + * ========================================================== */ + ++function ($) { "use strict"; + + var isIphone = (window.orientation !== undefined) + var isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1 + var isIE = window.navigator.appName == 'Microsoft Internet Explorer' + + // INPUTMASK PUBLIC CLASS DEFINITION + // ================================= + + var Inputmask = function (element, options) { + if (isAndroid) return // No support because caret positioning doesn't work on Android + + this.$element = $(element) + this.options = $.extend({}, Inputmask.DEFAULTS, options) + this.mask = String(this.options.mask) + + this.init() + this.listen() + + this.checkVal() //Perform initial check for existing values + } + + Inputmask.DEFAULTS = { + mask: "", + placeholder: "_", + definitions: { + '9': "[0-9]", + 'a': "[A-Za-z]", + 'w': "[A-Za-z0-9]", + '*': "." + } + } + + Inputmask.prototype.init = function() { + var defs = this.options.definitions + var len = this.mask.length + + this.tests = [] + this.partialPosition = this.mask.length + this.firstNonMaskPos = null + + $.each(this.mask.split(""), $.proxy(function(i, c) { + if (c == '?') { + len-- + this.partialPosition = i + } else if (defs[c]) { + this.tests.push(new RegExp(defs[c])) + if (this.firstNonMaskPos === null) + this.firstNonMaskPos = this.tests.length - 1 + } else { + this.tests.push(null) + } + }, this)) + + this.buffer = $.map(this.mask.split(""), $.proxy(function(c, i) { + if (c != '?') return defs[c] ? this.options.placeholder : c + }, this)) + + this.focusText = this.$element.val() + + this.$element.data("rawMaskFn", $.proxy(function() { + return $.map(this.buffer, function(c, i) { + return this.tests[i] && c != this.options.placeholder ? c : null + }).join('') + }, this)) + } + + Inputmask.prototype.listen = function() { + if (this.$element.attr("readonly")) return + + var pasteEventName = (isIE ? 'paste' : 'input') + ".mask" + + this.$element + .on("unmask.bs.inputmask", $.proxy(this.unmask, this)) + + .on("focus.bs.inputmask", $.proxy(this.focusEvent, this)) + .on("blur.bs.inputmask", $.proxy(this.blurEvent, this)) + + .on("keydown.bs.inputmask", $.proxy(this.keydownEvent, this)) + .on("keypress.bs.inputmask", $.proxy(this.keypressEvent, this)) + + .on(pasteEventName, $.proxy(this.pasteEvent, this)) + } + + //Helper Function for Caret positioning + Inputmask.prototype.caret = function(begin, end) { + if (this.$element.length === 0) return + if (typeof begin == 'number') { + end = (typeof end == 'number') ? end : begin + return this.$element.each(function() { + if (this.setSelectionRange) { + this.setSelectionRange(begin, end) + } else if (this.createTextRange) { + var range = this.createTextRange() + range.collapse(true) + range.moveEnd('character', end) + range.moveStart('character', begin) + range.select() + } + }) + } else { + if (this.$element[0].setSelectionRange) { + begin = this.$element[0].selectionStart + end = this.$element[0].selectionEnd + } else if (document.selection && document.selection.createRange) { + var range = document.selection.createRange() + begin = 0 - range.duplicate().moveStart('character', -100000) + end = begin + range.text.length + } + return { + begin: begin, + end: end + } + } + } + + Inputmask.prototype.seekNext = function(pos) { + var len = this.mask.length + while (++pos <= len && !this.tests[pos]); + + return pos + } + + Inputmask.prototype.seekPrev = function(pos) { + while (--pos >= 0 && !this.tests[pos]); + + return pos + } + + Inputmask.prototype.shiftL = function(begin,end) { + var len = this.mask.length + + if (begin < 0) return + + for (var i = begin, j = this.seekNext(end); i < len; i++) { + if (this.tests[i]) { + if (j < len && this.tests[i].test(this.buffer[j])) { + this.buffer[i] = this.buffer[j] + this.buffer[j] = this.options.placeholder + } else + break + j = this.seekNext(j) + } + } + this.writeBuffer() + this.caret(Math.max(this.firstNonMaskPos, begin)) + } + + Inputmask.prototype.shiftR = function(pos) { + var len = this.mask.length + + for (var i = pos, c = this.options.placeholder; i < len; i++) { + if (this.tests[i]) { + var j = this.seekNext(i) + var t = this.buffer[i] + this.buffer[i] = c + if (j < len && this.tests[j].test(t)) + c = t + else + break + } + } + }, + + Inputmask.prototype.unmask = function() { + this.$element + .unbind(".mask") + .removeData("inputmask") + } + + Inputmask.prototype.focusEvent = function() { + this.focusText = this.$element.val() + var len = this.mask.length + var pos = this.checkVal() + this.writeBuffer() + + var that = this + var moveCaret = function() { + if (pos == len) + that.caret(0, pos) + else + that.caret(pos) + } + + moveCaret() + setTimeout(moveCaret, 50) + } + + Inputmask.prototype.blurEvent = function() { + this.checkVal() + if (this.$element.val() !== this.focusText) + this.$element.trigger('change') + } + + Inputmask.prototype.keydownEvent = function(e) { + var k = e.which + + //backspace, delete, and escape get special treatment + if (k == 8 || k == 46 || (isIphone && k == 127)) { + var pos = this.caret(), + begin = pos.begin, + end = pos.end + + if (end - begin === 0) { + begin = k != 46 ? this.seekPrev(begin) : (end = this.seekNext(begin - 1)) + end = k == 46 ? this.seekNext(end) : end + } + this.clearBuffer(begin, end) + this.shiftL(begin, end - 1) + + return false + } else if (k == 27) {//escape + this.$element.val(this.focusText) + this.caret(0, this.checkVal()) + return false + } + } + + Inputmask.prototype.keypressEvent = function(e) { + var len = this.mask.length + + var k = e.which, + pos = this.caret() + + if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore + return true + } else if (k) { + if (pos.end - pos.begin !== 0) { + this.clearBuffer(pos.begin, pos.end) + this.shiftL(pos.begin, pos.end - 1) + } + + var p = this.seekNext(pos.begin - 1) + if (p < len) { + var c = String.fromCharCode(k) + if (this.tests[p].test(c)) { + this.shiftR(p) + this.buffer[p] = c + this.writeBuffer() + var next = this.seekNext(p) + this.caret(next) + } + } + return false + } + } + + Inputmask.prototype.pasteEvent = function() { + var that = this + + setTimeout(function() { + that.caret(that.checkVal(true)) + }, 0) + } + + Inputmask.prototype.clearBuffer = function(start, end) { + var len = this.mask.length + + for (var i = start; i < end && i < len; i++) { + if (this.tests[i]) + this.buffer[i] = this.options.placeholder + } + } + + Inputmask.prototype.writeBuffer = function() { + return this.$element.val(this.buffer.join('')).val() + } + + Inputmask.prototype.checkVal = function(allow) { + var len = this.mask.length + //try to place characters where they belong + var test = this.$element.val() + var lastMatch = -1 + + for (var i = 0, pos = 0; i < len; i++) { + if (this.tests[i]) { + this.buffer[i] = this.options.placeholder + while (pos++ < test.length) { + var c = test.charAt(pos - 1) + if (this.tests[i].test(c)) { + this.buffer[i] = c + lastMatch = i + break + } + } + if (pos > test.length) + break + } else if (this.buffer[i] == test.charAt(pos) && i != this.partialPosition) { + pos++ + lastMatch = i + } + } + if (!allow && lastMatch + 1 < this.partialPosition) { + this.$element.val("") + this.clearBuffer(0, len) + } else if (allow || lastMatch + 1 >= this.partialPosition) { + this.writeBuffer() + if (!allow) this.$element.val(this.$element.val().substring(0, lastMatch + 1)) + } + return (this.partialPosition ? i : this.firstNonMaskPos) + } + + + // INPUTMASK PLUGIN DEFINITION + // =========================== + + var old = $.fn.inputmask + + $.fn.inputmask = function (options) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.inputmask') + + if (!data) $this.data('bs.inputmask', (data = new Inputmask(this, options))) + }) + } + + $.fn.inputmask.Constructor = Inputmask + + + // INPUTMASK NO CONFLICT + // ==================== + + $.fn.inputmask.noConflict = function () { + $.fn.inputmask = old + return this + } + + + // INPUTMASK DATA-API + // ================== + + $(document).on('focus.bs.inputmask.data-api', '[data-mask]', function (e) { + var $this = $(this) + if ($this.data('bs.inputmask')) return + $this.inputmask($this.data()) + }) + +}(window.jQuery); diff --git a/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.css b/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.css new file mode 100644 index 000000000..36fd6900e --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.css @@ -0,0 +1,7 @@ +/*! + * bootstrap-select v1.4.2 + * http://silviomoreto.github.io/bootstrap-select/ + * + * Copyright 2013 bootstrap-select + * Licensed under the MIT license + */.bootstrap-select.btn-group,.bootstrap-select.btn-group[class*="span"]{float:none;display:inline-block;margin-bottom:10px;margin-left:0}.form-search .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group{margin-bottom:0}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:0}.bootstrap-select.btn-group.pull-right,.bootstrap-select.btn-group[class*="span"].pull-right,.row-fluid .bootstrap-select.btn-group[class*="span"].pull-right{float:right}.input-append .bootstrap-select.btn-group{margin-left:-1px}.input-prepend .bootstrap-select.btn-group{margin-right:-1px}.bootstrap-select:not([class*="span"]):not([class*="col-"]):not([class*="form-control"]){width:220px}.bootstrap-select{width:220px\0}.bootstrap-select.form-control:not([class*="span"]){width:100%}.bootstrap-select>.btn{width:100%}.error .bootstrap-select .btn{border:1px solid #b94a48}.dropdown-menu{z-index:2000}.bootstrap-select.show-menu-arrow.open>.btn{z-index:2051}.bootstrap-select .btn:focus{outline:thin dotted #333 !important;outline:5px auto -webkit-focus-ring-color !important;outline-offset:-2px}.bootstrap-select.btn-group .btn .filter-option{overflow:hidden;position:absolute;left:12px;right:25px;text-align:left}.bootstrap-select.btn-group .btn .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group>.disabled,.bootstrap-select.btn-group .dropdown-menu li.disabled>a{cursor:not-allowed}.bootstrap-select.btn-group>.disabled:focus{outline:none !important}.bootstrap-select.btn-group[class*="span"] .btn{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{position:static;border:0;padding:0;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu dt{display:block;padding:3px 20px;cursor:default}.bootstrap-select.btn-group .div-contain{overflow:hidden}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li>a.opt{position:relative;padding-left:35px}.bootstrap-select.btn-group .dropdown-menu li>a{cursor:pointer}.bootstrap-select.btn-group .dropdown-menu li>dt small{font-weight:normal}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a i.check-mark{display:inline-block;position:absolute;right:15px;margin-top:2.5px}.bootstrap-select.btn-group .dropdown-menu li a i.check-mark{display:none}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:.5em}.bootstrap-select.btn-group .dropdown-menu li:not(.disabled)>a:hover small,.bootstrap-select.btn-group .dropdown-menu li:not(.disabled)>a:focus small,.bootstrap-select.btn-group .dropdown-menu li.active:not(.disabled)>a small{color:#64b1d8;color:rgba(255,255,255,0.4)}.bootstrap-select.btn-group .dropdown-menu li>dt small{font-weight:normal}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #CCC;border-bottom-color:rgba(0,0,0,0.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after{display:block}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px}.mobile-device{position:absolute;top:0;left:0;display:block !important;width:100%;height:100% !important;opacity:0}.bootstrap-select.fit-width{width:auto !important}.bootstrap-select.btn-group.fit-width .btn .filter-option{position:static}.bootstrap-select.btn-group.fit-width .btn .caret{position:static;top:auto;margin-top:-1px}.control-group.error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select-searchbox{padding:4px 8px}.bootstrap-select-searchbox input{margin-bottom:0} diff --git a/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.js b/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.js new file mode 100644 index 000000000..cd4f7fe27 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-select/bootstrap-select.min.js @@ -0,0 +1,8 @@ +/*! + * bootstrap-select v1.4.2 + * http://silviomoreto.github.io/bootstrap-select/ + * + * Copyright 2013 bootstrap-select + * Licensed under the MIT license + */ +;!function(b){b.expr[":"].icontains=function(e,c,d){return b(e).text().toUpperCase().indexOf(d[3].toUpperCase())>=0};var a=function(d,c,f){if(f){f.stopPropagation();f.preventDefault()}this.$element=b(d);this.$newElement=null;this.$button=null;this.$menu=null;this.options=b.extend({},b.fn.selectpicker.defaults,this.$element.data(),typeof c=="object"&&c);if(this.options.title===null){this.options.title=this.$element.attr("title")}this.val=a.prototype.val;this.render=a.prototype.render;this.refresh=a.prototype.refresh;this.setStyle=a.prototype.setStyle;this.selectAll=a.prototype.selectAll;this.deselectAll=a.prototype.deselectAll;this.init()};a.prototype={constructor:a,init:function(){this.$element.hide();this.multiple=this.$element.prop("multiple");var d=this.$element.attr("id");this.$newElement=this.createView();this.$element.after(this.$newElement);this.$menu=this.$newElement.find("> .dropdown-menu");this.$button=this.$newElement.find("> button");this.$searchbox=this.$newElement.find("input");if(d!==undefined){var c=this;this.$button.attr("data-id",d);b('label[for="'+d+'"]').click(function(f){f.preventDefault();c.$button.focus()})}this.checkDisabled();this.clickListener();if(this.options.liveSearch){this.liveSearchListener()}this.render();this.liHeight();this.setStyle();this.setWidth();if(this.options.container){this.selectPosition()}this.$menu.data("this",this);this.$newElement.data("this",this)},createDropdown:function(){var c=this.multiple?" show-tick":"";var f=this.options.header?'
          '+this.options.header+"
          ":"";var e=this.options.liveSearch?'':"";var d='
          ';return b(d)},createView:function(){var c=this.createDropdown();var d=this.createLi();c.find("ul").append(d);return c},reloadLi:function(){this.destroyLi();var c=this.createLi();this.$menu.find("ul").append(c)},destroyLi:function(){this.$menu.find("li").remove()},createLi:function(){var d=this,e=[],c="";this.$element.find("option").each(function(){var i=b(this);var g=i.attr("class")||"";var h=i.attr("style")||"";var m=i.data("content")?i.data("content"):i.html();var k=i.data("subtext")!==undefined?''+i.data("subtext")+"":"";var j=i.data("icon")!==undefined?' ':"";if(j!==""&&(i.is(":disabled")||i.parent().is(":disabled"))){j=""+j+""}if(!i.data("content")){m=j+''+m+k+""}if(d.options.hideDisabled&&(i.is(":disabled")||i.parent().is(":disabled"))){e.push('')}else{if(i.parent().is("optgroup")&&i.data("divider")!==true){if(i.index()===0){var l=i.parent().attr("label");var n=i.parent().data("subtext")!==undefined?''+i.parent().data("subtext")+"":"";var f=i.parent().data("icon")?' ':"";l=f+''+l+n+"";if(i[0].index!==0){e.push('
          '+l+"
          "+d.createA(m,"opt "+g,h))}else{e.push("
          "+l+"
          "+d.createA(m,"opt "+g,h))}}else{e.push(d.createA(m,"opt "+g,h))}}else{if(i.data("divider")===true){e.push('
          ')}else{if(b(this).data("hidden")===true){e.push("")}else{e.push(d.createA(m,g,h))}}}}});b.each(e,function(f,g){c+="
        • "+g+"
        • "});if(!this.multiple&&this.$element.find("option:selected").length===0&&!this.options.title){this.$element.find("option").eq(0).prop("selected",true).attr("selected","selected")}return b(c)},createA:function(e,c,d){return''+e+''},render:function(){var d=this;this.$element.find("option").each(function(h){d.setDisabled(h,b(this).is(":disabled")||b(this).parent().is(":disabled"));d.setSelected(h,b(this).is(":selected"))});this.tabIndex();var g=this.$element.find("option:selected").map(function(){var j=b(this);var i=j.data("icon")&&d.options.showIcon?' ':"";var h;if(d.options.showSubtext&&j.attr("data-subtext")&&!d.multiple){h=' '+j.data("subtext")+""}else{h=""}if(j.data("content")&&d.options.showContent){return j.data("content")}else{if(j.attr("title")!==undefined){return j.attr("title")}else{return i+j.html()+h}}}).toArray();var f=!this.multiple?g[0]:g.join(this.options.multipleSeparator);if(this.multiple&&this.options.selectedTextFormat.indexOf("count")>-1){var c=this.options.selectedTextFormat.split(">");var e=this.options.hideDisabled?":not([disabled])":"";if((c.length>1&&g.length>c[1])||(c.length==1&&g.length>=2)){f=this.options.countSelectedText.replace("{0}",g.length).replace("{1}",this.$element.find('option:not([data-divider="true"]):not([data-hidden="true"])'+e).length)}}if(!f){f=this.options.title!==undefined?this.options.title:this.options.noneSelectedText}this.$button.attr("title",b.trim(f));this.$newElement.find(".filter-option").html(f)},setStyle:function(e,d){if(this.$element.attr("class")){this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device/gi,""))}var c=e?e:this.options.style;if(d=="add"){this.$button.addClass(c)}else{if(d=="remove"){this.$button.removeClass(c)}else{this.$button.removeClass(this.options.style);this.$button.addClass(c)}}},liHeight:function(){var e=this.$menu.parent().clone().appendTo("body"),f=e.addClass("open").find("> .dropdown-menu"),d=f.find("li > a").outerHeight(),c=this.options.header?f.find(".popover-title").outerHeight():0,g=this.options.liveSearch?f.find(".bootstrap-select-searchbox").outerHeight():0;e.remove();this.$newElement.data("liHeight",d).data("headerHeight",c).data("searchHeight",g)},setSize:function(){var h=this,d=this.$menu,i=d.find(".inner"),t=this.$newElement.outerHeight(),f=this.$newElement.data("liHeight"),r=this.$newElement.data("headerHeight"),l=this.$newElement.data("searchHeight"),k=d.find("li .divider").outerHeight(true),q=parseInt(d.css("padding-top"))+parseInt(d.css("padding-bottom"))+parseInt(d.css("border-top-width"))+parseInt(d.css("border-bottom-width")),o=this.options.hideDisabled?":not(.disabled)":"",n=b(window),g=q+parseInt(d.css("margin-top"))+parseInt(d.css("margin-bottom"))+2,p,u,s,j=function(){u=h.$newElement.offset().top-n.scrollTop();s=n.height()-u-t};j();if(this.options.header){d.css("padding-top",0)}if(this.options.size=="auto"){var e=function(){var v;j();p=s-g;if(h.options.dropupAuto){h.$newElement.toggleClass("dropup",(u>s)&&((p-g)3){v=f*3+g-2}else{v=0}d.css({"max-height":p+"px",overflow:"hidden","min-height":v+"px"});i.css({"max-height":p-r-l-q+"px","overflow-y":"auto","min-height":v-q+"px"})};e();b(window).resize(e);b(window).scroll(e)}else{if(this.options.size&&this.options.size!="auto"&&d.find("li"+o).length>this.options.size){var m=d.find("li"+o+" > *").filter(":not(.div-contain)").slice(0,this.options.size).last().parent().index();var c=d.find("li").slice(0,m+1).find(".div-contain").length;p=f*this.options.size+c*k+q;if(h.options.dropupAuto){this.$newElement.toggleClass("dropup",(u>s)&&(p .dropdown-menu").css("width");d.remove();this.$newElement.css("width",c)}else{if(this.options.width=="fit"){this.$menu.css("min-width","");this.$newElement.css("width","").addClass("fit-width")}else{if(this.options.width){this.$menu.css("min-width","");this.$newElement.css("width",this.options.width)}else{this.$menu.css("min-width","");this.$newElement.css("width","")}}}if(this.$newElement.hasClass("fit-width")&&this.options.width!=="fit"){this.$newElement.removeClass("fit-width")}},selectPosition:function(){var e=this,d="
          ",f=b(d),h,g,c=function(i){f.addClass(i.attr("class")).toggleClass("dropup",i.hasClass("dropup"));h=i.offset();g=i.hasClass("dropup")?0:i[0].offsetHeight;f.css({top:h.top+g,left:h.left,width:i[0].offsetWidth,position:"absolute"})};this.$newElement.on("click",function(){c(b(this));f.appendTo(e.options.container);f.toggleClass("open",!b(this).hasClass("open"));f.append(e.$menu)});b(window).resize(function(){c(e.$newElement)});b(window).on("scroll",function(){c(e.$newElement)});b("html").on("click",function(i){if(b(i.target).closest(e.$newElement).length<1){f.removeClass("open")}})},mobile:function(){this.$element.addClass("mobile-device").appendTo(this.$newElement);if(this.options.container){this.$menu.hide()}},refresh:function(){this.reloadLi();this.render();this.setWidth();this.setStyle();this.checkDisabled();this.liHeight()},update:function(){this.reloadLi();this.setWidth();this.setStyle();this.checkDisabled();this.liHeight()},setSelected:function(c,d){this.$menu.find("li").eq(c).toggleClass("selected",d)},setDisabled:function(c,d){if(d){this.$menu.find("li").eq(c).addClass("disabled").find("a").attr("href","#").attr("tabindex",-1)}else{this.$menu.find("li").eq(c).removeClass("disabled").find("a").removeAttr("href").attr("tabindex",0)}},isDisabled:function(){return this.$element.is(":disabled")},checkDisabled:function(){var c=this;if(this.isDisabled()){this.$button.addClass("disabled").attr("tabindex",-1)}else{if(this.$button.hasClass("disabled")){this.$button.removeClass("disabled")}if(this.$button.attr("tabindex")==-1){if(!this.$element.data("tabindex")){this.$button.removeAttr("tabindex")}}}this.$button.click(function(){return !c.isDisabled()})},tabIndex:function(){if(this.$element.is("[tabindex]")){this.$element.data("tabindex",this.$element.attr("tabindex"));this.$button.attr("tabindex",this.$element.data("tabindex"))}},clickListener:function(){var c=this;b("body").on("touchstart.dropdown",".dropdown-menu",function(d){d.stopPropagation()});this.$newElement.on("click",function(){c.setSize();if(!c.options.liveSearch&&!c.multiple){setTimeout(function(){c.$menu.find(".selected a").focus()},10)}});this.$menu.on("click","li a",function(k){var g=b(this).parent().index(),j=c.$element.val(),f=c.$element.prop("selectedIndex");if(c.multiple){k.stopPropagation()}k.preventDefault();if(!c.isDisabled()&&!b(this).parent().hasClass("disabled")){var d=c.$element.find("option");var i=d.eq(g);if(!c.multiple){d.prop("selected",false);i.prop("selected",true)}else{var h=i.prop("selected");i.prop("selected",!h)}if(!c.multiple){c.$button.focus()}else{if(c.options.liveSearch){c.$searchbox.focus()}}if((j!=c.$element.val()&&c.multiple)||(f!=c.$element.prop("selectedIndex")&&!c.multiple)){c.$element.change()}}});this.$menu.on("click","li.disabled a, li dt, li .div-contain, .popover-title, .popover-title :not(.close)",function(d){if(d.target==this){d.preventDefault();d.stopPropagation();if(!c.options.liveSearch){c.$button.focus()}else{c.$searchbox.focus()}}});this.$menu.on("click",".popover-title .close",function(){c.$button.focus()});this.$searchbox.on("click",function(d){d.stopPropagation()});this.$element.change(function(){c.render()})},liveSearchListener:function(){var d=this,c=b('
        • ');this.$newElement.on("click.dropdown.data-api",function(){d.$menu.find(".active").removeClass("active");if(!!d.$searchbox.val()){d.$searchbox.val("");d.$menu.find("li").show();if(!!c.parent().length){c.remove()}}if(!d.multiple){d.$menu.find(".selected").addClass("active")}setTimeout(function(){d.$searchbox.focus()},10)});this.$searchbox.on("input propertychange",function(){if(d.$searchbox.val()){d.$menu.find("li").show().not(":icontains("+d.$searchbox.val()+")").hide();if(!d.$menu.find("li").filter(":visible:not(.no-results)").length){if(!!c.parent().length){c.remove()}c.html('No results match "'+d.$searchbox.val()+'"').show();d.$menu.find("li").last().after(c)}else{if(!!c.parent().length){c.remove()}}}else{d.$menu.find("li").show();if(!!c.parent().length){c.remove()}}d.$menu.find("li.active").removeClass("active");d.$menu.find("li").filter(":visible:not(.divider)").eq(0).addClass("active").find("a").focus();b(this).focus()});this.$menu.on("mouseenter","a",function(f){d.$menu.find(".active").removeClass("active");b(f.currentTarget).parent().not(".disabled").addClass("active")});this.$menu.on("mouseleave","a",function(){d.$menu.find(".active").removeClass("active")})},val:function(c){if(c!==undefined){this.$element.val(c);this.$element.change();return this.$element}else{return this.$element.val()}},selectAll:function(){this.$element.find("option").prop("selected",true).attr("selected","selected");this.render()},deselectAll:function(){this.$element.find("option").prop("selected",false).removeAttr("selected");this.render()},keydown:function(p){var q,o,i,n,k,j,r,f,h,m,d,s,g={32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9"};q=b(this);i=q.parent();if(q.is("input")){i=q.parent().parent()}m=i.data("this");if(m.options.liveSearch){i=q.parent().parent()}if(m.options.container){i=m.$menu}o=b("[role=menu] li:not(.divider) a",i);s=m.$menu.parent().hasClass("open");if(m.options.liveSearch){if(/(^9$|27)/.test(p.keyCode)&&s&&m.$menu.find(".active").length===0){p.preventDefault();m.$menu.parent().removeClass("open");m.$button.focus()}o=b("[role=menu] li:not(.divider):visible",i);if(!q.val()&&!/(38|40)/.test(p.keyCode)){if(o.filter(".active").length===0){o=m.$newElement.find("li").filter(":icontains("+g[p.keyCode]+")")}}}if(!o.length){return}if(/(38|40)/.test(p.keyCode)){if(!s){m.$menu.parent().addClass("open")}n=o.index(o.filter(":focus"));j=o.parent(":not(.disabled):visible").first().index();r=o.parent(":not(.disabled):visible").last().index();k=o.eq(n).parent().nextAll(":not(.disabled):visible").eq(0).index();f=o.eq(n).parent().prevAll(":not(.disabled):visible").eq(0).index();h=o.eq(k).parent().prevAll(":not(.disabled):visible").eq(0).index();if(m.options.liveSearch){o.each(function(e){if(b(this).is(":not(.disabled)")){b(this).data("index",e)}});n=o.index(o.filter(".active"));j=o.filter(":not(.disabled):visible").first().data("index");r=o.filter(":not(.disabled):visible").last().data("index");k=o.eq(n).nextAll(":not(.disabled):visible").eq(0).data("index");f=o.eq(n).prevAll(":not(.disabled):visible").eq(0).data("index");h=o.eq(k).prevAll(":not(.disabled):visible").eq(0).data("index")}d=q.data("prevIndex");if(p.keyCode==38){if(m.options.liveSearch){n-=1}if(n!=h&&n>f){n=f}if(nr){n=r}if(n==d){n=j}}q.data("prevIndex",n);if(!m.options.liveSearch){o.eq(n).focus()}else{p.preventDefault();if(!q.is(".dropdown-toggle")){o.removeClass("active");o.eq(n).addClass("active").find("a").focus();q.focus()}}}else{if(!q.is("input")){var c=[],l,t;o.each(function(){if(b(this).parent().is(":not(.disabled)")){if(b.trim(b(this).text().toLowerCase()).substring(0,1)==g[p.keyCode]){c.push(b(this).parent().index())}}});l=b(document).data("keycount");l++;b(document).data("keycount",l);t=b.trim(b(":focus").text().toLowerCase()).substring(0,1);if(t!=g[p.keyCode]){l=1;b(document).data("keycount",l)}else{if(l>=c.length){b(document).data("keycount",0);if(l>c.length){l=1}}}o.eq(c[l-1]).focus()}}if(/(13|32|^9$)/.test(p.keyCode)&&s){if(!/(32)/.test(p.keyCode)){p.preventDefault()}if(!m.options.liveSearch){b(":focus").click()}else{if(!/(32)/.test(p.keyCode)){m.$menu.find(".active a").click();q.focus()}}b(document).data("keycount",0)}if((/(^9$|27)/.test(p.keyCode)&&s&&(m.multiple||m.options.liveSearch))||(/(27)/.test(p.keyCode)&&!s)){m.$menu.parent().removeClass("open");m.$button.focus()}},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},destroy:function(){this.$newElement.remove();this.$element.remove()}};b.fn.selectpicker=function(e,f){var c=arguments;var g;var d=this.each(function(){if(b(this).is("select")){var m=b(this),l=m.data("selectpicker"),h=typeof e=="object"&&e;if(!l){m.data("selectpicker",(l=new a(this,h,f)))}else{if(h){for(var j in h){l.options[j]=h[j]}}}if(typeof e=="string"){var k=e;if(l[k] instanceof Function){[].shift.apply(c);g=l[k].apply(l,c)}else{g=l.options[k]}}}});if(g!==undefined){return g}else{return d}};b.fn.selectpicker.defaults={style:"btn-default",size:"auto",title:null,selectedTextFormat:"values",noneSelectedText:"Nothing selected",countSelectedText:"{0} of {1} selected",width:false,container:false,hideDisabled:false,showSubtext:false,showIcon:true,showContent:true,dropupAuto:true,header:false,liveSearch:false,multipleSeparator:", ",iconBase:"glyphicon",tickIcon:"glyphicon-ok"};b(document).data("keycount",0).on("keydown",".bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=menu], .bootstrap-select-searchbox input",a.prototype.keydown).on("focusin.modal",".bootstrap-select [data-toggle=dropdown], .bootstrap-select [role=menu], .bootstrap-select-searchbox input",function(c){c.stopPropagation()})}(window.jQuery); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-select2/select2-spinner.gif b/public/admin/Coco/assets/libs/bootstrap-select2/select2-spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap-select2/select2.css b/public/admin/Coco/assets/libs/bootstrap-select2/select2.css new file mode 100644 index 000000000..6bad4dc21 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-select2/select2.css @@ -0,0 +1,589 @@ +/* +Version: 3.4.3 Timestamp: Tue Sep 17 06:47:14 PDT 2013 +*/ +.select2-container { + margin: 0; + position: relative; + display: inline-block; + /* inline-block for ie7 */ + zoom: 1; + *display: inline; + vertical-align: middle; +} + +.select2-container, +.select2-drop, +.select2-search, +.select2-search input { + /* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + + More Info : http://www.quirksmode.org/css/box.html + */ + -webkit-box-sizing: border-box; /* webkit */ + -moz-box-sizing: border-box; /* firefox */ + box-sizing: border-box; /* css3 */ +} + +.select2-container .select2-choice { + display: block; + height: 26px; + padding: 0 0 0 8px; + overflow: hidden; + position: relative; + + border: 1px solid #aaa; + white-space: nowrap; + line-height: 26px; + color: #444; + text-decoration: none; + + border-radius: 4px; + + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #fff; +} + +.select2-container.select2-drop-above .select2-choice { + border-bottom-color: #aaa; + + border-radius: 0 0 4px 4px; + +} + +.select2-container.select2-allowclear .select2-choice .select2-chosen { + margin-right: 42px; +} + +.select2-container .select2-choice > .select2-chosen { + margin-right: 26px; + display: block; + overflow: hidden; + + white-space: nowrap; + + text-overflow: ellipsis; +} + +.select2-container .select2-choice abbr { + display: none; + width: 12px; + height: 12px; + position: absolute; + right: 24px; + top: 8px; + + font-size: 1px; + text-decoration: none; + + border: 0; + background: url('select2.png') right top no-repeat; + cursor: pointer; + outline: 0; +} + +.select2-container.select2-allowclear .select2-choice abbr { + display: inline-block; +} + +.select2-container .select2-choice abbr:hover { + background-position: right -11px; + cursor: pointer; +} + +.select2-drop-mask { + border: 0; + margin: 0; + padding: 0; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 9998; + /* styles required for IE to work */ + background-color: #fff; + filter: alpha(opacity=0); +} + +.select2-drop { + width: 100%; + margin-top: -1px; + position: absolute; + z-index: 9999; + top: 100%; + + background: #fff; + color: #000; + border: 1px solid #aaa; + border-top: 0; + + border-radius: 0 0 4px 4px; + + -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); +} + +.select2-drop-auto-width { + border-top: 1px solid #aaa; + width: auto; +} + +.select2-drop-auto-width .select2-search { + padding-top: 4px; +} + +.select2-drop.select2-drop-above { + margin-top: 1px; + border-top: 1px solid #aaa; + border-bottom: 0; + + border-radius: 4px 4px 0 0; + + -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); +} + +.select2-drop-active { + border: 1px solid #5897fb; + border-top: none; +} + +.select2-drop.select2-drop-above.select2-drop-active { + border-top: 1px solid #5897fb; +} + +.select2-container .select2-choice .select2-arrow { + display: inline-block; + width: 18px; + height: 100%; + position: absolute; + right: 0; + top: 0; + + border-left: 1px solid #aaa; + border-radius: 0 4px 4px 0; + + background-clip: padding-box; + + background: #ccc; +} + +.select2-container .select2-choice .select2-arrow b { + display: block; + width: 100%; + height: 100%; + background: url('select2.png') no-repeat 0 1px; +} + +.select2-search { + display: inline-block; + width: 100%; + min-height: 26px; + margin: 0; + padding-left: 4px; + padding-right: 4px; + position: relative; + z-index: 10000; + white-space: nowrap; +} + +.select2-search input { + width: 100%; + height: auto !important; + min-height: 26px; + padding: 4px 20px 4px 5px; + margin: 0; + + outline: 0; + font-family: sans-serif; + font-size: 1em; + + border: 1px solid #aaa; + border-radius: 0; + + -webkit-box-shadow: none; + box-shadow: none; + + background: #fff url('select2.png') no-repeat 100% -22px; + background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #fff 85%, #eee 99%); +} + +.select2-drop.select2-drop-above .select2-search input { + margin-top: 4px; +} + +.select2-search input.select2-active { + background: #fff url('select2-spinner.gif') no-repeat 100%; + background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #fff 85%, #eee 99%); +} + +.select2-container-active .select2-choice, +.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); +} + +.select2-dropdown-open .select2-choice { + border-bottom-color: transparent; + -webkit-box-shadow: 0 1px 0 #fff inset; + box-shadow: 0 1px 0 #fff inset; + + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + background-color: #eee; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(top, #fff 0%, #eee 50%); +} + +.select2-dropdown-open.select2-drop-above .select2-choice, +.select2-dropdown-open.select2-drop-above .select2-choices { + border: 1px solid #5897fb; + border-top-color: transparent; + + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(bottom, #fff 0%, #eee 50%); +} + +.select2-dropdown-open .select2-choice .select2-arrow { + background: transparent; + border-left: none; + filter: none; +} +.select2-dropdown-open .select2-choice .select2-arrow b { + background-position: -18px 1px; +} + +/* results */ +.select2-results { + max-height: 200px; + padding: 0 0 0 4px; + margin: 4px 4px 4px 0; + position: relative; + overflow-x: hidden; + overflow-y: auto; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +.select2-results ul.select2-result-sub { + margin: 0; + padding-left: 0; +} + +.select2-results ul.select2-result-sub > li .select2-result-label { padding-left: 20px } +.select2-results ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 40px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 60px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 80px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 100px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 110px } +.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub > li .select2-result-label { padding-left: 120px } + +.select2-results li { + list-style: none; + display: list-item; + background-image: none; +} + +.select2-results li.select2-result-with-children > .select2-result-label { + font-weight: bold; +} + +.select2-results .select2-result-label { + padding: 3px 7px 4px; + margin: 0; + cursor: pointer; + + min-height: 1em; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.select2-results .select2-highlighted { + background: #3875d7; + color: #fff; +} + +.select2-results li em { + background: #feffde; + font-style: normal; +} + +.select2-results .select2-highlighted em { + background: transparent; +} + +.select2-results .select2-highlighted ul { + background: #fff; + color: #000; +} + + +.select2-results .select2-no-results, +.select2-results .select2-searching, +.select2-results .select2-selection-limit { + background: #f4f4f4; + display: list-item; +} + +/* +disabled look for disabled choices in the results dropdown +*/ +.select2-results .select2-disabled.select2-highlighted { + color: #666; + background: #f4f4f4; + display: list-item; + cursor: default; +} +.select2-results .select2-disabled { + background: #f4f4f4; + display: list-item; + cursor: default; +} + +.select2-results .select2-selected { + display: none; +} + +.select2-more-results.select2-active { + background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; +} + +.select2-more-results { + background: #f4f4f4; + display: list-item; +} + +/* disabled styles */ + +.select2-container.select2-container-disabled .select2-choice { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container.select2-container-disabled .select2-choice .select2-arrow { + background-color: #f4f4f4; + background-image: none; + border-left: 0; +} + +.select2-container.select2-container-disabled .select2-choice abbr { + display: none; +} + + +/* multiselect */ + +.select2-container-multi .select2-choices { + height: auto !important; + height: 1%; + margin: 0; + padding: 0; + position: relative; + + border: 1px solid #aaa; + cursor: text; + overflow: hidden; + + background-color: #fff; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); + background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%); + background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%); + background-image: linear-gradient(top, #eee 1%, #fff 15%); +} + +.select2-locked { + padding: 3px 5px 3px 5px !important; +} + +.select2-container-multi .select2-choices { + min-height: 26px; +} + +.select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); +} +.select2-container-multi .select2-choices li { + float: left; + list-style: none; +} +.select2-container-multi .select2-choices .select2-search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} + +.select2-container-multi .select2-choices .select2-search-field input { + padding: 5px; + margin: 1px 0; + + font-family: sans-serif; + font-size: 100%; + color: #666; + outline: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent !important; +} + +.select2-container-multi .select2-choices .select2-search-field input.select2-active { + background: #fff url('select2-spinner.gif') no-repeat 100% !important; +} + +.select2-default { + color: #999 !important; +} + +.select2-container-multi .select2-choices .select2-search-choice { + padding: 3px 5px 3px 18px; + margin: 3px 0 3px 5px; + position: relative; + + line-height: 13px; + color: #333; + cursor: default; + border: 1px solid #aaaaaa; + + border-radius: 3px; + + -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #e4e4e4; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); +} +.select2-container-multi .select2-choices .select2-search-choice .select2-chosen { + cursor: default; +} +.select2-container-multi .select2-choices .select2-search-choice-focus { + background: #d4d4d4; +} + +.select2-search-choice-close { + display: block; + width: 12px; + height: 13px; + position: absolute; + right: 3px; + top: 4px; + + font-size: 1px; + outline: none; + background: url('select2.png') right top no-repeat; +} + +.select2-container-multi .select2-search-choice-close { + left: 3px; +} + +.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { + background-position: right -11px; +} +.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { + background-position: right -11px; +} + +/* disabled styles */ +.select2-container-multi.select2-container-disabled .select2-choices { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { + padding: 3px 5px 3px 5px; + border: 1px solid #ddd; + background-image: none; + background-color: #f4f4f4; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none; + background: none; +} +/* end multiselect */ + + +.select2-result-selectable .select2-match, +.select2-result-unselectable .select2-match { + text-decoration: underline; +} + +.select2-offscreen, .select2-offscreen:focus { + clip: rect(0 0 0 0) !important; + width: 1px !important; + height: 1px !important; + border: 0 !important; + margin: 0 !important; + padding: 0 !important; + overflow: hidden !important; + position: absolute !important; + outline: 0 !important; + left: 0px !important; + top: 0px !important; +} + +.select2-display-none { + display: none; +} + +.select2-measure-scrollbar { + position: absolute; + top: -10000px; + left: -10000px; + width: 100px; + height: 100px; + overflow: scroll; +} +/* Retina-ize icons */ + + diff --git a/public/admin/Coco/assets/libs/bootstrap-select2/select2.min.js b/public/admin/Coco/assets/libs/bootstrap-select2/select2.min.js new file mode 100644 index 000000000..0910fdfe8 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-select2/select2.min.js @@ -0,0 +1,22 @@ +/* +Copyright 2012 Igor Vaynberg + +Version: 3.4.3 Timestamp: Tue Sep 17 06:47:14 PDT 2013 + +This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU +General Public License version 2 (the "GPL License"). You may choose either license to govern your +use of this software only upon the condition that you accept all of the terms of either the Apache +License or the GPL License. + +You may obtain a copy of the Apache License and the GPL License at: + +http://www.apache.org/licenses/LICENSE-2.0 +http://www.gnu.org/licenses/gpl-2.0.html + +Unless required by applicable law or agreed to in writing, software distributed under the Apache License +or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the Apache License and the GPL License for the specific language governing +permissions and limitations under the Apache License and the GPL License. +*/ +!function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++dc;c++)e=a.charAt(c),b+=m[e]||e;return b}function o(a,b){for(var c=0,d=b.length;d>c;c+=1)if(q(a,b[c]))return c;return-1}function p(){var b=a(l);b.appendTo("body");var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function q(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function r(b,c){var d,e,f;if(null===b||b.length<1)return[];for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d}function s(a){return a.outerWidth(!1)-a.width()}function t(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function u(c){c.on("mousemove",function(c){var d=i;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function v(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function w(a){var c,b=!1;return function(){return b===!1&&(c=a(),b=!0),c}}function x(a,b){var c=v(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){o(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus(),a.is(":visible")&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!h){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);h=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),h.attr("class","select2-sizer"),a("body").append(h)}return h.text(b.val()),h.width()}function D(b,c,d){var e,g,f=[];e=b.attr("class"),e&&(e=""+e,a(e.split(" ")).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=c.attr("class"),e&&(e=""+e,a(e.split(" ")).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(this))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=n(a.toUpperCase()).indexOf(n(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push(""),c.push(d(a.substring(e,e+f))),c.push(""),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page);i.callback(b)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]};a(d?c():c).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g)}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;throw new Error(c+" must be a function or a falsy value")}function K(b){return a.isFunction(b)?b():b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(q(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,h,j,k,i={x:0,y:0},c={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case c.LEFT:case c.RIGHT:case c.UP:case c.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case c.SHIFT:case c.CTRL:case c.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="
          ",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z"};j=a(document),g=function(){var a=1;return function(){return a++}}(),j.on("mousemove",function(a){i.x=a.pageX,i.y=a.pageY}),d=N(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,h,i,f=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+g()),this.containerSelector="#"+this.containerId.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.body=w(function(){return c.element.closest("body")}),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss)),this.container.addClass(K(c.containerCssClass)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(f),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),u(this.results),this.dropdown.on("mousemove-filtered touchstart touchmove touchend",f,this.bind(this.highlightUnderEvent)),x(80,this.results),this.dropdown.on("scroll-debounced",f,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),t(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",f,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown",function(a){a.stopPropagation()}),a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),k=k||p(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.nextSearchTerm=b},destroy:function(){var a=this.opts.element,c=a.data("select2");this.close(),this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),c!==b&&(c.container.remove(),c.dropdown.remove(),a.removeClass("select2-offscreen").removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show())},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:q(a.attr("locked"),"locked")||q(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,f,g,h=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a ","
          "," ","
            ","
          ","
          "].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e)),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(a){this.opened()&&(this.parent.close.apply(this,arguments),a=a||{focus:!0},this.focusser.removeAttr("disabled"),a.focus&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.removeAttr("disabled"),this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.removeAttr("disabled"),this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments)},initContainer:function(){var b,d=this.container,e=this.dropdown;this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),this.focusser.attr("id","s2id_autogen"+g()),a("label[for='"+this.opts.element.attr("id")+"']").attr("for",this.focusser.attr("id")),this.focusser.attr("tabindex",this.elementTabIndex),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body().get(0)&&window.setTimeout(this.bind(function(){this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),t(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown",this.bind(function(b){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(b)})),e.on("mousedown",this.bind(function(){this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder())})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()?(a=this.getPlaceholderOption())!==b&&a.is(":selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val():!1},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find(":selected");b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=q(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return q(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||this.focusser.focus(),q(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find(":selected").each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=N(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["
            ","
          • "," ","
          • ","
          ","
          ","
            ","
          ","
          "].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find(":selected").each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=r(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return q(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),this.updateResults(!0),this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){o(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,b){this.triggerSelect(a)&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()&&this.updateResults(!0),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),b&&b.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("
        • "),f=a("
        • "),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith("
          "+j+"
          "),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").fadeOut("fast",this.bind(function(){this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),this.close(),this.focusSearch()})).dequeue(),A(b))})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(a){var c,d,b=this.getVal();if(a=a.closest(".select2-search-choice"),0===a.length)throw"Invalid argument: "+a+". Must be .select2-search-choice";if(c=a.data("select2-data")){for(;(d=o(this.id(c),b))>=0;)b.splice(d,1),this.setVal(b),this.select&&this.postprocessResults();a.remove(),this.opts.element.trigger({type:"removed",val:this.id(c),choice:c}),this.triggerChange({removed:c})}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));o(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("
        • "+g.opts.formatNoMatches(g.search.val())+"
        • ")},getMaxSearchWidth:function(){return this.selection.width()-s(this.search)},resizeSearch:function(){var a,b,c,d,e,f=s(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),r(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){o(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c. Attach to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.find(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,g,h,i,j,c=Array.prototype.slice.call(arguments,0),k=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],l=["opened","isFocused","container","dropdown"],m=["val","data"],n={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?j=d.element.prop("multiple"):(j=d.multiple||!1,"tags"in d&&(d.multiple=j=!0)),g=j?new f:new e,g.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(o(c[0],k)<0)throw"Unknown method: "+c[0];if(i=b,g=a(this).data("select2"),g===b)return;if(h=c[0],"container"===h?i=g.container:"dropdown"===h?i=g.dropdown:(n[h]&&(h=n[h]),i=g[h].apply(g,c.slice(1))),o(c[0],l)>=0||o(c[0],m)&&1==c.length)return!1}}),i===b?this:i},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(){return b},formatSelectionCssClass:function(){return b},formatNoMatches:function(){return"No matches found"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results..."},formatSearching:function(){return"Searching..."},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a.id},matcher:function(a,b){return n(""+b).toUpperCase().indexOf(n(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b}},a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:v,markMatch:E,escapeMarkup:F,stripDiacritics:n},"class":{"abstract":d,single:e,multi:f}}}}(jQuery); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-select2/select2.png b/public/admin/Coco/assets/libs/bootstrap-select2/select2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d804ffb99699b9e030f1010314de0970b5a000d GIT binary patch literal 613 zcmV-r0-F7aP)#WY!I$JQV$)A5aAS1BM||2XVJl=+L1^1S1H% zM-&lx?NZpUrHhn>fk<>POqf2sh40}xxGZfc+t+#Eb(qHy9_3*1(U%t9t)QDnI#YAL(|ACV(>)>6WD-t!8tutHkdb^#3`HzoJG3A2@T`% zA|K@o*b!`R#(7)PWrMFn2))Ca3MR4(zaT`Zr61*kZK5NPnZwQszxh$fyv3?&4c>$q z2m=+yc0dRXRAsPDxF6sD;@rK4JGdR_``1S~o6Xi@2&aR6hcSrEp9HVRzEqVDqBn<1%hR=D4e1f^ra^A|34Cjc=Gny{F(o#MrvPYgZuTJOz(n)-F<| zj()qR;C={)N<0RRvDZ^@6ND+W*}gh-Lip(MDt!(zMSO)!j2j+*hxgzC-e3$@(O2p* zu;+gddm(cZwXTCLx*Ky4THOa*^b^F`woveIeCK^0aR|TJ00000NkvXXu0mjfA#WC6 literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap-typeahead/bootstrap3-typeahead.min.js b/public/admin/Coco/assets/libs/bootstrap-typeahead/bootstrap3-typeahead.min.js new file mode 100644 index 000000000..9d3cb53cc --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-typeahead/bootstrap3-typeahead.min.js @@ -0,0 +1 @@ +!function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.select=this.options.select||this.select,this.autoSelect="boolean"==typeof this.options.autoSelect?this.options.autoSelect:!0,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=$(this.options.menu),this.shown=!1,this.listen(),this.showHintOnFocus="boolean"==typeof this.options.showHintOnFocus?this.options.showHintOnFocus:!1};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").data("value");return(this.autoSelect||val)&&this.$element.val(this.updater(val)).change(),this.hide()},updater:function(item){return item},setSource:function(source){this.source=source},show:function(){var scrollHeight,pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return scrollHeight="function"==typeof this.options.scrollHeight?this.options.scrollHeight.call():this.options.scrollHeight,this.$menu.insertAfter(this.$element).css({top:pos.top+pos.height+scrollHeight,left:pos.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(query){var items;return this.query="undefined"!=typeof query&&null!==query?query:this.$element.val()||"",this.query.length"+match+""})},render:function(items){var that=this;return items=$(items).map(function(i,item){return i=$(that.options.item).data("value",item),i.find("a").html(that.highlighter(item)),i[0]}),this.autoSelect&&items.first().addClass("active"),this.$menu.html(items),this},next:function(){var active=this.$menu.find(".active").removeClass("active"),next=active.next();next.length||(next=$(this.$menu.find("li")[0])),next.addClass("active")},prev:function(){var active=this.$menu.find(".active").removeClass("active"),prev=active.prev();prev.length||(prev=this.$menu.find("li").last()),prev.addClass("active")},listen:function(){this.$element.on("focus",$.proxy(this.focus,this)).on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("keyup",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",$.proxy(this.keydown,this)),this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this)).on("mouseleave","li",$.proxy(this.mouseleave,this))},destroy:function(){this.$element.data("typeahead",null),this.$element.off("focus").off("blur").off("keypress").off("keyup"),this.eventSupported("keydown")&&this.$element.off("keydown"),this.$menu.remove()},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown){switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.shown||40!=e.keyCode?this.move(e):this.lookup("")},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(){this.focused||(this.focused=!0,(0===this.options.minLength&&!this.$element.val()||this.options.showHintOnFocus)&&this.lookup())},blur:function(){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")},mouseleave:function(){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var old=$.fn.typeahead;$.fn.typeahead=function(option){var arg=arguments;return this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&(arg.length>1?data[option].apply(data,Array.prototype.slice.call(arg,1)):data[option]())})},$.fn.typeahead.defaults={source:[],items:8,menu:'',item:'
        • ',minLength:1,scrollHeight:0,autoSelect:!0},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(){var $this=$(this);$this.data("typeahead")||$this.typeahead($this.data())})}(window.jQuery); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-validator/css/bootstrapValidator.min.css b/public/admin/Coco/assets/libs/bootstrap-validator/css/bootstrapValidator.min.css new file mode 100644 index 000000000..030cbdf75 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-validator/css/bootstrapValidator.min.css @@ -0,0 +1,13 @@ +/** + * BootstrapValidator (http://bootstrapvalidator.com) + * + * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 + * + * @version v0.4.5 + * @author https://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc + * @license MIT + */ + + +.bv-form .help-block{margin-bottom:0}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442} \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-validator/js/bootstrapValidator.min.js b/public/admin/Coco/assets/libs/bootstrap-validator/js/bootstrapValidator.min.js new file mode 100644 index 000000000..c10d0d567 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-validator/js/bootstrapValidator.min.js @@ -0,0 +1,13 @@ +/** + * BootstrapValidator (http://bootstrapvalidator.com) + * + * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 + * + * @version v0.4.5 + * @author https://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc + * @license MIT + */ + +!function(a){var b=function(c,d){this.$form=a(c),this.options=a.extend({},b.DEFAULT_OPTIONS,d),this.$invalidField=null,this.$submitButton=null,this.STATUS_NOT_VALIDATED="NOT_VALIDATED",this.STATUS_VALIDATING="VALIDATING",this.STATUS_INVALID="INVALID",this.STATUS_VALID="VALID";var e=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="",c[0];);return a>4?a:!a}(),f=document.createElement("div");this._changeEvent=9!==e&&"oninput"in f?"input":"keyup",this._submitIfValid=null,this._init()};b.DEFAULT_OPTIONS={elementClass:"bv-form",message:"This value is not valid",threshold:null,excluded:[":disabled",":hidden",":not(:visible)"],feedbackIcons:{valid:null,invalid:null,validating:null},submitButtons:'[type="submit"]',submitHandler:null,live:"enabled",fields:null},b.prototype={constructor:b,_init:function(){var b,c,d,e,f,g,h,i=this,j={excluded:this.$form.attr("data-bv-excluded"),trigger:this.$form.attr("data-bv-trigger"),message:this.$form.attr("data-bv-message"),submitButtons:this.$form.attr("data-bv-submitbuttons"),threshold:this.$form.attr("data-bv-threshold"),live:this.$form.attr("data-bv-live"),fields:{},feedbackIcons:{valid:this.$form.attr("data-bv-feedbackicons-valid"),invalid:this.$form.attr("data-bv-feedbackicons-invalid"),validating:this.$form.attr("data-bv-feedbackicons-validating")}};this.$form.attr("novalidate","novalidate").addClass(this.options.elementClass).on("submit.bv",function(a){a.preventDefault(),i.validate()}).on("click",this.options.submitButtons,function(){i.$submitButton=a(this),i._submitIfValid=!0}).find("[name], [data-bv-field]").each(function(){var k=a(this);if(!i._isExcluded(k)){var l=k.attr("name")||k.attr("data-bv-field"),m={};for(c in a.fn.bootstrapValidator.validators)if(b=a.fn.bootstrapValidator.validators[c],d=k.attr("data-bv-"+c.toLowerCase())+"",h="function"==typeof b.enableByHtml5?b.enableByHtml5(a(this)):null,h&&"false"!=d||h!==!0&&(""==d||"true"==d)){b.html5Attributes=b.html5Attributes||{message:"message"},m[c]=a.extend({},1==h?{}:h,m[c]);for(g in b.html5Attributes)e=b.html5Attributes[g],f=k.attr("data-bv-"+c.toLowerCase()+"-"+g),f&&("true"==f?f=!0:"false"==f&&(f=!1),m[c][e]=f)}var n={trigger:k.attr("data-bv-trigger"),message:k.attr("data-bv-message"),container:k.attr("data-bv-container"),selector:k.attr("data-bv-selector"),threshold:k.attr("data-bv-threshold"),validators:m};a.isEmptyObject(n.validators)||a.isEmptyObject(n)||(k.attr("data-bv-field",l),j.fields[l]=a.extend({},n,j.fields[l]))}}).end().find(this.options.submitButtons).each(function(){a("").attr("type","hidden").attr("name",a(this).attr("name")).val(a(this).val()).appendTo(i.$form)}),this.options=a.extend(!0,this.options,j);for(var k in this.options.fields)this._initField(k);this.setLiveMode(this.options.live)},_initField:function(b){if(null!=this.options.fields[b]&&null!=this.options.fields[b].validators){var c=this.getFieldElements(b);if(null==c)return void delete this.options.fields[b];for(var d in this.options.fields[b].validators)a.fn.bootstrapValidator.validators[d]||delete this.options.fields[b].validators[d];for(var e=this,f=c.attr("type"),g="radio"==f||"checkbox"==f||"file"==f||"SELECT"==c[0].tagName?"change":e._changeEvent,h=c.length,i=1==h||"radio"==f||"checkbox"==f,j=0;h>j;j++){var k=a(c[j]),l=k.parents(".form-group"),m=this.options.fields[b].container?l.find(this.options.fields[b].container):this._getMessageContainer(k);k.attr("data-bv-field")||k.attr("data-bv-field",b),k.on(g+".update.bv",function(){e._submitIfValid=!1,i?e.updateStatus(b,e.STATUS_NOT_VALIDATED,null):e.updateElementStatus(a(this),e.STATUS_NOT_VALIDATED,null)}),k.data("bv.messages",m);for(d in this.options.fields[b].validators)k.data("bv.result."+d,this.STATUS_NOT_VALIDATED),i&&j!=h-1||a("").css("display","none").attr("data-bv-validator",d).attr("data-bv-validator-for",b).html(this.options.fields[b].validators[d].message||this.options.fields[b].message||this.options.message).addClass("help-block").appendTo(m);if(this.options.feedbackIcons&&this.options.feedbackIcons.validating&&this.options.feedbackIcons.invalid&&this.options.feedbackIcons.valid&&(!i||j==h-1)){l.addClass("has-feedback");var n=a("").css("display","none").addClass("form-control-feedback").attr("data-bv-icon-for",b).insertAfter(k);0==l.find("label").length&&n.css("top",0)}}null==this.options.fields[b].enabled&&(this.options.fields[b].enabled=!0)}},_getMessageContainer:function(a){var b=a.parent();if(b.hasClass("form-group"))return b;var c=b.attr("class");if(!c)return this._getMessageContainer(b);c=c.split(" ");for(var d=c.length,e=0;d>e;e++)if(/^col-(xs|sm|md|lg)-\d+$/.test(c[e])||/^col-(xs|sm|md|lg)-offset-\d+$/.test(c[e]))return b;return this._getMessageContainer(b)},_submit:function(){if(this.isValid())this.options.submitHandler&&"function"==typeof this.options.submitHandler?this.options.submitHandler.call(this,this,this.$form,this.$submitButton):this.disableSubmitButtons(!0).defaultSubmit();else if("submitted"==this.options.live&&this.setLiveMode("enabled"),this.$invalidField){var b,c=this.$invalidField.parents(".tab-pane");c&&(b=c.attr("id"))&&a('a[href="#'+b+'"][data-toggle="tab"]').trigger("click.bs.tab.data-api"),this.$invalidField.focus()}},_isExcluded:function(b){if(this.options.excluded){"string"==typeof this.options.excluded&&(this.options.excluded=a.map(this.options.excluded.split(","),function(b){return a.trim(b)}));for(var c=this.options.excluded.length,d=0;c>d;d++)if("string"==typeof this.options.excluded[d]&&b.is(this.options.excluded[d])||"function"==typeof this.options.excluded[d]&&1==this.options.excluded[d].call(this,b,this))return!0}return!1},_exceedThreshold:function(a){var b=a.attr("data-bv-field"),c=this.options.fields[b].threshold||this.options.threshold;if(!c)return!0;var d=a.attr("type"),e=-1!=["button","checkbox","file","hidden","image","radio","reset","submit"].indexOf(d);return e||a.val().length>=c},getFieldElements:function(b){var c=this.options.fields[b].selector?a(this.options.fields[b].selector):this.$form.find('[name="'+b+'"]');return 0==c.length?null:c},setLiveMode:function(b){if(this.options.live=b,"submitted"==b)return this;var c=this;for(var d in this.options.fields)!function(e){var f=c.getFieldElements(e);if(f)for(var g=f.attr("type"),h=f.length,i=1==h||"radio"==g||"checkbox"==g,j=c.options.fields[d].trigger||c.options.trigger||("radio"==g||"checkbox"==g||"file"==g||"SELECT"==f[0].tagName?"change":c._changeEvent),k=a.map(j.split(" "),function(a){return a+".live.bv"}).join(" "),l=0;h>l;l++)"enabled"==b?a(f[l]).on(k,function(){c._exceedThreshold(a(this))&&(i?c.validateField(e):c.validateFieldElement(a(this),!1))}):a(f[l]).off(k)}(d);return this},disableSubmitButtons:function(a){return a?"disabled"!=this.options.live&&this.$form.find(this.options.submitButtons).attr("disabled","disabled"):this.$form.find(this.options.submitButtons).removeAttr("disabled"),this},validate:function(){if(!this.options.fields)return this;this.disableSubmitButtons(!0);for(var a in this.options.fields)this.validateField(a);return this.$submitButton&&this._submit(),this},validateField:function(b){for(var c=this.getFieldElements(b),d=c.attr("type"),e="radio"==d||"checkbox"==d?1:c.length,f=0;e>f;f++)this.validateFieldElement(a(c[f]),1==e);return this},validateFieldElement:function(b,c){var d,e,f=this,g=b.attr("data-bv-field"),h=this.options.fields[g].validators;if(!this.options.fields[g].enabled||this._isExcluded(b))return this;for(d in h){b.data("bv.dfs."+d)&&b.data("bv.dfs."+d).reject();var i=b.data("bv.result."+d);i!=this.STATUS_VALID&&i!=this.STATUS_INVALID&&(b.data("bv.result."+d,this.STATUS_VALIDATING),e=a.fn.bootstrapValidator.validators[d].validate(this,b,h[d]),"object"==typeof e?(c?this.updateStatus(g,this.STATUS_VALIDATING,d):this.updateElementStatus(b,this.STATUS_VALIDATING,d),b.data("bv.dfs."+d,e),e.done(function(a,b,d){a.removeData("bv.dfs."+b),c?f.updateStatus(a.attr("data-bv-field"),d?f.STATUS_VALID:f.STATUS_INVALID,b):f.updateElementStatus(a,d?f.STATUS_VALID:f.STATUS_INVALID,b),d&&1==f._submitIfValid&&f._submit()})):"boolean"==typeof e&&(c?this.updateStatus(g,e?this.STATUS_VALID:this.STATUS_INVALID,d):this.updateElementStatus(b,e?this.STATUS_VALID:this.STATUS_INVALID,d)))}return this},updateStatus:function(b,c,d){for(var e=this.getFieldElements(b),f=e.attr("type"),g="radio"==f||"checkbox"==f?1:e.length,h=0;g>h;h++)this.updateElementStatus(a(e[h]),c,d);return this},updateElementStatus:function(b,c,d){var e=this,f=b.attr("data-bv-field"),g=b.parents(".form-group"),h=b.data("bv.messages"),i=h.find(".help-block[data-bv-validator]"),j=g.find('.form-control-feedback[data-bv-icon-for="'+f+'"]');if(d)b.data("bv.result."+d,c);else for(var k in this.options.fields[f].validators)b.data("bv.result."+k,c);var l,m,n=b.parents(".tab-pane");switch(n&&(l=n.attr("id"))&&(m=a('a[href="#'+l+'"][data-toggle="tab"]').parent()),c){case this.STATUS_VALIDATING:this.disableSubmitButtons(!0),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error");break;case this.STATUS_INVALID:this.disableSubmitButtons(!0),g.removeClass("has-success").addClass("has-error"),d?i.filter('[data-bv-validator="'+d+'"]').show():i.show(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show(),m&&m.removeClass("bv-tab-success").addClass("bv-tab-error");break;case this.STATUS_VALID:d?i.filter('[data-bv-validator="'+d+'"]').hide():i.hide();var o=0==i.filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)!=e.STATUS_VALID}).length;this.disableSubmitButtons(!o),j&&j.removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid).addClass(o?this.options.feedbackIcons.valid:this.options.feedbackIcons.invalid).show();var p=function(c){return 0==c.find(".help-block[data-bv-validator]").filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)&&b.data("bv.result."+d)!=e.STATUS_VALID}).length};g.removeClass("has-error has-success").addClass(p(g)?"has-success":"has-error"),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error").addClass(p(n)?"bv-tab-success":"bv-tab-error");break;case this.STATUS_NOT_VALIDATED:default:this.disableSubmitButtons(!1),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error")}return this},isValid:function(){var b,c,d,e,f,g,h,i;for(c in this.options.fields)if(null!=this.options.fields[c]&&this.options.fields[c].enabled)for(b=this.getFieldElements(c),e=b.attr("type"),h="radio"==e||"checkbox"==e?1:b.length,i=0;h>i;i++)if(d=a(b[i]),!this._isExcluded(d))for(g in this.options.fields[c].validators){if(f=d.data("bv.result."+g),f==this.STATUS_NOT_VALIDATED||f==this.STATUS_VALIDATING)return!1;if(f==this.STATUS_INVALID)return this.$invalidField=d,!1}return!0},defaultSubmit:function(){this.$form.off("submit.bv").submit()},resetForm:function(b){var c,d,e,f,g;for(c in this.options.fields){d=this.getFieldElements(c),e=d.length;for(var h=0;e>h;h++)for(g in this.options.fields[c].validators)a(d[h]).removeData("bv.dfs."+g);this.updateStatus(c,this.STATUS_NOT_VALIDATED,null),b&&(f=d.attr("type"),"radio"==f||"checkbox"==f?d.removeAttr("checked").removeAttr("selected"):d.val(""))}return this.$invalidField=null,this.$submitButton=null,this.disableSubmitButtons(!1),this},enableFieldValidators:function(a,b){return this.options.fields[a].enabled=b,this.updateStatus(a,this.STATUS_NOT_VALIDATED,null),this}},a.fn.bootstrapValidator=function(c){var d=arguments;return this.each(function(){var e=a(this),f=e.data("bootstrapValidator"),g="object"==typeof c&&c;f||(f=new b(this,g),e.data("bootstrapValidator",f)),"string"==typeof c&&f[c].apply(f,Array.prototype.slice.call(d,1))})},a.fn.bootstrapValidator.validators={},a.fn.bootstrapValidator.Constructor=b,a.fn.bootstrapValidator.helpers={date:function(a,b,c,d){if(1e3>a||a>9999||0==b||b>12)return!1;var e=[31,28,31,30,31,30,31,31,30,31,30,31];if((a%400==0||a%100!=0&&a%4==0)&&(e[1]=29),0>c||c>e[b-1])return!1;if(d===!0){var f=new Date,g=f.getFullYear(),h=f.getMonth(),i=f.getDate();return g>a||a==g&&h>b-1||a==g&&b-1==h&&i>c}return!0},luhn:function(a){for(var b=a.length,c=0,d=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],e=0;b--;)e+=d[c][parseInt(a.charAt(b),10)],c^=1;return e%10===0&&e>0},mod_11_10:function(a){for(var b=5,c=a.length,d=0;c>d;d++)b=(2*(b||10)%11+parseInt(a.charAt(d),10))%10;return 1==b},mod_37_36:function(a,b){b=b||"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";for(var c=b.length,d=a.length,e=Math.floor(c/2),f=0;d>f;f++)e=(2*(e||c)%(c+1)+b.indexOf(a.charAt(f)))%c;return 1==e}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.base64={validate:function(a,b){var c=b.val();return""==c?!0:/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.between={html5Attributes:{message:"message",min:"min",max:"max",inclusive:"inclusive"},enableByHtml5:function(a){return"range"==a.attr("type")?{min:a.attr("min"),max:a.attr("max")}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.min&&d=c.min&&d<=c.max)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.callback={validate:function(b,c,d){var e=c.val();if(d.callback&&"function"==typeof d.callback){var f=new a.Deferred;return f.resolve(c,"callback",d.callback.call(this,e,b)),f}return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.choice={html5Attributes:{message:"message",min:"min",max:"max"},validate:function(a,b,c){var d=b.is("select")?a.getFieldElements(b.attr("data-bv-field")).find("option").filter(":selected").length:a.getFieldElements(b.attr("data-bv-field")).filter(":checked").length;return c.min&&dc.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.creditCard={validate:function(b,c){var d=c.val();if(""==d)return!0;if(/[^0-9-\s]+/.test(d))return!1;if(d=d.replace(/\D/g,""),!a.fn.bootstrapValidator.helpers.luhn(d))return!1;var e,f,g={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}};for(e in g)for(f in g[e].prefix)if(d.substr(0,g[e].prefix[f].length)==g[e].prefix[f]&&-1!=g[e].length.indexOf(d.length))return!0;return!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.cusip={validate:function(b,c){var d=c.val();if(""==d)return!0;if(d=d.toUpperCase(),!/^[0-9A-Z]{9}$/.test(d))return!1;for(var e=a.map(d.split(""),function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}),f=e.length,g=0,h=0;f-1>h;h++){var i=parseInt(e[h]);h%2!=0&&(i*=2),i>9&&(i-=9),g+=i}return g=(10-g%10)%10,g==e[f-1]}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.cvv={html5Attributes:{message:"message",ccfield:"creditCardField"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;if(!/^[0-9]{3,4}$/.test(d))return!1;if(!c.creditCardField)return!0;var e=a.getFieldElements(c.creditCardField).val();if(""==e)return!0;e=e.replace(/\D/g,"");var f,g,h={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}},i=null;for(f in h)for(g in h[f].prefix)if(e.substr(0,h[f].prefix[g].length)==h[f].prefix[g]&&-1!=h[f].length.indexOf(e.length)){i=f;break}return null==i?!1:"AMERICAN_EXPRESS"==i?4==d.length:3==d.length}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.date={html5Attributes:{message:"message",format:"format"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;d.format=d.format||"MM/DD/YYYY";var f=d.format.split(" "),g=f[0],h=f.length>1?f[1]:null,i=f.length>2?f[2]:null,j=e.split(" "),k=j[0],l=j.length>1?j[1]:null;if(f.length!=j.length)return!1;var m=-1!=k.indexOf("/")?"/":-1!=k.indexOf("-")?"-":null;if(null==m)return!1;k=k.split(m),g=g.split(m);var n=k[g.indexOf("YYYY")],o=k[g.indexOf("MM")],p=k[g.indexOf("DD")],q=null,r=null,s=null;if(h){if(h=h.split(":"),l=l.split(":"),h.length!=l.length)return!1;if(r=l.length>0?l[0]:null,q=l.length>1?l[1]:null,s=l.length>2?l[2]:null,s&&(s=parseInt(s,10),0>s||s>60))return!1;if(r&&(r=parseInt(r,10),0>r||r>=24||i&&r>12))return!1;if(q&&(q=parseInt(q,10),0>q||q>59))return!1}return p=parseInt(p,10),o=parseInt(o,10),n=parseInt(n,10),a.fn.bootstrapValidator.helpers.date(n,o,p)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.different={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d!=e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"different"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.digits={validate:function(a,b){var c=b.val();return""==c?!0:/^\d+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ean={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^(\d{8}|\d{12}|\d{13})$/.test(c))return!1;for(var d=c.length,e=0,f=8==d?[3,1]:[1,3],g=0;d-1>g;g++)e+=parseInt(c.charAt(g))*f[g%2];return e=10-e%10,e==c.charAt(d-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.emailAddress={enableByHtml5:function(a){return"email"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.file={html5Attributes:{extension:"extension",maxsize:"maxSize",message:"message",type:"type"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e,f=c.extension?c.extension.split(","):null,g=c.type?c.type.split(","):null,h=window.File&&window.FileList&&window.FileReader;if(h)for(var i=b.get(0).files,j=i.length,k=0;j>k;k++){if(c.maxSize&&i[k].size>parseInt(c.maxSize))return!1;if(e=i[k].name.substr(i[k].name.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;if(g&&-1==g.indexOf(i[k].type))return!1}else if(e=d.substr(d.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.greaterThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("min");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.value:d>=c.value)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.grid={validate:function(b,c){var d=c.val();return""==d?!0:(d=d.toUpperCase(),/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(d)?(d=d.replace(/\s/g,"").replace(/-/g,""),"GRID:"==d.substr(0,5)&&(d=d.substr(5)),a.fn.bootstrapValidator.helpers.mod_37_36(d)):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hex={validate:function(a,b){var c=b.val();return""==c?!0:/^[0-9a-fA-F]+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hexColor={enableByHtml5:function(a){return"color"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.iban={html5Attributes:{message:"message",country:"country"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f={AD:"AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}",AE:"AE[0-9]{2}[0-9]{3}[0-9]{16}",AL:"AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}",AO:"AO[0-9]{2}[0-9]{21}",AT:"AT[0-9]{2}[0-9]{5}[0-9]{11}",AZ:"AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}",BA:"BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}",BE:"BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}",BF:"BF[0-9]{2}[0-9]{23}",BG:"BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}",BH:"BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}",BI:"BI[0-9]{2}[0-9]{12}",BJ:"BJ[0-9]{2}[A-Z]{1}[0-9]{23}",BR:"BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]",CH:"CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}",CI:"CI[0-9]{2}[A-Z]{1}[0-9]{23}",CM:"CM[0-9]{2}[0-9]{23}",CR:"CR[0-9]{2}[0-9]{3}[0-9]{14}",CV:"CV[0-9]{2}[0-9]{21}",CY:"CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}",CZ:"CZ[0-9]{2}[0-9]{20}",DE:"DE[0-9]{2}[0-9]{8}[0-9]{10}",DK:"DK[0-9]{2}[0-9]{14}",DO:"DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}",DZ:"DZ[0-9]{2}[0-9]{20}",EE:"EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}",ES:"ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}",FI:"FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}",FO:"FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",FR:"FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",GB:"GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",GE:"GE[0-9]{2}[A-Z]{2}[0-9]{16}",GI:"GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}",GL:"GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",GR:"GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}",GT:"GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}",HR:"HR[0-9]{2}[0-9]{7}[0-9]{10}",HU:"HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}",IE:"IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",IL:"IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}",IR:"IR[0-9]{2}[0-9]{22}",IS:"IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}",IT:"IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",JO:"JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}",KW:"KW[0-9]{2}[A-Z]{4}[0-9]{22}",KZ:"KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LB:"LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}",LI:"LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}",LT:"LT[0-9]{2}[0-9]{5}[0-9]{11}",LU:"LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LV:"LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}",MC:"MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",MD:"MD[0-9]{2}[A-Z0-9]{20}",ME:"ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",MG:"MG[0-9]{2}[0-9]{23}",MK:"MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}",ML:"ML[0-9]{2}[A-Z]{1}[0-9]{23}",MR:"MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}",MT:"MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}",MU:"MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}",MZ:"MZ[0-9]{2}[0-9]{21}",NL:"NL[0-9]{2}[A-Z]{4}[0-9]{10}",NO:"NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}",PK:"PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",PL:"PL[0-9]{2}[0-9]{8}[0-9]{16}",PS:"PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",PT:"PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}",QA:"QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",RO:"RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",RS:"RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",SA:"SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}",SE:"SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}",SI:"SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}",SK:"SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}",SM:"SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",SN:"SN[0-9]{2}[A-Z]{1}[0-9]{23}",TN:"TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",TR:"TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}",VG:"VG[0-9]{2}[A-Z]{4}[0-9]{16}"};e=e.replace(/[^a-zA-Z0-9]/g,"").toUpperCase();var g=d.country||e.substr(0,2);if(!f[g])return!1;if(!new RegExp("^"+f[g]+"$").test(e))return!1;e=e.substr(4)+e.substr(0,4),e=a.map(e.split(""),function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}),e=e.join("");for(var h=parseInt(e.substr(0,1),10),i=e.length,j=1;i>j;++j)h=(10*h+parseInt(e.substr(j,1),10))%97;return 1==h}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.id={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=c.country||d.substr(0,2),f=["_",e.toLowerCase()].join("");return this[f]&&"function"==typeof this[f]?this[f](d):!0},_validateJMBG:function(a,b){if(!/^\d{13}$/.test(a))return!1;var c=parseInt(a.substr(0,2),10),d=parseInt(a.substr(2,2),10),e=(parseInt(a.substr(4,3),10),parseInt(a.substr(7,2),10)),f=parseInt(a.substr(12,1),10);if(c>31||d>12)return!1;for(var g=0,h=0;6>h;h++)g+=(7-h)*(parseInt(a.charAt(h))+parseInt(a.charAt(h+6)));if(g=11-g%11,(10==g||11==g)&&(g=0),g!=f)return!1;switch(b.toUpperCase()){case"BA":return e>=10&&19>=e;case"MK":return e>=41&&49>=e;case"ME":return e>=20&&29>=e;case"RS":return e>=70&&99>=e;case"SI":return e>=50&&59>=e;default:return!0}},_ba:function(a){return this._validateJMBG(a,"BA")},_mk:function(a){return this._validateJMBG(a,"MK")},_me:function(a){return this._validateJMBG(a,"ME")},_rs:function(a){return this._validateJMBG(a,"RS")},_si:function(a){return this._validateJMBG(a,"SI")},_bg:function(b){if(!/^\d{10}$/.test(b)&&!/^\d{6}\s\d{3}\s\d{1}$/.test(b))return!1;b=b.replace(/\s/g,"");var c=parseInt(b.substr(0,2),10)+1900,d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);if(d>40?(c+=100,d-=40):d>20&&(c-=100,d-=20),!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(b.charAt(h))*g[h];return f=f%11%10,f==b.substr(9,1)},_br:function(a){if(/^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(a))return!1;if(!/^\d{11}$/.test(a)&&!/^\d{3}\.\d{3}\.\d{3}-\d{2}$/.test(a))return!1;a=a.replace(/\./g,"").replace(/-/g,"");for(var b=0,c=0;9>c;c++)b+=(10-c)*parseInt(a.charAt(c));if(b=11-b%11,(10==b||11==b)&&(b=0),b!=a.charAt(9))return!1;var d=0;for(c=0;10>c;c++)d+=(11-c)*parseInt(a.charAt(c));return d=11-d%11,(10==d||11==d)&&(d=0),d==a.charAt(10)},_ch:function(a){if(!/^756[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{2}$/.test(a))return!1;a=a.replace(/\D/g,"").substr(3);for(var b=a.length,c=0,d=8==b?[3,1]:[1,3],e=0;b-1>e;e++)c+=parseInt(a.charAt(e))*d[e%2];return c=10-c%10,c==a.charAt(b-1)},_cl:function(a){if(!/^\d{7,8}[-]{0,1}[0-9K]$/.test(a))return!1;for(a=a.replace(/\D/g,"");a.length<9;)a="0"+a;for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,11==b?b=0:10==b&&(b="K"),b==a.charAt(8)},_cz:function(b){if(!/^\d{9,10}$/.test(b))return!1;var c=1900+parseInt(b.substr(0,2)),d=parseInt(b.substr(2,2))%50%20,e=parseInt(b.substr(4,2));if(9==b.length){if(c>=1980&&(c-=100),c>1953)return!1}else 1954>c&&(c+=100);if(!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;if(10==b.length){var f=parseInt(b.substr(0,9),10)%11;return 1985>c&&(f%=10),f==b.substr(9,1)}return!0},_dk:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(b))return!1;b=b.replace(/-/g,"");var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);switch(!0){case-1!="5678".indexOf(b.charAt(6))&&e>=58:e+=1800;break;case-1!="0123".indexOf(b.charAt(6)):case-1!="49".indexOf(b.charAt(6))&&e>=37:e+=1900;break;default:e+=2e3}return a.fn.bootstrapValidator.helpers.date(e,d,c)},_ee:function(a){return this._lt(a)},_es:function(a){if(!/^[0-9A-Z]{8}[-]{0,1}[0-9A-Z]$/.test(a)&&!/^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-Z]$/.test(a))return!1;a=a.replace(/-/g,"");var b="XYZ".indexOf(a.charAt(0));-1!=b&&(a=b+a.substr(1)+"");var c=parseInt(a.substr(0,8),10);return c="TRWAGMYFPDXBNJZSQVHLCKE"[c%23],c==a.substr(8,1)},_fi:function(b){if(!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(b))return!1;var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10),f={"+":1800,"-":1900,A:2e3};if(e=f[b.charAt(6)]+e,!a.fn.bootstrapValidator.helpers.date(e,d,c))return!1;var g=parseInt(b.substr(7,3));if(2>g)return!1;var h=b.substr(0,6)+b.substr(7,3)+"";return h=parseInt(h),"0123456789ABCDEFHJKLMNPRSTUVWXY".charAt(h%31)==b.charAt(10)},_hr:function(b){return/^[0-9]{11}$/.test(b)?a.fn.bootstrapValidator.helpers.mod_11_10(b):!1},_ie:function(a){if(!/^\d{7}[A-W][AHWTX]?$/.test(a))return!1;var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d))*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return 9!=a.length||"A"!=a.charAt(8)&&"H"!=a.charAt(8)?a.charAt(7)==b(a.substr(0,7)):a.charAt(7)==b(a.substr(0,7)+a.substr(8)+"")},_is:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(b))return!1;b=b.replace(/-/g,"");var c=parseInt(b.substr(0,2),10),d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10),f=parseInt(b.charAt(9));if(e=9==f?1900+e:100*(20+f)+e,!a.fn.bootstrapValidator.helpers.date(e,d,c,!0))return!1;for(var g=0,h=[3,2,7,6,5,4,3,2],i=0;8>i;i++)g+=parseInt(b.charAt(i))*h[i];return g=11-g%11,g==b.charAt(8)},_lt:function(b){if(!/^[0-9]{11}$/.test(b))return!1;var c=parseInt(b.charAt(0)),d=parseInt(b.substr(1,2),10),e=parseInt(b.substr(3,2),10),f=parseInt(b.substr(5,2),10),g=c%2==0?17+c/2:17+(c+1)/2;if(d=100*g+d,!a.fn.bootstrapValidator.helpers.date(d,e,f,!0))return!1;for(var h=0,i=[1,2,3,4,5,6,7,8,9,1],j=0;10>j;j++)h+=parseInt(b.charAt(j))*i[j];if(h%=11,10!=h)return h==b.charAt(10);for(h=0,i=[3,4,5,6,7,8,9,1,2,3],j=0;10>j;j++)h+=parseInt(b.charAt(j))*i[j];return h%=11,10==h&&(h=0),h==b.charAt(10)},_lv:function(b){if(!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(b))return!1;b=b.replace(/\D/g,"");var c=parseInt(b.substr(0,2)),d=parseInt(b.substr(2,2)),e=parseInt(b.substr(4,2));if(e=e+1800+100*parseInt(b.charAt(6)),!a.fn.bootstrapValidator.helpers.date(e,d,c,!0))return!1;for(var f=0,g=[10,5,8,4,2,1,6,3,7,9],h=0;10>h;h++)f+=parseInt(b.charAt(h))*g[h];return f=(f+1)%11%10,f==b.charAt(10)},_nl:function(a){for(;a.length<9;)a="0"+a;if(!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(a))return!1;if(a=a.replace(/\./g,""),0==parseInt(a,10))return!1;for(var b=0,c=a.length,d=0;c-1>d;d++)b+=(9-d)*parseInt(a.charAt(d));return b%=11,10==b&&(b=0),b==a.charAt(c-1)},_ro:function(b){if(!/^[0-9]{13}$/.test(b))return!1;var c=parseInt(b.charAt(0));if(0==c||7==c||8==c)return!1;var d=parseInt(b.substr(1,2),10),e=parseInt(b.substr(3,2),10),f=parseInt(b.substr(5,2),10),g={1:1900,2:1900,3:1800,4:1800,5:2e3,6:2e3};if(f>31&&e>12)return!1;if(9!=c&&(d=g[c+""]+d,!a.fn.bootstrapValidator.helpers.date(d,e,f)))return!1;for(var h=0,i=[2,7,9,1,4,6,3,5,8,2,7,9],j=b.length,k=0;j-1>k;k++)h+=parseInt(b.charAt(k))*i[k]; +return h%=11,10==h&&(h=1),h==b.charAt(j-1)},_se:function(b){if(!/^[0-9]{10}$/.test(b)&&!/^[0-9]{6}[-|+][0-9]{4}$/.test(b))return!1;b=b.replace(/[^0-9]/g,"");var c=parseInt(b.substr(0,2))+1900,d=parseInt(b.substr(2,2)),e=parseInt(b.substr(4,2));return a.fn.bootstrapValidator.helpers.date(c,d,e)?a.fn.bootstrapValidator.helpers.luhn(b):!1},_sk:function(a){return this._cz(a)},_sm:function(a){return/^\d{5}$/.test(a)},_za:function(b){if(!/^[0-9]{10}[0|1][8|9][0-9]$/.test(b))return!1;var c=parseInt(b.substr(0,2)),d=(new Date).getFullYear()%100,e=parseInt(b.substr(2,2)),f=parseInt(b.substr(4,2));return c=c>=d?c+1900:c+2e3,a.fn.bootstrapValidator.helpers.date(c,e,f)?a.fn.bootstrapValidator.helpers.luhn(b):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.identical={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d==e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"identical"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.imei={validate:function(b,c){var d=c.val();if(""==d)return!0;switch(!0){case/^\d{15}$/.test(d):case/^\d{2}-\d{6}-\d{6}-\d{1}$/.test(d):case/^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(d):return d=d.replace(/[^0-9]/g,""),a.fn.bootstrapValidator.helpers.luhn(d);case/^\d{14}$/.test(d):case/^\d{16}$/.test(d):case/^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(d):case/^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(d):return!0;default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.integer={enableByHtml5:function(a){return"number"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/^(?:-?(?:0|[1-9][0-9]*))$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ip={html5Attributes:{message:"message",ipv4:"ipv4",ipv6:"ipv6"},validate:function(b,c,d){var e=c.val();return""==e?!0:(d=a.extend({},{ipv4:!0,ipv6:!0},d),d.ipv4?/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e):d.ipv6?/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(str):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.isbn={validate:function(a,b){var c=b.val();if(""==c)return!0;var d;switch(!0){case/^\d{9}[\dX]$/.test(c):case 13==c.length&&/^(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 13==c.length&&/^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN10";break;case/^(978|979)\d{9}[\dX]$/.test(c):case 17==c.length&&/^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 17==c.length&&/^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN13";break;default:return!1}c=c.replace(/[^0-9X]/gi,"");var e,f=c.split(""),g=f.length,h=0;switch(d){case"ISBN10":h=0;for(var i=0;g-1>i;i++)h+=(10-i)*parseInt(f[i]);return e=11-h%11,11==e?e=0:10==e&&(e="X"),e+""==f[g-1];case"ISBN13":h=0;for(var i=0;g-1>i;i++)h+=i%2==0?parseInt(f[i]):3*parseInt(f[i]);return e=10-h%10,10==e&&(e="0"),e+""==f[g-1];default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.isin={COUNTRY_CODES:"AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP|NL|NC|NZ|NI|NE|NG|NU|NF|MP|NO|OM|PK|PW|PS|PA|PG|PY|PE|PH|PN|PL|PT|PR|QA|RE|RO|RU|RW|BL|SH|KN|LC|MF|PM|VC|WS|SM|ST|SA|SN|RS|SC|SL|SG|SX|SK|SI|SB|SO|ZA|GS|SS|ES|LK|SD|SR|SJ|SZ|SE|CH|SY|TW|TJ|TZ|TH|TL|TG|TK|TO|TT|TN|TR|TM|TC|TV|UG|UA|AE|GB|US|UM|UY|UZ|VU|VE|VN|VG|VI|WF|EH|YE|ZM|ZW",validate:function(a,b){var c=b.val();if(""==c)return!0;c=c.toUpperCase();var d=new RegExp("^("+this.COUNTRY_CODES+")[0-9A-Z]{10}$");if(!d.test(c))return!1;for(var e="",f=c.length,g=0;f-1>g;g++){var h=c.charCodeAt(g);e+=h>57?(h-55).toString():c.charAt(g)}var i="",j=e.length,k=j%2!=0?0:1;for(g=0;j>g;g++)i+=parseInt(e[g])*(g%2==k?2:1)+"";var l=0;for(g=0;gh;h++)f+=parseInt(c.charAt(h))*g[h%2];return f=10-f%10,f==c.charAt(e-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.issn={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^\d{4}\-\d{3}[\dX]$/.test(c))return!1;c=c.replace(/[^0-9X]/gi,"");var d=c.split(""),e=d.length,f=0;"X"==d[7]&&(d[7]=10);for(var g=0;e>g;g++)f+=(8-g)*parseInt(d[g]);return f%11==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.lessThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("max");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!1?d<=c.value:d0:""!=a.trim(c.val())}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.numeric={html5Attributes:{message:"message",separator:"separator"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=c.separator||".";return"."!=e&&(d=d.replace(e,".")),!isNaN(parseFloat(d))&&isFinite(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.phone={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"US":default:return d=d.replace(/\D/g,""),/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/.test(d)&&10==d.length}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.regexp={html5Attributes:{message:"message",regexp:"regexp"},enableByHtml5:function(a){var b=a.attr("pattern");return b?{regexp:b}:!1},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e="string"==typeof c.regexp?new RegExp(c.regexp):c.regexp;return e.test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.remote={html5Attributes:{message:"message",url:"url",name:"name"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=c.attr("data-bv-field"),g=d.data;null==g&&(g={}),"function"==typeof g&&(g=g.call(this,b)),g[d.name||f]=e;var h=new a.Deferred,i=a.ajax({type:"POST",url:d.url,dataType:"json",data:g});return i.then(function(a){h.resolve(c,"remote",a.valid===!0||"true"===a.valid)}),h.fail(function(){i.abort()}),h}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.rtn={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^\d{9}$/.test(c))return!1;for(var d=0,e=0;eg;g++)d+=e[g]*parseInt(c.charAt(g),36);return d=(10-d%10)%10,d==c.charAt(f-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siren={validate:function(b,c){var d=c.val();return""==d?!0:/^\d{9}$/.test(d)?a.fn.bootstrapValidator.helpers.luhn(d):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siret={validate:function(a,b){var c=b.val();if(""==c)return!0;for(var d,e=0,f=c.length,g=0;f>g;g++)d=parseInt(c.charAt(g),10),g%2==0&&(d=2*d,d>9&&(d-=9)),e+=d;return e%10==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.step={html5Attributes:{message:"message",base:"baseValue",step:"step"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;if(d=a.extend({},{baseValue:0,step:1},d),e=parseFloat(e),isNaN(e)||!isFinite(e))return!1;var f=function(a,b){var c=Math.pow(10,b);a*=c;var d=a>0|-(0>a),e=a%1===.5*d;return e?(Math.floor(a)+(d>0))/c:Math.round(a)/c},g=function(a,b){if(0==b)return 1;var c=(a+"").split("."),d=(b+"").split("."),e=(1==c.length?0:c[1].length)+(1==d.length?0:d[1].length);return f(a-b*Math.floor(a/b),e)},h=g(e-d.baseValue,d.step);return 0==h||h==d.step}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringCase={html5Attributes:{message:"message","case":"case"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c["case"]||"lower").toLowerCase();switch(e){case"upper":return d===d.toUpperCase();case"lower":default:return d===d.toLowerCase()}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringLength={html5Attributes:{message:"message",min:"min",max:"max"},enableByHtml5:function(a){var b=a.attr("maxlength");return b?{max:parseInt(b,10)}:!1},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=a.trim(e).length;return d.min&&fd.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uri={enableByHtml5:function(a){return"url"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=new RegExp("^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/[^\\s]*)?$","i");return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uuid={html5Attributes:{message:"message",version:"version"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},f=c.version?c.version+"":"all";return null==e[f]?!0:e[f].test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vat={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=c.country||d.substr(0,2),f=["_",e.toLowerCase()].join("");return this[f]&&"function"==typeof this[f]?this[f](d):!0},_at:function(a){if(!/^ATU[0-9]{8}$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[1,2,1,2,1,2,1],d=0,e=0;7>e;e++)d=parseInt(a.charAt(e))*c[e],d>9&&(d=Math.floor(d/10)+d%10),b+=d;return b=10-(b+4)%10,10==b&&(b=0),b==a.substr(7,1)},_be:function(a){if(!/^BE[0]{0,1}[0-9]{9}$/.test(a))return!1;if(a=a.substr(2),9==a.length&&(a="0"+a),0==a.substr(1,1))return!1;var b=parseInt(a.substr(0,8),10)+parseInt(a.substr(8,2),10);return b%97==0},_bg:function(b){if(!/^BG[0-9]{9,10}$/.test(b))return!1;b=b.substr(2);var c=0,d=0;if(9==b.length){for(d=0;8>d;d++)c+=parseInt(b.charAt(d))*(d+1);if(c%=11,10==c)for(c=0,d=0;8>d;d++)c+=parseInt(b.charAt(d))*(d+3);return c%=10,c==b.substr(8)}if(10==b.length){var e=function(b){var c=parseInt(b.substr(0,2),10)+1900,d=parseInt(b.substr(2,2),10),e=parseInt(b.substr(4,2),10);if(d>40?(c+=100,d-=40):d>20&&(c-=100,d-=20),!a.fn.bootstrapValidator.helpers.date(c,d,e))return!1;for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(b.charAt(h))*g[h];return f=f%11%10,f==b.substr(9,1)},f=function(a){for(var b=0,c=[21,19,17,13,11,9,7,3,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=10,b==a.substr(9,1)},g=function(a){for(var b=0,c=[4,3,2,7,6,5,4,3,2],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(9,1))};return e(b)||f(b)||g(b)}return!1},_ch:function(a){if(!/^CHE[0-9]{9}(MWST)?$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[5,4,3,2,7,6,5,4],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(8,1))},_cy:function(a){if(!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(a))return!1;if(a=a.substr(2),"12"==a.substr(0,2))return!1;for(var b=0,c={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21},d=0;8>d;d++){var e=parseInt(a.charAt(d),10);d%2==0&&(e=c[e+""]),b+=e}return b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[b%26],b==a.substr(8,1)},_cz:function(b){if(!/^CZ[0-9]{8,10}$/.test(b))return!1;b=b.substr(2);var c=0,d=0;if(8==b.length){if(b.charAt(0)+""=="9")return!1;for(c=0,d=0;7>d;d++)c+=parseInt(b.charAt(d),10)*(8-d);return c=11-c%11,10==c&&(c=0),11==c&&(c=1),c==b.substr(7,1)}if(9==b.length&&b.charAt(0)+""=="6"){for(c=0,d=0;7>d;d++)c+=parseInt(b.charAt(d+1),10)*(8-d);return c=11-c%11,10==c&&(c=0),11==c&&(c=1),c=[8,7,6,5,4,3,2,1,0,9,10][c-1],c==b.substr(8,1)}if(9==b.length||10==b.length){var e=1900+parseInt(b.substr(0,2)),f=parseInt(b.substr(2,2))%50%20,g=parseInt(b.substr(4,2));if(9==b.length){if(e>=1980&&(e-=100),e>1953)return!1}else 1954>e&&(e+=100);if(!a.fn.bootstrapValidator.helpers.date(e,f,g))return!1;if(10==b.length){var h=parseInt(b.substr(0,9),10)%11;return 1985>e&&(h%=10),h==b.substr(9,1)}return!0}return!1},_de:function(b){return/^DE[0-9]{9}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_dk:function(a){if(!/^DK[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[2,7,6,5,4,3,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11==0},_ee:function(a){if(!/^EE[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,7,1,3,7,1,3,7,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_es:function(a){if(!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(a))return!1;a=a.substr(2);var b=function(a){var b=parseInt(a.substr(0,8),10);return b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},c=function(a){var b=["XYZ".indexOf(a.charAt(0)),a.substr(1)].join("");return b=parseInt(b,10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},d=function(a){var b,c=a.charAt(0);if(-1!="KLM".indexOf(c))return b=parseInt(a.substr(1,8),10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1);if(-1!="ABCDEFGHJNPQRSUVW".indexOf(c)){for(var d=0,e=[2,1,2,1,2,1,2],f=0,g=0;7>g;g++)f=parseInt(a.charAt(g+1))*e[g],f>9&&(f=Math.floor(f/10)+f%10),d+=f;return d=10-d%10,d==a.substr(8,1)||"JABCDEFGHI"[d]==a.substr(8,1)}return!1},e=a.charAt(0);return/^[0-9]$/.test(e)?b(a):/^[XYZ]$/.test(e)?c(a):d(a)},_fi:function(a){if(!/^FI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[7,9,10,5,8,4,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_fr:function(b){if(!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(b))return!1;if(b=b.substr(2),!a.fn.bootstrapValidator.helpers.luhn(b.substr(2)))return!1;if(/^[0-9]{2}$/.test(b.substr(0,2)))return b.substr(0,2)==parseInt(b.substr(2)+"12",10)%97;var c,d="0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";return c=/^[0-9]{1}$/.test(b.charAt(0))?24*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-10:34*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-100,(parseInt(b.substr(2),10)+1+Math.floor(c/11))%11==c%11},_gb:function(a){if(!(/^GB[0-9]{9}$/.test(a)||/^GB[0-9]{12}$/.test(a)||/^GBGD[0-9]{3}$/.test(a)||/^GBHA[0-9]{3}$/.test(a)||/^GB(GD|HA)8888[0-9]{5}$/.test(a)))return!1;a=a.substr(2);var b=a.length;if(5==b){var c=a.substr(0,2),d=parseInt(a.substr(2));return"GD"==c&&500>d||"HA"==c&&d>=500}if(11==b&&("GD8888"==a.substr(0,6)||"HA8888"==a.substr(0,6)))return"GD"==a.substr(0,2)&&parseInt(a.substr(6,3))>=500||"HA"==a.substr(0,2)&&parseInt(a.substr(6,3))<500?!1:parseInt(a.substr(6,3))%97==parseInt(a.substr(9,2));if(9==b||12==b){for(var e=0,f=[8,7,6,5,4,3,2,10,1],g=0;9>g;g++)e+=parseInt(a.charAt(g))*f[g];return e%=97,parseInt(a.substr(0,3))>=100?0==e||42==e||55==e:0==e}return!0},_gr:function(a){if(!/^GR[0-9]{9}$/.test(a))return!1;a=a.substr(2),8==a.length&&(a="0"+a);for(var b=0,c=[256,128,64,32,16,8,4,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=b%11%10,b==a.substr(8,1)},_el:function(a){return/^EL[0-9]{9}$/.test(a)?(a="GR"+a.substr(2),this._gr(a)):!1},_hu:function(a){if(!/^HU[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,7,3,1,9,7,3,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_hr:function(b){return/^HR[0-9]{11}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_ie:function(a){if(!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(a))return!1;a=a.substr(2);var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d))*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return/^[0-9]+$/.test(a.substr(0,7))?a.charAt(7)==b(a.substr(0,7)+a.substr(8)+""):-1!="ABCDEFGHIJKLMNOPQRSTUVWXYZ+*".indexOf(a.charAt(1))?a.charAt(7)==b(a.substr(2,5)+a.substr(0,1)+""):!0},_it:function(b){if(!/^IT[0-9]{11}$/.test(b))return!1;if(b=b.substr(2),0==parseInt(b.substr(0,7)))return!1;var c=parseInt(b.substr(7,3));return 1>c||c>201&&999!=c&&888!=c?!1:a.fn.bootstrapValidator.helpers.luhn(b)},_lt:function(a){if(!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=0,d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+d%9);var e=c%11;if(10==e){c=0;for(var d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+(d+2)%9)}return e=e%11%10,e==a.charAt(b-1)},_lu:function(a){return/^LU[0-9]{8}$/.test(a)?(a=a.substr(2),a.substr(0,6)%89==a.substr(6,2)):!1},_lv:function(b){if(!/^LV[0-9]{11}$/.test(b))return!1;b=b.substr(2);var c=parseInt(b.charAt(0)),d=0,e=[],f=0,g=b.length;if(c>3){for(d=0,e=[9,1,4,8,3,10,2,5,7,6,1],f=0;g>f;f++)d+=parseInt(b.charAt(f))*e[f];return d%=11,3==d}var h=parseInt(b.substr(0,2)),i=parseInt(b.substr(2,2)),j=parseInt(b.substr(4,2));if(j=j+1800+100*parseInt(b.charAt(6)),!a.fn.bootstrapValidator.helpers.date(j,i,h))return!1;for(d=0,e=[10,5,8,4,2,1,6,3,7,9],f=0;g-1>f;f++)d+=parseInt(b.charAt(f))*e[f];return d=(d+1)%11%10,d==b.charAt(g-1)},_mt:function(a){if(!/^MT[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,4,6,7,8,9,10,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%37==0},_nl:function(a){if(!/^NL[0-9]{9}B[0-9]{2}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b=0),b==a.substr(8,1)},_no:function(a){if(!/^NO[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,11==b&&(b=0),b==a.substr(8,1)},_pl:function(a){if(!/^PL[0-9]{10}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[6,5,7,2,3,4,5,6,7,-1],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_pt:function(a){if(!/^PT[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,b>9&&(b=0),b==a.substr(8,1)},_ro:function(a){if(!/^RO[1-9][0-9]{1,9}$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=[7,5,3,2,1,7,5,3,2].slice(10-b),d=0,e=0;b-1>e;e++)d+=parseInt(a.charAt(e))*c[e];return d=10*d%11%10,d==a.substr(b-1,1)},_ru:function(a){if(!/^RU([0-9]{9}|[0-9]{12})$/.test(a))return!1;if(a=a.substr(2),10==a.length){for(var b=0,c=[2,4,10,3,5,9,4,6,8,0],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b%=10),b==a.substr(9,1)}if(12==a.length){for(var e=0,f=[7,2,4,10,3,5,9,4,6,8,0],g=0,h=[3,7,2,4,10,3,5,9,4,6,8,0],d=0;11>d;d++)e+=parseInt(a.charAt(d))*f[d],g+=parseInt(a.charAt(d))*h[d];return e%=11,e>9&&(e%=10),g%=11,g>9&&(g%=10),e==a.substr(10,1)&&g==a.substr(11,1)}return!1},_rs:function(a){if(!/^RS[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=10,c=0,d=0;8>d;d++)c=(parseInt(a.charAt(d))+b)%10,0==c&&(c=10),b=2*c%11;return(b+parseInt(a.substr(8,1)))%10==1},_se:function(b){return/^SE[0-9]{10}01$/.test(b)?(b=b.substr(2,10),a.fn.bootstrapValidator.helpers.luhn(b)):!1},_si:function(a){if(!/^SI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[8,7,6,5,4,3,2],d=0;7>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b&&(b=0),b==a.substr(7,1)},_sk:function(a){return/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(a)?(a=a.substr(2),a%11==0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vin={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(c))return!1;c=c.toUpperCase();for(var d={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,J:1,K:2,L:3,M:4,N:5,P:7,R:9,S:2,T:3,U:4,V:5,W:6,X:7,Y:8,Z:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,0:0},e=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],f=0,g=c.length,h=0;g>h;h++)f+=d[c.charAt(h)+""]*e[h];var i=f%11;return 10==i&&(i="X"),i==c.charAt(8)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.zipCode={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d||!c.country)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"CA":return/(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}\s?[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}/i.test(d);case"DK":return/^(DK(-|\s)?)?\d{4}$/i.test(d);case"GB":return this._gb(d);case"IT":return/^(I-|IT-)?\d{5}$/i.test(d);case"NL":return/^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(d);case"SE":return/^(S-)?\d{3}\s?\d{2}$/i.test(d);case"US":default:return/^\d{4,5}([\-]\d{4})?$/.test(d)}},_gb:function(a){for(var b="[ABCDEFGHIJKLMNOPRSTUWYZ]",c="[ABCDEFGHKLMNOPQRSTUVWXY]",d="[ABCDEFGHJKPMNRSTUVWXY]",e="[ABEHMNPRVWXY]",f="[ABDEFGHJLNPQRSTUWXYZ]",g=[new RegExp("^("+b+"{1}"+c+"?[0-9]{1,2})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}[0-9]{1}"+d+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}"+c+"{1}?[0-9]{1}"+e+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^(BF1)(\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$","i"),/^(GIR)(\s*)(0AA)$/i,/^(BFPO)(\s*)([0-9]{1,4})$/i,/^(BFPO)(\s*)(c\/o\s*[0-9]{1,3})$/i,/^([A-Z]{4})(\s*)(1ZZ)$/i,/^(AI-2640)$/i],h=0;h div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eeeeee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(top, #b3b3b3, #808080); + background-image: -ms-linear-gradient(top, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); + background-image: -o-linear-gradient(top, #b3b3b3, #808080); + background-image: linear-gradient(top, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; +} diff --git a/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/demo-mock.js b/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/demo-mock.js new file mode 100644 index 000000000..2680a43e3 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/demo-mock.js @@ -0,0 +1,76 @@ +$(function(){ + //ajax mocks + $.mockjaxSettings.responseTime = 500; + + $.mockjax({ + url: '/post', + response: function(settings) { + log(settings, this); + } + }); + + $.mockjax({ + url: '/error', + status: 400, + statusText: 'Bad Request', + response: function(settings) { + this.responseText = 'Please input correct value'; + log(settings, this); + } + }); + + $.mockjax({ + url: '/status', + status: 500, + response: function(settings) { + this.responseText = 'Internal Server Error'; + log(settings, this); + } + }); + + $.mockjax({ + url: '/groups', + response: function(settings) { + this.responseText = [ + {value: 0, text: 'Guest'}, + {value: 1, text: 'Service'}, + {value: 2, text: 'Customer'}, + {value: 3, text: 'Operator'}, + {value: 4, text: 'Support'}, + {value: 5, text: 'Admin'} + ]; + log(settings, this); + } + }); + + function log(settings, response) { + var s = [], str; + s.push(settings.type.toUpperCase() + ' url = "' + settings.url + '"'); + for(var a in settings.data) { + if(settings.data[a] && typeof settings.data[a] === 'object') { + str = []; + for(var j in settings.data[a]) {str.push(j+': "'+settings.data[a][j]+'"');} + str = '{ '+str.join(', ')+' }'; + } else { + str = '"'+settings.data[a]+'"'; + } + s.push(a + ' = ' + str); + } + s.push('RESPONSE: status = ' + response.status); + + if(response.responseText) { + if($.isArray(response.responseText)) { + s.push('['); + $.each(response.responseText, function(i, v){ + s.push('{value: ' + v.value+', text: "'+v.text+'"}'); + }); + s.push(']'); + } else { + s.push($.trim(response.responseText)); + } + } + s.push('--------------------------------------\n'); + $('#console').val(s.join('\n') + $('#console').val()); + } + +}); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/jquery.mockjax.js b/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/jquery.mockjax.js new file mode 100644 index 000000000..549b6e037 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-xeditable/demo/jquery.mockjax.js @@ -0,0 +1,521 @@ +/*! + * MockJax - jQuery Plugin to Mock Ajax requests + * + * Version: 1.5.0pre + * Released: + * Home: http://github.com/appendto/jquery-mockjax + * Author: Jonathan Sharp (http://jdsharp.com) + * License: MIT,GPL + * + * Copyright (c) 2011 appendTo LLC. + * Dual licensed under the MIT or GPL licenses. + * http://appendto.com/open-source-licenses + */ +(function($) { + var _ajax = $.ajax, + mockHandlers = [], + CALLBACK_REGEX = /=\?(&|$)/, + jsc = (new Date()).getTime(); + + + // Parse the given XML string. + function parseXML(xml) { + if ( window['DOMParser'] == undefined && window.ActiveXObject ) { + DOMParser = function() { }; + DOMParser.prototype.parseFromString = function( xmlString ) { + var doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + doc.loadXML( xmlString ); + return doc; + }; + } + + try { + var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' ); + if ( $.isXMLDoc( xmlDoc ) ) { + var err = $('parsererror', xmlDoc); + if ( err.length == 1 ) { + throw('Error: ' + $(xmlDoc).text() ); + } + } else { + throw('Unable to parse XML'); + } + } catch( e ) { + var msg = ( e.name == undefined ? e : e.name + ': ' + e.message ); + $(document).trigger('xmlParseError', [ msg ]); + return undefined; + } + return xmlDoc; + } + + // Trigger a jQuery event + function trigger(s, type, args) { + (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); + } + + // Check if the data field on the mock handler and the request match. This + // can be used to restrict a mock handler to being used only when a certain + // set of data is passed to it. + function isMockDataEqual( mock, live ) { + var identical = false; + // Test for situations where the data is a querystring (not an object) + if (typeof live === 'string') { + // Querystring may be a regex + return $.isFunction( mock.test ) ? mock.test(live) : mock == live; + } + $.each(mock, function(k, v) { + if ( live[k] === undefined ) { + identical = false; + return identical; + } else { + identical = true; + if ( typeof live[k] == 'object' ) { + return isMockDataEqual(mock[k], live[k]); + } else { + if ( $.isFunction( mock[k].test ) ) { + identical = mock[k].test(live[k]); + } else { + identical = ( mock[k] == live[k] ); + } + return identical; + } + } + }); + + return identical; + } + + // Check the given handler should mock the given request + function getMockForRequest( handler, requestSettings ) { + // If the mock was registered with a function, let the function decide if we + // want to mock this request + if ( $.isFunction(handler) ) { + return handler( requestSettings ); + } + + // Inspect the URL of the request and check if the mock handler's url + // matches the url for this ajax request + if ( $.isFunction(handler.url.test) ) { + // The user provided a regex for the url, test it + if ( !handler.url.test( requestSettings.url ) ) { + return null; + } + } else { + // Look for a simple wildcard '*' or a direct URL match + var star = handler.url.indexOf('*'); + if (handler.url !== requestSettings.url && star === -1 || + !new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&").replace('*', '.+')).test(requestSettings.url)) { + return null; + } + } + + // Inspect the data submitted in the request (either POST body or GET query string) + if ( handler.data && requestSettings.data ) { + if ( !isMockDataEqual(handler.data, requestSettings.data) ) { + // They're not identical, do not mock this request + return null; + } + } + // Inspect the request type + if ( handler && handler.type && + handler.type.toLowerCase() != requestSettings.type.toLowerCase() ) { + // The request type doesn't match (GET vs. POST) + return null; + } + + return handler; + } + + // If logging is enabled, log the mock to the console + function logMock( mockHandler, requestSettings ) { + var c = $.extend({}, $.mockjaxSettings, mockHandler); + if ( c.log && $.isFunction(c.log) ) { + c.log('MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url, $.extend({}, requestSettings)); + } + } + + // Process the xhr objects send operation + function _xhrSend(mockHandler, requestSettings, origSettings) { + + // This is a substitute for < 1.4 which lacks $.proxy + var process = (function(that) { + return function() { + return (function() { + // The request has returned + this.status = mockHandler.status; + this.statusText = mockHandler.statusText; + this.readyState = 4; + + // We have an executable function, call it to give + // the mock handler a chance to update it's data + if ( $.isFunction(mockHandler.response) ) { + mockHandler.response(origSettings); + } + // Copy over our mock to our xhr object before passing control back to + // jQuery's onreadystatechange callback + if ( requestSettings.dataType == 'json' && ( typeof mockHandler.responseText == 'object' ) ) { + this.responseText = JSON.stringify(mockHandler.responseText); + } else if ( requestSettings.dataType == 'xml' ) { + if ( typeof mockHandler.responseXML == 'string' ) { + this.responseXML = parseXML(mockHandler.responseXML); + } else { + this.responseXML = mockHandler.responseXML; + } + } else { + this.responseText = mockHandler.responseText; + } + if( typeof mockHandler.status == 'number' || typeof mockHandler.status == 'string' ) { + this.status = mockHandler.status; + } + if( typeof mockHandler.statusText === "string") { + this.statusText = mockHandler.statusText; + } + // jQuery < 1.4 doesn't have onreadystate change for xhr + if ( $.isFunction(this.onreadystatechange) ) { + if( mockHandler.isTimeout) { + this.status = -1; + } + this.onreadystatechange( mockHandler.isTimeout ? 'timeout' : undefined ); + } else if ( mockHandler.isTimeout ) { + // Fix for 1.3.2 timeout to keep success from firing. + this.status = -1; + } + }).apply(that); + }; + })(this); + + if ( mockHandler.proxy ) { + // We're proxying this request and loading in an external file instead + _ajax({ + global: false, + url: mockHandler.proxy, + type: mockHandler.proxyType, + data: mockHandler.data, + dataType: requestSettings.dataType === "script" ? "text/plain" : requestSettings.dataType, + complete: function(xhr, txt) { + mockHandler.responseXML = xhr.responseXML; + mockHandler.responseText = xhr.responseText; + mockHandler.status = xhr.status; + mockHandler.statusText = xhr.statusText; + this.responseTimer = setTimeout(process, mockHandler.responseTime || 0); + } + }); + } else { + // type == 'POST' || 'GET' || 'DELETE' + if ( requestSettings.async === false ) { + // TODO: Blocking delay + process(); + } else { + this.responseTimer = setTimeout(process, mockHandler.responseTime || 50); + } + } + } + + // Construct a mocked XHR Object + function xhr(mockHandler, requestSettings, origSettings, origHandler) { + // Extend with our default mockjax settings + mockHandler = $.extend({}, $.mockjaxSettings, mockHandler); + + if (typeof mockHandler.headers === 'undefined') { + mockHandler.headers = {}; + } + if ( mockHandler.contentType ) { + mockHandler.headers['content-type'] = mockHandler.contentType; + } + + return { + status: mockHandler.status, + statusText: mockHandler.statusText, + readyState: 1, + open: function() { }, + send: function() { + origHandler.fired = true; + _xhrSend.call(this, mockHandler, requestSettings, origSettings); + }, + abort: function() { + clearTimeout(this.responseTimer); + }, + setRequestHeader: function(header, value) { + mockHandler.headers[header] = value; + }, + getResponseHeader: function(header) { + // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery + if ( mockHandler.headers && mockHandler.headers[header] ) { + // Return arbitrary headers + return mockHandler.headers[header]; + } else if ( header.toLowerCase() == 'last-modified' ) { + return mockHandler.lastModified || (new Date()).toString(); + } else if ( header.toLowerCase() == 'etag' ) { + return mockHandler.etag || ''; + } else if ( header.toLowerCase() == 'content-type' ) { + return mockHandler.contentType || 'text/plain'; + } + }, + getAllResponseHeaders: function() { + var headers = ''; + $.each(mockHandler.headers, function(k, v) { + headers += k + ': ' + v + "\n"; + }); + return headers; + } + }; + } + + // Process a JSONP mock request. + function processJsonpMock( requestSettings, mockHandler, origSettings ) { + // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here + // because there isn't an easy hook for the cross domain script tag of jsonp + + processJsonpUrl( requestSettings ); + + requestSettings.dataType = "json"; + if(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) { + createJsonpCallback(requestSettings, mockHandler); + + // We need to make sure + // that a JSONP style response is executed properly + + var rurl = /^(\w+:)?\/\/([^\/?#]+)/, + parts = rurl.exec( requestSettings.url ), + remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); + + requestSettings.dataType = "script"; + if(requestSettings.type.toUpperCase() === "GET" && remote ) { + var newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings ); + + // Check if we are supposed to return a Deferred back to the mock call, or just + // signal success + if(newMockReturn) { + return newMockReturn; + } else { + return true; + } + } + } + return null; + } + + // Append the required callback parameter to the end of the request URL, for a JSONP request + function processJsonpUrl( requestSettings ) { + if ( requestSettings.type.toUpperCase() === "GET" ) { + if ( !CALLBACK_REGEX.test( requestSettings.url ) ) { + requestSettings.url += (/\?/.test( requestSettings.url ) ? "&" : "?") + + (requestSettings.jsonp || "callback") + "=?"; + } + } else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) { + requestSettings.data = (requestSettings.data ? requestSettings.data + "&" : "") + (requestSettings.jsonp || "callback") + "=?"; + } + } + + // Process a JSONP request by evaluating the mocked response text + function processJsonpRequest( requestSettings, mockHandler, origSettings ) { + // Synthesize the mock request for adding a script tag + var callbackContext = origSettings && origSettings.context || requestSettings, + newMock = null; + + + // If the response handler on the moock is a function, call it + if ( mockHandler.response && $.isFunction(mockHandler.response) ) { + mockHandler.response(origSettings); + } else { + + // Evaluate the responseText javascript in a global context + if( typeof mockHandler.responseText === 'object' ) { + $.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')'); + } else { + $.globalEval( '(' + mockHandler.responseText + ')'); + } + } + + // Successful response + jsonpSuccess( requestSettings, mockHandler ); + jsonpComplete( requestSettings, mockHandler ); + + // If we are running under jQuery 1.5+, return a deferred object + if(jQuery.Deferred){ + newMock = new jQuery.Deferred(); + if(typeof mockHandler.responseText == "object"){ + newMock.resolve( mockHandler.responseText ); + } + else{ + newMock.resolve( jQuery.parseJSON( mockHandler.responseText ) ); + } + } + return newMock; + } + + + // Create the required JSONP callback function for the request + function createJsonpCallback( requestSettings, mockHandler ) { + jsonp = requestSettings.jsonpCallback || ("jsonp" + jsc++); + + // Replace the =? sequence both in the query string and the data + if ( requestSettings.data ) { + requestSettings.data = (requestSettings.data + "").replace(CALLBACK_REGEX, "=" + jsonp + "$1"); + } + + requestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, "=" + jsonp + "$1"); + + + // Handle JSONP-style loading + window[ jsonp ] = window[ jsonp ] || function( tmp ) { + data = tmp; + jsonpSuccess( requestSettings, mockHandler ); + jsonpComplete( requestSettings, mockHandler ); + // Garbage collect + window[ jsonp ] = undefined; + + try { + delete window[ jsonp ]; + } catch(e) {} + + if ( head ) { + head.removeChild( script ); + } + }; + } + + // The JSONP request was successful + function jsonpSuccess(requestSettings, mockHandler) { + // If a local callback was specified, fire it and pass it the data + if ( requestSettings.success ) { + requestSettings.success.call( callbackContext, ( mockHandler.response ? mockHandler.response.toString() : mockHandler.responseText || ''), status, {} ); + } + + // Fire the global callback + if ( requestSettings.global ) { + trigger(requestSettings, "ajaxSuccess", [{}, requestSettings] ); + } + } + + // The JSONP request was completed + function jsonpComplete(requestSettings, mockHandler) { + // Process result + if ( requestSettings.complete ) { + requestSettings.complete.call( callbackContext, {} , status ); + } + + // The request was completed + if ( requestSettings.global ) { + trigger( "ajaxComplete", [{}, requestSettings] ); + } + + // Handle the global AJAX counter + if ( requestSettings.global && ! --jQuery.active ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + + + // The core $.ajax replacement. + function handleAjax( url, origSettings ) { + var mockRequest, requestSettings, mockHandler; + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + origSettings = url; + url = undefined; + } else { + // work around to support 1.5 signature + origSettings.url = url; + } + + // Extend the original settings for the request + requestSettings = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); + + // Iterate over our mock handlers (in registration order) until we find + // one that is willing to intercept the request + for(var k = 0; k < mockHandlers.length; k++) { + if ( !mockHandlers[k] ) { + continue; + } + + mockHandler = getMockForRequest( mockHandlers[k], requestSettings ); + if(!mockHandler) { + // No valid mock found for this request + continue; + } + + // Handle console logging + logMock( mockHandler, requestSettings ); + + + if ( requestSettings.dataType === "jsonp" ) { + if ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) { + // This mock will handle the JSONP request + return mockRequest; + } + } + + + // Removed to fix #54 - keep the mocking data object intact + //mockHandler.data = requestSettings.data; + + mockHandler.cache = requestSettings.cache; + mockHandler.timeout = requestSettings.timeout; + mockHandler.global = requestSettings.global; + + (function(mockHandler, requestSettings, origSettings, origHandler) { + mockRequest = _ajax.call($, $.extend(true, {}, origSettings, { + // Mock the XHR object + xhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ) } + })); + })(mockHandler, requestSettings, origSettings, mockHandlers[k]); + + return mockRequest; + } + + // We don't have a mock request, trigger a normal request + return _ajax.apply($, [origSettings]); + } + + + // Public + + $.extend({ + ajax: handleAjax + }); + + $.mockjaxSettings = { + //url: null, + //type: 'GET', + log: function(msg) { + window['console'] && window.console.log && window.console.log(msg); + }, + status: 200, + statusText: "OK", + responseTime: 500, + isTimeout: false, + contentType: 'text/plain', + response: '', + responseText: '', + responseXML: '', + proxy: '', + proxyType: 'GET', + + lastModified: null, + etag: '', + headers: { + etag: 'IJF@H#@923uf8023hFO@I#H#', + 'content-type' : 'text/plain' + } + }; + + $.mockjax = function(settings) { + var i = mockHandlers.length; + mockHandlers[i] = settings; + return i; + }; + $.mockjaxClear = function(i) { + if ( arguments.length == 1 ) { + mockHandlers[i] = null; + } else { + mockHandlers = []; + } + }; + $.mockjax.handler = function(i) { + if ( arguments.length == 1 ) { + return mockHandlers[i]; + } + }; +})(jQuery); diff --git a/public/admin/Coco/assets/libs/bootstrap-xeditable/img/clear.png b/public/admin/Coco/assets/libs/bootstrap-xeditable/img/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..580b52a5be8a644f826def0c7ed6a13f90c0915c GIT binary patch literal 509 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4u6ByT*@`3|I*lDyqr82-2SpV<%OaTa()76WMy zFm^kcZ3hx8D{xE)(qO#|GLJ6IVqjoo^>lFzk+^JnVSiR|B17B9``_m-NuMxfR?C!* zh07MrSo)3sr09zP_wDzlhX=fPF>UDu=?vANf(w(JrZ%)>D41|8J9+Zugm01epVrPx zINBDzitE|2b$6T`9`!DJFmdU=eKrTz=_*cb3=s8r9VQ%8yxBf7d%v=5Nxh^7ZP6=ia-yr`GWA z@1JRG_RM@X%BIyHqImbIN_g6wl?zIFvhME$`)4a}gbAnqdolZft=%U7gPsvQH z#I2z#?2;8wgCxj?;QX|b^2DN42FH~Aq*MjZ+{Ezopr E0Crl)MgRZ+ literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap-xeditable/img/loading.gif b/public/admin/Coco/assets/libs/bootstrap-xeditable/img/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap-xeditable/js/bootstrap-editable.min.js b/public/admin/Coco/assets/libs/bootstrap-xeditable/js/bootstrap-editable.min.js new file mode 100644 index 000000000..e2703aee8 --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap-xeditable/js/bootstrap-editable.min.js @@ -0,0 +1,7 @@ +/*! X-editable - v1.5.1 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */ +!function(a){"use strict";var b=function(b,c){this.options=a.extend({},a.fn.editableform.defaults,c),this.$div=a(b),this.options.scope||(this.options.scope=this)};b.prototype={constructor:b,initInput:function(){this.input=this.options.input,this.value=this.input.str2value(this.options.value),this.input.prerender()},initTemplate:function(){this.$form=a(a.fn.editableform.template)},initButtons:function(){var b=this.$form.find(".editable-buttons");b.append(a.fn.editableform.buttons),"bottom"===this.options.showbuttons&&b.addClass("editable-buttons-bottom")},render:function(){this.$loading=a(a.fn.editableform.loading),this.$div.empty().append(this.$loading),this.initTemplate(),this.options.showbuttons?this.initButtons():this.$form.find(".editable-buttons").remove(),this.showLoading(),this.isSaving=!1,this.$div.triggerHandler("rendering"),this.initInput(),this.$form.find("div.editable-input").append(this.input.$tpl),this.$div.append(this.$form),a.when(this.input.render()).then(a.proxy(function(){if(this.options.showbuttons||this.input.autosubmit(),this.$form.find(".editable-cancel").click(a.proxy(this.cancel,this)),this.input.error)this.error(this.input.error),this.$form.find(".editable-submit").attr("disabled",!0),this.input.$input.attr("disabled",!0),this.$form.submit(function(a){a.preventDefault()});else{this.error(!1),this.input.$input.removeAttr("disabled"),this.$form.find(".editable-submit").removeAttr("disabled");var b=null===this.value||void 0===this.value||""===this.value?this.options.defaultValue:this.value;this.input.value2input(b),this.$form.submit(a.proxy(this.submit,this))}this.$div.triggerHandler("rendered"),this.showForm(),this.input.postrender&&this.input.postrender()},this))},cancel:function(){this.$div.triggerHandler("cancel")},showLoading:function(){var a,b;this.$form?(a=this.$form.outerWidth(),b=this.$form.outerHeight(),a&&this.$loading.width(a),b&&this.$loading.height(b),this.$form.hide()):(a=this.$loading.parent().width(),a&&this.$loading.width(a)),this.$loading.show()},showForm:function(a){this.$loading.hide(),this.$form.show(),a!==!1&&this.input.activate(),this.$div.triggerHandler("show")},error:function(b){var c,d=this.$form.find(".control-group"),e=this.$form.find(".editable-error-block");if(b===!1)d.removeClass(a.fn.editableform.errorGroupClass),e.removeClass(a.fn.editableform.errorBlockClass).empty().hide();else{if(b){c=(""+b).split("\n");for(var f=0;f").text(c[f]).html();b=c.join("
          ")}d.addClass(a.fn.editableform.errorGroupClass),e.addClass(a.fn.editableform.errorBlockClass).html(b).show()}},submit:function(b){b.stopPropagation(),b.preventDefault();var c=this.input.input2value(),d=this.validate(c);if("object"===a.type(d)&&void 0!==d.newValue){if(c=d.newValue,this.input.value2input(c),"string"==typeof d.msg)return this.error(d.msg),this.showForm(),void 0}else if(d)return this.error(d),this.showForm(),void 0;if(!this.options.savenochange&&this.input.value2str(c)==this.input.value2str(this.value))return this.$div.triggerHandler("nochange"),void 0;var e=this.input.value2submit(c);this.isSaving=!0,a.when(this.save(e)).done(a.proxy(function(a){this.isSaving=!1;var b="function"==typeof this.options.success?this.options.success.call(this.options.scope,a,c):null;return b===!1?(this.error(!1),this.showForm(!1),void 0):"string"==typeof b?(this.error(b),this.showForm(),void 0):(b&&"object"==typeof b&&b.hasOwnProperty("newValue")&&(c=b.newValue),this.error(!1),this.value=c,this.$div.triggerHandler("save",{newValue:c,submitValue:e,response:a}),void 0)},this)).fail(a.proxy(function(a){this.isSaving=!1;var b;b="function"==typeof this.options.error?this.options.error.call(this.options.scope,a,c):"string"==typeof a?a:a.responseText||a.statusText||"Unknown error!",this.error(b),this.showForm()},this))},save:function(b){this.options.pk=a.fn.editableutils.tryParseJson(this.options.pk,!0);var c,d="function"==typeof this.options.pk?this.options.pk.call(this.options.scope):this.options.pk,e=!!("function"==typeof this.options.url||this.options.url&&("always"===this.options.send||"auto"===this.options.send&&null!==d&&void 0!==d));return e?(this.showLoading(),c={name:this.options.name||"",value:b,pk:d},"function"==typeof this.options.params?c=this.options.params.call(this.options.scope,c):(this.options.params=a.fn.editableutils.tryParseJson(this.options.params,!0),a.extend(c,this.options.params)),"function"==typeof this.options.url?this.options.url.call(this.options.scope,c):a.ajax(a.extend({url:this.options.url,data:c,type:"POST"},this.options.ajaxOptions))):void 0},validate:function(a){return void 0===a&&(a=this.value),"function"==typeof this.options.validate?this.options.validate.call(this.options.scope,a):void 0},option:function(a,b){a in this.options&&(this.options[a]=b),"value"===a&&this.setValue(b)},setValue:function(a,b){this.value=b?this.input.str2value(a):a,this.$form&&this.$form.is(":visible")&&this.input.value2input(this.value)}},a.fn.editableform=function(c){var d=arguments;return this.each(function(){var e=a(this),f=e.data("editableform"),g="object"==typeof c&&c;f||e.data("editableform",f=new b(this,g)),"string"==typeof c&&f[c].apply(f,Array.prototype.slice.call(d,1))})},a.fn.editableform.Constructor=b,a.fn.editableform.defaults={type:"text",url:null,params:null,name:null,pk:null,value:null,defaultValue:null,send:"auto",validate:null,success:null,error:null,ajaxOptions:null,showbuttons:!0,scope:null,savenochange:!1},a.fn.editableform.template='
          ',a.fn.editableform.loading='
          ',a.fn.editableform.buttons='',a.fn.editableform.errorGroupClass=null,a.fn.editableform.errorBlockClass="editable-error",a.fn.editableform.engine="jquery"}(window.jQuery),function(a){"use strict";a.fn.editableutils={inherit:function(a,b){var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a,a.superclass=b.prototype},setCursorPosition:function(a,b){if(a.setSelectionRange)a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},tryParseJson:function(a,b){if("string"==typeof a&&a.length&&a.match(/^[\{\[].*[\}\]]$/))if(b)try{a=new Function("return "+a)()}catch(c){}finally{return a}else a=new Function("return "+a)();return a},sliceObj:function(b,c,d){var e,f,g={};if(!a.isArray(c)||!c.length)return g;for(var h=0;h").text(b).html()},itemsByValue:function(b,c,d){if(!c||null===b)return[];if("function"!=typeof d){var e=d||"value";d=function(a){return a[e]}}var f=a.isArray(b),g=[],h=this;return a.each(c,function(c,e){if(e.children)g=g.concat(h.itemsByValue(b,e.children,d));else if(f)a.grep(b,function(a){return a==(e&&"object"==typeof e?d(e):e)}).length&&g.push(e);else{var i=e&&"object"==typeof e?d(e):e;b==i&&g.push(e)}}),g},createInput:function(b){var c,d,e,f=b.type;return"date"===f&&("inline"===b.mode?a.fn.editabletypes.datefield?f="datefield":a.fn.editabletypes.dateuifield&&(f="dateuifield"):a.fn.editabletypes.date?f="date":a.fn.editabletypes.dateui&&(f="dateui"),"date"!==f||a.fn.editabletypes.date||(f="combodate")),"datetime"===f&&"inline"===b.mode&&(f="datetimefield"),"wysihtml5"!==f||a.fn.editabletypes[f]||(f="textarea"),"function"==typeof a.fn.editabletypes[f]?(c=a.fn.editabletypes[f],d=this.sliceObj(b,this.objectKeys(c.defaults)),e=new c(d)):(a.error("Unknown type: "+f),!1)},supportsTransitions:function(){var a=document.body||document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e"),this.tip().is(this.innerCss)?this.tip().append(this.$form):this.tip().find(this.innerCss).append(this.$form),this.renderForm()},hide:function(a){if(this.tip()&&this.tip().is(":visible")&&this.$element.hasClass("editable-open")){if(this.$form.data("editableform").isSaving)return this.delayedHide={reason:a},void 0;this.delayedHide=!1,this.$element.removeClass("editable-open"),this.innerHide(),this.$element.triggerHandler("hidden",a||"manual")}},innerShow:function(){},innerHide:function(){},toggle:function(a){this.container()&&this.tip()&&this.tip().is(":visible")?this.hide():this.show(a)},setPosition:function(){},save:function(a,b){this.$element.triggerHandler("save",b),this.hide("save")},option:function(a,b){this.options[a]=b,a in this.containerOptions?(this.containerOptions[a]=b,this.setContainerOption(a,b)):(this.formOptions[a]=b,this.$form&&this.$form.editableform("option",a,b))},setContainerOption:function(a,b){this.call("option",a,b)},destroy:function(){this.hide(),this.innerDestroy(),this.$element.off("destroyed"),this.$element.removeData("editableContainer")},innerDestroy:function(){},closeOthers:function(b){a(".editable-open").each(function(c,d){if(d!==b&&!a(d).find(b).length){var e=a(d),f=e.data("editableContainer");f&&("cancel"===f.options.onblur?e.data("editableContainer").hide("onblur"):"submit"===f.options.onblur&&e.data("editableContainer").tip().find("form").submit())}})},activate:function(){this.tip&&this.tip().is(":visible")&&this.$form&&this.$form.data("editableform").input.activate()}},a.fn.editableContainer=function(d){var e=arguments;return this.each(function(){var f=a(this),g="editableContainer",h=f.data(g),i="object"==typeof d&&d,j="inline"===i.mode?c:b;h||f.data(g,h=new j(this,i)),"string"==typeof d&&h[d].apply(h,Array.prototype.slice.call(e,1))})},a.fn.editableContainer.Popup=b,a.fn.editableContainer.Inline=c,a.fn.editableContainer.defaults={value:null,placement:"top",autohide:!0,onblur:"cancel",anim:!1,mode:"popup"},jQuery.event.special.destroyed={remove:function(a){a.handler&&a.handler()}}}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Inline.prototype,a.fn.editableContainer.Popup.prototype,{containerName:"editableform",innerCss:".editable-inline",containerClass:"editable-container editable-inline",initContainer:function(){this.$tip=a(""),this.options.anim||(this.options.anim=0)},splitOptions:function(){this.containerOptions={},this.formOptions=this.options},tip:function(){return this.$tip},innerShow:function(){this.$element.hide(),this.tip().insertAfter(this.$element).show()},innerHide:function(){this.$tip.hide(this.options.anim,a.proxy(function(){this.$element.show(),this.innerDestroy()},this))},innerDestroy:function(){this.tip()&&this.tip().empty().remove()}})}(window.jQuery),function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.editable.defaults,c,a.fn.editableutils.getConfigData(this.$element)),this.options.selector?this.initLive():this.init(),this.options.highlight&&!a.fn.editableutils.supportsTransitions()&&(this.options.highlight=!1)};b.prototype={constructor:b,init:function(){var b,c=!1;if(this.options.name=this.options.name||this.$element.attr("id"),this.options.scope=this.$element[0],this.input=a.fn.editableutils.createInput(this.options),this.input){switch(void 0===this.options.value||null===this.options.value?(this.value=this.input.html2value(a.trim(this.$element.html())),c=!0):(this.options.value=a.fn.editableutils.tryParseJson(this.options.value,!0),this.value="string"==typeof this.options.value?this.input.str2value(this.options.value):this.options.value),this.$element.addClass("editable"),"textarea"===this.input.type&&this.$element.addClass("editable-pre-wrapped"),"manual"!==this.options.toggle?(this.$element.addClass("editable-click"),this.$element.on(this.options.toggle+".editable",a.proxy(function(a){if(this.options.disabled||a.preventDefault(),"mouseenter"===this.options.toggle)this.show();else{var b="click"!==this.options.toggle;this.toggle(b)}},this))):this.$element.attr("tabindex",-1),"function"==typeof this.options.display&&(this.options.autotext="always"),this.options.autotext){case"always":b=!0;break;case"auto":b=!a.trim(this.$element.text()).length&&null!==this.value&&void 0!==this.value&&!c;break;default:b=!1}a.when(b?this.render():!0).then(a.proxy(function(){this.options.disabled?this.disable():this.enable(),this.$element.triggerHandler("init",this)},this))}},initLive:function(){var b=this.options.selector;this.options.selector=!1,this.options.autotext="never",this.$element.on(this.options.toggle+".editable",b,a.proxy(function(b){var c=a(b.target);c.data("editable")||(c.hasClass(this.options.emptyclass)&&c.empty(),c.editable(this.options).trigger(b))},this))},render:function(a){return this.options.display!==!1?this.input.value2htmlFinal?this.input.value2html(this.value,this.$element[0],this.options.display,a):"function"==typeof this.options.display?this.options.display.call(this.$element[0],this.value,a):this.input.value2html(this.value,this.$element[0]):void 0},enable:function(){this.options.disabled=!1,this.$element.removeClass("editable-disabled"),this.handleEmpty(this.isEmpty),"manual"!==this.options.toggle&&"-1"===this.$element.attr("tabindex")&&this.$element.removeAttr("tabindex")},disable:function(){this.options.disabled=!0,this.hide(),this.$element.addClass("editable-disabled"),this.handleEmpty(this.isEmpty),this.$element.attr("tabindex",-1)},toggleDisabled:function(){this.options.disabled?this.enable():this.disable()},option:function(b,c){return b&&"object"==typeof b?(a.each(b,a.proxy(function(b,c){this.option(a.trim(b),c)},this)),void 0):(this.options[b]=c,"disabled"===b?c?this.disable():this.enable():("value"===b&&this.setValue(c),this.container&&this.container.option(b,c),this.input.option&&this.input.option(b,c),void 0))},handleEmpty:function(b){this.options.display!==!1&&(this.isEmpty=void 0!==b?b:"function"==typeof this.input.isEmpty?this.input.isEmpty(this.$element):""===a.trim(this.$element.html()),this.options.disabled?this.isEmpty&&(this.$element.empty(),this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass)):this.isEmpty?(this.$element.html(this.options.emptytext),this.options.emptyclass&&this.$element.addClass(this.options.emptyclass)):this.options.emptyclass&&this.$element.removeClass(this.options.emptyclass))},show:function(b){if(!this.options.disabled){if(this.container){if(this.container.tip().is(":visible"))return}else{var c=a.extend({},this.options,{value:this.value,input:this.input});this.$element.editableContainer(c),this.$element.on("save.internal",a.proxy(this.save,this)),this.container=this.$element.data("editableContainer")}this.container.show(b)}},hide:function(){this.container&&this.container.hide()},toggle:function(a){this.container&&this.container.tip().is(":visible")?this.hide():this.show(a)},save:function(a,b){if(this.options.unsavedclass){var c=!1;c=c||"function"==typeof this.options.url,c=c||this.options.display===!1,c=c||void 0!==b.response,c=c||this.options.savenochange&&this.input.value2str(this.value)!==this.input.value2str(b.newValue),c?this.$element.removeClass(this.options.unsavedclass):this.$element.addClass(this.options.unsavedclass)}if(this.options.highlight){var d=this.$element,e=d.css("background-color");d.css("background-color",this.options.highlight),setTimeout(function(){"transparent"===e&&(e=""),d.css("background-color",e),d.addClass("editable-bg-transition"),setTimeout(function(){d.removeClass("editable-bg-transition")},1700)},10)}this.setValue(b.newValue,!1,b.response)},validate:function(){return"function"==typeof this.options.validate?this.options.validate.call(this,this.value):void 0},setValue:function(b,c,d){this.value=c?this.input.str2value(b):b,this.container&&this.container.option("value",this.value),a.when(this.render(d)).then(a.proxy(function(){this.handleEmpty()},this))},activate:function(){this.container&&this.container.activate()},destroy:function(){this.disable(),this.container&&this.container.destroy(),this.input.destroy(),"manual"!==this.options.toggle&&(this.$element.removeClass("editable-click"),this.$element.off(this.options.toggle+".editable")),this.$element.off("save.internal"),this.$element.removeClass("editable editable-open editable-disabled"),this.$element.removeData("editable")}},a.fn.editable=function(c){var d={},e=arguments,f="editable";switch(c){case"validate":return this.each(function(){var b,c=a(this),e=c.data(f);e&&(b=e.validate())&&(d[e.options.name]=b)}),d;case"getValue":return 2===arguments.length&&arguments[1]===!0?d=this.eq(0).data(f).value:this.each(function(){var b=a(this),c=b.data(f);c&&void 0!==c.value&&null!==c.value&&(d[c.options.name]=c.input.value2submit(c.value))}),d;case"submit":var g=arguments[1]||{},h=this,i=this.editable("validate");if(a.isEmptyObject(i)){var j={};if(1===h.length){var k=h.data("editable"),l={name:k.options.name||"",value:k.input.value2submit(k.value),pk:"function"==typeof k.options.pk?k.options.pk.call(k.options.scope):k.options.pk};"function"==typeof k.options.params?l=k.options.params.call(k.options.scope,l):(k.options.params=a.fn.editableutils.tryParseJson(k.options.params,!0),a.extend(l,k.options.params)),j={url:k.options.url,data:l,type:"POST"},g.success=g.success||k.options.success,g.error=g.error||k.options.error}else{var m=this.editable("getValue");j={url:g.url,data:m,type:"POST"}}j.success="function"==typeof g.success?function(a){g.success.call(h,a,g)}:a.noop,j.error="function"==typeof g.error?function(){g.error.apply(h,arguments)}:a.noop,g.ajaxOptions&&a.extend(j,g.ajaxOptions),g.data&&a.extend(j.data,g.data),a.ajax(j)}else"function"==typeof g.error&&g.error.call(h,i);return this}return this.each(function(){var d=a(this),g=d.data(f),h="object"==typeof c&&c;return h&&h.selector?(g=new b(this,h),void 0):(g||d.data(f,g=new b(this,h)),"string"==typeof c&&g[c].apply(g,Array.prototype.slice.call(e,1)),void 0)})},a.fn.editable.defaults={type:"text",disabled:!1,toggle:"click",emptytext:"Empty",autotext:"auto",value:null,display:null,emptyclass:"editable-empty",unsavedclass:"editable-unsaved",selector:null,highlight:"#FFFF80"}}(window.jQuery),function(a){"use strict";a.fn.editabletypes={};var b=function(){};b.prototype={init:function(b,c,d){this.type=b,this.options=a.extend({},d,c)},prerender:function(){this.$tpl=a(this.options.tpl),this.$input=this.$tpl,this.$clear=null,this.error=null},render:function(){},value2html:function(b,c){a(c)[this.options.escape?"text":"html"](a.trim(b))},html2value:function(b){return a("
          ").html(b).text()},value2str:function(a){return a},str2value:function(a){return a},value2submit:function(a){return a},value2input:function(a){this.$input.val(a)},input2value:function(){return this.$input.val()},activate:function(){this.$input.is(":visible")&&this.$input.focus()},clear:function(){this.$input.val(null)},escape:function(b){return a("
          ").text(b).html()},autosubmit:function(){},destroy:function(){},setClass:function(){this.options.inputclass&&this.$input.addClass(this.options.inputclass)},setAttr:function(a){void 0!==this.options[a]&&null!==this.options[a]&&this.$input.attr(a,this.options[a])},option:function(a,b){this.options[a]=b}},b.defaults={tpl:"",inputclass:null,escape:!0,scope:null,showbuttons:!0},a.extend(a.fn.editabletypes,{abstractinput:b})}(window.jQuery),function(a){"use strict";var b=function(){};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){var b=a.Deferred();return this.error=null,this.onSourceReady(function(){this.renderList(),b.resolve()},function(){this.error=this.options.sourceError,b.resolve()}),b.promise()},html2value:function(){return null},value2html:function(b,c,d,e){var f=a.Deferred(),g=function(){"function"==typeof d?d.call(c,b,this.sourceData,e):this.value2htmlFinal(b,c),f.resolve()};return null===b?g.call(this):this.onSourceReady(g,function(){f.resolve()}),f.promise()},onSourceReady:function(b,c){var d;if(a.isFunction(this.options.source)?(d=this.options.source.call(this.options.scope),this.sourceData=null):d=this.options.source,this.options.sourceCache&&a.isArray(this.sourceData))return b.call(this),void 0;try{d=a.fn.editableutils.tryParseJson(d,!1)}catch(e){return c.call(this),void 0}if("string"==typeof d){if(this.options.sourceCache){var f,g=d;if(a(document).data(g)||a(document).data(g,{}),f=a(document).data(g),f.loading===!1&&f.sourceData)return this.sourceData=f.sourceData,this.doPrepend(),b.call(this),void 0;if(f.loading===!0)return f.callbacks.push(a.proxy(function(){this.sourceData=f.sourceData,this.doPrepend(),b.call(this)},this)),f.err_callbacks.push(a.proxy(c,this)),void 0;f.loading=!0,f.callbacks=[],f.err_callbacks=[]}var h=a.extend({url:d,type:"get",cache:!1,dataType:"json",success:a.proxy(function(d){f&&(f.loading=!1),this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(f&&(f.sourceData=this.sourceData,a.each(f.callbacks,function(){this.call()})),this.doPrepend(),b.call(this)):(c.call(this),f&&a.each(f.err_callbacks,function(){this.call()}))},this),error:a.proxy(function(){c.call(this),f&&(f.loading=!1,a.each(f.err_callbacks,function(){this.call()}))},this)},this.options.sourceOptions);a.ajax(h)}else this.sourceData=this.makeArray(d),a.isArray(this.sourceData)?(this.doPrepend(),b.call(this)):c.call(this)},doPrepend:function(){null!==this.options.prepend&&void 0!==this.options.prepend&&(a.isArray(this.prependData)||(a.isFunction(this.options.prepend)&&(this.options.prepend=this.options.prepend.call(this.options.scope)),this.options.prepend=a.fn.editableutils.tryParseJson(this.options.prepend,!0),"string"==typeof this.options.prepend&&(this.options.prepend={"":this.options.prepend}),this.prependData=this.makeArray(this.options.prepend)),a.isArray(this.prependData)&&a.isArray(this.sourceData)&&(this.sourceData=this.prependData.concat(this.sourceData)))},renderList:function(){},value2htmlFinal:function(){},makeArray:function(b){var c,d,e,f,g=[];if(!b||"string"==typeof b)return null;if(a.isArray(b)){f=function(a,b){return d={value:a,text:b},c++>=2?!1:void 0};for(var h=0;h1&&(e.children&&(e.children=this.makeArray(e.children)),g.push(e))):g.push({value:e,text:e})}else a.each(b,function(a,b){g.push({value:a,text:b})});return g},option:function(a,b){this.options[a]=b,"source"===a&&(this.sourceData=null),"prepend"===a&&(this.prependData=null)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{source:null,prepend:!1,sourceError:"Error when loading list",sourceCache:!0,sourceOptions:null}),a.fn.editabletypes.list=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("text",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.renderClear(),this.setClass(),this.setAttr("placeholder")},activate:function(){this.$input.is(":visible")&&(this.$input.focus(),a.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length),this.toggleClear&&this.toggleClear())},renderClear:function(){this.options.clear&&(this.$clear=a(''),this.$input.after(this.$clear).css("padding-right",24).keyup(a.proxy(function(b){if(!~a.inArray(b.keyCode,[40,38,9,13,27])){clearTimeout(this.t);var c=this;this.t=setTimeout(function(){c.toggleClear(b)},100)}},this)).parent().css("position","relative"),this.$clear.click(a.proxy(this.clear,this)))},postrender:function(){},toggleClear:function(){if(this.$clear){var a=this.$input.val().length,b=this.$clear.is(":visible");a&&!b&&this.$clear.show(),!a&&b&&this.$clear.hide()}},clear:function(){this.$clear.hide(),this.$input.val("").focus()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'',placeholder:null,clear:!0}),a.fn.editabletypes.text=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("textarea",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.setAttr("placeholder"),this.setAttr("rows"),this.$input.keydown(function(b){b.ctrlKey&&13===b.which&&a(this).closest("form").submit()})},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:"",inputclass:"input-large",placeholder:null,rows:7}),a.fn.editabletypes.textarea=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("select",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){this.$input.empty();var b=function(c,d){var e;if(a.isArray(d))for(var f=0;f",e),d[f].children))):(e.value=d[f].value,d[f].disabled&&(e.disabled=!0),c.append(a("
        ";if(this.o.calendarWeeks){var c='';b+=c,this.picker.find(".datepicker-days thead tr:first-child").prepend(c)}for(;a'+k[this.o.language].daysMin[a++%7]+"";b+="",this.picker.find(".datepicker-days thead").append(b)},fillMonths:function(){for(var a="",b=0;12>b;)a+=''+k[this.o.language].monthsShort[b++]+"";this.picker.find(".datepicker-months td").html(a)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],d=this.viewDate.getUTCFullYear(),e=this.viewDate.getUTCMonth(),f=this.date.valueOf(),g=new Date;return b.getUTCFullYear()d||b.getUTCFullYear()==d&&b.getUTCMonth()>e)&&c.push("new"),this.o.todayHighlight&&b.getUTCFullYear()==g.getFullYear()&&b.getUTCMonth()==g.getMonth()&&b.getUTCDate()==g.getDate()&&c.push("today"),f&&b.valueOf()==f&&c.push("active"),(b.valueOf()this.o.endDate||-1!==a.inArray(b.getUTCDay(),this.o.daysOfWeekDisabled))&&c.push("disabled"),this.range&&(b>this.range[0]&&b"),this.o.calendarWeeks)){var r=new Date(+m+864e5*((this.o.weekStart-m.getUTCDay()-7)%7)),s=new Date(+r+864e5*((11-r.getUTCDay())%7)),t=new Date(+(t=b(s.getUTCFullYear(),0,1))+864e5*((11-t.getUTCDay())%7)),u=(s-t)/864e5/7+1;q.push('")}p=this.getClassNames(m),p.push("day");var v=this.o.beforeShowDay(m);void 0===v?v={}:"boolean"==typeof v?v={enabled:v}:"string"==typeof v&&(v={classes:v}),v.enabled===!1&&p.push("disabled"),v.classes&&(p=p.concat(v.classes.split(/\s+/))),v.tooltip&&(c=v.tooltip),p=a.unique(p),q.push('"),m.getUTCDay()==this.o.weekEnd&&q.push(""),m.setUTCDate(m.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(q.join(""));var w=this.date&&this.date.getUTCFullYear(),x=this.picker.find(".datepicker-months").find("th:eq(1)").text(e).end().find("span").removeClass("active");w&&w==e&&x.eq(this.date.getUTCMonth()).addClass("active"),(g>e||e>i)&&x.addClass("disabled"),e==g&&x.slice(0,h).addClass("disabled"),e==i&&x.slice(j+1).addClass("disabled"),q="",e=10*parseInt(e/10,10);var y=this.picker.find(".datepicker-years").find("th:eq(1)").text(e+"-"+(e+9)).end().find("td");e-=1;for(var z=-1;11>z;z++)q+='e||e>i?" disabled":"")+'">'+e+"",e+=1;y.html(q)},updateNavArrows:function(){if(this._allow_update){var a=new Date(this.viewDate),b=a.getUTCFullYear(),c=a.getUTCMonth();switch(this.viewMode){case 0:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()&&c<=this.o.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()&&c>=this.o.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.o.startDate!==-1/0&&b<=this.o.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),1/0!==this.o.endDate&&b>=this.o.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}}},click:function(c){c.preventDefault();var d=a(c.target).closest("span, td, th");if(1==d.length)switch(d[0].nodeName.toLowerCase()){case"th":switch(d[0].className){case"datepicker-switch":this.showMode(1);break;case"prev":case"next":var e=l.modes[this.viewMode].navStep*("prev"==d[0].className?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,e);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,e)}this.fill();break;case"today":var f=new Date;f=b(f.getFullYear(),f.getMonth(),f.getDate(),0,0,0),this.showMode(-2);var g="linked"==this.o.todayBtn?null:"view";this._setDate(f,g);break;case"clear":var h;this.isInput?h=this.element:this.component&&(h=this.element.find("input")),h&&h.val("").change(),this._trigger("changeDate"),this.update(),this.o.autoclose&&this.hide()}break;case"span":if(!d.is(".disabled")){if(this.viewDate.setUTCDate(1),d.is(".month")){var i=1,j=d.parent().find("span").index(d),k=this.viewDate.getUTCFullYear();this.viewDate.setUTCMonth(j),this._trigger("changeMonth",this.viewDate),1===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}else{var k=parseInt(d.text(),10)||0,i=1,j=0;this.viewDate.setUTCFullYear(k),this._trigger("changeYear",this.viewDate),2===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}this.showMode(-1),this.fill()}break;case"td":if(d.is(".day")&&!d.is(".disabled")){var i=parseInt(d.text(),10)||1,k=this.viewDate.getUTCFullYear(),j=this.viewDate.getUTCMonth();d.is(".old")?0===j?(j=11,k-=1):j-=1:d.is(".new")&&(11==j?(j=0,k+=1):j+=1),this._setDate(b(k,j,i,0,0,0,0))}}},_setDate:function(a,b){b&&"date"!=b||(this.date=new Date(a)),b&&"view"!=b||(this.viewDate=new Date(a)),this.fill(),this.setValue(),this._trigger("changeDate");var c;this.isInput?c=this.element:this.component&&(c=this.element.find("input")),c&&(c.change(),!this.o.autoclose||b&&"date"!=b||this.hide())},moveMonth:function(a,b){if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),g=e.getUTCMonth(),h=Math.abs(b);if(b=b>0?1:-1,1==h)d=-1==b?function(){return e.getUTCMonth()==g}:function(){return e.getUTCMonth()!=c},c=g+b,e.setUTCMonth(c),(0>c||c>11)&&(c=(c+12)%12);else{for(var i=0;h>i;i++)e=this.moveMonth(e,b);c=e.getUTCMonth(),e.setUTCDate(f),d=function(){return c!=e.getUTCMonth()}}for(;d();)e.setUTCDate(--f),e.setUTCMonth(c);return e},moveYear:function(a,b){return this.moveMonth(a,12*b)},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(this.picker.is(":not(:visible)"))return 27==a.keyCode&&this.show(),void 0;var b,c,d,e=!1;switch(a.keyCode){case 27:this.hide(),a.preventDefault();break;case 37:case 39:if(!this.o.keyboardNavigation)break;b=37==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 38:case 40:if(!this.o.keyboardNavigation)break;b=38==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+7*b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+7*b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 13:this.hide(),a.preventDefault();break;case 9:this.hide()}if(e){this._trigger("changeDate");var f;this.isInput?f=this.element:this.component&&(f=this.element.find("input")),f&&f.change()}},showMode:function(a){a&&(this.viewMode=Math.max(this.o.minViewMode,Math.min(2,this.viewMode+a))),this.picker.find(">div").hide().filter(".datepicker-"+l.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}};var f=function(b,c){this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,a(this.inputs).datepicker(c).bind("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a(b).data("datepicker")}),this.updateDates()};f.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.date}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(b){var c=a(b.target).data("datepicker"),d=c.getUTCDate(),e=a.inArray(b.target,this.inputs),f=this.inputs.length;if(-1!=e){if(d=0&&dthis.dates[e])for(;f>e&&d>this.dates[e];)this.pickers[e++].setUTCDate(d);this.updateDates()}},remove:function(){a.map(this.pickers,function(a){a.remove()}),delete this.element.data().datepicker}};var g=a.fn.datepicker,h=a.fn.datepicker=function(b){var g=Array.apply(null,arguments);g.shift();var h;return this.each(function(){var j=a(this),k=j.data("datepicker"),l="object"==typeof b&&b;if(!k){var m=c(this,"date"),n=a.extend({},i,m,l),o=d(n.language),p=a.extend({},i,o,m,l);if(j.is(".input-daterange")||p.inputs){var q={inputs:p.inputs||j.find("input").toArray()};j.data("datepicker",k=new f(this,a.extend(p,q)))}else j.data("datepicker",k=new e(this,p))}return"string"==typeof b&&"function"==typeof k[b]&&(h=k[b].apply(k,g),void 0!==h)?!1:void 0}),void 0!==h?h:this},i=a.fn.datepicker.defaults={autoclose:!1,beforeShowDay:a.noop,calendarWeeks:!1,clearBtn:!1,daysOfWeekDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keyboardNavigation:!0,language:"en",minViewMode:0,rtl:!1,startDate:-1/0,startView:0,todayBtn:!1,todayHighlight:!1,weekStart:0},j=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=e;var k=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear"}},l={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(a){return 0===a%4&&0!==a%100||0===a%400 +},getDaysInMonth:function(a,b){return[31,l.isLeapYear(a)?29:28,31,30,31,30,31,31,30,31,30,31][b]},validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,parseFormat:function(a){var b=a.replace(this.validParts,"\0").split("\0"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,d,f){if(c instanceof Date)return c;if("string"==typeof d&&(d=l.parseFormat(d)),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(c)){var g,h,i=/([\-+]\d+)([dmwy])/,j=c.match(/([\-+]\d+)([dmwy])/g);c=new Date;for(var m=0;mb;)b+=12;for(b%=12,a.setUTCMonth(b);a.getUTCMonth()!=b;)a.setUTCDate(a.getUTCDate()-1);return a},d:function(a,b){return a.setUTCDate(b)}};r.M=r.MM=r.mm=r.m,r.dd=r.d,c=b(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0);var s=d.parts.slice();if(j.length!=s.length&&(s=a(s).filter(function(b,c){return-1!==a.inArray(c,q)}).toArray()),j.length==s.length){for(var m=0,t=s.length;t>m;m++){if(n=parseInt(j[m],10),g=s[m],isNaN(n))switch(g){case"MM":o=a(k[f].months).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].months)+1;break;case"M":o=a(k[f].monthsShort).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].monthsShort)+1}p[g]=n}for(var u,m=0;m=g;g++)f.length&&b.push(f.shift()),b.push(e[c.parts[g]]);return b.join("")},headTemplate:'',contTemplate:'',footTemplate:''};l.template='
         
        '+u+""+m.getUTCDate()+"
        '+l.headTemplate+""+l.footTemplate+"
        "+"
        "+'
        '+''+l.headTemplate+l.contTemplate+l.footTemplate+"
        "+"
        "+'
        '+''+l.headTemplate+l.contTemplate+l.footTemplate+"
        "+"
        "+"
        ",a.fn.datepicker.DPGlobal=l,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=g,this},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),h.call(c,"show"))}),a(function(){h.call(a('[data-provide="datepicker-inline"]'))})}(window.jQuery),function(a){"use strict";a.fn.bdatepicker=a.fn.datepicker.noConflict(),a.fn.datepicker||(a.fn.datepicker=a.fn.bdatepicker);var b=function(a){this.init("date",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datepicker=a.fn.editableutils.tryParseJson(b.datepicker,!0),this.options.datepicker=a.extend({},c.datepicker,b.datepicker,{format:this.options.viewformat}),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=a.fn.bdatepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)},render:function(){this.$input.bdatepicker(this.options.datepicker),this.options.clear&&(this.$clear=a('').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('
        ').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return this.parseDate(a,this.parsedViewFormat)},value2str:function(a){return a?this.dpg.formatDate(a,this.parsedFormat,this.options.datepicker.language):""},str2value:function(a){return this.parseDate(a,this.parsedFormat)},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.bdatepicker("update",a)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".day",function(b){if(!a(b.currentTarget).is(".old")&&!a(b.currentTarget).is(".new")){var c=a(this).closest("form");setTimeout(function(){c.submit()},200)}})},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datepicker.language),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datepicker.language),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'
        ',inputclass:null,format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.date=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.date),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.bdatepicker(this.options.datepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.bdatepicker("update")},this))},value2input:function(a){this.$input.val(a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):""),this.$tpl.bdatepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.date.defaults,{tpl:'
        ',inputclass:"input-small",datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!0}}),a.fn.editabletypes.datefield=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetime",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datetimepicker=a.fn.editableutils.tryParseJson(b.datetimepicker,!0),this.options.datetimepicker=a.extend({},c.datetimepicker,b.datetimepicker,{format:this.options.viewformat}),this.options.datetimepicker.language=this.options.datetimepicker.language||"en",this.dpg=a.fn.datetimepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format,this.options.formatType),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat,this.options.formatType)},render:function(){this.$input.datetimepicker(this.options.datetimepicker),this.$input.on("changeMode",function(){var b=a(this).closest("form").parent();setTimeout(function(){b.triggerHandler("resize")},0)}),this.options.clear&&(this.$clear=a('').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('
        ').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(this.toUTC(a),this.parsedViewFormat,this.options.datetimepicker.language,this.options.formatType):"";return c?(b.superclass.value2html.call(this,d,c),void 0):d},html2value:function(a){var b=this.parseDate(a,this.parsedViewFormat);return b?this.fromUTC(b):null},value2str:function(a){return a?this.dpg.formatDate(this.toUTC(a),this.parsedFormat,this.options.datetimepicker.language,this.options.formatType):""},str2value:function(a){var b=this.parseDate(a,this.parsedFormat);return b?this.fromUTC(b):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){a&&this.$input.data("datetimepicker").setDate(a)},input2value:function(){var a=this.$input.data("datetimepicker");return a.date?a.getDate():null},activate:function(){},clear:function(){this.$input.data("datetimepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".minute",function(){var b=a(this).closest("form");setTimeout(function(){b.submit()},200)})},toUTC:function(a){return a?new Date(a.valueOf()-6e4*a.getTimezoneOffset()):a},fromUTC:function(a){return a?new Date(a.valueOf()+6e4*a.getTimezoneOffset()):a},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datetimepicker.language,this.options.formatType),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datetimepicker.language,this.options.formatType),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'
        ',inputclass:null,format:"yyyy-mm-dd hh:ii",formatType:"standard",viewformat:null,datetimepicker:{todayHighlight:!1,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.datetime=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetimefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.datetime),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.datetimepicker(this.options.datetimepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.datetimepicker("update")},this))},value2input:function(a){this.$input.val(this.value2html(a)),this.$tpl.datetimepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.datetime.defaults,{tpl:'
        ',inputclass:"input-medium",datetimepicker:{todayHighlight:!1,autoclose:!0}}),a.fn.editabletypes.datetimefield=b}(window.jQuery); \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap/css/bootstrap.min.css b/public/admin/Coco/assets/libs/bootstrap/css/bootstrap.min.css new file mode 100644 index 000000000..b6fe4e0fb --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:before,:after{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,select.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,textarea.form-group-sm .form-control,select[multiple].input-sm,select[multiple].form-group-sm .form-control{height:auto}.input-lg,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,select.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,textarea.form-group-lg .form-control,select[multiple].input-lg,select[multiple].form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=radio],[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important;visibility:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.next,.carousel-inner>.item.active.right{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.eot b/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed GIT binary patch literal 20335 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

        !oRptb@n+ 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 literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.svg b/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..25691af8f --- /dev/null +++ b/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.ttf b/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..67fa00bf83801d2fa568546b982c80d27f6ef74e GIT binary patch literal 41280 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

        PBK;&Wcg|NX{>QR@W3{K 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 literal 0 HcmV?d00001 diff --git a/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.woff b/public/admin/Coco/assets/libs/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..8c54182aa5d4d1ab3c9171976b615c1dcb1dc187 GIT binary patch literal 23320 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 mX4Rtsthis.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('