From 8dbd405db4d008006a5d53eee84bab87528a532b Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 29 Oct 2019 17:21:08 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=E6=80=BB=E5=88=86=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_commons_controller.rb | 4 ++++ app/views/homework_commons/settings.json.jbuilder | 2 +- .../20191029084344_add_total_score_to_homework_commons.rb | 5 +++++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20191029084344_add_total_score_to_homework_commons.rb diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 5d27de7b8..692f813a6 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -572,10 +572,13 @@ class HomeworkCommonsController < ApplicationController if @homework.homework_type == "practice" # 实训作业的评分设置 + tip_exception("总分值不能为空") if params[:total_score].blank? + tip_exception("总分值不能小于0") if params[:total_score].to_i < 0 tip_exception("缺少answer_open_evaluation参数") if params[:answer_open_evaluation].nil? tip_exception("缺少work_efficiency参数") if params[:work_efficiency].nil? tip_exception("缺少eff_score参数") if params[:work_efficiency] && params[:eff_score].blank? tip_exception("效率分不能小于等于0") if params[:eff_score] && params[:eff_score].to_i <= 0 + tip_exception("效率分不能大于总分值") if params[:eff_score] && params[:eff_score].to_i > params[:total_score].to_i tip_exception("缺少shixun_evaluation参数") if params[:shixun_evaluation].blank? tip_exception("缺少challenge_settings参数") if params[:challenge_settings].blank? # tip_exception("缺少challenge_id参数") if params[:challenge_settings][:challenge_id].blank? @@ -584,6 +587,7 @@ class HomeworkCommonsController < ApplicationController # params[:challenge_settings][:challenge_score].length != params[:challenge_settings][:challenge_id].length current_eff_score = @homework.eff_score + @homework.total_score = params[:total_score] @homework.work_efficiency = params[:work_efficiency] @homework.eff_score = params[:work_efficiency] ? params[:eff_score].to_i : 0 diff --git a/app/views/homework_commons/settings.json.jbuilder b/app/views/homework_commons/settings.json.jbuilder index 52e3f1cdf..cf36c6165 100644 --- a/app/views/homework_commons/settings.json.jbuilder +++ b/app/views/homework_commons/settings.json.jbuilder @@ -5,7 +5,7 @@ json.partial! "homework_btn_check", locals: {identity: @user_course_identity, ho json.partial! "student_btn_check", locals: {identity: @user_course_identity, homework: @homework, work: @work} json.(@homework, :unified_setting, :publish_time, :end_time, :late_penalty, :allow_late, :late_time, :work_public, - :score_open, :answer_public) + :score_open, :answer_public, :total_score) json.group_settings @course_groups do |group| json.group_id group.id diff --git a/db/migrate/20191029084344_add_total_score_to_homework_commons.rb b/db/migrate/20191029084344_add_total_score_to_homework_commons.rb new file mode 100644 index 000000000..1fefdde34 --- /dev/null +++ b/db/migrate/20191029084344_add_total_score_to_homework_commons.rb @@ -0,0 +1,5 @@ +class AddTotalScoreToHomeworkCommons < ActiveRecord::Migration[5.2] + def change + add_column :homework_commons, :total_score, :float, default: 100 + end +end From b0cba788fc799103b65c3d883072f0f706f0f52e Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 30 Oct 2019 10:34:23 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=E8=B0=83=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_works_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index b7a6953a5..c45bca268 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -534,7 +534,9 @@ class StudentWorksController < ApplicationController # 作品调分 def adjust_score tip_exception("分数不能为空") if params[:score].blank? - tip_exception("分数不能超过0-100") if params[:score].to_f < 0 || params[:score].to_f > 100 + tip_exception("分数不能超过0-100") if @homework.homework_type != "practice" && (params[:score].to_f < 0 || params[:score].to_f.round(1) > 100.round(1)) + tip_exception("已提交的作品请去评阅页进行调分") if @homework.homework_type == "practice" && @work.work_status > 0 + tip_exception("分数不能超过总分值#{@homework.total_score}") if @homework.homework_type == "practice" && (params[:score].to_f < 0 || params[:score].to_f.round(1) > @homework.total_score.round(1)) ActiveRecord::Base.transaction do begin # 分数不为空的历史评阅都置为失效 From 636f0655a3b9b0be7e0d602f184236cc1d9f19b3 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 30 Oct 2019 14:44:10 +0800 Subject: [PATCH 03/22] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E6=9C=AA=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E7=9A=84=E8=B0=83=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 15 +++++++++++++++ app/models/exercise_user.rb | 4 +++- app/models/exercise_user_score.rb | 5 +++++ .../homework_commons/works_list.json.jbuilder | 2 +- config/routes.rb | 3 ++- .../20191030062150_create_exercise_user_scores.rb | 13 +++++++++++++ spec/models/exercise_user_score_spec.rb | 5 +++++ 7 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 app/models/exercise_user_score.rb create mode 100644 db/migrate/20191030062150_create_exercise_user_scores.rb create mode 100644 spec/models/exercise_user_score_spec.rb diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index bd5a41123..a6464a151 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -605,6 +605,21 @@ class ExercisesController < ApplicationController end end + # 对未提交的用户进行调分 + def adjust_score + exercise_user = @exercise.exercise_users.find_by!(user_id: params[:user_id]) + tip_exception("已提交的作品请去评阅页进行调分") if exercise_user.commit_status == 1 + tip_exception("分数不能为空") if params[:score].blank? + tip_exception("分数不能超过0-#{@exercise.question_scores}") if params[:score].to_f < 0 || params[:score].to_f.round(1) > @exercise.question_scores.round(1) + + ActiveRecord::Base.transaction do + start_at_time = exercise_user.start_at || Time.now + exercise_user.update_attributes!(start_at: start_at_time, end_at: Time.now, status: 1, commit_status: 1, score: params[:score].to_f.round(2), commit_method: 5) + ExerciseUserScore.create!(exercise_id: @exercise.id, exercise_user_id: exercise_user.id, score: params[:score], comment: params[:comment]) + normal_status("操作成功") + end + end + #我的题库 def my_exercises ActiveRecord::Base.transaction do diff --git a/app/models/exercise_user.rb b/app/models/exercise_user.rb index 0f2e8456e..fb2034998 100644 --- a/app/models/exercise_user.rb +++ b/app/models/exercise_user.rb @@ -1,8 +1,10 @@ class ExerciseUser < ApplicationRecord - # commit_method 0 为默认, 1为学生的手动提交,2为倒计时结束后自动提交,3为试卷定时截止的自动提交, 4为教师手动的立即截止 + # commit_method 0 为默认, 1为学生的手动提交,2为倒计时结束后自动提交,3为试卷定时截止的自动提交, 4为教师手动的立即截止, 5为老师调分 belongs_to :user belongs_to :exercise + has_many :exercise_user_scores, dependent: :destroy + scope :commit_exercise_by_status, lambda { |s| where(commit_status: s) } scope :exercise_user_committed, -> {where("commit_status != ?",0) } scope :current_exercise_user, lambda { |user_id,exercise_id| where(user_id: user_id,exercise_id:exercise_id)} diff --git a/app/models/exercise_user_score.rb b/app/models/exercise_user_score.rb new file mode 100644 index 000000000..d022b0b31 --- /dev/null +++ b/app/models/exercise_user_score.rb @@ -0,0 +1,5 @@ +class ExerciseUserScore < ApplicationRecord + belongs_to :exercise + belongs_to :exercise_user + belongs_to :user +end diff --git a/app/views/homework_commons/works_list.json.jbuilder b/app/views/homework_commons/works_list.json.jbuilder index 24d1f354a..3807d5b99 100644 --- a/app/views/homework_commons/works_list.json.jbuilder +++ b/app/views/homework_commons/works_list.json.jbuilder @@ -86,7 +86,7 @@ if @homework.homework_type == "practice" json.work_efficiency @homework.work_efficiency json.student_works @student_works.each do |work| - json.(work, :id, :work_status, :update_time, :ultimate_score) + json.(work, :id, :work_status, :update_time, :ultimate_score, :myshixun_id) json.late_penalty work.late_penalty if @homework.allow_late json.work_score work_score_format(work.work_score, @current_user == work.user, @score_open) diff --git a/config/routes.rb b/config/routes.rb index 2f8f3d958..5315df7ce 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -510,7 +510,7 @@ Rails.application.routes.draw do post :join_exercise_banks # 加入习题集 post :publish # 立即发布 post :end_exercise # 立即截止 - +`` end end @@ -626,6 +626,7 @@ Rails.application.routes.draw do post :cancel_exercise get :begin_commit #提交前的弹窗 get :publish_groups + post :adjust_score end resources :exercise_questions,only:[:new,:create,:index] end diff --git a/db/migrate/20191030062150_create_exercise_user_scores.rb b/db/migrate/20191030062150_create_exercise_user_scores.rb new file mode 100644 index 000000000..911a8a3a5 --- /dev/null +++ b/db/migrate/20191030062150_create_exercise_user_scores.rb @@ -0,0 +1,13 @@ +class CreateExerciseUserScores < ActiveRecord::Migration[5.2] + def change + create_table :exercise_user_scores do |t| + t.references :exercise, index: true + t.references :exercise_user, index: true + t.float :score + t.text :comment + t.references :user, index: true + + t.timestamps + end + end +end diff --git a/spec/models/exercise_user_score_spec.rb b/spec/models/exercise_user_score_spec.rb new file mode 100644 index 000000000..97f67a99a --- /dev/null +++ b/spec/models/exercise_user_score_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ExerciseUserScore, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From e8c9e6d9c0fa335758981345ca5e9afde0527a47 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Thu, 31 Oct 2019 09:41:00 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98-=E6=8E=92=E8=A1=8C=E6=A6=9C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admins/competition_settings/index.js | 106 +++++++++--------- .../admins/competition_settings.scss | 25 +++++ .../competition_settings/index.html.erb | 96 +++++++++------- 3 files changed, 132 insertions(+), 95 deletions(-) diff --git a/app/assets/javascripts/admins/competition_settings/index.js b/app/assets/javascripts/admins/competition_settings/index.js index 81fbf7519..92ecf2440 100644 --- a/app/assets/javascripts/admins/competition_settings/index.js +++ b/app/assets/javascripts/admins/competition_settings/index.js @@ -471,45 +471,45 @@ $(document).on('turbolinks:load', function(){ ' \n' + '
奖项 | +排名 | +战队名称 | +真实姓名 | +职业 | +学号 | +单位 | +实名 | +职业 | +手机 | +队长 | +审批时间 | +审批人 | +操作 | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
序号 | +奖项名称 | +数量 | +奖励类型 | +队员个人证书模板 | +团队证书模板 | +指导老师证书模板 | +操作 | + + + <%= render 'admins/competition_settings/shared/competition_prizes', competition: @competition %> + +
---|
d)},a.validator.format("Please select no more than {0} files.")),a.validator.addMethod("maxsize",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0;ed)return!1;return!0},a.validator.format("File size must not exceed {0} bytes each.")),a.validator.addMethod("maxsizetotal",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0,f=0;f d)return!1;return!0},a.validator.format("Total size of all files must not exceed {0} bytes.")),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileRU",function(a,b){var c=a.replace(/\(|\)|\s+|-/g,"");return this.optional(b)||c.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(c)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("netmask",function(a,b){return this.optional(b)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(a)},"Please enter a valid netmask."),a.validator.addMethod("nieES",function(a,b){"use strict";if(this.optional(b))return!0;var c,d=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),e="TRWAGMYFPDXBNJZSQVHLCKET",f=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!d.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),c=9===a.length?a.substr(0,8):a.substr(0,9),e.charAt(parseInt(c,10)%23)===f)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a,b){"use strict";return!!this.optional(b)||(a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,1)%23)))},"Please specify a valid NIF number."),a.validator.addMethod("nipPL",function(a){"use strict";if(a=a.replace(/[^0-9]/g,""),10!==a.length)return!1;for(var b=[6,5,7,2,3,4,5,6,7],c=0,d=0;d<9;d++)c+=b[d]*a[d];var e=c%11,f=10===e?0:e;return f===parseInt(a[9],10)},"Please specify a valid NIP number."),a.validator.addMethod("nisBR",function(a){var b,c,d,e,f,g=0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;for(c=parseInt(a.substring(10,11),10),b=parseInt(a.substring(0,10),10),e=2;e<12;e++)f=e,10===e&&(f=2),11===e&&(f=3),g+=b%10*f,b=parseInt(b/10,10);return d=g%11,d=d>1?11-d:0,c===d},"Please specify a valid NIS/PIS number"),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonePL",function(a,b){a=a.replace(/\s+/g,"");var c=/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;return this.optional(b)||c.test(a)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c '); - } + } } }, styleURL: function() { @@ -19109,7 +19109,7 @@ return Popper; offsetAmt = (parseInt(offsetAmt)+parseInt(this.settings.spacing)) + this.$ele.outerHeight(); this.reposition(offsetAmt); } - + if ($.isFunction(self.settings.onShow)) { self.settings.onShow.call(this.$ele); } @@ -19133,7 +19133,7 @@ return Popper; bind: function() { var self = this; - this.$ele.find('[data-notify="dismiss"]').on('click', function() { + this.$ele.find('[data-notify="dismiss"]').on('click', function() { self.close(); }) @@ -19167,8 +19167,8 @@ return Popper; hasAnimation = false; this.$ele.data('closing', 'true').addClass(this.settings.animate.exit); - self.reposition(posX); - + self.reposition(posX); + if ($.isFunction(self.settings.onClose)) { self.settings.onClose.call(this.$ele); } @@ -21148,7 +21148,7 @@ S2.define('select2/selection/allowClear',[ return; } - var removeAll = this.options.get('translations').get('removeAllItems'); + var removeAll = this.options.get('translations').get('removeAllItems'); var $remove = $( '' + @@ -29428,7 +29428,7 @@ S2.define('jquery.select2',[ '' + '', contTemplate: ' ', - footTemplate: '' + + footTemplate: '' + ' ' + ' ' + '' @@ -29898,13 +29898,35 @@ function customConfirm(opts){ return $.confirm($.extend({}, defaultOpts, opts)) } -function show_success_flash(message) { +function customLoading(opts) { + var loading; + var defaultOpts = { + content: opts.ajax, + contentLoaded: function(){ + setTimeout(function(){ + loading.close() + }, 200); + } + } + loading = $.confirm($.extend({}, defaultOpts, opts)); + return loading; +} + +function show_success_flash(message){ $.notify({ message: message || '操作成功' },{ type: 'success' }); } + +function showErrorNotify(message){ + $.notify({ + message: message || '操作失败' + },{ + type: 'danger' + }); +} ; (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : @@ -38504,7 +38526,7 @@ ZImage.prototype = { // Draw rect text if (style.text != null) { // Only restore transform when needs draw text. - this.restoreTransform(ctx); + this.restoreTransform(ctx); this.drawRectText(ctx, this.getBoundingRect()); } }, @@ -44048,7 +44070,7 @@ Path.prototype = { // Draw rect text if (style.text != null) { // Only restore transform when needs draw text. - this.restoreTransform(ctx); + this.restoreTransform(ctx); this.drawRectText(ctx, this.getBoundingRect()); } }, @@ -75940,7 +75962,7 @@ SeriesModel.extend({ return tree.data; }, - + /** * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. * @returns {string} orient @@ -76805,7 +76827,7 @@ function commonLayout(seriesModel, api) { var width = 0; var height = 0; var separation$$1 = null; - + if (layout === 'radial') { width = 2 * Math.PI; height = Math.min(layoutInfo.height, layoutInfo.width) / 2; @@ -76862,7 +76884,7 @@ function commonLayout(seriesModel, api) { }); } else { - var orient = seriesModel.getOrient(); + var orient = seriesModel.getOrient(); if (orient === 'RL' || orient === 'LR') { ky = height / (right.getLayout().x + delta + tx); kx = width / ((bottom.depth - 1) || 1); @@ -76886,7 +76908,7 @@ function commonLayout(seriesModel, api) { }); } } - } + } } /* @@ -87518,7 +87540,7 @@ extendChartView({ var width = layoutInfo.width; // view height var height = layoutInfo.height; - + var nodeData = seriesModel.getData(); var edgeData = seriesModel.getData('edge'); @@ -87643,12 +87665,12 @@ extendChartView({ localY: this.shape.y / height }); }; - + el.draggable = true; el.cursor = 'move'; }); } - + if (!this._data && seriesModel.get('animation')) { group.setClipPath(createGridClipShape$2(group.getBoundingRect(), seriesModel, function () { group.removeClipPath(); @@ -87932,7 +87954,7 @@ function computeNodeValues(nodes) { /** * Compute the x-position for each node. - * + * * Here we use Kahn algorithm to detect cycle when we traverse * the node to computer the initial x position. * @@ -87962,7 +87984,7 @@ function computeNodeBreadths(nodes, edges, nodeWidth, width) { zeroIndegrees.push(nodes[i]); } } - + while (zeroIndegrees.length) { each$1(zeroIndegrees, function (node) { node.setLayout({x: x}, true); @@ -87977,18 +87999,18 @@ function computeNodeBreadths(nodes, edges, nodeWidth, width) { } }); }); - + ++x; zeroIndegrees = nextNode; nextNode = []; } - + for (var i = 0; i < remainEdges.length; i++) { if (__DEV__) { if (remainEdges[i] === 1) { throw new Error('Sankey is a DAG, the original data has cycle!'); } - } + } } moveSinksRight(nodes, x); @@ -88296,7 +88318,7 @@ var sankeyVisual = function (ecModel, payload) { maxValue = nodeValue; } }); - + each$1(nodes, function (node) { var mapping = new VisualMapping({ type: 'color', @@ -88304,7 +88326,7 @@ var sankeyVisual = function (ecModel, payload) { dataExtent: [minValue, maxValue], visual: seriesModel.get('color') }); - + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); node.setVisual('color', mapValueToColor); // If set itemStyle.normal.color @@ -97332,10 +97354,10 @@ var sunburstLayout = function (seriesType, ecModel, api, payload) { ? unitRadian : (value * unitRadian); if (angle < minAngle) { angle = minAngle; - + } else { - + } endAngle = startAngle + dir * angle; @@ -130129,8 +130151,8 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); /* * Editor.md * - * @file editormd.js - * @version v1.5.0 + * @file editormd.js + * @version v1.5.0 * @description Open source online markdown editor. * @license MIT License * @author Pandao @@ -130141,10 +130163,10 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); ;(function(factory) { "use strict"; - + // CommonJS/Node.js if (typeof require === "function" && typeof exports === "object" && typeof module === "object") - { + { module.exports = factory; } else if (typeof define === "function") // AMD/CMD/Sea.js @@ -130152,60 +130174,60 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); if (define.amd) // for Require.js { /* Require.js define replace */ - } - else + } + else { define(["jquery"], factory); // for Sea.js } - } + } else - { + { window.editormd = factory(); } - -}(function() { + +}(function() { /* Require.js assignment replace */ - + "use strict"; - + var $ = (typeof (jQuery) !== "undefined") ? jQuery : Zepto; if (typeof ($) === "undefined") { return ; } - + /** * editormd - * + * * @param {String} id 编辑器的ID * @param {Object} options 配置选项 Key/Value * @returns {Object} editormd 返回editormd对象 */ - + var editormd = function (id, options) { return new editormd.fn.init(id, options); }; - + editormd.title = editormd.$name = "Editor.md"; editormd.version = "1.5.0"; editormd.homePage = "https://pandao.github.io/editor.md/"; editormd.classPrefix = "editormd-"; - + editormd.toolbarModes = { full : [ - "undo", "redo", "|", - "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|", - "h1", "h2", "h3", "h4", "h5", "h6", "|", + "undo", "redo", "|", + "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|", + "h1", "h2", "h3", "h4", "h5", "h6", "|", "list-ul", "list-ol", "hr", "|", "link", "reference-link", "image", "code", "preformatted-text", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|", "goto-line", "watch", "preview", "fullscreen", "clear", "search", "|", "help", "info" ], simple : [ - "undo", "redo", "|", - "bold", "del", "italic", "quote", "uppercase", "lowercase", "|", - "h1", "h2", "h3", "h4", "h5", "h6", "|", + "undo", "redo", "|", + "bold", "del", "italic", "quote", "uppercase", "lowercase", "|", + "h1", "h2", "h3", "h4", "h5", "h6", "|", "list-ul", "list-ol", "hr", "|", "watch", "preview", "fullscreen", "|", "help", "info" @@ -130216,7 +130238,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "help", "info" ] }; - + editormd.defaults = { mode : "gfm", //gfm or markdown name : "", // Form element name @@ -130261,7 +130283,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); fontSize : "13px", saveHTMLToTextarea : false, disabledKeyMaps : [], - + onload : function() {}, onresize : function() {}, onchange : function() {}, @@ -130273,20 +130295,20 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); onfullscreenExit : function() {}, onscroll : function() {}, onpreviewscroll : function() {}, - + imageUpload : false, imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], imageUploadURL : "", crossDomainUpload : false, uploadCallbackURL : "", - + toc : true, // Table of contents tocm : false, // Using [TOCM], auto create ToC dropdown menu tocTitle : "", // for ToC dropdown menu btn tocDropdown : false, tocContainer : "", tocStartLevel : 1, // Said from H1 to create ToC - htmlDecode : false, // Open the HTML tag identification + htmlDecode : false, // Open the HTML tag identification pageBreak : true, // Enable parse page break [========] atLink : true, // for @link emailLink : true, // for email address auto link @@ -130298,7 +130320,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); flowChart : false, // flowChart.js only support IE9+ sequenceDiagram : false, // sequenceDiagram.js only support IE9+ previewCodeHighlight : true, - + toolbar : true, // show/hide toolbar toolbarAutoFixed : true, // on window scroll auto fixed position toolbarIcons : "full", @@ -130314,7 +130336,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); toolbarCustomIcons : { // using html tag create toolbar icon, unused default tag. lowercase : "a", "ucwords" : "Aa" - }, + }, toolbarIconsClass : { undo : "fa-undo", redo : "fa-repeat", @@ -130352,9 +130374,9 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); clear : "fa-eraser", help : "fa-question-circle", info : "fa-info-circle" - }, + }, toolbarIconTexts : {}, - + lang : { name : "zh-cn", description : "开源在线Markdown编辑器
Open source online Markdown editor.", @@ -130432,11 +130454,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); formatNotAllowed : "错误:只允许上传图片文件,允许上传的图片文件格式有:" }, preformattedText : { - title : "添加预格式文本或代码块", + title : "添加预格式文本或代码块", emptyAlert : "错误:请填写预格式文本或代码的内容。" }, codeBlock : { - title : "添加代码块", + title : "添加代码块", selectLabel : "代码语言:", selectDefaultText : "请选择代码语言", otherLanguage : "其他语言", @@ -130452,18 +130474,18 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } } }; - + editormd.classNames = { tex : editormd.classPrefix + "tex" }; editormd.dialogZindex = 99999; - + editormd.$katex = null; editormd.$marked = null; editormd.$CodeMirror = null; editormd.$prettyPrint = null; - + var timer, flowchartTimer; editormd.prototype = editormd.fn = { @@ -130473,76 +130495,76 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); preview : false, fullscreen : false }, - + /** * 构造函数/实例初始化 * Constructor / instance initialization - * + * * @param {String} id 编辑器的ID * @param {Object} [options={}] 配置选项 Key/Value * @returns {editormd} 返回editormd的实例对象 */ - + init : function (id, options) { - + options = options || {}; - + if (typeof id === "object") { options = id; } - + var _this = this; - var classPrefix = this.classPrefix = editormd.classPrefix; + var classPrefix = this.classPrefix = editormd.classPrefix; var settings = this.settings = $.extend(true, editormd.defaults, options); - + id = (typeof id === "object") ? settings.id : id; - + var editor = this.editor = $("#" + id); - + this.id = id; this.lang = settings.lang; - + var classNames = this.classNames = { textarea : { html : classPrefix + "html-textarea", markdown : classPrefix + "markdown-textarea" } }; - - settings.pluginPath = (settings.pluginPath === "") ? settings.path + "../plugins/" : settings.pluginPath; - + + settings.pluginPath = (settings.pluginPath === "") ? settings.path + "../plugins/" : settings.pluginPath; + this.state.watching = (settings.watch) ? true : false; - + if ( !editor.hasClass("editormd") ) { editor.addClass("editormd"); } - + editor.css({ width : (typeof settings.width === "number") ? settings.width + "px" : settings.width, height : (typeof settings.height === "number") ? settings.height + "px" : settings.height }); - + if (settings.autoHeight) { editor.css("height", "auto"); } - + var markdownTextarea = this.markdownTextarea = editor.children("textarea"); - + if (markdownTextarea.length < 1) { editor.append(""); markdownTextarea = this.markdownTextarea = editor.children("textarea"); } - + markdownTextarea.addClass(classNames.textarea.markdown).attr("placeholder", settings.placeholder); - + if (typeof markdownTextarea.attr("name") === "undefined" || markdownTextarea.attr("name") === "") { markdownTextarea.attr("name", (settings.name !== "") ? settings.name : id + "-markdown-doc"); } - + var appendElements = [ (!settings.readOnly) ? "" : "", ( (settings.saveHTMLToTextarea) ? "" : "" ), @@ -130550,114 +130572,114 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "", "" ].join("\n"); - + editor.append(appendElements).addClass(classPrefix + "vertical"); - - if (settings.theme !== "") + + if (settings.theme !== "") { editor.addClass(classPrefix + "theme-" + settings.theme); } - - this.mask = editor.children("." + classPrefix + "mask"); + + this.mask = editor.children("." + classPrefix + "mask"); this.containerMask = editor.children("." + classPrefix + "container-mask"); - + if (settings.markdown !== "") { markdownTextarea.val(settings.markdown); } - + if (settings.appendMarkdown !== "") { markdownTextarea.val(markdownTextarea.val() + settings.appendMarkdown); } - - this.htmlTextarea = editor.children("." + classNames.textarea.html); + + this.htmlTextarea = editor.children("." + classNames.textarea.html); this.preview = editor.children("." + classPrefix + "preview"); this.previewContainer = this.preview.children("." + classPrefix + "preview-container"); - - if (settings.previewTheme !== "") + + if (settings.previewTheme !== "") { this.preview.addClass(classPrefix + "preview-theme-" + settings.previewTheme); } - + if (typeof define === "function" && define.amd) { - if (typeof katex !== "undefined") + if (typeof katex !== "undefined") { editormd.$katex = katex; } - - if (settings.searchReplace && !settings.readOnly) + + if (settings.searchReplace && !settings.readOnly) { editormd.loadCSS(settings.path + "codemirror/addon/dialog/dialog"); editormd.loadCSS(settings.path + "codemirror/addon/search/matchesonscrollbar"); } } - + if ((typeof define === "function" && define.amd) || !settings.autoLoadModules) { if (typeof CodeMirror !== "undefined") { editormd.$CodeMirror = CodeMirror; } - + if (typeof marked !== "undefined") { editormd.$marked = marked; } - + this.setCodeMirror().setToolbar().loadedDisplay(); - } - else + } + else { this.loadQueues(); } return this; }, - + /** * 所需组件加载队列 * Required components loading queue - * + * * @returns {editormd} 返回editormd的实例对象 */ - + loadQueues : function() { var _this = this; var settings = this.settings; var loadPath = settings.path; - + var loadFlowChartOrSequenceDiagram = function() { - - if (editormd.isIE8) + + if (editormd.isIE8) { _this.loadedDisplay(); - + return ; } - if (settings.flowChart || settings.sequenceDiagram) + if (settings.flowChart || settings.sequenceDiagram) { editormd.loadScript(loadPath + "raphael.min", function() { - editormd.loadScript(loadPath + "underscore.min", function() { + editormd.loadScript(loadPath + "underscore.min", function() { - if (!settings.flowChart && settings.sequenceDiagram) + if (!settings.flowChart && settings.sequenceDiagram) { editormd.loadScript(loadPath + "sequence-diagram.min", function() { _this.loadedDisplay(); }); } - else if (settings.flowChart && !settings.sequenceDiagram) - { - editormd.loadScript(loadPath + "flowchart.min", function() { + else if (settings.flowChart && !settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "flowchart.min", function() { editormd.loadScript(loadPath + "jquery.flowchart.min", function() { _this.loadedDisplay(); }); }); } - else if (settings.flowChart && settings.sequenceDiagram) - { - editormd.loadScript(loadPath + "flowchart.min", function() { + else if (settings.flowChart && settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "flowchart.min", function() { editormd.loadScript(loadPath + "jquery.flowchart.min", function() { editormd.loadScript(loadPath + "sequence-diagram.min", function() { _this.loadedDisplay(); @@ -130668,157 +130690,157 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }); }); - } + } else { _this.loadedDisplay(); } - }; + }; editormd.loadCSS(loadPath + "codemirror/codemirror.min"); - + if (settings.searchReplace && !settings.readOnly) { editormd.loadCSS(loadPath + "codemirror/addon/dialog/dialog"); editormd.loadCSS(loadPath + "codemirror/addon/search/matchesonscrollbar"); } - + if (settings.codeFold) { - editormd.loadCSS(loadPath + "codemirror/addon/fold/foldgutter"); + editormd.loadCSS(loadPath + "codemirror/addon/fold/foldgutter"); } - + editormd.loadScript(loadPath + "codemirror/codemirror.min", function() { editormd.$CodeMirror = CodeMirror; - + editormd.loadScript(loadPath + "codemirror/modes.min", function() { - + editormd.loadScript(loadPath + "codemirror/addons.min", function() { - + _this.setCodeMirror(); - - if (settings.mode !== "gfm" && settings.mode !== "markdown") + + if (settings.mode !== "gfm" && settings.mode !== "markdown") { _this.loadedDisplay(); - + return false; } - + _this.setToolbar(); editormd.loadScript(loadPath + "marked.min", function() { editormd.$marked = marked; - - if (settings.previewCodeHighlight) + + if (settings.previewCodeHighlight) { editormd.loadScript(loadPath + "prettify.min", function() { loadFlowChartOrSequenceDiagram(); }); - } + } else - { + { loadFlowChartOrSequenceDiagram(); } }); - + }); - + }); - + }); return this; }, - + /** * 设置 Editor.md 的整体主题,主要是工具栏 * Setting Editor.md theme - * + * * @returns {editormd} 返回editormd的实例对象 */ - + setTheme : function(theme) { var editor = this.editor; var oldTheme = this.settings.theme; var themePrefix = this.classPrefix + "theme-"; - + editor.removeClass(themePrefix + oldTheme).addClass(themePrefix + theme); - + this.settings.theme = theme; - + return this; }, - + /** * 设置 CodeMirror(编辑区)的主题 * Setting CodeMirror (Editor area) theme - * + * * @returns {editormd} 返回editormd的实例对象 */ - - setEditorTheme : function(theme) { - var settings = this.settings; - settings.editorTheme = theme; - + + setEditorTheme : function(theme) { + var settings = this.settings; + settings.editorTheme = theme; + if (theme !== "default") { editormd.loadCSS(settings.path + "codemirror/theme/" + settings.editorTheme); } - + this.cm.setOption("theme", theme); - + return this; }, - + /** * setEditorTheme() 的别名 * setEditorTheme() alias - * + * * @returns {editormd} 返回editormd的实例对象 */ - - setCodeMirrorTheme : function (theme) { + + setCodeMirrorTheme : function (theme) { this.setEditorTheme(theme); - + return this; }, - + /** * 设置 Editor.md 的主题 * Setting Editor.md theme - * + * * @returns {editormd} 返回editormd的实例对象 */ - - setPreviewTheme : function(theme) { + + setPreviewTheme : function(theme) { var preview = this.preview; var oldTheme = this.settings.previewTheme; var themePrefix = this.classPrefix + "preview-theme-"; - + preview.removeClass(themePrefix + oldTheme).addClass(themePrefix + theme); - + this.settings.previewTheme = theme; - + return this; }, - + /** * 配置和初始化CodeMirror组件 * CodeMirror initialization - * + * * @returns {editormd} 返回editormd的实例对象 */ - - setCodeMirror : function() { + + setCodeMirror : function() { var settings = this.settings; var editor = this.editor; - + if (settings.editorTheme !== "default") { editormd.loadCSS(settings.path + "codemirror/theme/" + settings.editorTheme); } - + var codeMirrorConfig = { mode : settings.mode, theme : settings.editorTheme, @@ -130831,8 +130853,8 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); lineNumbers : settings.lineNumbers, lineWrapping : settings.lineWrapping, extraKeys : { - "Ctrl-Q": function(cm) { - cm.foldCode(cm.getCursor()); + "Ctrl-Q": function(cm) { + cm.foldCode(cm.getCursor()); } }, foldGutter : settings.codeFold, @@ -130845,10 +130867,10 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); showTrailingSpace : settings.showTrailingSpace, highlightSelectionMatches : ( (!settings.matchWordHighlight) ? false : { showToken: (settings.matchWordHighlight === "onselected") ? false : /\w/ } ) }; - + this.codeEditor = this.cm = editormd.$CodeMirror.fromTextArea(this.markdownTextarea[0], codeMirrorConfig); this.codeMirror = this.cmElement = editor.children(".CodeMirror"); - + if (settings.value !== "") { this.cm.setValue(settings.value); @@ -130858,13 +130880,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); fontSize : settings.fontSize, width : (!settings.watch) ? "100%" : "50%" }); - + if (settings.autoHeight) { this.codeMirror.css("height", "auto"); this.cm.setOption("viewportMargin", Infinity); } - + if (!settings.lineNumbers) { this.codeMirror.find(".CodeMirror-gutters").css("border-right", "none"); @@ -130872,149 +130894,149 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 获取CodeMirror的配置选项 * Get CodeMirror setting options - * + * * @returns {Mixed} return CodeMirror setting option value */ - - getCodeMirrorOption : function(key) { + + getCodeMirrorOption : function(key) { return this.cm.getOption(key); }, - + /** * 配置和重配置CodeMirror的选项 * CodeMirror setting options / resettings - * + * * @returns {editormd} 返回editormd的实例对象 */ - + setCodeMirrorOption : function(key, value) { - + this.cm.setOption(key, value); - + return this; }, - + /** * 添加 CodeMirror 键盘快捷键 * Add CodeMirror keyboard shortcuts key map - * + * * @returns {editormd} 返回editormd的实例对象 */ - + addKeyMap : function(map, bottom) { this.cm.addKeyMap(map, bottom); - + return this; }, - + /** * 移除 CodeMirror 键盘快捷键 * Remove CodeMirror keyboard shortcuts key map - * + * * @returns {editormd} 返回editormd的实例对象 */ - + removeKeyMap : function(map) { this.cm.removeKeyMap(map); - + return this; }, - + /** * 跳转到指定的行 * Goto CodeMirror line - * + * * @param {String|Intiger} line line number or "first"|"last" * @returns {editormd} 返回editormd的实例对象 */ - + gotoLine : function (line) { - + var settings = this.settings; - + if (!settings.gotoLine) { return this; } - + var cm = this.cm; var editor = this.editor; var count = cm.lineCount(); var preview = this.preview; - + if (typeof line === "string") { if(line === "last") { line = count; } - + if (line === "first") { line = 1; } } - - if (typeof line !== "number") - { + + if (typeof line !== "number") + { alert("Error: The line number must be an integer."); return this; } - + line = parseInt(line) - 1; - + if (line > count) { alert("Error: The line number range 1-" + count); - + return this; } - + cm.setCursor( {line : line, ch : 0} ); - + var scrollInfo = cm.getScrollInfo(); - var clientHeight = scrollInfo.clientHeight; + var clientHeight = scrollInfo.clientHeight; var coords = cm.charCoords({line : line, ch : 0}, "local"); - + cm.scrollTo(null, (coords.top + coords.bottom - clientHeight) / 2); - + if (settings.watch) - { + { var cmScroll = this.codeMirror.find(".CodeMirror-scroll")[0]; - var height = $(cmScroll).height(); - var scrollTop = cmScroll.scrollTop; + var height = $(cmScroll).height(); + var scrollTop = cmScroll.scrollTop; var percent = (scrollTop / cmScroll.scrollHeight); if (scrollTop === 0) { preview.scrollTop(0); - } + } else if (scrollTop + height >= cmScroll.scrollHeight - 16) - { - preview.scrollTop(preview[0].scrollHeight); - } + { + preview.scrollTop(preview[0].scrollHeight); + } else - { + { preview.scrollTop(preview[0].scrollHeight * percent); } } cm.focus(); - + return this; }, - + /** * 扩展当前实例对象,可同时设置多个或者只设置一个 * Extend editormd instance object, can mutil setting. - * + * * @returns {editormd} this(editormd instance object.) */ - + extend : function() { if (typeof arguments[1] !== "undefined") { @@ -131025,7 +131047,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); this[arguments[0]] = arguments[1]; } - + if (typeof arguments[0] === "object" && typeof arguments[0].length === "undefined") { $.extend(true, this, arguments[0]); @@ -131033,168 +131055,168 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 设置或扩展当前实例对象,单个设置 * Extend editormd instance object, one by one - * + * * @param {String|Object} key option key * @param {String|Object} value option value * @returns {editormd} this(editormd instance object.) */ - + set : function (key, value) { - + if (typeof value !== "undefined" && typeof value === "function") { value = $.proxy(value, this); } - + this[key] = value; return this; }, - + /** * 重新配置 * Resetting editor options - * + * * @param {String|Object} key option key * @param {String|Object} value option value * @returns {editormd} this(editormd instance object.) */ - + config : function(key, value) { var settings = this.settings; - + if (typeof key === "object") { settings = $.extend(true, settings, key); } - + if (typeof key === "string") { settings[key] = value; } - + this.settings = settings; this.recreate(); - + return this; }, - + /** * 注册事件处理方法 * Bind editor event handle - * + * * @param {String} eventType event type * @param {Function} callback 回调函数 * @returns {editormd} this(editormd instance object.) */ - + on : function(eventType, callback) { var settings = this.settings; - - if (typeof settings["on" + eventType] !== "undefined") - { - settings["on" + eventType] = $.proxy(callback, this); + + if (typeof settings["on" + eventType] !== "undefined") + { + settings["on" + eventType] = $.proxy(callback, this); } return this; }, - + /** * 解除事件处理方法 * Unbind editor event handle - * + * * @param {String} eventType event type * @returns {editormd} this(editormd instance object.) */ - + off : function(eventType) { var settings = this.settings; - - if (typeof settings["on" + eventType] !== "undefined") + + if (typeof settings["on" + eventType] !== "undefined") { settings["on" + eventType] = function(){}; } - + return this; }, - + /** * 显示工具栏 * Display toolbar - * + * * @param {Function} [callback=function(){}] 回调函数 * @returns {editormd} 返回editormd的实例对象 */ - + showToolbar : function(callback) { var settings = this.settings; - + if(settings.readOnly) { return this; } - + if (settings.toolbar && (this.toolbar.length < 1 || this.toolbar.find("." + this.classPrefix + "menu").html() === "") ) { this.setToolbar(); } - - settings.toolbar = true; - + + settings.toolbar = true; + this.toolbar.show(); this.resize(); - + $.proxy(callback || function(){}, this)(); return this; }, - + /** * 隐藏工具栏 * Hide toolbar - * + * * @param {Function} [callback=function(){}] 回调函数 * @returns {editormd} this(editormd instance object.) */ - - hideToolbar : function(callback) { + + hideToolbar : function(callback) { var settings = this.settings; - - settings.toolbar = false; + + settings.toolbar = false; this.toolbar.hide(); this.resize(); - + $.proxy(callback || function(){}, this)(); return this; }, - + /** * 页面滚动时工具栏的固定定位 * Set toolbar in window scroll auto fixed position - * + * * @returns {editormd} 返回editormd的实例对象 */ - + setToolbarAutoFixed : function(fixed) { - + var state = this.state; var editor = this.editor; var toolbar = this.toolbar; var settings = this.settings; - + if (typeof fixed !== "undefined") { settings.toolbarAutoFixed = fixed; } - + var autoFixedHandle = function(){ var $window = $(window); var top = $window.scrollTop(); - + if (!settings.toolbarAutoFixed) { return false; @@ -131217,7 +131239,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }); } }; - + if (!state.fullscreen && !state.preview && settings.toolbar && settings.toolbarAutoFixed) { $(window).bind("scroll", autoFixedHandle); @@ -131225,58 +131247,58 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 配置和初始化工具栏 * Set toolbar and Initialization - * + * * @returns {editormd} 返回editormd的实例对象 */ - + setToolbar : function() { - var settings = this.settings; - + var settings = this.settings; + if(settings.readOnly) { return this; } - + var editor = this.editor; var preview = this.preview; var classPrefix = this.classPrefix; - + var toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); - + if (settings.toolbar && toolbar.length < 1) - { + { var toolbarHTML = ""; - + editor.append(toolbarHTML); toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); } - - if (!settings.toolbar) + + if (!settings.toolbar) { toolbar.hide(); - + return this; } - + toolbar.show(); - - var icons = (typeof settings.toolbarIcons === "function") ? settings.toolbarIcons() + + var icons = (typeof settings.toolbarIcons === "function") ? settings.toolbarIcons() : ((typeof settings.toolbarIcons === "string") ? editormd.toolbarModes[settings.toolbarIcons] : settings.toolbarIcons); - + var toolbarMenu = toolbar.find("." + this.classPrefix + "menu"), menu = ""; var pullRight = false; - + for (var i = 0, len = icons.length; i < len; i++) { var name = icons[i]; - if (name === "||") - { + if (name === "||") + { pullRight = true; - } + } else if (name === "|") { menu += "| "; @@ -131285,26 +131307,26 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { var isHeader = (/h(\d)/.test(name)); var index = name; - + if (name === "watch" && !settings.watch) { index = "unwatch"; } - + var title = settings.lang.toolbar[index]; var iconTexts = settings.toolbarIconTexts[index]; var iconClass = settings.toolbarIconsClass[index]; - + title = (typeof title === "undefined") ? "" : title; iconTexts = (typeof iconTexts === "undefined") ? "" : iconTexts; iconClass = (typeof iconClass === "undefined") ? "" : iconClass; var menuItem = pullRight ? "" : " "; - + if (typeof settings.toolbarCustomIcons[name] !== "undefined" && typeof settings.toolbarCustomIcons[name] !== "function") { menuItem += settings.toolbarCustomIcons[name]; } - else + else { menuItem += ""; menuItem += ""+((isHeader) ? name.toUpperCase() : ( (iconClass === "") ? iconTexts : "") ) + ""; @@ -131318,64 +131340,64 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } toolbarMenu.html(menu); - + toolbarMenu.find("[title=\"Lowercase\"]").attr("title", settings.lang.toolbar.lowercase); toolbarMenu.find("[title=\"ucwords\"]").attr("title", settings.lang.toolbar.ucwords); - + this.setToolbarHandler(); this.setToolbarAutoFixed(); return this; }, - + /** * 工具栏图标事件处理对象序列 * Get toolbar icons event handlers - * + * * @param {Object} cm CodeMirror的实例对象 * @param {String} name 要获取的事件处理器名称 * @returns {Object} 返回处理对象序列 */ - + dialogLockScreen : function() { $.proxy(editormd.dialogLockScreen, this)(); - + return this; }, dialogShowMask : function(dialog) { $.proxy(editormd.dialogShowMask, this)(dialog); - + return this; }, - - getToolbarHandles : function(name) { + + getToolbarHandles : function(name) { var toolbarHandlers = this.toolbarHandlers = editormd.toolbarHandlers; - + return (name && typeof toolbarIconHandlers[name] !== "undefined") ? toolbarHandlers[name] : toolbarHandlers; }, - + /** * 工具栏图标事件处理器 * Bind toolbar icons event handle - * + * * @returns {editormd} 返回editormd的实例对象 */ - + setToolbarHandler : function() { var _this = this; var settings = this.settings; - + if (!settings.toolbar || settings.readOnly) { return this; } - + var toolbar = this.toolbar; var cm = this.cm; - var classPrefix = this.classPrefix; - var toolbarIcons = this.toolbarIcons = toolbar.find("." + classPrefix + "menu > li > a"); - var toolbarIconHandlers = this.getToolbarHandles(); - + var classPrefix = this.classPrefix; + var toolbarIcons = this.toolbarIcons = toolbar.find("." + classPrefix + "menu > li > a"); + var toolbarIconHandlers = this.getToolbarHandles(); + toolbarIcons.bind(editormd.mouseOrTouch("click", "touchend"), function(event) { var icon = $(this).children(".fa"); @@ -131386,23 +131408,23 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); if (name === "") { return ; } - + _this.activeIcon = icon; - if (typeof toolbarIconHandlers[name] !== "undefined") + if (typeof toolbarIconHandlers[name] !== "undefined") { $.proxy(toolbarIconHandlers[name], _this)(cm); } - else + else { - if (typeof settings.toolbarHandlers[name] !== "undefined") + if (typeof settings.toolbarHandlers[name] !== "undefined") { $.proxy(settings.toolbarHandlers[name], _this)(cm, icon, cursor, selection); } } - - if (name !== "link" && name !== "reference-link" && name !== "image" && name !== "code-block" && - name !== "preformatted-text" && name !== "watch" && name !== "preview" && name !== "search" && name !== "fullscreen" && name !== "info") + + if (name !== "link" && name !== "reference-link" && name !== "image" && name !== "code-block" && + name !== "preformatted-text" && name !== "watch" && name !== "preview" && name !== "search" && name !== "fullscreen" && name !== "info") { cm.focus(); } @@ -131413,31 +131435,31 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 动态创建对话框 * Creating custom dialogs - * + * * @param {Object} options 配置项键值对 Key/Value * @returns {dialog} 返回创建的dialog的jQuery实例对象 */ - - createDialog : function(options) { + + createDialog : function(options) { return $.proxy(editormd.createDialog, this)(options); }, - + /** * 创建关于Editor.md的对话框 * Create about Editor.md dialog - * + * * @returns {editormd} 返回editormd的实例对象 */ - + createInfoDialog : function() { var _this = this; var editor = this.editor; - var classPrefix = this.classPrefix; - + var classPrefix = this.classPrefix; + var infoDialogHTML = [ " ", "", @@ -131451,30 +131473,30 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); ].join("\n"); editor.append(infoDialogHTML); - + var infoDialog = this.infoDialog = editor.children("." + classPrefix + "dialog-info"); infoDialog.find("." + classPrefix + "dialog-close").bind(editormd.mouseOrTouch("click", "touchend"), function() { _this.hideInfoDialog(); }); - + infoDialog.css("border", (editormd.isIE8) ? "1px solid #ddd" : "").css("z-index", editormd.dialogZindex).show(); - + this.infoDialogPosition(); return this; }, - + /** * 关于Editor.md对话居中定位 * Editor.md dialog position handle - * + * * @returns {editormd} 返回editormd的实例对象 */ - + infoDialogPosition : function() { var infoDialog = this.infoDialog; - + var _infoDialogPosition = function() { infoDialog.css({ top : ($(window).height() - infoDialog.height()) / 2 + "px", @@ -131485,33 +131507,33 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); _infoDialogPosition(); $(window).resize(_infoDialogPosition); - + return this; }, - + /** * 显示关于Editor.md * Display about Editor.md dialog - * + * * @returns {editormd} 返回editormd的实例对象 */ - + showInfoDialog : function() { $("html,body").css("overflow-x", "hidden"); - + var _this = this; var editor = this.editor; - var settings = this.settings; + var settings = this.settings; var infoDialog = this.infoDialog = editor.children("." + this.classPrefix + "dialog-info"); - + if (infoDialog.length < 1) { this.createInfoDialog(); } - + this.lockScreen(true); - + this.mask.css({ opacity : settings.dialogMaskOpacity, backgroundColor : settings.dialogMaskBgColor @@ -131523,15 +131545,15 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 隐藏关于Editor.md * Hide about Editor.md dialog - * + * * @returns {editormd} 返回editormd的实例对象 */ - - hideInfoDialog : function() { + + hideInfoDialog : function() { $("html,body").css("overflow-x", ""); this.infoDialog.hide(); this.mask.hide(); @@ -131539,116 +131561,116 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 锁屏 * lock screen - * + * * @param {Boolean} lock Boolean 布尔值,是否锁屏 * @returns {editormd} 返回editormd的实例对象 */ - + lockScreen : function(lock) { editormd.lockScreen(lock); this.resize(); return this; }, - + /** * 编辑器界面重建,用于动态语言包或模块加载等 * Recreate editor - * + * * @returns {editormd} 返回editormd的实例对象 */ - + recreate : function() { var _this = this; var editor = this.editor; var settings = this.settings; - + this.codeMirror.remove(); - + this.setCodeMirror(); - if (!settings.readOnly) + if (!settings.readOnly) { if (editor.find(".editormd-dialog").length > 0) { editor.find(".editormd-dialog").remove(); } - - if (settings.toolbar) - { - this.getToolbarHandles(); + + if (settings.toolbar) + { + this.getToolbarHandles(); this.setToolbar(); } } - + this.loadedDisplay(true); return this; }, - + /** * 高亮预览HTML的pre代码部分 * highlight of preview codes - * + * * @returns {editormd} 返回editormd的实例对象 */ - - previewCodeHighlight : function() { + + previewCodeHighlight : function() { var settings = this.settings; var previewContainer = this.previewContainer; - - if (settings.previewCodeHighlight) + + if (settings.previewCodeHighlight) { previewContainer.find("pre").addClass("prettyprint linenums"); - + if (typeof prettyPrint !== "undefined") - { + { prettyPrint(); } } return this; }, - + /** * 解析TeX(KaTeX)科学公式 * TeX(KaTeX) Renderer - * + * * @returns {editormd} 返回editormd的实例对象 */ - + katexRender : function() { - + if (timer === null) { return this; } - + this.previewContainer.find("." + editormd.classNames.tex).each(function(){ var tex = $(this); editormd.$katex.render(tex.text(), tex[0]); - + tex.find(".katex").css("font-size", "1.6em"); - }); + }); return this; }, - + /** * 解析和渲染流程图及时序图 * FlowChart and SequenceDiagram Renderer - * + * * @returns {editormd} 返回editormd的实例对象 */ - + flowChartAndSequenceDiagramRender : function() { var $this = this; var settings = this.settings; var previewContainer = this.previewContainer; - + if (editormd.isIE8) { return this; } @@ -131657,20 +131679,20 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); if (flowchartTimer === null) { return this; } - - previewContainer.find(".flowchart").flowChart(); + + previewContainer.find(".flowchart").flowChart(); } if (settings.sequenceDiagram) { previewContainer.find(".sequence-diagram").sequenceDiagram({theme: "simple"}); } - + var preview = $this.preview; var codeMirror = $this.codeMirror; var codeView = codeMirror.find(".CodeMirror-scroll"); var height = codeView.height(); - var scrollTop = codeView.scrollTop(); + var scrollTop = codeView.scrollTop(); var percent = (scrollTop / codeView[0].scrollHeight); var tocHeight = 0; @@ -131678,43 +131700,43 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); tocHeight += $(this).height(); }); - var tocMenuHeight = preview.find(".editormd-toc-menu").height(); + var tocMenuHeight = preview.find(".editormd-toc-menu").height(); tocMenuHeight = (!tocMenuHeight) ? 0 : tocMenuHeight; - if (scrollTop === 0) + if (scrollTop === 0) { preview.scrollTop(0); - } + } else if (scrollTop + height >= codeView[0].scrollHeight - 16) - { - preview.scrollTop(preview[0].scrollHeight); - } + { + preview.scrollTop(preview[0].scrollHeight); + } else - { + { preview.scrollTop((preview[0].scrollHeight + tocHeight + tocMenuHeight) * percent); } return this; }, - + /** * 注册键盘快捷键处理 * Register CodeMirror keyMaps (keyboard shortcuts). - * + * * @param {Object} keyMap KeyMap key/value {"(Ctrl/Shift/Alt)-Key" : function(){}} * @returns {editormd} return this */ - + registerKeyMaps : function(keyMap) { - + var _this = this; var cm = this.cm; var settings = this.settings; var toolbarHandlers = editormd.toolbarHandlers; var disabledKeyMaps = settings.disabledKeyMaps; - + keyMap = keyMap || null; - + if (keyMap) { for (var i in keyMap) @@ -131734,7 +131756,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { var _keyMap = editormd.keyMaps[k]; var handle = (typeof _keyMap === "string") ? $.proxy(toolbarHandlers[_keyMap], _this) : $.proxy(_keyMap, _this); - + if ($.inArray(k, ["F9", "F10", "F11"]) < 0 && $.inArray(k, disabledKeyMaps) < 0) { var _map = {}; @@ -131743,15 +131765,15 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.addKeyMap(_map); } } - + $(window).keydown(function(event) { - + var keymaps = { "120" : "F9", "121" : "F10", "122" : "F11" }; - + if ( $.inArray(keymaps[event.keyCode], disabledKeyMaps) < 0 ) { switch (event.keyCode) @@ -131760,17 +131782,17 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); $.proxy(toolbarHandlers["watch"], _this)(); return false; break; - + case 121: $.proxy(toolbarHandlers["preview"], _this)(); return false; break; - + case 122: - $.proxy(toolbarHandlers["fullscreen"], _this)(); + $.proxy(toolbarHandlers["fullscreen"], _this)(); return false; break; - + default: break; } @@ -131780,53 +131802,53 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 绑定同步滚动 - * + * * @returns {editormd} return this */ - + bindScrollEvent : function() { - + var _this = this; var preview = this.preview; var settings = this.settings; var codeMirror = this.codeMirror; var mouseOrTouch = editormd.mouseOrTouch; - + if (!settings.syncScrolling) { return this; } - - var cmBindScroll = function() { + + var cmBindScroll = function() { codeMirror.find(".CodeMirror-scroll").bind(mouseOrTouch("scroll", "touchmove"), function(event) { var height = $(this).height(); - var scrollTop = $(this).scrollTop(); + var scrollTop = $(this).scrollTop(); var percent = (scrollTop / $(this)[0].scrollHeight); - + var tocHeight = 0; - + preview.find(".markdown-toc-list").each(function(){ tocHeight += $(this).height(); }); - + var tocMenuHeight = preview.find(".editormd-toc-menu").height(); tocMenuHeight = (!tocMenuHeight) ? 0 : tocMenuHeight; - if (scrollTop === 0) + if (scrollTop === 0) { preview.scrollTop(0); - } + } else if (scrollTop + height >= $(this)[0].scrollHeight - 16) - { - preview.scrollTop(preview[0].scrollHeight); - } + { + preview.scrollTop(preview[0].scrollHeight); + } else { preview.scrollTop((preview[0].scrollHeight + tocHeight + tocMenuHeight) * percent); } - + $.proxy(settings.onscroll, _this)(event); }); }; @@ -131836,26 +131858,26 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }; var previewBindScroll = function() { - + preview.bind(mouseOrTouch("scroll", "touchmove"), function(event) { var height = $(this).height(); - var scrollTop = $(this).scrollTop(); + var scrollTop = $(this).scrollTop(); var percent = (scrollTop / $(this)[0].scrollHeight); var codeView = codeMirror.find(".CodeMirror-scroll"); - if(scrollTop === 0) + if(scrollTop === 0) { codeView.scrollTop(0); } else if (scrollTop + height >= $(this)[0].scrollHeight) { - codeView.scrollTop(codeView[0].scrollHeight); + codeView.scrollTop(codeView[0].scrollHeight); } - else + else { codeView.scrollTop(codeView[0].scrollHeight * percent); } - + $.proxy(settings.onpreviewscroll, _this)(event); }); @@ -131863,7 +131885,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var previewUnbindScroll = function() { preview.unbind(mouseOrTouch("scroll", "touchmove")); - }; + }; codeMirror.bind({ mouseover : cmBindScroll, @@ -131871,11 +131893,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); touchstart : cmBindScroll, touchend : cmUnbindScroll }); - + if (settings.syncScrolling === "single") { return this; } - + preview.bind({ mouseover : previewBindScroll, mouseout : previewUnbindScroll, @@ -131885,24 +131907,24 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + bindChangeEvent : function() { - + var _this = this; var cm = this.cm; var settings = this.settings; - + if (!settings.syncScrolling) { return this; } - + cm.on("change", function(_cm, changeObj) { - + if (settings.watch) { _this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); } - + timer = setTimeout(function() { clearTimeout(timer); _this.save(); @@ -131912,210 +131934,210 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 加载队列完成之后的显示处理 * Display handle of the module queues loaded after. - * + * * @param {Boolean} recreate 是否为重建编辑器 * @returns {editormd} 返回editormd的实例对象 */ - + loadedDisplay : function(recreate) { - + recreate = recreate || false; - + var _this = this; var editor = this.editor; var preview = this.preview; var settings = this.settings; - + this.containerMask.hide(); - + this.save(); - + if (settings.watch) { preview.show(); } - + editor.data("oldWidth", editor.width()).data("oldHeight", editor.height()); // 为了兼容Zepto - + this.resize(); this.registerKeyMaps(); - + $(window).resize(function(){ _this.resize(); }); - + this.bindScrollEvent().bindChangeEvent(); - + if (!recreate) { $.proxy(settings.onload, this)(); } - + this.state.loaded = true; return this; }, - + /** * 设置编辑器的宽度 * Set editor width - * + * * @param {Number|String} width 编辑器宽度值 * @returns {editormd} 返回editormd的实例对象 */ - + width : function(width) { - - this.editor.css("width", (typeof width === "number") ? width + "px" : width); + + this.editor.css("width", (typeof width === "number") ? width + "px" : width); this.resize(); - + return this; }, - + /** * 设置编辑器的高度 * Set editor height - * + * * @param {Number|String} height 编辑器高度值 * @returns {editormd} 返回editormd的实例对象 */ - + height : function(height) { - - this.editor.css("height", (typeof height === "number") ? height + "px" : height); + + this.editor.css("height", (typeof height === "number") ? height + "px" : height); this.resize(); - + return this; }, - + /** * 调整编辑器的尺寸和布局 * Resize editor layout - * + * * @param {Number|String} [width=null] 编辑器宽度值 * @param {Number|String} [height=null] 编辑器高度值 * @returns {editormd} 返回editormd的实例对象 */ - + resize : function(width, height) { - + width = width || null; height = height || null; - + var state = this.state; var editor = this.editor; var preview = this.preview; var toolbar = this.toolbar; var settings = this.settings; var codeMirror = this.codeMirror; - + if (width) { editor.css("width", (typeof width === "number") ? width + "px" : width); } - + if (settings.autoHeight && !state.fullscreen && !state.preview) { editor.css("height", "auto"); codeMirror.css("height", "auto"); - } - else + } + else { - if (height) + if (height) { editor.css("height", (typeof height === "number") ? height + "px" : height); } - + if (state.fullscreen) { editor.height($(window).height()); } - if (settings.toolbar && !settings.readOnly) + if (settings.toolbar && !settings.readOnly) { codeMirror.css("margin-top", toolbar.height() + 1).height(editor.height() - toolbar.height()); - } + } else { codeMirror.css("margin-top", 0).height(editor.height()); } } - - if(settings.watch) + + if(settings.watch) { codeMirror.width(editor.width() / 2); preview.width((!state.preview) ? editor.width() / 2 : editor.width()); - + this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); - - if (settings.toolbar && !settings.readOnly) + + if (settings.toolbar && !settings.readOnly) { preview.css("top", toolbar.height() + 1); - } - else + } + else { preview.css("top", 0); } - + if (settings.autoHeight && !state.fullscreen && !state.preview) { preview.height(""); } else - { + { var previewHeight = (settings.toolbar && !settings.readOnly) ? editor.height() - toolbar.height() : editor.height(); - + preview.height(previewHeight); } - } - else + } + else { codeMirror.width(editor.width()); preview.hide(); } - - if (state.loaded) + + if (state.loaded) { $.proxy(settings.onresize, this)(); } return this; }, - + /** * 解析和保存Markdown代码 * Parse & Saving Markdown source code - * + * * @returns {editormd} 返回editormd的实例对象 */ - + save : function() { - + if (timer === null) { return this; } - + var _this = this; var state = this.state; var settings = this.settings; - var cm = this.cm; + var cm = this.cm; var cmValue = cm.getValue(); var previewContainer = this.previewContainer; - if (settings.mode !== "gfm" && settings.mode !== "markdown") + if (settings.mode !== "gfm" && settings.mode !== "markdown") { this.markdownTextarea.val(cmValue); - + return this; } - + var marked = editormd.$marked; - var markdownToC = this.markdownToC = []; - var rendererOptions = this.markedRendererOptions = { + var markdownToC = this.markdownToC = []; + var rendererOptions = this.markedRendererOptions = { toc : settings.toc, tocm : settings.tocm, tocStartLevel : settings.tocStartLevel, @@ -132129,7 +132151,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); sequenceDiagram : settings.sequenceDiagram, previewCodeHighlight : settings.previewCodeHighlight, }; - + var markedOptions = this.markedOptions = { renderer : editormd.markedRenderer(markdownToC, rendererOptions), gfm : true, @@ -132140,74 +132162,74 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); smartLists : true, smartypants : true }; - + marked.setOptions(markedOptions); - + var newMarkdownDoc = editormd.$marked(cmValue, markedOptions); - + //console.info("cmValue", cmValue, newMarkdownDoc); - + newMarkdownDoc = editormd.filterHTMLTags(newMarkdownDoc, settings.htmlDecode); - + //console.error("cmValue", cmValue, newMarkdownDoc); - + this.markdownTextarea.text(cmValue); - + cm.save(); - - if (settings.saveHTMLToTextarea) + + if (settings.saveHTMLToTextarea) { this.htmlTextarea.text(newMarkdownDoc); } - + if(settings.watch || (!settings.watch && state.preview)) { previewContainer.html(newMarkdownDoc); this.previewCodeHighlight(); - - if (settings.toc) + + if (settings.toc) { var tocContainer = (settings.tocContainer === "") ? previewContainer : $(settings.tocContainer); var tocMenu = tocContainer.find("." + this.classPrefix + "toc-menu"); - + tocContainer.attr("previewContainer", (settings.tocContainer === "") ? "true" : "false"); - + if (settings.tocContainer !== "" && tocMenu.length > 0) { tocMenu.remove(); } - + editormd.markdownToCRenderer(markdownToC, tocContainer, settings.tocDropdown, settings.tocStartLevel); - + if (settings.tocDropdown || tocContainer.find("." + this.classPrefix + "toc-menu").length > 0) { editormd.tocDropdownMenu(tocContainer, (settings.tocTitle !== "") ? settings.tocTitle : this.lang.tocTitle); } - + if (settings.tocContainer !== "") { previewContainer.find(".markdown-toc").css("border", "none"); } } - + if (settings.tex) { - if (!editormd.kaTeXLoaded && settings.autoLoadModules) + if (!editormd.kaTeXLoaded && settings.autoLoadModules) { editormd.loadKaTeX(function() { editormd.$katex = katex; editormd.kaTeXLoaded = true; _this.katexRender(); }); - } - else + } + else { editormd.$katex = katex; this.katexRender(); } - } - + } + if (settings.flowChart || settings.sequenceDiagram) { flowchartTimer = setTimeout(function(){ @@ -132217,7 +132239,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }, 10); } - if (state.loaded) + if (state.loaded) { $.proxy(settings.onchange, this)(); } @@ -132225,215 +132247,215 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return this; }, - + /** * 聚焦光标位置 * Focusing the cursor position - * + * * @returns {editormd} 返回editormd的实例对象 */ - + focus : function() { this.cm.focus(); return this; }, - + /** * 设置光标的位置 * Set cursor position - * + * * @param {Object} cursor 要设置的光标位置键值对象,例:{line:1, ch:0} * @returns {editormd} 返回editormd的实例对象 */ - + setCursor : function(cursor) { this.cm.setCursor(cursor); return this; }, - + /** * 获取当前光标的位置 * Get the current position of the cursor - * + * * @returns {Cursor} 返回一个光标Cursor对象 */ - + getCursor : function() { return this.cm.getCursor(); }, - + /** * 设置光标选中的范围 * Set cursor selected ranges - * + * * @param {Object} from 开始位置的光标键值对象,例:{line:1, ch:0} * @param {Object} to 结束位置的光标键值对象,例:{line:1, ch:0} * @returns {editormd} 返回editormd的实例对象 */ - + setSelection : function(from, to) { - + this.cm.setSelection(from, to); - + return this; }, - + /** * 获取光标选中的文本 * Get the texts from cursor selected - * + * * @returns {String} 返回选中文本的字符串形式 */ - + getSelection : function() { return this.cm.getSelection(); }, - + /** * 设置光标选中的文本范围 * Set the cursor selection ranges - * + * * @param {Array} ranges cursor selection ranges array * @returns {Array} return this */ - + setSelections : function(ranges) { this.cm.setSelections(ranges); - + return this; }, - + /** * 获取光标选中的文本范围 * Get the cursor selection ranges - * + * * @returns {Array} return selection ranges array */ - + getSelections : function() { return this.cm.getSelections(); }, - + /** * 替换当前光标选中的文本或在当前光标处插入新字符 * Replace the text at the current cursor selected or insert a new character at the current cursor position - * + * * @param {String} value 要插入的字符值 * @returns {editormd} 返回editormd的实例对象 */ - + replaceSelection : function(value) { this.cm.replaceSelection(value); return this; }, - + /** * 在当前光标处插入新字符 * Insert a new character at the current cursor position * * 同replaceSelection()方法 * With the replaceSelection() method - * + * * @param {String} value 要插入的字符值 * @returns {editormd} 返回editormd的实例对象 */ - + insertValue : function(value) { this.replaceSelection(value); return this; }, - + /** * 追加markdown * append Markdown to editor - * + * * @param {String} md 要追加的markdown源文档 * @returns {editormd} 返回editormd的实例对象 */ - + appendMarkdown : function(md) { var settings = this.settings; var cm = this.cm; - + cm.setValue(cm.getValue() + md); - + return this; }, - + /** * 设置和传入编辑器的markdown源文档 * Set Markdown source document - * + * * @param {String} md 要传入的markdown源文档 * @returns {editormd} 返回editormd的实例对象 */ - + setMarkdown : function(md) { this.cm.setValue(md || this.settings.markdown); - + return this; }, - + /** * 获取编辑器的markdown源文档 * Set Editor.md markdown/CodeMirror value - * + * * @returns {editormd} 返回editormd的实例对象 */ - + getMarkdown : function() { return this.cm.getValue(); }, - + /** * 获取编辑器的源文档 * Get CodeMirror value - * + * * @returns {editormd} 返回editormd的实例对象 */ - + getValue : function() { return this.cm.getValue(); }, - + /** * 设置编辑器的源文档 * Set CodeMirror value - * + * * @param {String} value set code/value/string/text * @returns {editormd} 返回editormd的实例对象 */ - + setValue : function(value) { this.cm.setValue(value); - + return this; }, - + /** * 清空编辑器 * Empty CodeMirror editor container - * + * * @returns {editormd} 返回editormd的实例对象 */ - + clear : function() { this.cm.setValue(""); - + return this; }, - + /** * 获取解析后存放在Textarea的HTML源码 * Get parsed html code from Textarea - * + * * @returns {String} 返回HTML源码 */ - + getHTML : function() { if (!this.settings.saveHTMLToTextarea) { @@ -132441,28 +132463,28 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return false; } - + return this.htmlTextarea.val(); }, - + /** * getHTML()的别名 * getHTML (alias) - * + * * @returns {String} Return html code 返回HTML源码 */ - + getTextareaSavedHTML : function() { return this.getHTML(); }, - + /** * 获取预览窗口的HTML源码 * Get html from preview container - * + * * @returns {editormd} 返回editormd的实例对象 */ - + getPreviewedHTML : function() { if (!this.settings.watch) { @@ -132470,137 +132492,137 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return false; } - + return this.previewContainer.html(); }, - + /** * 开启实时预览 * Enable real-time watching - * + * * @returns {editormd} 返回editormd的实例对象 */ - - watch : function(callback) { + + watch : function(callback) { var settings = this.settings; - + if ($.inArray(settings.mode, ["gfm", "markdown"]) < 0) { return this; } - + this.state.watching = settings.watch = true; this.preview.show(); - + if (this.toolbar) { var watchIcon = settings.toolbarIconsClass.watch; var unWatchIcon = settings.toolbarIconsClass.unwatch; - + var icon = this.toolbar.find(".fa[name=watch]"); icon.parent().attr("title", settings.lang.toolbar.watch); icon.removeClass(unWatchIcon).addClass(watchIcon); } - - this.codeMirror.css("border-right", "1px solid #ddd").width(this.editor.width() / 2); - + + this.codeMirror.css("border-right", "1px solid #ddd").width(this.editor.width() / 2); + timer = 0; - + this.save().resize(); - + if (!settings.onwatch) { settings.onwatch = callback || function() {}; } - + $.proxy(settings.onwatch, this)(); - + return this; }, - + /** * 关闭实时预览 * Disable real-time watching - * + * * @returns {editormd} 返回editormd的实例对象 */ - + unwatch : function(callback) { var settings = this.settings; this.state.watching = settings.watch = false; this.preview.hide(); - - if (this.toolbar) + + if (this.toolbar) { var watchIcon = settings.toolbarIconsClass.watch; var unWatchIcon = settings.toolbarIconsClass.unwatch; - + var icon = this.toolbar.find(".fa[name=watch]"); icon.parent().attr("title", settings.lang.toolbar.unwatch); icon.removeClass(watchIcon).addClass(unWatchIcon); } - + this.codeMirror.css("border-right", "none").width(this.editor.width()); - + this.resize(); - + if (!settings.onunwatch) { settings.onunwatch = callback || function() {}; } - + $.proxy(settings.onunwatch, this)(); - + return this; }, - + /** * 显示编辑器 * Show editor - * + * * @param {Function} [callback=function()] 回调函数 * @returns {editormd} 返回editormd的实例对象 */ - + show : function(callback) { callback = callback || function() {}; - + var _this = this; this.editor.show(0, function() { $.proxy(callback, _this)(); }); - + return this; }, - + /** * 隐藏编辑器 * Hide editor - * + * * @param {Function} [callback=function()] 回调函数 * @returns {editormd} 返回editormd的实例对象 */ - + hide : function(callback) { callback = callback || function() {}; - + var _this = this; this.editor.hide(0, function() { $.proxy(callback, _this)(); }); - + return this; }, - + /** * 隐藏编辑器部分,只预览HTML * Enter preview html state - * + * * @returns {editormd} 返回editormd的实例对象 */ - + previewing : function() { - + var _this = this; var editor = this.editor; var preview = this.preview; @@ -132608,18 +132630,18 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var settings = this.settings; var codeMirror = this.codeMirror; var previewContainer = this.previewContainer; - + if ($.inArray(settings.mode, ["gfm", "markdown"]) < 0) { return this; } - + if (settings.toolbar && toolbar) { toolbar.toggle(); toolbar.find(".fa[name=preview]").toggleClass("active"); } - + codeMirror.toggle(); - + var escHandle = function(event) { if (event.shiftKey && event.keyCode === 27) { _this.previewed(); @@ -132633,20 +132655,20 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); if (this.state.fullscreen) { preview.css("background", "#fff"); } - + editor.find("." + this.classPrefix + "preview-close-btn").show().bind(editormd.mouseOrTouch("click", "touchend"), function(){ _this.previewed(); }); - + if (!settings.watch) { this.save(); - } - else + } + else { previewContainer.css("padding", ""); } - + previewContainer.addClass(this.classPrefix + "preview-active"); preview.show().css({ @@ -132655,30 +132677,30 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); width : editor.width(), height : (settings.autoHeight && !this.state.fullscreen) ? "auto" : editor.height() }); - + if (this.state.loaded) { $.proxy(settings.onpreviewing, this)(); } $(window).bind("keyup", escHandle); - } - else + } + else { $(window).unbind("keyup", escHandle); this.previewed(); } }, - + /** * 显示编辑器部分,退出只预览HTML * Exit preview html state - * + * * @returns {editormd} 返回editormd的实例对象 */ - + previewed : function() { - + var editor = this.editor; var preview = this.preview; var toolbar = this.toolbar; @@ -132687,25 +132709,25 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var previewCloseBtn = editor.find("." + this.classPrefix + "preview-close-btn"); this.state.preview = false; - + this.codeMirror.show(); - + if (settings.toolbar) { toolbar.show(); } - + preview[(settings.watch) ? "show" : "hide"](); - + previewCloseBtn.hide().unbind(editormd.mouseOrTouch("click", "touchend")); - + previewContainer.removeClass(this.classPrefix + "preview-active"); - + if (settings.watch) { previewContainer.css("padding", "20px"); } - - preview.css({ + + preview.css({ background : null, position : "absolute", width : editor.width() / 2, @@ -132717,19 +132739,19 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { $.proxy(settings.onpreviewed, this)(); } - + return this; }, - + /** * 编辑器全屏显示 * Fullscreen show - * + * * @returns {editormd} 返回editormd的实例对象 */ - + fullscreen : function() { - + var _this = this; var state = this.state; var editor = this.editor; @@ -132737,13 +132759,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var toolbar = this.toolbar; var settings = this.settings; var fullscreenClass = this.classPrefix + "fullscreen"; - + if (toolbar) { - toolbar.find(".fa[name=fullscreen]").parent().toggleClass("active"); + toolbar.find(".fa[name=fullscreen]").parent().toggleClass("active"); } - + var escHandle = function(event) { - if (!event.shiftKey && event.keyCode === 27) + if (!event.shiftKey && event.keyCode === 27) { if (state.fullscreen) { @@ -132752,50 +132774,50 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } }; - if (!editor.hasClass(fullscreenClass)) + if (!editor.hasClass(fullscreenClass)) { state.fullscreen = true; $("html,body").css("overflow", "hidden"); - + editor.css({ width : $(window).width(), height : $(window).height() }).addClass(fullscreenClass); this.resize(); - + $.proxy(settings.onfullscreen, this)(); $(window).bind("keyup", escHandle); } else - { - $(window).unbind("keyup", escHandle); + { + $(window).unbind("keyup", escHandle); this.fullscreenExit(); } return this; }, - + /** * 编辑器退出全屏显示 * Exit fullscreen state - * + * * @returns {editormd} 返回editormd的实例对象 */ - + fullscreenExit : function() { - + var editor = this.editor; var settings = this.settings; var toolbar = this.toolbar; - var fullscreenClass = this.classPrefix + "fullscreen"; - + var fullscreenClass = this.classPrefix + "fullscreen"; + this.state.fullscreen = false; - + if (toolbar) { - toolbar.find(".fa[name=fullscreen]").parent().removeClass("active"); + toolbar.find(".fa[name=fullscreen]").parent().removeClass("active"); } $("html,body").css("overflow", ""); @@ -132806,43 +132828,43 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }).removeClass(fullscreenClass); this.resize(); - + $.proxy(settings.onfullscreenExit, this)(); return this; }, - + /** * 加载并执行插件 * Load and execute the plugin - * + * * @param {String} name plugin name / function name * @param {String} path plugin load path * @returns {editormd} 返回editormd的实例对象 */ - + executePlugin : function(name, path) { - + var _this = this; var cm = this.cm; var settings = this.settings; - + path = settings.pluginPath + path; - - if (typeof define === "function") - { + + if (typeof define === "function") + { if (typeof this[name] === "undefined") { alert("Error: " + name + " plugin is not found, you are not load this plugin."); - + return this; } - + this[name](cm); - + return this; } - + if ($.inArray(path, editormd.loadFiles.plugin) < 0) { editormd.loadPlugin(path, function() { @@ -132854,79 +132876,79 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { $.proxy(editormd.loadPlugins[name], this)(cm); } - + return this; }, - + /** * 搜索替换 * Search & replace - * + * * @param {String} command CodeMirror serach commands, "find, fintNext, fintPrev, clearSearch, replace, replaceAll" * @returns {editormd} return this */ - + search : function(command) { var settings = this.settings; - + if (!settings.searchReplace) { alert("Error: settings.searchReplace == false"); return this; } - + if (!settings.readOnly) { this.cm.execCommand(command || "find"); } - + return this; }, - - searchReplace : function() { + + searchReplace : function() { this.search("replace"); - + return this; }, - - searchReplaceAll : function() { + + searchReplaceAll : function() { this.search("replaceAll"); - + return this; } }; - - editormd.fn.init.prototype = editormd.fn; - + + editormd.fn.init.prototype = editormd.fn; + /** * 锁屏 * lock screen when dialog opening - * + * * @returns {void} */ editormd.dialogLockScreen = function() { var settings = this.settings || {dialogLockScreen : true}; - - if (settings.dialogLockScreen) - { + + if (settings.dialogLockScreen) + { $("html,body").css("overflow", "hidden"); this.resize(); } }; - + /** * 显示透明背景层 * Display mask layer when dialog opening - * + * * @param {Object} dialog dialog jQuery object * @returns {void} */ - + editormd.dialogShowMask = function(dialog) { var editor = this.editor; var settings = this.settings || {dialogShowMask : true}; - + dialog.css({ top : ($(window).height() - dialog.height()) / 2 + "px", left : ($(window).width() - dialog.width()) / 2 + "px" @@ -132941,11 +132963,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); undo : function() { this.cm.undo(); }, - + redo : function() { this.cm.redo(); }, - + bold : function() { var cm = this.cm; var cursor = cm.getCursor(); @@ -132957,7 +132979,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.setCursor(cursor.line, cursor.ch + 2); } }, - + del : function() { var cm = this.cm; var cursor = cm.getCursor(); @@ -133001,7 +133023,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); //cm.replaceSelection("> " + selection); //cm.setCursor(cursor.line, (selection === "") ? cursor.ch + 2 : cursor.ch + selection.length + 2); }, - + ucfirst : function() { var cm = this.cm; var selection = cm.getSelection(); @@ -133010,7 +133032,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.replaceSelection(editormd.firstUpperCase(selection)); cm.setSelections(selections); }, - + ucwords : function() { var cm = this.cm; var selection = cm.getSelection(); @@ -133019,7 +133041,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.replaceSelection(editormd.wordsFirstUpperCase(selection)); cm.setSelections(selections); }, - + uppercase : function() { var cm = this.cm; var selection = cm.getSelection(); @@ -133028,13 +133050,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.replaceSelection(selection.toUpperCase()); cm.setSelections(selections); }, - + lowercase : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); var selections = cm.listSelections(); - + cm.replaceSelection(selection.toLowerCase()); cm.setSelections(selections); }, @@ -133146,15 +133168,15 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var cursor = cm.getCursor(); var selection = cm.getSelection(); - if (selection === "") + if (selection === "") { cm.replaceSelection("- " + selection); - } - else + } + else { var selectionText = selection.split("\n"); - for (var i = 0, len = selectionText.length; i < len; i++) + for (var i = 0, len = selectionText.length; i < len; i++) { selectionText[i] = (selectionText[i] === "") ? "" : "- " + selectionText[i]; } @@ -133168,7 +133190,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var cursor = cm.getCursor(); var selection = cm.getSelection(); - if(selection === "") + if(selection === "") { cm.replaceSelection("1. " + selection); } @@ -133176,7 +133198,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { var selectionText = selection.split("\n"); - for (var i = 0, len = selectionText.length; i < len; i++) + for (var i = 0, len = selectionText.length; i < len; i++) { selectionText[i] = (selectionText[i] === "") ? "" : (i+1) + ". " + selectionText[i]; } @@ -133199,7 +133221,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); alert("settings.tex === false"); return this; } - + var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); @@ -133225,7 +133247,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); alert("settings.pageBreak === false"); return this; } - + var cm = this.cm; var selection = cm.getSelection(); @@ -133235,7 +133257,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); image : function() { this.executePlugin("imageDialog", "image-dialog/image-dialog"); }, - + code : function() { var cm = this.cm; var cursor = cm.getCursor(); @@ -133249,17 +133271,17 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }, "code-block" : function() { - this.executePlugin("codeBlockDialog", "code-block-dialog/code-block-dialog"); + this.executePlugin("codeBlockDialog", "code-block-dialog/code-block-dialog"); }, "preformatted-text" : function() { this.executePlugin("preformattedTextDialog", "preformatted-text-dialog/preformatted-text-dialog"); }, - + table : function() { - this.executePlugin("tableDialog", "table-dialog/table-dialog"); + this.executePlugin("tableDialog", "table-dialog/table-dialog"); }, - + datetime : function() { var cm = this.cm; var selection = cm.getSelection(); @@ -133269,20 +133291,20 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.replaceSelection(datefmt); }, - + emoji : function() { this.executePlugin("emojiDialog", "emoji-dialog/emoji-dialog"); }, - + "html-entities" : function() { this.executePlugin("htmlEntitiesDialog", "html-entities-dialog/html-entities-dialog"); }, - + "goto-line" : function() { this.executePlugin("gotoLineDialog", "goto-line-dialog/goto-line-dialog"); }, - watch : function() { + watch : function() { this[this.settings.watch ? "unwatch" : "watch"](); }, @@ -133297,7 +133319,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); clear : function() { this.clear(); }, - + search : function() { this.search(); }, @@ -133310,7 +133332,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); this.showInfoDialog(); } }; - + editormd.keyMaps = { "Ctrl-1" : "h1", "Ctrl-2" : "h2", @@ -133320,12 +133342,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "Ctrl-6" : "h6", "Ctrl-B" : "bold", // if this is string == editormd.toolbarHandlers.xxxx "Ctrl-D" : "datetime", - + "Ctrl-E" : function() { // emoji var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); - + if (!this.settings.emoji) { alert("Error: settings.emoji == false"); @@ -133342,12 +133364,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "Ctrl-H" : "hr", "Ctrl-I" : "italic", "Ctrl-K" : "code", - + "Ctrl-L" : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); - + var title = (selection === "") ? "" : " \""+selection+"\""; cm.replaceSelection("[" + selection + "]("+title+")"); @@ -133357,12 +133379,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } }, "Ctrl-U" : "list-ul", - + "Shift-Ctrl-A" : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); - + if (!this.settings.atLink) { alert("Error: settings.atLink == false"); @@ -133375,24 +133397,24 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.setCursor(cursor.line, cursor.ch + 1); } }, - + "Shift-Ctrl-C" : "code", "Shift-Ctrl-Q" : "quote", "Shift-Ctrl-S" : "del", "Shift-Ctrl-K" : "tex", // KaTeX - + "Shift-Alt-C" : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); - + cm.replaceSelection(["```", selection, "```"].join("\n")); if (selection === "") { cm.setCursor(cursor.line, cursor.ch + 3); - } + } }, - + "Shift-Ctrl-Alt-C" : "code-block", "Shift-Ctrl-H" : "html-entities", "Shift-Alt-H" : "help", @@ -133401,12 +133423,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "Shift-Alt-U" : "ucwords", "Shift-Ctrl-Alt-U" : "ucfirst", "Shift-Alt-L" : "lowercase", - + "Shift-Ctrl-I" : function() { var cm = this.cm; var cursor = cm.getCursor(); var selection = cm.getSelection(); - + var title = (selection === "") ? "" : " \""+selection+"\""; cm.replaceSelection(""); @@ -133415,7 +133437,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); cm.setCursor(cursor.line, cursor.ch + 4); } }, - + "Shift-Ctrl-Alt-I" : "image", "Shift-Ctrl-L" : "link", "Shift-Ctrl-O" : "list-ol", @@ -133426,59 +133448,59 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); "F10" : "preview", "F11" : "fullscreen", }; - + /** * 清除字符串两边的空格 * Clear the space of strings both sides. - * + * * @param {String} str string - * @returns {String} trimed string + * @returns {String} trimed string */ - + var trim = function(str) { return (!String.prototype.trim) ? str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") : str.trim(); }; - + editormd.trim = trim; - + /** * 所有单词首字母大写 * Words first to uppercase - * + * * @param {String} str string * @returns {String} string */ - + var ucwords = function (str) { - return str.toLowerCase().replace(/\b(\w)|\s(\w)/g, function($1) { + return str.toLowerCase().replace(/\b(\w)|\s(\w)/g, function($1) { return $1.toUpperCase(); }); }; - + editormd.ucwords = editormd.wordsFirstUpperCase = ucwords; - + /** * 字符串首字母大写 * Only string first char to uppercase - * + * * @param {String} str string * @returns {String} string */ - - var firstUpperCase = function(str) { + + var firstUpperCase = function(str) { return str.toLowerCase().replace(/\b(\w)/, function($1){ return $1.toUpperCase(); }); }; - + var ucfirst = firstUpperCase; - + editormd.firstUpperCase = editormd.ucfirst = firstUpperCase; - + editormd.urls = { atLinkBase : "https://github.com/" }; - + editormd.regexs = { atLink : /@(\w+)/g, email : /(\w+)@(\w+)\.(\w+)\.?(\w+)?/g, @@ -133497,7 +133519,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); ext : ".png" }; - // Twitter Emoji (Twemoji) graphics files url path + // Twitter Emoji (Twemoji) graphics files url path editormd.twemoji = { path : "http://twemoji.maxcdn.com/36x36/", ext : ".png" @@ -133506,7 +133528,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); /** * 自定义marked的解析器 * Custom Marked renderer rules - * + * * @param {Array} markdownToC 传入用于接收TOC的数组 * @returns {Renderer} markedRenderer 返回marked的Renderer自定义对象 */ @@ -133515,7 +133537,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var defaults = { toc : true, // Table of contents tocm : false, - tocStartLevel : 1, // Said from H1 to create ToC + tocStartLevel : 1, // Said from H1 to create ToC pageBreak : true, atLink : true, // for @link emailLink : true, // for mail address auto link @@ -133525,12 +133547,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); flowChart : false, // flowChart.js only support IE9+ sequenceDiagram : false, // sequenceDiagram.js only support IE9+ }; - - var settings = $.extend(defaults, options || {}); + + var settings = $.extend(defaults, options || {}); var marked = editormd.$marked; var markedRenderer = new marked.Renderer(); - markdownToC = markdownToC || []; - + markdownToC = markdownToC || []; + var regexs = editormd.regexs; var atLinkReg = regexs.atLink; var emojiReg = regexs.emoji; @@ -133542,11 +133564,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var pageBreakReg = regexs.pageBreak; markedRenderer.emoji = function(text) { - - text = text.replace(editormd.regexs.emojiDatetime, function($1) { + + text = text.replace(editormd.regexs.emojiDatetime, function($1) { return $1.replace(/:/g, ":"); }); - + var matchs = text.match(emojiReg); if (!matchs || !settings.emoji) { @@ -133554,7 +133576,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } for (var i = 0, len = matchs.length; i < len; i++) - { + { if (matchs[i] === ":+1:") { matchs[i] = ":\\+1:"; } @@ -133564,11 +133586,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var name = $1.replace(/:/g, ""); if (faMatchs) - { + { for (var fa = 0, len1 = faMatchs.length; fa < len1; fa++) { var faName = faMatchs[fa].replace(/:/g, ""); - + return ""; } } @@ -133577,15 +133599,15 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var emdlogoMathcs = $1.match(editormdLogoReg); var twemojiMatchs = $1.match(twemojiReg); - if (emdlogoMathcs) - { + if (emdlogoMathcs) + { for (var x = 0, len2 = emdlogoMathcs.length; x < len2; x++) { var logoName = emdlogoMathcs[x].replace(/:/g, ""); return ""; } } - else if (twemojiMatchs) + else if (twemojiMatchs) { for (var t = 0, len3 = twemojiMatchs.length; t < len3; t++) { @@ -133611,8 +133633,8 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); markedRenderer.atLink = function(text) { if (atLinkReg.test(text)) - { - if (settings.atLink) + { + if (settings.atLink) { text = text.replace(emailReg, function($1, $2, $3, $4) { return $1.replace(/@/g, "_#_@_#_"); @@ -133622,7 +133644,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return "" + $1 + ""; }).replace(/_#_@_#_/g, "@"); } - + if (settings.emailLink) { text = text.replace(emailLinkReg, function($1, $2, $3, $4, $5) { @@ -133635,7 +133657,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return text; }; - + markedRenderer.link = function (href, title, text) { if (this.options.sanitize) { @@ -133651,14 +133673,14 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } var out = "" + text.replace(/@/g, "@") + ""; } @@ -133670,14 +133692,14 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return out; }; - + markedRenderer.heading = function(text, level, raw) { - + var linkText = text; var hasLinkReg = /\s*\]*)\>(.*)\<\/a\>\s*/; var getLinkTextReg = /\s*\]+)\>([^\>]*)\<\/a\>\s*/g; - if (hasLinkReg.test(text)) + if (hasLinkReg.test(text)) { var tempText = []; text = text.split(/\]+)\>([^\>]*)\<\/a\>/); @@ -133689,23 +133711,23 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); text = tempText.join(" "); } - + text = trim(text); - + var escapedText = text.toLowerCase().replace(/[^\w]+/g, "-"); var toc = { text : text, level : level, slug : escapedText }; - + var isChinese = /^[\u4e00-\u9fa5]+$/.test(text); var id = (isChinese) ? escape(text).replace(/\%/g, "") : text.toLowerCase().replace(/[^\w]+/g, "-"); markdownToC.push(toc); - + var headingHTML = ""; - + headingHTML += ""; headingHTML += ""; headingHTML += (hasLinkReg) ? this.atLink(this.emoji(linkText)) : this.atLink(this.emoji(text)); @@ -133713,13 +133735,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return headingHTML; }; - + markedRenderer.pageBreak = function(text) { if (pageBreakReg.test(text) && settings.pageBreak) { text = "
"; } - + return text; }; @@ -133729,39 +133751,39 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var isTeXAddClass = (isTeXLine) ? " class=\"" + editormd.classNames.tex + "\"" : ""; var isToC = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text); var isToCMenu = /^\[TOCM\]$/.test(text); - - if (!isTeXLine && isTeXInline) + + if (!isTeXLine && isTeXInline) { text = text.replace(/(\$\$([^\$]*)\$\$)+/g, function($1, $2) { return "" + $2.replace(/\$/g, "") + ""; }); - } - else + } + else { text = (isTeXLine) ? text.replace(/\$/g, "") : text; } - + var tocHTML = "" + text + ""; - + return (isToC) ? ( (isToCMenu) ? "
" : tocHTML ) : ( (pageBreakReg.test(text)) ? this.pageBreak(text) : "" + this.atLink(this.emoji(text)) + "
\n" ); }; - markedRenderer.code = function (code, lang, escaped) { + markedRenderer.code = function (code, lang, escaped) { if (lang === "seq" || lang === "sequence") { return "" + code + ""; - } + } else if ( lang === "flow") { return "" + code + ""; - } + } else if ( lang === "math" || lang === "latex" || lang === "katex") { return "" + code + "
"; - } - else + } + else { return marked.Renderer.prototype.code.apply(this, arguments); @@ -133771,64 +133793,64 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); markedRenderer.tablecell = function(content, flags) { var type = (flags.header) ? "th" : "td"; var tag = (flags.align) ? "<" + type +" style=\"text-align:" + flags.align + "\">" : "<" + type + ">"; - + return tag + this.atLink(this.emoji(content)) + "" + type + ">\n"; }; markedRenderer.listitem = function(text) { - if (settings.taskList && /^\s*\[[x\s]\]\s*/.test(text)) + if (settings.taskList && /^\s*\[[x\s]\]\s*/.test(text)) { text = text.replace(/^\s*\[\s\]\s*/, " ") .replace(/^\s*\[x\]\s*/, " "); return "" + this.atLink(this.emoji(text)) + " "; } - else + else { return "" + this.atLink(this.emoji(text)) + " "; } }; - + return markedRenderer; }; - + /** * * 生成TOC(Table of Contents) * Creating ToC (Table of Contents) - * + * * @param {Array} toc 从marked获取的TOC数组列表 * @param {Element} container 插入TOC的容器元素 * @param {Integer} startLevel Hx 起始层级 * @returns {Object} tocContainer 返回ToC列表容器层的jQuery对象元素 */ - + editormd.markdownToCRenderer = function(toc, container, tocDropdown, startLevel) { - - var html = ""; + + var html = ""; var lastLevel = 0; var classPrefix = this.classPrefix; - + startLevel = startLevel || 1; - - for (var i = 0, len = toc.length; i < len; i++) + + for (var i = 0, len = toc.length; i < len; i++) { var text = toc[i].text; var level = toc[i].level; - + if (level < startLevel) { continue; } - - if (level > lastLevel) + + if (level > lastLevel) { html += ""; } - else if (level < lastLevel) + else if (level < lastLevel) { html += (new Array(lastLevel - level + 2)).join(""); - } - else + } + else { html += ""; } @@ -133836,44 +133858,44 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); html += "" + text + " "; lastLevel = level; } - + var tocContainer = container.find(".markdown-toc"); - + if ((tocContainer.length < 1 && container.attr("previewContainer") === "false")) { var tocHTML = ""; - + tocHTML = (tocDropdown) ? "
" + tocHTML + "" : tocHTML; - + container.html(tocHTML); - + tocContainer = container.find(".markdown-toc"); } - + if (tocDropdown) { tocContainer.wrap("
"); } - + tocContainer.html("").children(".markdown-toc-list").html(html.replace(/\r?\n?\
\<\/ul\>/g, "")); - + return tocContainer; }; - + /** * * 生成TOC下拉菜单 * Creating ToC dropdown menu - * + * * @param {Object} container 插入TOC的容器jQuery对象元素 * @param {String} tocTitle ToC title * @returns {Object} return toc-menu object */ - + editormd.tocDropdownMenu = function(container, tocTitle) { - + tocTitle = tocTitle || "Table of Contents"; - + var zindex = 400; var tocMenus = container.find("." + this.classPrefix + "toc-menu"); @@ -133882,13 +133904,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var toc = $this.children(".markdown-toc"); var icon = ""; var btn = "" + icon + tocTitle + ""; - var menu = toc.children("ul"); + var menu = toc.children("ul"); var list = menu.find("li"); - + toc.append(btn); - + list.first().before("
- "); - + $this.mouseover(function(){ menu.show(); @@ -133920,27 +133942,27 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }); }).mouseleave(function(){ menu.hide(); - }); - }); - + }); + }); + return tocMenus; }; - + /** * 简单地过滤指定的HTML标签 * Filter custom html tags - * + * * @param {String} html 要过滤HTML * @param {String} filters 要过滤的标签 * @returns {String} html 返回过滤的HTML */ - + editormd.filterHTMLTags = function(html, filters) { - + if (typeof html !== "string") { html = new String(html); } - + if (typeof filters !== "string") { return html; } @@ -133955,7 +133977,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); html = html.replace(new RegExp("\<\s*" + tag + "\s*([^\>]*)\>([^\>]*)\<\s*\/" + tag + "\s*\>", "igm"), ""); } - + //return html; if (typeof attrs !== "undefined") @@ -133966,7 +133988,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { html = html.replace(htmlTagRegex, function($1, $2, $3, $4, $5) { return "<" + $2 + ">" + $4 + "" + $5 + ">"; - }); + }); } else if (attrs === "on*") { @@ -133974,19 +133996,19 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var el = $("<" + $2 + ">" + $4 + "" + $5 + ">"); var _attrs = $($1)[0].attributes; var $attrs = {}; - + $.each(_attrs, function(i, e) { if (e.nodeName !== '"') $attrs[e.nodeName] = e.nodeValue; }); - - $.each($attrs, function(i) { + + $.each($attrs, function(i) { if (i.indexOf("on") === 0) { delete $attrs[i]; } }); - + el.attr($attrs); - + var text = (typeof el[1] !== "undefined") ? $(el[1]).text() : ""; return el[0].outerHTML + text; @@ -134007,19 +134029,19 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }); } } - + return html; }; - + /** * 将Markdown文档解析为HTML用于前台显示 * Parse Markdown to HTML for Font-end preview. - * + * * @param {String} id 用于显示HTML的对象ID * @param {Object} [options={}] 配置选项,可选 * @returns {Object} div 返回jQuery对象元素 */ - + editormd.markdownToHTML = function(id, options) { var defaults = { gfm : true, @@ -134043,23 +134065,23 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); sequenceDiagram : false, previewCodeHighlight : true }; - + editormd.$marked = marked; var div = $("#" + id); var settings = div.settings = $.extend(true, defaults, options || {}); var saveTo = div.find("textarea"); - + if (saveTo.length < 1) { div.append(""); saveTo = div.find("textarea"); - } - - var markdownDoc = (settings.markdown === "") ? saveTo.val() : settings.markdown; + } + + var markdownDoc = (settings.markdown === "") ? saveTo.val() : settings.markdown; var markdownToC = []; - var rendererOptions = { + var rendererOptions = { toc : settings.toc, tocm : settings.tocm, tocStartLevel : settings.tocStartLevel, @@ -134084,53 +134106,53 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); smartLists : true, smartypants : true }; - + markdownDoc = new String(markdownDoc); - + var markdownParsed = marked(markdownDoc, markedOptions); - + markdownParsed = editormd.filterHTMLTags(markdownParsed, settings.htmlDecode); - + if (settings.markdownSourceCode) { saveTo.text(markdownDoc); } else { saveTo.remove(); } - + div.addClass("markdown-body " + this.classPrefix + "html-preview").append(markdownParsed); - + var tocContainer = (settings.tocContainer !== "") ? $(settings.tocContainer) : div; - + if (settings.tocContainer !== "") { tocContainer.attr("previewContainer", false); } - - if (settings.toc) + + if (settings.toc) { div.tocContainer = this.markdownToCRenderer(markdownToC, tocContainer, settings.tocDropdown, settings.tocStartLevel); - + if (settings.tocDropdown || div.find("." + this.classPrefix + "toc-menu").length > 0) { this.tocDropdownMenu(div, settings.tocTitle); } - + if (settings.tocContainer !== "") { div.find(".editormd-toc-menu, .editormd-markdown-toc").remove(); } } - - if (settings.previewCodeHighlight) + + if (settings.previewCodeHighlight) { div.find("pre").addClass("prettyprint linenums"); prettyPrint(); } - - if (!editormd.isIE8) + + if (!editormd.isIE8) { if (settings.flowChart) { - div.find(".flowchart").flowChart(); + div.find(".flowchart").flowChart(); } if (settings.sequenceDiagram) { @@ -134142,12 +134164,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); { var katexHandle = function() { div.find("." + editormd.classNames.tex).each(function(){ - var tex = $(this); - katex.render(tex.html().replace(/</g, "<").replace(/>/g, ">"), tex[0]); + var tex = $(this); + katex.render(tex.html().replace(/</g, "<").replace(/>/g, ">"), tex[0]); tex.find(".katex").css("font-size", "1.6em"); }); }; - + if (settings.autoLoadKaTeX && !editormd.$katex && !editormd.kaTeXLoaded) { this.loadKaTeX(function() { @@ -134161,22 +134183,22 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); katexHandle(); } } - - div.getMarkdown = function() { + + div.getMarkdown = function() { return saveTo.val(); }; - + return div; }; - + // Editor.md themes, change toolbar themes etc. // added @1.5.0 editormd.themes = ["default", "dark"]; - + // Preview area themes // added @1.5.0 editormd.previewThemes = ["default", "dark"]; - + // CodeMirror / editor area themes // @1.5.0 rename -> editorThemes, old version -> themes editormd.editorThemes = [ @@ -134197,44 +134219,44 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); ]; editormd.loadPlugins = {}; - + editormd.loadFiles = { js : [], css : [], plugin : [] }; - + /** * 动态加载Editor.md插件,但不立即执行 * Load editor.md plugins - * + * * @param {String} fileName 插件文件路径 * @param {Function} [callback=function()] 加载成功后执行的回调函数 * @param {String} [into="head"] 嵌入页面的位置 */ - + editormd.loadPlugin = function(fileName, callback, into) { callback = callback || function() {}; - + this.loadScript(fileName, function() { editormd.loadFiles.plugin.push(fileName); callback(); }, into); }; - + /** * 动态加载CSS文件的方法 * Load css file method - * + * * @param {String} fileName CSS文件名 * @param {Function} [callback=function()] 加载成功后执行的回调函数 * @param {String} [into="head"] 嵌入页面的位置 */ - + editormd.loadCSS = function(fileName, callback, into) { - into = into || "head"; + into = into || "head"; callback = callback || function() {}; - + var css = document.createElement("link"); css.type = "text/css"; css.rel = "stylesheet"; @@ -134251,42 +134273,42 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); document.body.appendChild(css); } }; - + editormd.isIE = (navigator.appName == "Microsoft Internet Explorer"); editormd.isIE8 = (editormd.isIE && navigator.appVersion.match(/8./i) == "8."); /** * 动态加载JS文件的方法 * Load javascript file method - * + * * @param {String} fileName JS文件名 * @param {Function} [callback=function()] 加载成功后执行的回调函数 * @param {String} [into="head"] 嵌入页面的位置 */ editormd.loadScript = function(fileName, callback, into) { - + into = into || "head"; callback = callback || function() {}; - - var script = null; + + var script = null; script = document.createElement("script"); script.id = fileName.replace(/[\./]+/g, "-"); - script.type = "text/javascript"; + script.type = "text/javascript"; script.src = fileName + ".js"; - - if (editormd.isIE8) - { + + if (editormd.isIE8) + { script.onreadystatechange = function() { - if(script.readyState) + if(script.readyState) { - if (script.readyState === "loaded" || script.readyState === "complete") + if (script.readyState === "loaded" || script.readyState === "complete") { - script.onreadystatechange = null; + script.onreadystatechange = null; editormd.loadFiles.js.push(fileName); callback(); } - } + } }; } else @@ -134303,45 +134325,45 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); document.body.appendChild(script); } }; - + // 使用国外的CDN,加载速度有时会很慢,或者自定义URL // You can custom KaTeX load url. editormd.katexURL = { css : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min", js : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min" }; - + editormd.kaTeXLoaded = false; - + /** * 加载KaTeX文件 * load KaTeX files - * + * * @param {Function} [callback=function()] 加载成功后执行的回调函数 */ - + editormd.loadKaTeX = function (callback) { editormd.loadCSS(editormd.katexURL.css, function(){ editormd.loadScript(editormd.katexURL.js, callback || function(){}); }); }; - + /** * 锁屏 * lock screen - * + * * @param {Boolean} lock Boolean 布尔值,是否锁屏 * @returns {void} */ - + editormd.lockScreen = function(lock) { $("html,body").css("overflow", (lock) ? "hidden" : ""); }; - + /** * 动态创建对话框 * Creating custom dialogs - * + * * @param {Object} options 配置项键值对 Key/Value * @returns {dialog} 返回创建的dialog的jQuery实例对象 */ @@ -134366,7 +134388,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }; options = $.extend(true, defaults, options); - + var $this = this; var editor = this.editor; var classPrefix = editormd.classPrefix; @@ -134388,9 +134410,9 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); html += ""; } - html += "
" + tocTitle + " " + icon + "
" + options.content; + html += "" + options.content; - if (options.footer || typeof options.footer === "string") + if (options.footer || typeof options.footer === "string") { html += "" + ( (typeof options.footer === "boolean") ? "" : options.footer) + ""; } @@ -134407,7 +134429,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); dialog.lockScreen = function(lock) { if (options.lockScreen) - { + { $("html,body").css("overflow", (lock) ? "hidden" : ""); $this.resize(); } @@ -134432,7 +134454,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return dialog; }; - dialog.loading = function(show) { + dialog.loading = function(show) { var loading = dialog.find("." + classPrefix + "dialog-mask"); loading[(show) ? "show" : "hide"](); @@ -134479,7 +134501,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } if (options.title !== "" && options.drag) - { + { var posX, posY; var dialogHeader = dialog.children("." + classPrefix + "dialog-header"); @@ -134495,7 +134517,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); posX = e.clientX - parseInt(dialog[0].style.left); posY = e.clientY - parseInt(dialog[0].style.top); - document.onmousemove = moveAction; + document.onmousemove = moveAction; }); var userCanSelect = function (obj) { @@ -134503,7 +134525,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); }; var userUnselect = function (obj) { - obj.addClass(classPrefix + "user-unselect").on("selectstart", function(event) { // selectstart for IE + obj.addClass(classPrefix + "user-unselect").on("selectstart", function(event) { // selectstart for IE return false; }); }; @@ -134516,7 +134538,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); if( nowLeft >= 0 ) { if( nowLeft + dialog.width() <= $(window).width()) { left = e.clientX - posX; - } else { + } else { left = $(window).width() - dialog.width(); document.onmousemove = null; } @@ -134543,18 +134565,18 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); dialog[0].style.top = top + "px"; }; - document.onmouseup = function() { + document.onmouseup = function() { userCanSelect($("body")); userCanSelect(dialog); - document.onselectstart = null; + document.onselectstart = null; document.onmousemove = null; }; dialogHeader.touchDraggable = function() { var offset = null; var start = function(e) { - var orig = e.originalEvent; + var orig = e.originalEvent; var pos = $(this).parent().position(); offset = { @@ -134583,20 +134605,20 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return dialog; }; - + /** * 鼠标和触摸事件的判断/选择方法 * MouseEvent or TouchEvent type switch - * + * * @param {String} [mouseEventType="click"] 供选择的鼠标事件 * @param {String} [touchEventType="touchend"] 供选择的触摸事件 * @returns {String} EventType 返回事件类型名称 */ - + editormd.mouseOrTouch = function(mouseEventType, touchEventType) { mouseEventType = mouseEventType || "click"; touchEventType = touchEventType || "touchend"; - + var eventType = mouseEventType; try { @@ -134606,23 +134628,23 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); return eventType; }; - + /** * 日期时间的格式化方法 * Datetime format method - * + * * @param {String} [format=""] 日期时间的格式,类似PHP的格式 * @returns {String} datefmt 返回格式化后的日期时间字符串 */ - - editormd.dateFormat = function(format) { + + editormd.dateFormat = function(format) { format = format || ""; var addZero = function(d) { return (d < 10) ? "0" + d : d; }; - var date = new Date(); + var date = new Date(); var year = date.getFullYear(); var year2 = year.toString().slice(2, 4); var month = addZero(date.getMonth() + 1); @@ -134631,14 +134653,14 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); var hour = addZero(date.getHours()); var min = addZero(date.getMinutes()); var second = addZero(date.getSeconds()); - var ms = addZero(date.getMilliseconds()); + var ms = addZero(date.getMilliseconds()); var datefmt = ""; var ymd = year2 + "-" + month + "-" + day; var fymd = year + "-" + month + "-" + day; var hms = hour + ":" + min + ":" + second; - switch (format) + switch (format) { case "UNIX Time" : datefmt = date.getTime(); @@ -134646,11 +134668,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); case "UTC" : datefmt = date.toUTCString(); - break; + break; case "yy" : datefmt = year2; - break; + break; case "year" : case "yyyy" : @@ -134660,7 +134682,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); case "month" : case "mm" : datefmt = month; - break; + break; case "cn-week-day" : case "cn-wd" : @@ -134707,7 +134729,7 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); break; case "yyyy-mm-dd h:i:s ms" : - case "full + ms" : + case "full + ms" : datefmt = fymd + " " + hms + " " + ms; break; @@ -134802,11 +134824,11 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); formatNotAllowed : "錯誤:只允許上傳圖片文件,允許上傳的圖片文件格式有:" }, preformattedText : { - title : "添加預格式文本或代碼塊", + title : "添加預格式文本或代碼塊", emptyAlert : "錯誤:請填寫預格式文本或代碼的內容。" }, codeBlock : { - title : "添加代碼塊", + title : "添加代碼塊", selectLabel : "代碼語言:", selectDefaultText : "請語言代碼語言", otherLanguage : "其他語言", @@ -134821,13 +134843,13 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); } } }; - + exports.defaults.lang = lang; }; - + // CommonJS/Node.js if (typeof require === "function" && typeof exports === "object" && typeof module === "object") - { + { module.exports = factory; } else if (typeof define === "function") // AMD/CMD/Sea.js @@ -134844,12 +134866,12 @@ CodeMirror.defineMIME('application/x-sh', 'shell'); factory(editormd); }); } - } + } else { factory(window.editormd); } - + })(); (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.dragula = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\n' + ' \n' + '\n' + - ' 第1阶段\n' + + ' 第1阶段\n' + '\n' + '\n' + - ' 有效时间:\n' + - '\n' + + '\n' + '有效时间:\n' + + '\n' + '\n' + ' \n' + '\n' + ' ~\n' + - '\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 总任务数:\n' + - '\n' + + '总任务数:\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 成绩来源:\n' + - '\n' + + '成绩来源:\n' + + '\n' + ' \n' + - '\n' + + '\n' + '\n' + - ' 任务1\n' + - '\n' + + ' 任务1\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务2\n' + - '\n' + + ' 任务2\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务3\n' + - '\n' + + ' 任务3\n' + + '\n' + @@ -136595,45 +136617,45 @@ $(document).on('turbolinks:load', function(){ var html='\n' + ' \n' + '\n' + '\n' + - ' 第'+showCount+'阶段\n' + + ' 第'+showCount+'阶段\n' + '\n' + '\n' + - ' 有效时间:\n' + - '\n' + + '\n' + '有效时间:\n' + + '\n' + '\n' + ' \n' + '\n' + ' ~\n' + - '\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 总任务数:\n' + - '\n' + + '总任务数:\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 成绩来源:\n' + - '\n' + + '成绩来源:\n' + + '\n' + ' \n' + - '\n' + + '\n'+ '\n' + - ' 任务1\n' + - '\n' + + ' 任务1\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务2\n' + - '\n' + + ' 任务2\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务3\n' + - '\n' + + ' 任务3\n' + + '\n' + @@ -136648,6 +136670,67 @@ $(document).on('turbolinks:load', function(){ $(".stage-update-form .section-start-time").datetimepicker(timeOptions); $(".stage-update-form .section-end-time").datetimepicker(timeOptions); }); + + // 奖项设置 + var $prizeContainer = $('#competition-prize-card'); + var competitionId = $prizeContainer.data('id'); + $(document).on('prize.save.success', function(){ + $.ajax({ + method: 'GET', + url: '/admins/competitions/' + competitionId + '/competition_prizes', + dataType: 'script' + }) + }); + + $('.modal.admin-upload-file-modal').on('upload:success', function(e, data){ + var $imageElement; + if(data.suffix === '_member'){ + $imageElement = $('.prize-member-image-' + data.source_id); + } else if(data.suffix === '_team'){ + $imageElement = $('.prize-team-image-' + data.source_id); + } else { + $imageElement = $('.prize-teacher-image-' + data.source_id); + } + $imageElement.attr('src', data.url); + $imageElement.show(); + $imageElement.next().html('重新上传'); + }) + + // 生成获奖记录 + $prizeContainer.on('click', '.generate-prize-user-action', function(){ + var $link = $(this); + + var generateRequest = function(){ + return $.ajax({ + method: 'POST', + url: '/admins/competitions/' + competitionId + '/competition_prize_users', + dataType: 'json', + success: function(data){ + if(data && data.status === 0){ + show_success_flash(); + $link.remove(); + } else { + showErrorNotify(data.message); + } + }, + error: function(res){ + var data = res.responseJSON; + showErrorNotify(data.message); + } + }) + } + + customConfirm({ + content: '确认生成吗?', + ok: function () { + customLoading({ + ajax: generateRequest + }) + } + }) + }); + } else { + $(document).unbind('prize.save.success'); } }); @@ -136681,8 +136764,8 @@ function change_total(item) { var html = ""; if(count > divCount){ for(var i=0;i < count-divCount ;i++){ - html+='\n' + ' \n' + '\n' + '任务'+(divCount+i+1)+'\n' + - '\n' + + html+='\n' + '任务'+(divCount+i+1)+'\n' + + ''; @@ -136736,45 +136819,45 @@ function addNewTab(competition_id) { '\n' + '\n' + '\n' + '\n' + '\n' + - ' 第1阶段\n' + + ' 第1阶段\n' + '\n' + '\n' + - ' 有效时间:\n' + - '\n' + + '\n' + '有效时间:\n' + + '\n' + '\n' + ' \n' + '\n' + ' ~\n' + - '\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 总任务数:\n' + - '\n' + + '总任务数:\n' + + '\n' + + '\n' + ' \n' + - '\n' + - ' 成绩来源:\n' + - '\n' + + '成绩来源:\n' + + '\n' + ' \n' + - '\n' + + '\n' + '\n' + - ' 任务1\n' + - '\n' + + ' 任务1\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务2\n' + - '\n' + + ' 任务2\n' + + '\n' + '\n' + ' \n' + '\n' + '\n' + - ' 任务3\n' + - '\n' + + ' 任务3\n' + + '\n' + @@ -137786,8 +137869,8 @@ $(document).on('turbolinks:load', function() { data: $form.serialize() }); } - }); - }) + }); + }) }); $(document).on('turbolinks:load', function () { $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-subject-modal', function () { @@ -138085,6 +138168,52 @@ $(document).on('turbolinks:load', function() { }); } }); +$(document).on('turbolinks:load', function() { + $('.admin-modal-container').on('show.bs.modal', '.admin-save-competition-prize-modal', function(event){ + var $modal = $('.modal.admin-save-competition-prize-modal'); + var $form = $modal.find('form.admin-save-competition-prize-form'); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + rules: { + 'competition_prize[name]': { + required: true, + maxlength: 10 + }, + 'competition_prize[num]': { + required: true, + digits: true, + min: 1 + } + } + }); + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + var url = $form.attr('action'); + var formMethod = $form.data('form-method') + + if ($form.valid()) { + $.ajax({ + method: formMethod, + dataType: 'json', + url: url, + data: $form.serialize(), + success: function(data){ + if(data && data.status === 0) { + show_success_flash(); + $(document).trigger('prize.save.success'); + $modal.modal('hide'); + } else { + $modal.find('.error').html(data.message) + } + } + }); + } + }); + }) +}); $(document).on('turbolinks:load', function() { var $modal = $('.modal.admin-upload-file-modal'); if ($modal.length > 0) { diff --git a/public/assets/admin-5d791c4f4a14e1586cfa44776ae262b3c1494e1c0fb0e00c330f0cb9d30fd7ba.js.gz b/public/assets/admin-5d791c4f4a14e1586cfa44776ae262b3c1494e1c0fb0e00c330f0cb9d30fd7ba.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..5ea1b2817bd38da94a7d588a08f0bc6dcad8b13f GIT binary patch literal 997013 zcmV(pK=8jGiwFQFf4f}*1LVE=e%r{gDEzne6c97V0xXaswTm*WpVy3YydB$fl6xiE z1Cfw~F$FLHXju`J_xWDqd$L\n' + ' \n' + '\n' + '~&8$wn{L)z!6ibz$Sd$}d@dS{2hW z{hD}xiND4lhDAE5RxYY)Qua4C&eQ5*dfFN0mm5W#j!XXcbex}VT*hUU6dUodO7rY% znp|zflgUP0mPu7^{04oM)K|IkJ{c!*nT)(?HcASwx=6g&FF$(YbeLpivf@41SXo)| z&!!pm aL4~%W(1Q`PFHd3EFCPG+ zVU-tsZ!JC^#Z}yfq0Z9cau9mF;4-N$@{#&oB$s)W4EkAK`NyNQj8DhOXb{Nfyr_Kz z7#rB7gSAisaXPK4JhQ-1FnV68fMazX0G#CjD-5nz5L3`=XybZb@@+VtjuPk>AM& *O#(NL*A()>Xd^)H`Wb9|mHJ4La@=FL&nnKwyQ%Qefn<18FP zRnRAzjuRr?+B~!P5-5gf1S{3JiPj17syan{AG4|V<6tb#o)^^{2=;MH+!;QD&M+R2 zedNHw;fgBYygZLcgL|?7`lbFlT7jbv)(f!u_)wPM zFQ`4rhtta>t2%$5CdIWtoxg^UX&oczx}9O)gS9|4FOq6nWUQC__vy1kQ_QNvMYw97 zX!30mXQMpyF6C4&0m$d$gkYQ$d6gqsbuQy-c#)LeY}WixOs1hy{*Tv7)hm~(mM>N7 zDmnd NzH491SNrlBuBz;M)ZPG82vl{98 zPzddLvtvH!AP~6oj P&fdjE ze969k%)ca=oX1a+7yhKNNnT6ild9zRXOzWRyTZ=Dms5IbiU!1@ @Tf_w0N0#hxkpOY92Fn{fD zZ3L@LeXfOUoVkpL%>{OSk(3wMmYSCHFh61Rc$X jRwyeHeE}!S&x|&! zz>3!dxNACg%$^myXV4R_OB0)<*nF*Y#KBK}gAPI8t`h3gU(*KAHzhUdq*+>N70h8f zr_)nVR!jMN7=zk2Mg>+DjbJmUW20XoH*^p+0izA47{5ZQ^*|$YW96WMv!jl^z;lP~ z)H-!;Od<43qeqXIKr6GG8lh^WfgToxMpBHZY{Z(rV;v l^w#Xgz?{t1o(Bp}ziD#DvQ@=2IkX<$8ozIiS>4uG-bR#M{9Cb0a8t^?#(zlQ z^3&f!57|xVq0MA-$mFXgH$3(enrF$CzQ#W5K%XY3<~~hPckrn7s6S)$-6u#^To?do zJ7CpKkYQ+hs4o6isl2w(jVfT3PoTfz8rC>FH&}y?5k#J!bil-h6$VlO{kEUTW*?xF z3DAQEjZO2u@eD^r>Wa@}MkuvuusSa @62liOp_Ej6v&r$;mkw}J=;Td4N}Bc+agL_Zk%w?}amK?TfXPQ7cFtn3 zrED1HQ9*678wf&&@%Bel@yEkqGT~YlurpKl1KpgY+24MCA4)%k5bH1r#NOKp)+Fhk z50kQdpOh2$y@Y?m9!*xTfv9mT*|!0`;WuA TfTw}Pb4wJgt>dVHeDzrnrSkRBC5zd$LXCX>3PC$mR zr!pGYATytv{%AFbT9(-l7Qg=VBOp4Yl5?~&SfMa8o-)&@jl66vsHqUI =a1U4N)zKDEESe)V%zO}M$+dHe49o9EBw7{&mE zfQvM=c{Z@QNf&H((d)DrLrwh`NZ4`CI7{ckaKDLK+>FqFcB=dr(0_`jF>F!`^JX(N z&;I=U;~L`Jn3{nEy&V7r*3&5Y_V&zQI|7sLq1Ux3RiD5*jBteJv)=vTqAg RFrIrI Cn=5~u^VT4s=2s4r_sCWqCe?t5Z5 zT?;Kt*q$wue~rk8jQA|80?YvmsqT>s@e^7~NBipPs*PTuHh`XFLr_{rhu-iaE}*06 zmya*n`)ffH=aI~8Smb5-EWZTxXBmk8*5(DtsQuTpx tH#a`|RzT=M7FXBt+j9Ww$QZiel1-4nAz? zEIPbOfFk`kJd$Ms5{GGWPI^ ckqIkgh3<#}C}Cc%Y9 %OZvpqX_ zPW?489v?1+9I!uTXs*o4ujhdaFN}gXuYC6Q^*j1)o19#JQ|F*FjANMe#$jiD19rQO zvITU&24s}*qR1~l5Y^dqeizDUmM%8tZ4>8$*#@@XV~%G-S8wdz(( <@m-7WwUi}ZDWJ &urw|f4>d blfHj_stFv(Y>QKD*)^ql`DZ zj3 yM>Y6C(QD|AL$ zSqJuwL0bkGOGNYhkUWEG`PF01YY(6sM`?$Rhmdwn`LLk_uHezx%TpFb-Y5-;b8E1% zsW?~79L-PWy4SQW7igJ;oUFV;TMm(V8V|pO-X++C@p+;L`%r<3WJ4FVW|-(P^J^BP zSmlk~#OTymJPwl=* ?q4YW5jx6BS@ p{Z^4Lj9@SnYMK(7Bm;;P=R-eb%fjR!2KTmyOu%8%Km@gSz%T z`=5c$*6IhrO^m~33adDhXX0MpOBU$K3=~HIzMIX}=u0xKnoOB9oHJ72IFPp*)UQ*_ z15eu$-vwU%%FdFbm9F8M!YkP9|KD2vI%oRVt^ZvB{8v$cgMBYW0(Cqtp$BmPnn?;; z;e6?@Uv{xo0KF5Zw$3@YCQvD4DN{X$a_ltAlH%u&uV0yQi}q9Ue>x^~Yg2hWXlQMS z*W}i0c~TF1a)YgIF`1`0+TDZf?yJN6OYs;Fk!`mdD}_$Z7vj-A@YLI{&bb+2Al41b za?3~~%v%oTa{i-M#2CJ|VP4F!y&P^VU1#8yS2I76?vVOeO9Axny@TCOGJY+#ekk(8 z`~40(zQJ0*3k=Ky;2vKDt~ZT6htvgKqFQJeLca@t`8|o*QjR1o*G5_fntx+%cQ-P= z3vYDNpiM)Kjel<@t5Ke1VgC>#y@R#dU=4o1v*k4<8JMf+y6$!{bCCVzQ4XPZK>>fL zwxTlx`#m%+6W8pxOEEY;bum{~!QmUhVwdjcT0MT;rOpt298T+V&RsO$s@8A;Os_^4 zeVWhcn2*t{&M^qBS`W#?Oz!At?K7W0^FBvw=y2sYTlZRPboLspU8JK?lC60gk6Knl zoPyZ6u%zZ|#K$>~MSVn `VrKy@XuD=& zv?EDtZIYLj{WKO{KJ$!~p2?VUB1$`qovP@ZOM}m 1+=J5fTj&Ng=2C z=-LP=AX#JeX5AD#HV}Zf$4J?8+%jnNfqaig__z3*a0N@pl0h-}^F3YDH=J4K8Dyh- zOADmNvrRhPW5=9-gyZXbz1E?}gRNEMwS@)w%)*W1FxGuat1iKDY%U@Fja$V0#A?3o z%JL~V?w9(kvCbYu30}TK*|*jhr9pDV0ksV;(+}9qB=(nGIg!GX?O_VG2))K2vUyIz zRe?T fA;h+7 6{)aijGG| zj|i(;%0IQx9m5v5QRQU3t1Z+-9YK D21YclMpktRS*h+xkI0^xM8aGX<|>W z(Ga%7F-V}8G1Mwj+E$Pmm>3l;gSSqOIuCxThi};t2r_a4_M8k9yqu1!bP^ZU21T3V zlGlc0;jI)^h9-xOAIpHlVfex}93ivbxIp7|*_k@02&ZAV@QMQm(dLwD8CmDS-7El; z2x~ULQq6P<{DB@gHP!8qB|W!BnyPtzTSsm!Yv;=SH-~G~b#p HO8ak zh+ov2bJv?x;^MqCJH!&8iJtc`!tbQxmz{BvomUs$k*7uN$)_P+c UvvfCG%- za3<3;GVbAl{J-ZE2(*P05U~OOo^#M57ZyxInE`#%R-kxey{e`C^*!I#2X(!?{!D7< z&M35HtwOJ+ ;Rhk9)SDY~5*DQzTDe&n;!J=X0P5$5fvDWFL>6j`7@6D7?x{}*` zC^UBfsr57tAVh00-(Gy3RPkccVy2?>FtQeRbvF8oyp2-w22Hmfx!7;&s4nv_wdo~j znZ*B@T$5qZ8CJy@epn`#tk1GM5#;*K%GLUn$~$D0_@S`CpXzx9L{ hUgnispMCD|~uZp`sAX-Uo;qsfQ0CrhVI zumh7E;Yv3875vt!G{t7kiQKYQ#j0$rmGu79T|y13Z$y+iXrs<0oZQ1Cf_g1t6DxW? zFLtf&xBo)-DhbaP=7`4BK%*9JH0_D |xq#}>eu~|_0|K#P zisdz0an2=kbXW=8mc1G(S;gF2oeeoj?9@7O(U|KAq2Z~hKGV!UkMnqBhw4=qMSew| zhv$@oV2!G_LEgYxmR>xj+n!*tB$>zBuez-%K2$w01^6Fqx%_IaF pO*tp(&7o`?5d2`b!e;!AUY#Lx zzX!N;JN^NHYx(Cf3Y$j>Ioba2( 2 z)9oFWc7AtvUyWtJTYfzpUQxPvh6O)@#HISZ0~VL+Z~1B0PjS>8yC0bKGTq)`(#v%B zd(F8i<(;yNKc<&SKCOJe(IsU@B1=hW-S`T<-qu~^qZ4-BgL?OU)ZFEdh%oo-Gky=Y zv}DhBB(J$WI<1nx5zA56KA*jP&ErE}k@mXgFc0hA7nj~_1w7swmJDye-)RtW8v~6J z@>{AIGyS?BR~2Z7PoPzrotLJvr|I^-t@$^;UV#^^80kzd^U-w7lYZrtca@APR@_Ox zP4c3WhLTyTn@Lv24Ct7dXm&O+=$bv~#Fx^{U?ogdW)QDfFt5seT!l$+BOr|;J{X7S z{{7k$2J(>!d6f7;UqK}+GeGX&S0Em7*p3G WBV}Z(dPa8EV 1+lx z8slF;67M6L&StPjs^a=a4IcqzS5~&<9A=FEp|MdhyA{dX6h3mK2qUXVTC$7fRd7`G zS HyWP`bJt_pa|t1 z!Xs?vA! WvFyU|?762TPd=@3g#o#dOC{`HhKY-kN zVb;+ZC-UhQooTgFSRmMLS?8)qEB-79n;3A`!I!GgTrH`SFdi;s3@} 4;@Ddn+_204A#Q(6{hp4Z_4PCM9ba!1CG7jO7=uXR+2NTE7^MQj z62Lyb0kHcmwnbYZJKM9x18^KXQHnb;-^;!nNUbML5(TPYpu}1#_{~=rX?fa-Ve-@v zcMqNbAEr P(^MRWK70{mnEDtQ` z^86sU;p(iR-Q2&=s17uYIDqclGzjxi0=yO8u(e$6^6dp|+usV1WBa|}kZ(v*bzPeh zMglX9*LtR*$yGU~%9?$cg}pmXdNiB)Biwq;=7fm&2I8MrON-3`LJ3TE7~D*eck8ki zpnCE4{cGfkJmeid&fkDuaR0tpd8+LO5gm{E0_rVFO&A9z`PXx#GlqpEImFEXv;{(w zL$-wJT{dJZ?WsbdgQwP7*a-B4MMqu#IsI z08yh~I*3|$<)8(Mf_}Ro(MPR}WQDrURN~xqg`=yUo!QTNw dPigm*ZJt9DwYren|KHRV=85G};~P7SZ*);Q{|}VMd8Cs)y*~1|zP1?S zS$nNyt5JhVYC;@+EkbZJh9EW{h`Im(%IkTTD$PDaz=ZM!(ubE%m6Ye)ex8sIi-^5n zhW4G#_|cbB -bvQ p{~9(KwFzIgRF{ GFN z?m$e370YXup+bP_fPh)dr+GbU_FB(rul00$t%vs7p^wE zrv7JSgdO=sQ~G0rqcOtIfTa~IU@`(un4V|J=yN)%^R}>J>_V^#wo`eU?`P= d^jz=+e8Yyy1(3q_+0N|;{&RD)t zlb_YunKc($3)h4!+$5~t4GSc%ZiCuuw`Q{# X6SX8T#ASsT1nDrB3?wBM&iY|MLueWZ&~eX( )EC{*MpN2kZsb^z1Imw&o=pUQDwuA3%gf zo85!G-p;00{4}3tRYWgL8Ybyj$wgq`|425>_JP*$C1&Z3y1GmxKhb=T8x!0>Z3wfF zIt3%?=^g!b{6QzRZ5;P1=P&XeicS;AZp=+Yx6FDp~1c~9@npgJ$)Py4Zh8CWhN zoe`*Zzy>ZUs zxat~AUkR-b>;N}b5uH{!x_``7Vy;A7ZzrttWtZ%vMfE&{2ru)4M3h8J*F$9I2FwmS zN#H;c^h0ZB%x2vvvg+KwZ L{YyI<6{>-u`QDt7E@Z;l*U)vd!yKmWcpY;(7~N%T{>>bN_=12#~L!W2F> z2Otls<1H{w*CRi>pU(c7-H(Iy1nRYS_q+Rhy9Zmlvo6fvFCISJn-z~9J=)v})-x!J zp-FK+oBgx6pJJ2VpuM$!u(P|pvyV;U$d4aB>}}3sY|{ %Glxx4Yln-duV@yD-l7-qz+;Z)>}^ z?2PsX?d_et?#{vf*0S^22jKShy4|gv?cTBrbO5j&?Cfv%wzqqG%TA~Vl(4 Ej=HkgqLMbZ0&4q9?YLqJWKEYGv+&@x4W}!zDedV~N@v;qf2M+dy1NHE-QMoj zrkv9Oo6?p(rEFH*|7XTAzP`J?wFd;z)0SzQ&1herQ8A0}|Fhs5d}|N(>)uvZTcj?V z&!&4mJA?LKx3>fP`=Gbve1Lq`xAtK+U83!!rUS$5?sm8L_P4fnmYvQvQo_#8*53a1 z{<70K7_9H??r(1c?)I0R4pL9Icd!p+O4PH=gpgtF?``dF9qjg&oe%DBAc37Npw-^8 z6T >|M2lJnU^-h&%qA2{8z6M_v6Y+(}?c5iQMd+v-r zrJn@30aQS4awgksCi~h 76~8zM`~VkIkf~&Eylb5! zje^v>h2Ju z;`7*L^Vrqq@d+A<<%fxP4|aBT)fBd93I~oEAOpba2f#qP%gkaM+05SN{sEBwa Tu)eq3-8|^+A1pHikbE%Lt=;YI{k>%-fW*4J+1u~!>=O%Gf|x)+z)J6J z!z{W>O#y~DH~ %WWh3**@rMEO>{_W>3u~{^WxUF9N<@VfSqz8&>n_ zvF+V+Pl%*GXffNc%lCRqPKns*!8RZQRL7;KL{z^6_V(7Y^XVZ+0Ss&c;U6qJBjnq_ z>p}h7+BsNqLMZTHGxlJ2Z7(|?)Dw1gQ4)c4U3x~ak$b?7dON+{?WLzg#IOU1>+W@z zoe?rVP@Xq?AXg5Sof8nl9w2XjZ*%8h*(t%!-U6Bf`q6ihIU%%qqGBCC=vQwLW$XAs zzcvR^x{e?8Yikh2>-aI#PT~vc?10%H4-U~gmPFmd Zl$<* znvasl=u}zv&4Tq_@bKY&y?8S~UQsXKg7VF6X=WC;j&Re3ARQ+I==c~0AMnB9`{qE5 z2tT$4O~a&Om@G`gIGl!gScYfl@@HXt!{``PflV|j4z|MfCg`BR(e@6)wk+NbMd>~R zGm8Mk>|u0v2#dM99VGrR1Pph|=_w0A^)uksA<#rX^}&$0o?&dD1R;)&yW!mbp~>5Y z5mOwn7sSUIB4%bTRtBi{v;WwB_;8D2Ok}Oz=DvCoW{-Au0zx)G9S6MU-mdI=fF4us zhKu$eoQ2b9+NpB>N=HDscoU`Hd2kf?ottjBe;fR?fxbz40p!c9@~3E-L*1~{%X(Bc z!|jADI?C~LXAqSk2WDu68 673s>O66>{M+ws0{E-o$k))VksChi6Atji8U7 zzF*R;+GjDJ-8-)*b4#ZP2O_=T>v>!NA^U~Ch=sn0{7G0?i^#fzMHK!0n=Il~-{h^9 zw#jLa_X2=-a$G%nwErMk-@cDJi1>*=9Q#?tT4|jL)U!U3Uqn-%B6g*Ji@h7H)v`mE z*z=9!lPUU1+9%T&@ZVsgQ{j81s{mumqG^_t!+4Uo-eOh(v4oWo^CZ1h6ba6WA|>yz z?oi9{D8nM8G~jfK%b97bY3%euPAfTz`>7gysCj$YQd3O!Q{I#Z8I#x48o1Kq*)D|R zP6cS_RXeBGRq~3awVr4{BvkmOLEuNV5klt!JO|Kw35%nwpLI?NOA4s5DK9kKYJ`xr zdq@MDLBZlkB-siE>?h%7fb=VYZN?LOg8pR*#K`B~<08SC1avoL5*@d?t+3UDf1B`c z3;u1xza99u3;*`u-#+|1Xwd;z>lFSC;ok`UCGhX8B?!H>Guj4Ab~8R5Zl7+(d%LFx zd%c6v0lJ6whC2tFt<@;X{nT$=B;#@33V=S%>mtlc>hJFCZ0+2yKsvH-($VWzOqur+ z{#no`Df+BxaT{v6EoA(=M!B<@_M?6h }usnZeX_LMQ|U^PDT90>P0$wGx<9R7x@hWa1T(Aw0|ASrDE*8Xno(6hQLR zXxKjEyH$TihmaOI$H+o$+NY~l7>qlm9gxG;59l~=q|J(*m_)8 >Y%##y3(XIbx=9&Y&AZ3kJ!XaG7jO1NKOYZ{ft1Ens6R ze83cdvWjR7%vzqW5zD}9Ui!qSIBGb^XNYRGj0KCjp&ICJT95;==SlUU!kZ2?5N>er zzJ^{ld|!tpL>T%CoLjT=vetR!nqWoT-khYAoZ4Kg4$)eD5+jh-MSiW%0q-qTiKmgM zQ9=V6B|H?==$EgsamCOuC!zwiwCZ@OYiU!irA?KVrh!o*)94;fQC*udePxR3S_XQW zfm)Ef%c*RsQqMA>vc-CtQrRj}*;4!jl`Re}$Z+ P`zJ7+7HLK0%ncQZGE_9A`%1`V=JWh_IROf3pGt|U}Fc@NKFlgw? z{M2PR)XAHyi1^6X^*B&WnlZz|WmyPncO&3m%ojnY{{5MuduB^8MmMs4Pd@1e&BZg> ziM@-n>X*o+IYRIcef9+{h{nO@@=(^#8SjUv+r@ts2z-;fhZ1bm!CD*J2o~vJn^qeK zW8rrxowh;~!?^wTjZ~Xzk!r+e{s#uAP3K(2jM>ztEaGZTj9Dz=7R%@c%PGk!i^mE1 z)$-4j1)E)M3Xx@h#z2=oi+2g>Rq*BXvJVV~di-|5; HQ^DK@>vIPk@>B6 zZ$Er&fm~k|tOOqcBLZW;Og>Un^=~DRfqDo#jQ903Ma}>bG5Fe89W6evB~zC4e}mcv z^BO-M4wFfB=VpIv^MYj5#*kL%z?|r!=9pxpO<6`-p}amh3j7wnjHg}EgFx%!4zX<0 zP9eittw1(+Pt6f*dRHoZO%QFoOvIlv%#UFu8~J!8wZklt^z7Qd!LZ`KMUi;*Plbf( zGn*F}2fU}6mXD&%ZkGp^vyz8f-L4V+Ca4W$Xu^ZKKeKq B9v0c @1 zwx7w2!J9@?_`D!a&ZC%@ly$!>5_MJbt!l~5l;dWa2F+q552wfZAUOOUAyNE(LZX-} zB+?%j5?W|2S#Ecd2O6hGE`Us)F%VFA6K(% &jjWEfvgLhse9 zrz_rrjg=MO$u$r4V&C=@sF9+Zayr2X<7DJu+lai?i06%fhA`J_Ix8SM>HdA=Imh7R zEWIR6>_tJT4vacBY2yC>nwF`?`^jk}gYbv)vTcXz(c{~2I8Nf?X$*?118Sp{s)_s` zwxPHr^dv5xCFA(I?+pIedT_KM!Z8w_$sdf7qr6f`Zd?pnFJzcu9?7@z;oy^N#(CY| zio-(4Z6>pWjE?=o0)=&^&H*VWL0-b5MCL6JX%G|438A#A+2>&*#k{&kDZYpl=4^Q} zbCeh>IC5-a?j|A9Ob$u5!ZyiAjCn>8U2=T>>iO&EZ$5s0^Y+mOf+qJ?{qkgk+JXv1%dXuDZ=5>oYWEg1&lr0=^w~6~N7KH{l4fNLOJT~G*38~b zj=ki@WTj!URnc8ZKqqM)^~5bzZT4(OTsnwBihM2qUE$dEjKwU!^ZA!Te8IzJ{+cwI zI{hf?SNuBNYx_|Fk1oqvae~G9Kdf>#z3DU^IU(l}0eA=$B~kBiYxhx<99Gf#dV=8- z2SAk7Y}VW6pZxbG{XS~7Tm9Y+`?}rgZ+7XcPlv2$;~aY4en3Bp7^K-H=rZg3fpO~4 z*Xs6mtjb1B#ib27qH~?3^NPO!vB@luGT{(W&kks-2y^!|Uwn`8DZPCSlMM-oxcV5M zmiZWLykFkGidZEuy_hpn_{29KB}ck4g;njgeSc96t_^m>wz$~{4B;X##9-`kFJM6f z36qh^A$(QD6Q_$;x7M)Rqlyj*@GA=KurgiFZ|U_9O^n5WcQOX;qqWfrw*np>v(c(| z_zqTljv(bbq>7Z-G!Z3^txn*7$Dd9%1`mAva&$O&5NrgnDe#Iry9JL~1px*p2r}fR zY?>Rd=m% P&sTA2_Pd~4HNG!;ZTEuX?x5E5^KYOCmKKdKhcy>mzC8Fl=^TIR z3?BT%u+}xOW+5#t@x{|~rX+z>-GB0r`m>V`{Jp3yXYg-4`-Xo5JY=-Hr#Fy%OGZzw z=V={ikMKkj<@3K! 5xW^#JbHPc!TDE2yJIa5tn1tQDtmfjv}+~Dkt^% zKa=Yw3@P%pTcRIkiQQ#4V@&DJ4asDCd$v?Nr@EN q_mY}dBSxQz(OR3s^F^MwyKlO*dQ^O{pak?m35aXlSwF*R?sEE{LtJWPQg?7 z#EnIE36cD<2z6q3N(x>wiYnh#tY>`Tk5Ew`y`5H83sLN7@gh#^Bd|h8ZI&wBs?7== zwS~!7YoQ+KtuPy=lGh}kK%v)mhUgp&l_Du>b@Ra3-&&%qzy18)mkybt^XB=-zrKC{ zpPyeme);N`_s=6xv^yVPzJC7pmyfcn-Gjo4**(!N*3b_*vr)5d%AFLTlQU;B5XBLj zeU?}0+4W;}(DH=xdT=`V!19`hyp=?f-wiB(kgNkT1ig>7 - zW}I{gS<*|kcv=l@?fJu{4(jocWCPXY(9_TCNpoKRb~&DZ@~&}@_gs*+Ou4Ex&ohxd zDw-p{c~#0!*Ps{hDs+YtHE0^Vj=)o+{=(~#bctMgk-4&JBQ)yu&|#B=w#X4gFW36< zg$$Yk$;B;2E`g%!6hfNVYBpi0BZYOBa8DY9yIPhbhk*5sp4|{SqFU>^jV^tA!CkbE z7ZjwGj1YHLksnxT&{eDe?L7Dep#I@%yLLzsxvv#)jUA7>zhGiKU;n9Vvy|}|rj`h2 zpPsq(gZ)sS@Tr_k!=B=fvUUZyy! zzDI`jA(rtB&3*55oDaWHQI${nUYEX(le0>Ezew;@t?zA3zR_ mLK5pN)g8z> zOz79Jg8X@HwFFgwocu`CLM}u0`V{q&m2{LWfKJ#IP!)RMe2e{%FrES9wE AHF=Up6vyyTN-%90MsA^gV2l|Y6%kbQz zOzH96TQxLWoTUXw7t9;#hQUHr(*jz1o99HQ9Uvly-BtKzh W}q$r z^&Ytj`>w(W5G1~vvcyJ|vH2X(&?&vMD^bW--G+b(SA8fU-5Qoa>|bAP)^+2UW~0~b zTF`S+b9A}jNOwNFnzyHV-Sva+gNg`j3`oQ6)9qe=Z|gaQZ0Dg=lm-eyn6X)5Z{U zuR;kX@?(*@QBD6>LK_3~>%h&~8%u&VO1~0d6j=9$UaZxi9JC08KU~#%Qsh^_vmTG) zNtF~$PErvuBtuDrixlO!uB~xJ%qrFuvWZq3EjdHmyJc6b@-P*s#0WUu(#xXM_ArDw zlv!rGp-)q|4W6Cnpn!kOg}Vmb0FQ^}p`_uqHmA%O(SKuKu0F&mv^_3&?YSLmX<1Ga z=^zN{ws&@({LJE$sD$$L i#@e_ zn8fEGwt%0fqqu7JeTlhR=64g}EYdWfGFM?DU7KlQH~P+ |L0SS3YGTjK!uvAa zU=!Hoq%#;Zs!zJ+e Rgagjdg^S+QXd;tD1HzlOif4L_I!el`J`pT5U%1|H5wwF?O9-5eLxH+ zvuF_1%0*E6Oo6@=gw7_*0@-u>r!Z_baz?pUwbMWm2QZx=uK;MFEeuU+wMoyDaXd`E zw_D!a)w4!6_3Ofht|55IbUgZ*-VrSt`j`(U)q}za yw_PiS-&n5vdG-Ol;NVy{oxjgn5JCQ`=_FIAMxBU0UJiU9mTRxsOO(m~3Q< zC{jw+qf^|J^A8ObJfO6Q_ma1wNGal&+4`DbFnebd6xr8lND-A$JJF4{&Nt45>lYxi z`Engs>n$3pHSjZ*&^}qffPr}efY0cS9Oc3wIiOn>1uO5dC(ObqBYF`n=B<<2J>o~% zVYa>=Oe1^?b2wcPtn8Q3v;zVsDKL~MEUZu^F;H+^4vrG|)5kx6AiS2D`cv4LMLhhH zjQTnL5Y_v~1H`-d$ #E8rBVR-6gOq>
Zcz9zFSWBKGj{qowBr1-p zL5Jfw#9Ijrmz7Gxq|=zne`SOFVOXRSVP%(Z^6F()BfqL1KgR1*ENhybBOU2&!TP3t zTcIOHv1Z)=p2Nz%okK6`z!`0xiFotF+*+1WEK7#Vk_Ty& a71*JJRuHFr$!n(q#p5a|p2ldJ zh628N%- 0P-4vqVM$7!C1g6-s!WZRkRVQ$bqvGrAv0Dt3vU Fb8_YY?@_EQxJ2sM@) HtE$9d+`WJMF*r|jFLP$LA^9cn4~&YQaAdY|W& z>-Ge{ai_>$#+D1A`5~$B+C6L==mPOVQT8G8x{5CSqCO-!0{P29E#_R4%yN(+HfnRP zORG@=zsQTn?0$rCA+@+RI@a-HE%I?Xiq=}|pkl8LLN7k1mmG=$7j zoT(G3#w!Jl!#@U|fDrIk+v>i1(f7c0m% jK@H4SmbWLY z0{Pc@x3$gZ*Se)D&7IOtyknPiuF=pXS1hy+<)$ZR@|;c2D>nP8H72ZUgL+J18;Cww z=C*)#@A!R^jglg14j(e3cF_NX4Q&2u-PX#qmvvGyXZ>}Zpp|SnZqruwZQ4z`O`F#| z4w_RU(y(}_lJOQHibZj6R_zv^xF<*T1+S%M%pU{YYSXz5!d#2%f*)+k_=2z8J|xBm z{|$86xNg!xh1830)?^6h;d{x|6BgZI$CFWYzBVJXvK`VPju%WY=0KsHNcirfW!>Oy z)OlKG@wiNu(V`O=k8aEO&1w=?l~GYLPM-B&@GLH`vmr+B6m&`4zR&71NxAa}&qq~0 z8%*;jxN&N8;}YzX0x7R#3ALsXj~WPL?n1z$H8tTpoT{{j@e+s8lzz|zT66!aGi0F~ zMb)iHGD2o_66E5dd`20#F)4ilf0W&%?GZf}i?(0*PN_PdKbKPwjGsT7HPLvwxkWzz z_9_z>st=V~U*{b9G;*<9*<7XtM!iTm$~9nsKo*JjEelZ~voW!zy3^0qWnFWG&TEad z0qYHTkGRR)Lui6B)VE~4Z>{F7yfl`>Is-Sc*+(PmU~XZ~F9IGpcbOFDbhW~lF;RjC z8Sj{HPAecz5D;>@SS?YGo);4KjVgpstV#=);~|7P4?>=z&r(9%#GEko#T&L*b-$OG zre4YL$0 0t{^8QU%%7MCj-%)P2K<$UUpL z#20(>Dr%|(&^!Edk&j{dMKko4Jw+>NR3Emorlpft)6(cPt*JhE%)>*obWd*ixJa0v zADEMk#W__Q38S|4=Xj5O6zYzRKeveq;#@*(^da)p-$LV?N6DD+1+*Vbl#$6?UXMTx z1EEtfFJsOmj2Y0$lKAp?KqYGOX7CMSx+~~5CH^j8Yr*7t|MY%{h6ydRrI(%CLdNjD zlQd#Amsy)1n8ZAu^#>EzGMue$6xd2wY_CTXhn$MZfF+^SGd7ttikUy260hWS>Dy#P zr)Wfj<_Hi8=QIAy*?R{FH7Wz~)F}k+#&aG10vjVV(LCyE@5ebzALWNROcY<-n-2&D z99)<*sG!y`fTz;*jfvS5Wc@TvX|4crk)${ U8s)y}O4NyPt}DhzA0r!6yKtPFE`g;) zktMAy!8iXL(QlBlK_e)QB(eaE#uL=#L0Dc4ELI_wQ2OR_+vR7z+(^qZRmaTcF}=D2 z)3?dgIqUh{z?v{tcDR0pJrDig`pV4|gw^*PqR@F1+A3xJEGlfd9K7v`;?$0o;>Z&- zZ-Gp>;rz9qgf@5WW4_yB&N-To=V m^Px(sVPai4a{Q$)W& zL%dkt5dUry8)1H&jijY5B(B@u^P8{G+r7;RmC?|P$O*M87Kn#X&!uP*s*dT9UOKj@ zCV~>$0k_SQoD+s&DY`Y}q;r&89-lEsnaD9EAt@7i^PDgqP&-yB<^=)GQ#9<$T=RHi zVerQ0qjcN1YsR{n!NPpY;ARrqOA~Cj`n{yZ2dVafro8`PH}dazs5!Ueg{Mba3upQT zrIOi4{1%?9ersI8a4zcy@FgFCQj}BD0DAkLbgZ!zxr~c1k3|tGxFSEM#$@Ew^AJ_{ zzV?WvFD`0%z>IF4Xg#tgY6-*IDJef|3tKG?f!>xGyh}89qSJAdYGei$Udp zojSFI+FFa?=fVjE;WBE-KWvCI_vl5q+(Fxq-V*?>laI%*<19X3c<0Pc%9UrVwYmeq zew#N1cpa4^*R1?U+!QFO=avb93aS?+{vUS}U;zY+!unbBkNLd2#=O$YtjdK`+||W9 zp3}e;S)fOUeIwR#9rE~i(VXXTHlx@1k~T3|7RN0H_HVxRd8Zf}{ hx^X11B6@sESNy~cXkMtT$Wp;)bfUjNbm9wfgxLI&T$AI1 zJ>Z>Su(){+Zbd>YO!25*v?2Sf2{A_};^inXgs-K<7KaV=8UXQzlIie*Ml$=IOshGU zHu1#|?A4?5dnuB5v|JiXIXzIx%syx=hcwkL54gI)lTABU EM03>M;uMKq8-ZV z@%9X*Zt|$z
wh6WB>&`%~#OD=z>|K(fEmGx9@;OX!!jT7zXvxo-7wB*k%$ zZDlL9)nP>uLD_MoJhs|<7=EyRhqTI5LG$VcTjyzRS@yj+S1Am$ck?M~w{tfsgoR;8C| zcK$lSlmwD(WQWU3QKL_Bq(#FWiJX+fycm7d#^KRLbfvi!7yxon)-tAM+_&Zy=aP98 zb?2w-+=9~diSl#_0ZTxI{mD~U`X$b{4X}qiHCC$uE`D$6u8_^g-}7u_VNZ;MFQRTt z8^w_tSoei-zGjJ@ddq&tg;mKtZA{qrT~p@MVF~}1p9{OneN^ec7<}`yZ|Ya`=e=Qq z-NB}6T-K{pMv<{u_3X$-?zba(p|P*A3}F446eSAPz%YHITluQZ`Ykoy*aWYxgX(z+ z8g)@RXn$#BFktUUiHt3BWZq~NId=F{o&!Ql@xb4X zXRCfy `4fB|0+%w}3_s9au_2p&^Kskl<#RmD!Vpw^rk8-b*LAjqk*?w{Kk z9OmcBsZGyT=Ifa!nyFq(WNvqgAwE$f#puyKe$#tOIA4W+HLKWOF5btDP$c?EDDj4< zstZSGDOHC-g+_$1oM+i!hm924-ncwmwK{?`Ku%n!5+=Qlg)gbm=fECaZA1_ z9q1!JPv01OY1~!waaXx<$5N%GW1rIJE?U*^gDja3S<(!dT1;3?xBN1aWi)5QV9)hy z+#-n_>meD5K8{Q#5jA$;*aXa{&iFf?;ftz|F#)IR#`uEH=ZO&;ZWJW*5 Nvqonum4gcNVX|cEM0frgKM ?T gKFMBE5a1R8>6=sI0Ff&9oi0CEn&nN-$Im_E*E1IlW^Dnqxgecx5=sSkA z?;-PCToud3rK~A=qv@_ IL(f!OLGZnA?N=lceX|}Cz`~_hNF8|3HCZk;R*1`F)3#<$N?m-q) z(iE7WL(qgE>h6fuv;b1im-FiXKK{t3%FpO_N(z7EI30d@GCe)j-Z!I{>E1>ve+mL@ zT3D4up^@29 ZgT-#g+rj^tyt2{bz4q^Xp;^p)DKd z+Bu(&4+evA=%{6vG!G&}{>qB@lnZQkcKWn*-xKxB=DpwRSaUwAoK1cJTbk+u- Z3eVistF@pDiXS|z z@5>|YF8h0vIlRaV%_h$D_5N@1w&w80;wb(6)-{F3_e}`ivP_y&R T{*hSj! zL&e>-(m#AUKe)JeO<(BZc85#Pii@5jE#h+SE??;1GPb|eyu*eBfX&^7Hs8oX^8^N! z^kCuAaN}FBSSt;$!>VdLzF5|-BWZ;_@dR6R9jD=4a?E;px{P&!3Z4}asU@}WgTs|2 zO%^K$j&{oM)U-_Izxod=gDBJt8GZ^-2UNu4j^k3gi>1S~mPB*DNy4x@p?5MA0=I$V ztsTpFA*_WID=22*2saH(|BuSoWcqj(x($|z8*^w{*09xGLdh0)t2uOB{aV3Tb90!P zSNklELgATapSI9;2He)Rg9ylUWRW*=TQt5Bb~&zK=IdxgYUA7K7?6%m#b#(!OB@@< z$VWhY){-$zF9Kt}fqI(Q`AK4%L0D!~kv-QQ*EEt{FV JDgxdGE~Y zbm*|wc;FZ{rlDV!c%2-C*D$8NNfw6K3DPcjm1bXnqr72nQ3PQL4+E^5IqGs0qZEQ> zcznP|t(hh-=vWDD6R4=P1`Ml0M&7|lY=H3@OQG+}kT^`&GBn2s Yz>3WWL<;N5CSq{Qy*pz*!P6 zmJYQ18$UT#Skkd&Uvk |J5$x6kp5C_I{a` %- zOy~z_=`q*r^AXbw@Y&TxI=pz)!>{qU`p@JVzYVKm%)jDIY5tW0*x`HK+;! <3evR@gdd==2Xf=i%Ht9X}#J5@kS2HoIoqrDD zX$6*>K%YVp92HIQ7>dy{=Kq4^cTAJQq_T-}0o#nyz;NTt>3ta*=I!*R1002? GwLRY9r6 ;Bu9vU2P^dbl}r_@vh<`!{paNfY(qC zD VAVG?zUV)80X-fLOdsP_m#YMi?<+ >sT=W|l^G4Y||0K!UM`eBdEcRiA?--w&B-yx=r&r M!%r6knOlK0C=bJdP`m%%2eml3Ey@2Z}_RK~whGi7!XuJH~J5!yc||JXl@v9(cd~ z7p5lAchal$w1}bT>sDvG)5AJ~q<^C{21L?Oj89%>!|`;Kl-`H*AO8U8ek=9*B^CZw z>MfpvE?3}NxV^u8@Lu4nw`ucuaW?XD*tUg7lz~*57u4H(*c5RI+i{8p25s%vFF$&C zkuEC}2Yh*PzM-CC1q`U_d&o1|-JN!~_i?k=?{5EZc(k#y;wyKvcRmK5G!DJ97!x&I zdx3YevU0CAEfWvlBmm2F2*1-a&-aYg@?gz9v69~X`{q-zXl5 FF@28F$SDBIqFvX{@j zUKcC$LhnO-78j|v)9FFM0X$6Ke(-kjJ8&@QkzqFZHcTcsHf uq;-0wT;3lx@EMk%SZMQKc?NrkW(|qwsvpaoX-}ZEfuY9q-AsLb?a^ z@Ri)^bUhy!(Jt%|tw)cY!+EDb?6miBh$PFW=ND`{LgyaaV^x)0PJkRyRXLx=#R%2{ z6qp$3?%F#A?fpw<#bQ{vG2)^C3O*k2pOW|@A-_ZkufXz_fgTp|jOiUwg6sYEj8~%+ z@=yo5=jr5GIWTch)%XMUgFnGDe_oDXc`3h}%^&bzqAz^?^Ck`pk8f^yX_d40u|S!s z&=IA)5=&EMR 5`2EogC!XprbnbYXTi)YoPLTMW2=?J-hZE#Mw2- z>bI{wG=_2C#1cEA1EIe$NDxitP@3$8hw|lpj4fr;%To+ahQ4qq_*(px@h4*?SeaS} z$x^XkH6m>khY|qbSZp653&p-cv=g JZ+*h+fbZfxAY=F5*Z= dD>3DM?j__$j&hia*x>|tZr?6 zdCn>#ZBdnS^Wz3Xn{tIqH(Ea~){ww_FGU{Jj0~;|G07|_T@d%~HZXLO3BCPwSxYBy zPElg3q0Z1E^tHI2R9$<3BnC0*9n{C$jH)uV6O6l2=>0Y=D{orj*8WxZoct=pA7{#O zDLTO(ex<>5`wD8~WQoAz%tMxa?Xj0pk?cvn!jNetIyp^%?E@ZYLTD6HZo+RUm$HoR z7D=E{adFs~Xh2_`Z(x$94Z4tAZftJt9=KXzolZGPh8@<36y`tC6x! UfojTH8H382pNZzba$S?D7)YbP0&`+QErt2TsHS{DJ&^%`6OU6e zZgEi2&DS(WJTeZ$Z~ (toMy4Py4Zj9aYI2#pc zPd|({J6k~g<7-cb+N2 Jqg4hod4?(^(gEqAyasTQP6CPsn21BLGXP^(q&P8Fg&HyX zXbRN0*e*trWNop}X{M`88Qb|3v=<^ZmPv96nqGW{c4p31T`@GFkWqOmOqmrXMS#}> z7h>|fMP_p=WXti4brE~$RvmkIlA*N0m3z`$QCe}yvjm2o-~q}|#J$LyFm!rkI)U9Z z2H1#q;e0WBh^HkA_12Q?0)5V-HP+9YgfIZLQmL6jPo%<*JfAv>@zC6(3(km((}XF} z88$&im@?CU6ewy$%Y|?Ev#f*tJEw!h8a7hvHfYF*YI^<}SwlGmRrd q%f;GhZrE?vSTkXHnjx!2Vb z>#8*P(*(&16zmZ!AK8|DQ41%fp}o(WgsNM9(&Mp2Kg^!3EogV;9(&&Ry4beL9~VUo z!zkaA&I3s8<{OSkQ%CTh6Gjqm(32@Wp;UB u1Lxm2JmO7 zu*a}k7=56TG3Z(v;lAhZ#R2|>{py}qs~fIBKx>oX&7CbVKW!Yj6Y@+B#$44Tp^{3Y zSs3Y|*9AKjdpoAz>pTLAEz*FSuI$-BL+(csTpV; oz*lYaq+8uu8-GbMD%T ziDRAO=*X8*r@C&Ua_A1!26X1@sFdxE9mTPOm3{8DP!$Cnm+@qAPwbw8SVUjqJ)ZbA zcL)L=qH1E$yXcpbJg>yohtoc^kWkU~XyOz$G;A-iD{>qh>DJIYJ;N0Cb30A`?!z9E z4KQ|aVf}VbHAw!h<5J)N=@m91Cmg;X$xH!7#9L2cqhe*YeX(Mn1JQ_n?@qU zT49SL@0f4y-(aKTRzDtSU}dBExKzZAYEo?*X*7#oR?u3KA_Fx5-7_fTI`rsCf?n3r zBWEwL6XN!3pkgG|MLr5i+OlVId()E+;}3n}G=P?pBq@1f;2Rc97&TB4eP6j%QV?V@ z%ug``5ZSWGoHNCaFvl4{gKtCgz)}rKn_+)nmIO5Xz_@H&A{GQd{v7evKfpYxf;YEV zA%$l>{KDC+R#RK)QIbp$9z4%JWSIOprjtHU_3#;KRAq{;V}Q@}%?lV%XFbhx6f-Sh z5VL++4Z)H=d`Tz7G MJb5z=dF$iRVzM2Zd z$vl6Omt}fN=a_1Gfpb=?)``Qa?myyn0zO*_HUW7nxF{{QQ2#2>)Xq@3BRv-dr v;$vIV|^h4>75ZS1vOJzSzHT-HRYT@lBPG)^InB9NVFA+;$v2Ca40<$JYYvS zNR=u%$;aa OA#@_BP~_br_*ej2%}Vt z^&W&{0kcHUeX<6sGfH_J5A2*&n9wB>9_cNm0)Z$FNQuUQPbsg`@*TG2F<1hQ*^B|= z>ns59MW4`yK4tAdQsX^xbjjUk;guFFBb}e0aS=+Tdm*0|!-Nq8t52Zo5a4F8V8HRT z;qMWf;{I?d;HM(&Y{u@)jfJK@86!}A+Rve#s2~ Ks&&Y{(N^A)T#j*QLJW+dOL#n1a%CZ5$%60b% zXGNMW2zE6_;Ed!Z74nvI>Y4!ah1vE?mV!CPG(n8nFl}x0|6%_a$pM1>+XQ%X-WMlq zEm9?fv9}I(XLZpju*xNfz(C&Y^EOVNZJdW*3*-nF?2pS57?5T~W1ie=;$-=hSs|>1 zdkpTS<$L@sJi7o4B@xr~pUd)GuvPm+kRA!OA_E3u>L*le(5c?9@@6yFG%%UadkUJ0 z5P;8;iZuJvuW3FlVcc_&s$Xg85y54mPF;97jY4pTwki7aQRDV5^0E?iD){y)0)Q;d z k?kp7}Z7ubgi)-;vM7#;*Y# ztr4@7fU}`YU~u_#+tV0N4JJE-O>>6i0JMQe_)<{>TE{RR;b!9cq*yiR8&^o3N->=A z#cOHmCL#;C6+O|_P+cEp8U*XGc5YHT$)bAfFvoTHCCD%>pQC$w5xpTRptZ4tuB_x( zWgFSj0^~7Tq)0JWD!CFk4!Nso<(~378@3vqj+oNkIzYMc`0Q7#mP{GtG#`|A^iZ5`+5h7J%JYV9vlTusUDwPt6rsW7-kcvds zqxivBmoToF_bF_MFE+E*gqe1vqpjW_GU|%q>t5D#h+aW`L8Kd1(G#6oaaEDxI9kj# zeUH~(CmydDKY1D% b4oYYjC&PMXz_!kim~n$%n_1|DB6^c?g>!~h?c8c7eza&!`U?=Ir3$}j)& z!RslXGtGuMMLvg2M@H*AVE*sYqhPgRit7AdlhgmiLp;K&J`?hoU_dBvqEXG8vChhE zhensaA# K8v4bR;c@I~!*s(eiQ9~CXuH~BN9bkh5SD(RuNB=k%m>>TL5=4w>D z43L|Fl2mCk5|3WugOW`Dd(7unl721c#AYX9pq_OMh>o6rn=ohLDjQ3P^FQab04yRV zVe1kyW3`OG3Rh}cLANXXU^cGEZlwqOjxXR*ldKE)s5Li)NfdF^2;RoY-Qa+t6)HB? z qFF53jCKHz>smc+dRh#P)Uh#NKmnE*#@boE vwS zGqo%p^B1QDDYT|ZZ}2eT;I^fpPBTl%K^ntT=(kpl&!1aB;w*TY*j$!-vT2c61@k1h zh7sn8{*p+mgQ>M)vm8}E{eL0c3icOcj4MONb`6VDqE0HE1L{fuX!gQe3>%w-mCkA( z3-#;Izr1_~^`}UYM4QqMIG?7YKDzy=0hdW4Y=cKw;L#eQ DK@$ zQWjAXW7sUjBTb0H@EDi=VhAafB;V2!o&Ti}1^mkjsc l!Q+i2{d94l* zbwM0uz{1uX5Ab-K;wkgVbR6?&TrHjr_UDRm+R%E!U5{@lR>|YmmW&r;UIL6~<_Gw~ zULgCB1JELGFGlQmWT$GLb>_ciGtv+4rR9Z|FjWBs2<$JM8vg85`Kui4mZx#aQjQSn zw1}yi3VUP8UkcmBu+06=CJ#rz)dqo6fMGloUe7YUL`>yHK+S(mGZAV+bWx!l$9!pj zdHInaPy6Q=?akiy4r{_={?Zb?8PteErbkn L>WM4EZ74rR@4%DFpCG%WEwwKHexzt{CGXw57a$7^2|_zgk6N2Rx{`rwbFJa zhoJy8!lMrI(Q)F|9*9slgqasVVh1C>_}vDbDBx2=GDaM*D1R>!mk0Roryo9e;^l_k z^XwcW9=>jNwmRGYS8oGg%5Bl(hT|r{cDuVzR{(rFCYg~h3yqU}1HQq2D?&Qz{s=Zg zh^Ft~UcU @gzra(?gE*qUkx9>=|u%L8eU=ab4aPNLhMJP8@ot zd@nLfj5d)dG8Pc`yL1f6t=rYaq`)pe#Vd&bSd_AVa~oLk$pDiG-A3Hz6A?R|PeOM7 z_nFO1i>c-h%#vE9cDN#(dh9R?vyQb#6yd{zv12f7t2IzB 7gFG#|zs%u{!+R4@t8{LMIu`*e-@Iae18$XR&ybJAIps O0Qt_~hi B&E5vg9=QO$2J}y)O}1gaZS{^VSZ4Vhhw+d4C-7fq2IF0| z2eac(C*3v-9d`%8x)@MJYD&=iZYZ>=$skoVU)UvjXm#u4 VfXqw0c**a9X(Gj&n3+3M(Nx@7`WwV32C~Q_W+%D_ZYU>9;;DZ6S z^fV$w^gPh|+v=co#m@Q31hmMi^MF-t1t%xCEJ71V*qv+Ci11)MDWMrE!bO~pSv0v= zyO7TxOX>ax*4LJHco7#du(E<~2@d%>0Pe~7gZ*0=d;*0!voU;YAHnYRTIXb1$Oufm zcI#7p@2$@eZ=X2M27y2#;K)(=Cp7{Lfmfp9CB}FVI?6bh(8p<-#YBTk^yD8uTK^|o zQ}apCJj4jrhK0{Gqi*&{Op0wStFqW{)Stml>kyk;@h9FdDRro)@(U)dm(N;#tM#8; zTbWJbUhC (Kv z{j`zNPD4wqq&RZuoqln>Z-#S=K~tLnK~{Md@D_OGgZAadr;C#j6+)@h#5X=2f4Uj0 zpWK|34^EDG@yXSOIKGU_bbQ^OfLTXLTsI2LBb0o_@7~L2D9T_*;Ro$TPg8RWP!-9K zTnKRg #x!Ha zHmf2D2?BByx6cMQy>R!ozG6o+-@#~S9kz5_(41)_C@bP~$fq!pU;e7PQHI4udXDx` ztNRT{5<;}?b-(qx@E^Yv{w97y2}nv3op=&F$ &l0xV~8%Y(SB uCDo<4R}sAP g` zaKDuN&SFY0pJ5yjZ%JxiHb3BY_+>5+7^TY_(~M(u;xL|;6o=A!mlT&N+3DUhux-GQ zr{>H@%{|Fe%7w-PgNs_A^*v*7byEI}yA)oe$#_(<0OZl=sZ?qG6+P92?)VTn8=*+N zi)2LfLs=^B-)B$oisYM`m!BVl@G;riph|J$jnbm;wbb24;L{n%$v(Qo&w;2~-t7to z3apSBjrkY;x1*(sml2 z5-_f4fQQ?i?ur)q24Weeg!lZob*11TKiqNC`0}!lymF3bBrFsTR)j4Fcgo#RDywT2 zm(SZBaiV{PM~8TR%iMLa<3&igvBWGI65VI=&`@&)$}1hbmWDrQ5Qu9d{S`~Fy?p-g zK-+s)Df$NKTC2xiafn!$4+Z65k)gf%`Tji~^~9M{jHfd|gs}L63V3a<^P%DG`8 wKdP}Eoa>KI23dfB^8Hhs}ym+_ s|^yRvT-PEB7s`Bjz_%7f1^Ei)AGtATW4c>s{4 z=pq)q=nsV_opJ*3#%jDHIh=gh_YMx}$cRN1IpT{{2yPM=Nd0(K4(WwQGo~y>x yo7NxWCVtkIfmVq z1}O&H>A{oh2Q5m(!Hy_+cRtUb1N8*dFMwCkgydFY`Kc(9n;mcP+zfOGA4o06UR*qR zq}_$&DNURXCb3dG7MQ$|DFQ4d@km8N_~?zIu8w;Htv-uz=lGYzd#?siMD(Y^`dOzW zQ{_Tv?}&JE{c_}cmj-C}Y_=LQXL5)EV_$gI2cBKw?X$Oi;U&2i5$L5>!yJkdCNM MH0G#CZ%GX>dPnBALDaW8TH*M!LxxA&^*Nh-ez#Lt-Cd#V0M1= zZjMa7;Mfw2P5@Okh1BJzCtK5^HqOk90#ld5F~@I3ad>AQB?%CU!sGE+GC?uBzn8I? z%BuUM`dDF^>?Cg>8u+X7h@a%F{MD&2L$JX+p~*^phk5%vSWsM+qr48{mbc6XMT1## zTgkg76GFeGsBuV5bE1${_VrLatEo|ng#P}2n0xp3wv8-L_;2x3Kuo4XS|la;lGu`E zuVXts-py@er!&thD=|ny5@Hfy6QpHztoiJ3ook&c0F<1#=h>c2A_9fF*Qs;;9XC!0 zZg2 I@Um+ZzT)-8zED=^VD+JIL9wNh@@YZv+vC2M0nxqB-xW#fuDA*wl zv1u CZFJT?gKgb&>7a``r4JrIT(LRfF^2I$Dl0+Eu@^n O~4gL$S`ihw4cIlh<)KAl`sa21xcR4_e}6oO6tl8g-g4KD>y$yScjv?7DgVaN(#V$p+~4MFvhgfm|y{LR8K= zvwEo~9}dmHsU&(eB;C)@KhJfR$iNQ7QgQXY#Fy-c5r*M$ qGPV_831I<)b&YkLW7KCLP@vuyqno))j%8lmi^&x<(T01tfZEZ z@^Wh ?V<{2S`S+gf{K;1-Do{|2@9oU43JggFHusSM{h8F 1SVj zRi9C}yZui*8wZ?ZbN4{Zm3Cq{I_fG>TP8Bw_@O*H Jj;1C{y++>M|WeveE^Rzpey4T3ZECFroxb zenC+}zAoSjC=0yxL9d41Il3w`IR{+RExeJ*x<4N}=BRYsqT#FhP>hzzOazfu!mODtBy)6C8t4U6z6+J@oYqG10C8mETh4m^<*1lj>k4#JBn z64|H|m>mq8CzK*^MDQpO3d P{CK7&9#)|fFN_gTGT3vUIX0vdUZMD5^;6fv> z3B!>F{Z?|*sBCKWyNExFz`Lwo_Df7|A#V_U2ZdK5T;A5H!Z5(^=s~LOaKJ6Vgk@DH z?xU&I_7W5`sv7!5Onb|WRHLRZ18#So76?YnAKglRcQT<{vEeU!`}cte8=Hr3612qI z+NRn@>W(i;CTmkkQ+R`E=RgIr7GLCrqw%0U_S+4a@(KDUIIdi4p{%OpvLJc^eQEc; zfYZOr9c7=BbJ8STLy#jxQ?4QWeU % +38KJrO0Ol@2@oNSQ|5}j1Ls3W={r9445w#{a?$X-lkZ!V z{MUEive4N&wO2$op6Kn2Fp}OSDVT3R!N8+~1dAW%w8X^_-BqMfoKFm=_T81AP4bM0 zGZL*tGL1a=`KK2HO3v_{Z1!louY2pj)4s+g^H>if V~->I-_ PTIx*2DY>K86ejn9Ie|d z{HF?en1KO$jWz_c_Aj%QSLF;HgN>ZBo7^0BKXBa>0!^I?l!+kY2W#H4S&m(ylW4bi zy%8z=na+dj7NgEL? kO7{Ojry9&7XsX zA5%h++E&7sq1RWFYh8}{li(1DQypp{2_jNrjXUbuMYphN2J($WzH(sphsW_=4E06o zHzqoxpBGcG