// ==UserScript== // @name 好大学在线 助手 // @namespace https://github.com/ShenHongFei/cnmooc-assistant // @homepage https://github.com/ShenHongFei/cnmooc-assistant // @author 沈鸿飞 // @description . // @version 2017.11.24.20.20 // @match http://www.cnmooc.org/study/initplay/*.mooc // @match http://www.cnmooc.org/study/unit/*.mooc // @match http://www.cnmooc.org/examTest/stuExamList/*.mooc // @run-at document-idle // @downloadURL none // ==/UserScript== // 满分批阅当前 mark() var add_button, answers, assistant_api, assistant_div, auto_fill, complete_item, fun, get_quiz_answers, mark, mark_all, name, options, pause_quiz_timer, print_answers, questions, test_answer, unblock_video_progress, indexOf = [].indexOf; mark = async function() { $('input[id^=quiz_]').each(function(i, e) { var max_point; max_point = e.className.match(/max\[(\d+)\]/)[1]; return e.setAttribute('value', max_point); }); await sleep(200); $('#submitReviewBtn').click(); await sleep(200); $("input[value='提交互评']").click(); await sleep(200); return $("input[value='确定']").click(); }; // 满分批阅所有 mark_all() mark_all = async function() { var i, j, results; $('#gotoReviewSubmitBtn').click(); results = []; for (i = j = 1; j <= 3; i = ++j) { await sleep(700); results.push(mark()); } return results; }; // 完成该项 complete_item = function() { return updateStudyOver(); }; // 解锁视频进度 unblock_video_progress = function() { $('#isOver').val(2); return eval($(".video-show script").html()); }; // 暂停计时 pause_quiz_timer = function() { var useTimeFlag; if (typeof unsafeWindow !== "undefined" && unsafeWindow !== null) { return unsafeWindow.useTimeFlag = false; } else { return useTimeFlag = false; } }; // answers={question.quizId:[options(string)]} answers = null; questions = null; options = null; // async 修改自 doSubmitExam_ajax test_answer = async function(questions) { var allRightFlag, gradeId, i, question, reSubmit, ret_data, score, totalScore, userQuiz2, user_Quiz, user_quizs; //处理每道题计时 _quizUseTimeRecord[_quizIdRecord] = _quizUseTimeRecord[_quizIdRecord] || 0; _quizUseTimeRecord[_quizIdRecord] = parseInt(_quizUseTimeRecord[_quizIdRecord]) + _quizUseTime; user_quizs = (function() { var j, len, results; results = []; for (j = 0, len = questions.length; j < len; j++) { question = questions[j]; results.push(JSON.stringify(question)); } return results; })(); reSubmit = $('#reSubmit').val(); gradeId = $('#gradeId').val(); userQuiz2 = []; totalScore = 0; allRightFlag = true; i = 0; while (i < user_quizs.length) { user_Quiz = JSON.parse(user_quizs[i]); user_Quiz['useTime'] = _quizUseTimeRecord[user_Quiz['quizId']]; _quizUseTimeRecord[user_Quiz['quizId']] = 0; userQuiz2.push(JSON.stringify(user_Quiz)); score = parseInt(user_Quiz['markQuizScore']); totalScore += score; if (score === 0) { allRightFlag = false; } i++; } if (allRightFlag) { totalScore = 10000; } user_quizs = userQuiz2; console.log(user_quizs); ret_data = (await $.when($.ajax({ url: CONTEXTPATH + '/examSubmit/7681/saveExam/1/' + examPaperId + '/' + examSubmitId + '.mooc?testPaperId=' + examTestPaperId, type: 'post', data: { gradeId: gradeId, reSubmit: reSubmit, submitquizs: user_quizs, submitFlag: 0, useTime: 1, totalScore: totalScore, testPaperId: examTestPaperId }, dataType: 'json', success: function(data) { if (!data.successFlag) { throw Error(data.successFlag = false); } }, error: function() { return console.log('test_answer error'); } }))); return JSON.parse(ret_data.examSubmit.submitContent); }; // async get_quiz_answers = async function() { var current_round_option_ids, i, j, l, len, len1, len2, m, n, o, oi, option_id_flags, perfect_answer, qi, question, ref, result, test_result; // 初始化页面问题 questions = (function() { var j, len, ref, results; ref = $('#exam_paper').quiz().getPractice(); results = []; for (j = 0, len = ref.length; j < len; j++) { question = ref[j]; results.push(JSON.parse(question)); } return results; })(); // 枚举、测试、更新答案 options = $('[option_id]').map(function(i, e) { return e.getAttribute('option_id'); }); answers = {}; ref = [1, 2, 4, 8, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15]; for (j = 0, len = ref.length; j < len; j++) { oi = ref[j]; option_id_flags = []; for (i = l = 0; l <= 3; i = ++l) { option_id_flags.push((oi << i & 0b1000) === 0b1000); } // 检测已有正确答案,对每一题生成答案,设置userAnswer for (qi = m = 0, len1 = questions.length; m < len1; qi = ++m) { question = questions[qi]; perfect_answer = answers[question.quizId]; if (perfect_answer) { question.userAnswer = perfect_answer.join(','); } else { current_round_option_ids = []; // option_id 并非连续 for (i = n = 0; n <= 3; i = ++n) { if (option_id_flags[i]) { current_round_option_ids.push(options[qi * 4 + i]); } } question.userAnswer = current_round_option_ids.join(','); } } console.log(questions); // 枚举的答案准备完成,开始测试 test_result = (await test_answer(questions)); for (o = 0, len2 = test_result.length; o < len2; o++) { result = test_result[o]; result = JSON.parse(result); if (result.markResult) { // perfect_options=(parseInt option for option in result.userAnswer.split(',')) answers[result.quizId] = result.userAnswer.split(','); } } } console.log(answers); return answers; }; // async 查看习题答案 print_answers = async function() { var j, len, option, option_id_from, pretty_options, qi, question, x; if (!answers) { await get_quiz_answers(); } pretty_options = ''; for (qi = j = 0, len = questions.length; j < len; qi = ++j) { question = questions[qi]; option_id_from = options[qi * 4]; x = (function() { var l, len1, ref, results; ref = answers[question.quizId]; results = []; for (l = 0, len1 = ref.length; l < len1; l++) { option = ref[l]; results.push(String.fromCharCode('A'.charCodeAt(0) + parseInt(option) - option_id_from)); } return results; })(); pretty_options += `第${qi + 1}题:${x.join(',')}\n`; } console.log(pretty_options); alert(pretty_options); }; // 自动完成习题 auto_fill = async function() { var answer_ids, k, v; if (!answers) { await get_quiz_answers(); } answer_ids = []; for (k in answers) { v = answers[k]; answer_ids = answer_ids.concat(v); } // todo:多选题再次点击会取消选择 $("[option_id]").filter(function(i, e) { var ref; return ref = e.getAttribute('option_id'), indexOf.call(answer_ids, ref) >= 0; }).find('[class|="input"]').click(); }; assistant_api = { '解锁视频进度': unblock_video_progress, '完成该项': complete_item, '暂停答题计时': pause_quiz_timer, '自动完成习题': auto_fill, '查看习题答案': print_answers }; // userscript 环境 if (typeof unsafeWindow !== "undefined" && unsafeWindow !== null) { // 暴露assistant接口 unsafeWindow.assistant = {}; for (name in assistant_api) { fun = assistant_api[name]; unsafeWindow.assistant[fun.name] = fun; } // 返回课程主页改为返回导航 $('#backCourse').contents().last().replaceWith('返回导航'); $('#backCourse').off('click'); $("#backCourse").on('click', function() { return location.href = CONTEXTPATH + "/portal/session/unitNavigation/" + $("#courseOpenId").val() + ".mooc"; }); // 助手界面显示 assistant_div = document.createElement('div'); assistant_div.id = 'assistant'; $('.main-scroll')[0].prepend(assistant_div); // 助手界面添加按钮 add_button = function(text, fun) { var btn; btn = document.createElement('button'); btn.textContent = text; btn.onclick = fun; // todo:优雅的样式设置 btn.style = 'margin:5px;padding:5px'; return assistant_div.appendChild(btn); }; for (name in assistant_api) { fun = assistant_api[name]; add_button(name, fun); } // tab切换 $('.tab-inner').on('click', function() { // todo:智能判断可用功能 return console.log(this); }); } //router= // 10:video_helper_init //# 20:pdf_helper # pdf页面 //# 50:quiz_helper # 选择题 //router[$('#itemType').val()]() //async_ajax_test=-> // ajax_ret=await $.when $.ajax // url:'http://www.cnmooc.org/study/unit/197091.mooc' // success:->console.log 'success callback' // console.log ajax_ret.length //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxVQUFBLEVBQUEsT0FBQSxFQUFBLGFBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLGFBQUEsRUFBQSxHQUFBLEVBQUEsZ0JBQUEsRUFBQSxJQUFBLEVBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxPQUFBLEVBQUEsZ0JBQUEsRUFBQSxhQUFBLEVBQUEsU0FBQSxFQUFBLFdBQUEsRUFBQSxzQkFBQTtFQUFBOztBQWNBLElBQUEsR0FBSyxNQUFBLFFBQUEsQ0FBQSxDQUFBO0VBQ0QsQ0FBQSxDQUFFLGtCQUFGLENBQXFCLENBQUMsSUFBdEIsQ0FBMkIsUUFBQSxDQUFDLENBQUQsRUFBRyxDQUFILENBQUE7QUFDdkIsUUFBQTtJQUFBLFNBQUEsR0FBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQVosQ0FBa0IsY0FBbEIsQ0FBa0MsQ0FBQSxDQUFBO1dBQzVDLENBQUMsQ0FBQyxZQUFGLENBQWUsT0FBZixFQUF1QixTQUF2QjtFQUZ1QixDQUEzQjtFQUdBLE1BQU0sS0FBQSxDQUFNLEdBQU47RUFDTixDQUFBLENBQUUsa0JBQUYsQ0FBcUIsQ0FBQyxLQUF0QixDQUFBO0VBQ0EsTUFBTSxLQUFBLENBQU0sR0FBTjtFQUNOLENBQUEsQ0FBRSxxQkFBRixDQUF3QixDQUFDLEtBQXpCLENBQUE7RUFDQSxNQUFNLEtBQUEsQ0FBTSxHQUFOO1NBQ04sQ0FBQSxDQUFFLG1CQUFGLENBQXNCLENBQUMsS0FBdkIsQ0FBQTtBQVRDLEVBZEw7OztBQTBCQSxRQUFBLEdBQVMsTUFBQSxRQUFBLENBQUEsQ0FBQTtBQUNMLE1BQUEsQ0FBQSxFQUFBLENBQUEsRUFBQTtFQUFBLENBQUEsQ0FBRSxzQkFBRixDQUF5QixDQUFDLEtBQTFCLENBQUE7QUFDQTtFQUFBLEtBQVMsMEJBQVQ7SUFDSSxNQUFNLEtB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LEVBQTJCLFFBQUEsQ0FBQSxDQUFBLEVBQUE7O1dBRXZCLE9BQU8sQ0FBQyxHQUFSLENBQVksSUFBWjtFQUZ1QixDQUEzQixFQTlCSjs7O0FBbEtBIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PVVzZXJTY3JpcHQ9PVxuIyBAbmFtZSAgICAgICAgIOWlveWkp+WtpuWcqOe6vyDliqnmiYtcbiMgQG5hbWVzcGFjZSAgICBodHRwczovL2dpdGh1Yi5jb20vU2hlbkhvbmdGZWkvY25tb29jLWFzc2lzdGFudFxuIyBAaG9tZXBhZ2UgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9TaGVuSG9uZ0ZlaS9jbm1vb2MtYXNzaXN0YW50XG4jIEBhdXRob3IgICAgICAg5rKI6bi/6aOeXG4jIEBkZXNjcmlwdGlvbiAgLlxuIyBAdmVyc2lvbiAgICAgIDIwMTcuMTEuMjQuMDMuMTlcbiMgQG1hdGNoICAgICAgICBodHRwOi8vd3d3LmNubW9vYy5vcmcvc3R1ZHkvaW5pdHBsYXkvKi5tb29jXG4jIEBtYXRjaCAgICAgICAgaHR0cDovL3d3dy5jbm1vb2Mub3JnL3N0dWR5L3VuaXQvKi5tb29jXG4jIEBtYXRjaCAgICAgICAgaHR0cDovL3d3dy5jbm1vb2Mub3JnL2V4YW1UZXN0L3N0dUV4YW1MaXN0LyoubW9vY1xuIyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWlkbGVcbiMgPT0vVXNlclNjcmlwdD09XG4gICAgXG4jIOa7oeWIhuaJuemYheW9k+WJjSBtYXJrKClcbm1hcms9LT5cbiAgICAkKCdpbnB1dFtpZF49cXVpel9dJykuZWFjaCAoaSxlKS0+XG4gICAgICAgIG1heF9wb2ludD1lLmNsYXNzTmFtZS5tYXRjaCgvbWF4XFxbKFxcZCspXFxdLylbMV1cbiAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJyxtYXhfcG9pbnQpXG4gICAgYXdhaXQgc2xlZXAoMjAwKVxuICAgICQoJyNzdWJtaXRSZXZpZXdCdG4nKS5jbGljaygpXG4gICAgYXdhaXQgc2xlZXAoMjAwKVxuICAgICQoXCJpbnB1dFt2YWx1ZT0n5o+Q5Lqk5LqS6K+EJ11cIikuY2xpY2soKVxuICAgIGF3YWl0IHNsZWVwKDIwMClcbiAgICAkKFwiaW5wdXRbdmFsdWU9J+ehruWumiddXCIpLmNsaWNrKClcblxuIyDmu6HliIbmibnpmIXmiYDmnIkgbWFya19hbGwoKVxubWFya19hbGw9LT5cbiAgICAkKCcjZ290b1Jldmlld1N1Ym1pdEJ0bicpLmNsaWNrKClcbiAgICBmb3IgaSBpbiBbMS4uM11cbiAgICAgICAgYXdhaXQgc2xlZXAoNzAwKVxuICAgICAgICBtYXJrKClcblxuIyDlrozmiJDor6XpoblcbmNvbXBsZXRlX2l0ZW09LT5cbiAgICB1cGRhdGVTdHVkeU92ZXIoKVxuXG4jIOino+mUgeinhumikei/m+W6plxudW5ibG9ja192aWRlb19wcm9ncmVzcz0tPlxuICAgICQoJyNpc092ZXInKS52YWwoMilcbiAgICBldmFsKCQoXCIudmlkZW8tc2hvdyBzY3JpcHRcIikuaHRtbCgpKVxuXG4jIOaaguWBnOiuoeaXtlxucGF1c2VfcXVpel90aW1lcj0tPlxuICAgIGlmIHVuc2FmZVdpbmRvdz9cbiAgICAgICAgdW5zYWZlV2luZG93LnVzZVRpbWVGbGFnPWZhbHNlXG4gICAgZWxzZSB1c2VUaW1lRmxhZz1mYWxzZVxuXG4jIGFuc3dlcnM9e3F1ZXN0aW9uLnF1aXpJZDpbb3B0aW9ucyhzdHJpbmcpXX1cbmFuc3dlcnM9bnVsbFxucXVlc3Rpb25zPW51bGxcbm9wdGlvbnM9bnVsbFxuXG4jIGFzeW5jIOS/ruaUueiHqiBkb1N1Ym1pdEV4YW1fYWpheFxudGVzdF9hbnN3ZXI9KHF1ZXN0aW9ucyktPlxuICAgICPlpITnkIbmr4/pgZPpopjorqHml7ZcbiAgICBfcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF09X3F1aXpVc2VUaW1lUmVjb3JkW19xdWl6SWRSZWNvcmRdIG9yIDBcbiAgICBfcXVpelVzZVRpbWVSZWNvcmRbX3F1aXpJZFJlY29yZF09cGFyc2VJbnQoX3F1aXpVc2VUaW1lUmVjb3JkW19xdWl6SWRSZWNvcmRdKStfcXVpelVzZVRpbWVcbiAgICB1c2VyX3F1aXpzPShKU09OLnN0cmluZ2lmeSBxdWVzdGlvbiBmb3IgcXVlc3Rpb24gaW4gcXVlc3Rpb25zKVxuICAgIHJlU3VibWl0PSQoJyNyZVN1Ym1pdCcpLnZhbCgpXG4gICAgZ3JhZGVJZD0kKCcjZ3JhZGVJZCcpLnZhbCgpXG4gICAgdXNlclF1aXoyPVtdXG4gICAgdG90YWxTY29yZT0wXG4gICAgYWxsUmlnaHRGbGFnPXRydWVcbiAgICBpPTBcbiAgICB3aGlsZSBpPHVzZXJfcXVpenMubGVuZ3RoXG4gICAgICAgIHVzZXJfUXVpej1KU09OLnBhcnNlKHVzZXJfcXVpenNbaV0pXG4gICAgICAgIHVzZXJfUXVpelsndXNlVGltZSddPV9xdWl6VXNlVGltZVJlY29yZFt1c2VyX1F1aXpbJ3F1aXpJZCddXVxuICAgICAgICBfcXVpelVzZVRpbWVSZWNvcmRbdXNlcl9RdWl6WydxdWl6SWQnXV09MFxuICAgICAgICBcbiAgICAgICAgdXNlclF1aXoyLnB1c2ggSlNPTi5zdHJpbmdpZnkodXNlcl9RdWl6KVxuICAgICAgICBzY29yZT1wYXJzZUludCh1c2VyX1F1aXpbJ21hcmtRdWl6U2NvcmUnXSlcbiAgICAgICAgdG90YWxTY29yZSs9c2NvcmVcbiAgICAgICAgaWYgc2NvcmU9PTBcbiAgICAgICAgICAgIGFsbFJpZ2h0RmxhZz1mYWxzZVxuICAgICAgICBpKytcbiAgICBpZiBhbGxSaWdodEZsYWdcbiAgICAgICAgdG90YWxTY29yZT0xMDAwMFxuICAgICAgICBcbiAgICB1c2VyX3F1aXpzPXVzZXJRdWl6MlxuICAgIGNvbnNvbGUubG9nKHVzZXJfcXVpenMpXG4gICAgcmV0X2RhdGE9YXdhaXQgJC53aGVuICQuYWpheFxuICAgICAgICB1cmw6Q09OVEVYVFBBVEgrJy9leGFtU3VibWl0Lzc2ODEvc2F2ZUV4YW0vMS8nK2V4YW1QYXBlcklkKycvJytleGFtU3VibWl0SWQrJy5tb29jP3Rlc3RQYXBlcklkPScrZXhhbVRlc3RQYXBlcklkXG4gICAgICAgIHR5cGU6J3Bvc3QnXG4gICAgICAgIGRhdGE6XG4gICAgICAgICAgICBncmFkZUlkOmdyYWRlSWRcbiAgICAgICAgICAgIHJlU3VibWl0OnJlU3VibWl0XG4gICAgICAgICAgICBzdWJtaXRxdWl6czp1c2VyX3F1aXpzXG4gICAgICAgICAgICBzdWJtaXRGbGFnOjBcbiAgICAgICAgICAgIHVzZVRpbWU6MVxuICAgICAgICAgICAgdG90YWxTY29yZTp0b3RhbFNjb3JlXG4gICAgICAgICAgICB0ZXN0UGFwZXJJZDpleGFtVGVzdFBhcGVySWRcbiAgICAgICAgZGF0YVR5cGU6J2pzb24nXG4gICAgICAgIHN1Y2Nlc3M6KGRhdGEpIC0+IGlmICFkYXRhLnN1Y2Nlc3NGbGFnIHRoZW4gdGhyb3cgRXJyb3IoZGF0YS5zdWNjZXNzRmxhZz1mYWxzZSlcbiAgICAgICAgZXJyb3I6LT4gY29uc29sZS5sb2coJ3Rlc3RfYW5zd2VyIGVycm9yJylcbiAgICBKU09OLnBhcnNlIHJldF9kYXRhLmV4YW1TdWJtaXQuc3VibWl0Q29udGVudFxuXG4jIGFzeW5jXG5nZXRfcXVpel9hbnN3ZXJzPS0+XG4gICAgIyDliJ3lp4vljJbpobXpnaLpl67pophcbiAgICBxdWVzdGlvbnM9KEpTT04ucGFyc2UgcXVlc3Rpb24gZm9yIHF1ZXN0aW9uIGluICQoJyNleGFtX3BhcGVyJykucXVpeigpLmdldFByYWN0aWNlKCkpXG4gICAgXG4gICAgIyDmnprkuL7jgIHmtYvor5XjgIHmm7TmlrDnrZTmoYhcbiAgICBvcHRpb25zPSQoJ1tvcHRpb25faWRdJykubWFwIChpLGUpLT4gZS5nZXRBdHRyaWJ1dGUoJ29wdGlvbl9pZCcpXG4gICAgYW5zd2Vycz17fVxuICAgIGZvciBvaSBpbiBbMSwyLDQsOCwzLDUsNiw3LDksMTAsMTEsMTIsMTMsMTQsMTVdXG4gICAgICAgIG9wdGlvbl9pZF9mbGFncz1bXVxuICAgICAgICBmb3IgaSBpbiBbMC4uM11cbiAgICAgICAgICAgIG9wdGlvbl9pZF9mbGFncy5wdXNoIChvaTw8aSYwYjEwMDApPT0wYjEwMDBcbiAgICAgICAgIyDmo4DmtYvlt7LmnInmraPnoa7nrZTmoYjvvIzlr7nmr4/kuIDpopjnlJ/miJDnrZTmoYjvvIzorr7nva51c2VyQW5zd2VyXG4gICAgICAgIGZvciBxdWVzdGlvbixxaSBpbiBxdWVzdGlvbnNcbiAgICAgICAgICAgIHBlcmZlY3RfYW5zd2VyPWFuc3dlcnNbcXVlc3Rpb24ucXVpeklkXVxuICAgICAgICAgICAgaWYgcGVyZmVjdF9hbnN3ZXJcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi51c2VyQW5zd2VyPXBlcmZlY3RfYW5zd2VyLmpvaW4oJywnKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN1cnJlbnRfcm91bmRfb3B0aW9uX2lkcz1bXVxuICAgICAgICAgICAgICAgICMgb3B0aW9uX2lkIOW5tumdnui/nue7rVxuICAgICAgICAgICAgICAgIGZvciBpIGluIFswLi4zXVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3JvdW5kX29wdGlvbl9pZHMucHVzaCBvcHRpb25zW3FpKjQraV0gaWYgb3B0aW9uX2lkX2ZsYWdzW2ldXG4gICAgICAgICAgICAgICAgcXVlc3Rpb24udXNlckFuc3dlcj1jdXJyZW50X3JvdW5kX29wdGlvbl9pZHMuam9pbignLCcpXG4gICAgICAgIGNvbnNvbGUubG9nIHF1ZXN0aW9uc1xuICAgICAgICAjIOaemuS4vueahOetlOahiOWHhuWkh+WujOaIkO+8jOW8gOWni+a1i+ivlVxuICAgICAgICB0ZXN0X3Jlc3VsdD1hd2FpdCB0ZXN0X2Fuc3dlcihxdWVzdGlvbnMpXG4gICAgICAgIGZvciByZXN1bHQgaW4gdGVzdF9yZXN1bHRcbiAgICAgICAgICAgIHJlc3VsdD1KU09OLnBhcnNlKHJlc3VsdClcbiAgICAgICAgICAgIGlmIHJlc3VsdC5tYXJrUmVzdWx0XG4gICAgICAgICAgICAgICAgIyBwZXJmZWN0X29wdGlvbnM9KHBhcnNlSW50IG9wdGlvbiBmb3Igb3B0aW9uIGluIHJlc3VsdC51c2VyQW5zd2VyLnNwbGl0KCcsJykpXG4gICAgICAgICAgICAgICAgYW5zd2Vyc1tyZXN1bHQucXVpeklkXT1yZXN1bHQudXNlckFuc3dlci5zcGxpdCgnLCcpXG4gICAgY29uc29sZS5sb2cgYW5zd2Vyc1xuICAgIGFuc3dlcnNcblxuIyBhc3luYyDmn6XnnIvkuaDpopjnrZTmoYhcbnByaW50X2Fuc3dlcnM9LT5cbiAgICBhd2FpdCBnZXRfcXVpel9hbnN3ZXJzKCkgaWYgIWFuc3dlcnNcbiAgICBwcmV0dHlfb3B0aW9ucz0nJ1xuICAgIGZvciBxdWVzdGlvbixxaSBpbiBxdWVzdGlvbnNcbiAgICAgICAgb3B0aW9uX2lkX2Zyb209b3B0aW9uc1txaSo0XVxuICAgICAgICB4PShTdHJpbmcuZnJvbUNoYXJDb2RlKCdBJy5jaGFyQ29kZUF0KDApK3BhcnNlSW50KG9wdGlvbiktb3B0aW9uX2lkX2Zyb20pIGZvciBvcHRpb24gaW4gYW5zd2Vyc1txdWVzdGlvbi5xdWl6SWRdKVxuICAgICAgICBwcmV0dHlfb3B0aW9ucys9XCLnrKwje3FpKzF96aKY77yaI3t4LmpvaW4oJywnKX1cXG5cIlxuICAgIGNvbnNvbGUubG9nKHByZXR0eV9vcHRpb25zKVxuICAgIGFsZXJ0KHByZXR0eV9vcHRpb25zKVxuICAgIHJldHVyblxuXG4jIOiHquWKqOWujOaIkOS5oOmimFxuYXV0b19maWxsPS0+XG4gICAgYXdhaXQgZ2V0X3F1aXpfYW5zd2VycygpIGlmICFhbnN3ZXJzXG4gICAgYW5zd2VyX2lkcz1bXVxuICAgIGZvciBrLHYgb2YgYW5zd2Vyc1xuICAgICAgICBhbnN3ZXJfaWRzPWFuc3dlcl9pZHMuY29uY2F0IHZcbiAgICAjIHRvZG865aSa6YCJ6aKY5YaN5qyh54K55Ye75Lya5Y+W5raI6YCJ5oupXG4gICAgJChcIltvcHRpb25faWRdXCIpLmZpbHRlciAoaSxlKS0+ZS5nZXRBdHRyaWJ1dGUoJ29wdGlvbl9pZCcpIGluIGFuc3dlcl9pZHNcbiAgICAgICAgLmZpbmQoJ1tjbGFzc3w9XCJpbnB1dFwiXScpXG4gICAgICAgIC5jbGljaygpXG4gICAgcmV0dXJuXG5cbmFzc2lzdGFudF9hcGk9XG4gICAgJ+ino+mUgeinhumikei/m+W6pic6dW5ibG9ja192aWRlb19wcm9ncmVzc1xuICAgICflrozmiJDor6XpobknICAgIDpjb21wbGV0ZV9pdGVtXG4gICAgJ+aaguWBnOetlOmimOiuoeaXtic6cGF1c2VfcXVpel90aW1lclxuICAgICfoh6rliqjlrozmiJDkuaDpopgnOmF1dG9fZmlsbFxuICAgICfmn6XnnIvkuaDpopjnrZTmoYgnOnByaW50X2Fuc3dlcnNcblxuIyB1c2Vyc2NyaXB0IOeOr+Wig1xuaWYgdW5zYWZlV2luZG93P1xuICAgICMg5pq06ZyyYXNzaXN0YW505o6l5Y+jXG4gICAgdW5zYWZlV2luZG93LmFzc2lzdGFudD17fVxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIHVuc2FmZVdpbmRvdy5hc3Npc3RhbnRbZnVuLm5hbWVdPWZ1blxuXG4gICAgIyDov5Tlm57or77nqIvkuLvpobXmlLnkuLrov5Tlm57lr7zoiKpcbiAgICAkKCcjYmFja0NvdXJzZScpLmNvbnRlbnRzKCkubGFzdCgpLnJlcGxhY2VXaXRoKCfov5Tlm57lr7zoiKonKVxuICAgICQoJyNiYWNrQ291cnNlJykub2ZmKCdjbGljaycpXG4gICAgJChcIiNiYWNrQ291cnNlXCIpLm9uICdjbGljaycsIC0+XG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSBDT05URVhUUEFUSCArIFwiL3BvcnRhbC9zZXNzaW9uL3VuaXROYXZpZ2F0aW9uL1wiICsgJChcIiNjb3Vyc2VPcGVuSWRcIikudmFsKCkgKyBcIi5tb29jXCJcbiAgICBcbiAgICAjIOWKqeaJi+eVjOmdouaYvuekulxuICAgIGFzc2lzdGFudF9kaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBhc3Npc3RhbnRfZGl2LmlkPSdhc3Npc3RhbnQnXG4gICAgJCgnLm1haW4tc2Nyb2xsJylbMF0ucHJlcGVuZChhc3Npc3RhbnRfZGl2KVxuICAgIFxuICAgICMg5Yqp5omL55WM6Z2i5re75Yqg5oyJ6ZKuXG4gICAgYWRkX2J1dHRvbj0odGV4dCxmdW4pLT5cbiAgICAgICAgYnRuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpXG4gICAgICAgIGJ0bi50ZXh0Q29udGVudD10ZXh0XG4gICAgICAgIGJ0bi5vbmNsaWNrPWZ1blxuICAgICAgICAjIHRvZG865LyY6ZuF55qE5qC35byP6K6+572uXG4gICAgICAgIGJ0bi5zdHlsZT0nbWFyZ2luOjVweDtwYWRkaW5nOjVweCdcbiAgICAgICAgYXNzaXN0YW50X2Rpdi5hcHBlbmRDaGlsZChidG4pXG4gICAgICAgIFxuICAgIGZvciBuYW1lLGZ1biBvZiBhc3Npc3RhbnRfYXBpXG4gICAgICAgIGFkZF9idXR0b24obmFtZSxmdW4pXG4gICAgICAgIFxuICAgICMgdGFi5YiH5o2iXG4gICAgJCgnLnRhYi1pbm5lcicpLm9uICdjbGljaycsLT5cbiAgICAgICAgIyB0b2RvOuaZuuiDveWIpOaWreWPr+eUqOWKn+iDvVxuICAgICAgICBjb25zb2xlLmxvZyB0aGlzXG4gICAgXG4jcm91dGVyPVxuIyAgICAxMDp2aWRlb19oZWxwZXJfaW5pdFxuIyMgICAgMjA6cGRmX2hlbHBlciAjIHBkZumhtemdolxuIyMgICAgNTA6cXVpel9oZWxwZXIgIyDpgInmi6npophcbiMgICAgXG4jcm91dGVyWyQoJyNpdGVtVHlwZScpLnZhbCgpXSgpXG4jXG4jYXN5bmNfYWpheF90ZXN0PS0+XG4jICAgIGFqYXhfcmV0PWF3YWl0ICQud2hlbiAkLmFqYXhcbiMgICAgICAgIHVybDonaHR0cDovL3d3dy5jbm1vb2Mub3JnL3N0dWR5L3VuaXQvMTk3MDkxLm1vb2MnXG4jICAgICAgICBzdWNjZXNzOi0+Y29uc29sZS5sb2cgJ3N1Y2Nlc3MgY2FsbGJhY2snXG4jICAgIGNvbnNvbGUubG9nIGFqYXhfcmV0Lmxlbmd0aCJdfQ== //# sourceURL=E:\SDK\cnmooc-assistant\index.coffee