From 4bb9a7466bcf6c159980acb9ade7a853b988c0a8 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Wed, 27 Jan 2016 09:26:54 +0800 Subject: [PATCH 01/70] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A5=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E9=85=8D=E7=BD=AE=E7=9A=84=E7=B2=BE=E7=A1=AE=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=AE=9A=E6=97=B6=E5=99=A8=E8=A7=A3=E6=9E=90=E7=9A=84?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/ParseCrontab.class.php | 6 ++---- src/include/TickTable.class.php | 6 +++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/include/ParseCrontab.class.php b/src/include/ParseCrontab.class.php index 9ab6d5d..ac28d68 100644 --- a/src/include/ParseCrontab.class.php +++ b/src/include/ParseCrontab.class.php @@ -111,12 +111,10 @@ static protected function _parse_array($crontab_array, $start_time) $val = $val.":01"; } $time = strtotime($val); - if ($time > $start_time && $time <= $start_time + 60) { - $sec = date("s", $time); - $result[intval($sec)] = intval($sec); + if ($time >= $start_time && $time < $start_time + 60) { + $result[$time] = $time; } } - ksort($result); return $result; } } \ No newline at end of file diff --git a/src/include/TickTable.class.php b/src/include/TickTable.class.php index deebb0e..c3f9bae 100644 --- a/src/include/TickTable.class.php +++ b/src/include/TickTable.class.php @@ -23,7 +23,11 @@ protected function compare($val1,$val2){ public static function set_task($sec_list,$task){ $time = time(); foreach ($sec_list as $sec) { - self::getInstance()->insert(array("tick"=>$time+$sec,"task"=>$task)); + if($sec > 60){ + self::getInstance()->insert(array("tick"=>$sec,"task"=>$task)); + }else{ + self::getInstance()->insert(array("tick"=>$time+$sec,"task"=>$task)); + } } } From d4703d9b86c57556f198f003ebcbb5272d5edf8b Mon Sep 17 00:00:00 2001 From: ClownFish Date: Wed, 27 Jan 2016 10:35:21 +0800 Subject: [PATCH 02/70] fixbug #17 --- src/include/Crontab.class.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/include/Crontab.class.php b/src/include/Crontab.class.php index 784b624..4ef42fb 100644 --- a/src/include/Crontab.class.php +++ b/src/include/Crontab.class.php @@ -200,16 +200,14 @@ static public function do_something($interval) } $tasks = TickTable::get_task(); if (empty($tasks)) return false; - foreach ($tasks as $id => $task) { + foreach ($tasks as $task) { if (isset($task["unique"]) && $task["unique"]) { - if (isset(self::$unique_list[$id]) && (self::$unique_list[$id] >= $task["unique"])) { + if (isset(self::$unique_list[$task["id"]]) && (self::$unique_list[$task["id"]] >= $task["unique"])) { continue; } - - self::$unique_list[$id] = isset(self::$unique_list[$id]) ? (self::$unique_list[$id] + 1) : 0; + self::$unique_list[$task["id"]] = isset(self::$unique_list[$task["id"]]) ? (self::$unique_list[$task["id"]] + 1) : 0; } - - (new Process())->create_process($id, $task); + (new Process())->create_process($task["id"], $task); } return true; } From 9c18044936525ed1c2f76b82292e08ebdfb1197c Mon Sep 17 00:00:00 2001 From: ClownFish Date: Tue, 23 Feb 2016 20:23:16 +0800 Subject: [PATCH 03/70] =?UTF-8?q?=E5=88=A0=E9=99=A4delay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/Crontab.class.php | 18 +++++++++--------- src/include/Process.class.php | 18 +++++++++--------- src/plugin/PluginBase.class.php | 22 +++++++++++----------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/include/Crontab.class.php b/src/include/Crontab.class.php index 4ef42fb..0663ac1 100644 --- a/src/include/Crontab.class.php +++ b/src/include/Crontab.class.php @@ -20,7 +20,7 @@ class Crontab static public $task_list = array(); static public $unique_list = array(); static public $worker = false; - static public $delay = array(); + //static public $delay = array(); /** * 重启 @@ -190,14 +190,14 @@ static public function do_something($interval) { //是否设置了延时执行 - if (!empty(self::$delay)) { - foreach (self::$delay as $pid => $task) { - if (time() >= $task["start"]) { - (new Process())->create_process($task["task"]["id"], $task["task"]); - unset(self::$delay[$pid]); - } - } - } +// if (!empty(self::$delay)) { +// foreach (self::$delay as $pid => $task) { +// if (time() >= $task["start"]) { +// (new Process())->create_process($task["task"]["id"], $task["task"]); +// unset(self::$delay[$pid]); +// } +// } +// } $tasks = TickTable::get_task(); if (empty($tasks)) return false; foreach ($tasks as $task) { diff --git a/src/include/Process.class.php b/src/include/Process.class.php index 7d89b63..eee2a6f 100644 --- a/src/include/Process.class.php +++ b/src/include/Process.class.php @@ -29,15 +29,15 @@ public function create_process($id, $task) "type" => "crontab", "process" =>$process, ); - swoole_event_add($process->pipe, function ($pipe) use ($process) { - $task = $process->read(); - list($pid, $sec) = explode(",", $task); - if (isset(Crontab::$task_list[$pid])) { - $tasklist = Crontab::$task_list[$pid]; - Crontab::$delay[$pid] = array("start"=>time() + $sec,"task"=>$tasklist["task"]); - $process->write($task); - } - }); +// swoole_event_add($process->pipe, function ($pipe) use ($process) { +// $task = $process->read(); +// list($pid, $sec) = explode(",", $task); +// if (isset(Crontab::$task_list[$pid])) { +// $tasklist = Crontab::$task_list[$pid]; +// Crontab::$delay[$pid] = array("start"=>time() + $sec,"task"=>$tasklist["task"]); +// $process->write($task); +// } +// }); } /** diff --git a/src/plugin/PluginBase.class.php b/src/plugin/PluginBase.class.php index 670f5c9..68d370b 100644 --- a/src/plugin/PluginBase.class.php +++ b/src/plugin/PluginBase.class.php @@ -10,17 +10,17 @@ abstract class PluginBase { public $worker; - public function delay($sec){ - if(!is_numeric($sec)){ - return false; - } - $task = $this->worker->pid.",".$sec; - $this->worker->write($task); - if($this->worker->read() ==$task){ - return true; - } - return false; - } +// public function delay($sec){ +// if(!is_numeric($sec)){ +// return false; +// } +// $task = $this->worker->pid.",".$sec; +// $this->worker->write($task); +// if($this->worker->read() ==$task){ +// return true; +// } +// return false; +// } abstract public function run($task); From f96ebd32973e65c4578757c24f3b3140c7089a41 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Fri, 19 Aug 2016 19:07:13 +0800 Subject: [PATCH 04/70] =?UTF-8?q?=E6=94=B9=E9=80=A0=E5=BC=80=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/App/Cron.php | 24 ++++ src/centre/App/Tasks.php | 64 ++++++++++ src/centre/Lib/CentreServer.php | 62 ++++++++++ src/centre/Lib/Donkeyid.php | 116 ++++++++++++++++++ src/centre/Lib/Flog.php | 51 ++++++++ src/centre/Lib/LoadTasks.php | 188 +++++++++++++++++++++++++++++ src/centre/Lib/ParseCrontab.php | 108 +++++++++++++++++ src/centre/Lib/Tasks.php | 96 +++++++++++++++ src/centre/Lib/WorkerServer.php | 25 ++++ src/centre/_init.php | 28 +++++ src/centre/centre.php | 72 +++++++++++ src/centre/configs/dev/crontab.php | 13 ++ src/centre/configs/dev/db.php | 14 +++ src/centre/configs/dev/log.php | 7 ++ src/centre/configs/product/db.php | 14 +++ src/centre/configs/product/log.php | 7 ++ src/centre/configs/test/db.php | 14 +++ src/centre/configs/test/log.php | 7 ++ src/centre/worker.php | 71 +++++++++++ test/callTest.php | 46 +++++++ 20 files changed, 1027 insertions(+) create mode 100644 src/centre/App/Cron.php create mode 100644 src/centre/App/Tasks.php create mode 100644 src/centre/Lib/CentreServer.php create mode 100644 src/centre/Lib/Donkeyid.php create mode 100644 src/centre/Lib/Flog.php create mode 100644 src/centre/Lib/LoadTasks.php create mode 100644 src/centre/Lib/ParseCrontab.php create mode 100644 src/centre/Lib/Tasks.php create mode 100644 src/centre/Lib/WorkerServer.php create mode 100644 src/centre/_init.php create mode 100644 src/centre/centre.php create mode 100644 src/centre/configs/dev/crontab.php create mode 100644 src/centre/configs/dev/db.php create mode 100644 src/centre/configs/dev/log.php create mode 100644 src/centre/configs/product/db.php create mode 100644 src/centre/configs/product/log.php create mode 100644 src/centre/configs/test/db.php create mode 100644 src/centre/configs/test/log.php create mode 100644 src/centre/worker.php create mode 100644 test/callTest.php diff --git a/src/centre/App/Cron.php b/src/centre/App/Cron.php new file mode 100644 index 0000000..4880901 --- /dev/null +++ b/src/centre/App/Cron.php @@ -0,0 +1,24 @@ +$task) + { + $data[$id] = $task; + } + return array('data' => $data); + } +} \ No newline at end of file diff --git a/src/centre/App/Tasks.php b/src/centre/App/Tasks.php new file mode 100644 index 0000000..e612864 --- /dev/null +++ b/src/centre/App/Tasks.php @@ -0,0 +1,64 @@ +$task) + { + $data[$id] = $task; + } + return array('data' => $data); + } + + public static function get($id) + { + $tasks = LoadTasks::getTasks(); + if (!$tasks->exist($id)){ + return ["code"=>101,"msg"=>"不存在"]; + } + $task = $tasks->get($id); + $task["id"] = $id; + return ["code"=>0,"data"=>$task]; + } + + public static function add($task) + { + $task["id"] = Donkeyid::getInstance()->dk_get_next_id(); + $ids = LoadTasks::saveTasks([$task]); + if ($ids === false){ + return ["code"=>102,"data"=>$ids,"msg"=>"添加失败"]; + } + return ["code"=>0,"data"=>$ids,"msg"=>"保存成功"]; + } + + public static function update($id,$task) + { + if (!LoadTasks::updateTask($id,$task)){ + return ["code"=>102,"msg"=>"更新失败"]; + } + return ["code"=>0,"data"=>'',"msg"=>"更新成功"]; + } + + public static function delete($id) + { + if (!LoadTasks::delTask($id)){ + return ["code"=>102,"msg"=>"删除失败"]; + } + return ["code"=>0,"data"=>'',"msg"=>"删除成功"]; + } + +} \ No newline at end of file diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php new file mode 100644 index 0000000..556a59d --- /dev/null +++ b/src/centre/Lib/CentreServer.php @@ -0,0 +1,62 @@ +taskworker){ + if ($worker_id == 0 ){ + //echo "开始计时:".date("Y-m-d H:i:s")."\n"; + $server->after((60-date("s"))*1000,function () use ($server){ + $server->task("load"); + //echo "开始after计时:".date("Y-m-d H:i:s")."\n"; + $server->tick(60000, function () use ($server) { + //echo "开始task:".date("Y-m-d H:i:s")."\n"; + $server->task("load"); + }); + }); + } + if ($worker_id == 1){ + $server->tick(1000, function () use ($server) { + echo "开始tick计时:".date("Y-m-d H:i:s")."\n"; + $tasks = Tasks::getTasks(); + $server->task($tasks); + }); + } + } + } + function onTask($serv, $task_id, $from_id, $data) + { + if ($data == "load"){ + Tasks::checkTasks(); + }else{ + + } + + return true; + } + function onFinish($serv, $task_id, $data) + { + return; + } + public function call($request, $header) + { + //初始化日志 + Flog::startLog($request['call']); + Flog::log("call:".$request['call'].",params:".json_encode($request['params'])); + $ret = parent::call($request, $header); // TODO: Change the autogenerated stub + Flog::log($ret); + Flog::endLog(); + Flog::flush(); + return $ret; + } +} \ No newline at end of file diff --git a/src/centre/Lib/Donkeyid.php b/src/centre/Lib/Donkeyid.php new file mode 100644 index 0000000..50faabc --- /dev/null +++ b/src/centre/Lib/Donkeyid.php @@ -0,0 +1,116 @@ +node_id = ($node_id == false || $node_id < 0)?0:$node_id; + $this->epoch = ($epoch == false || $epoch < 0)?0:$epoch; + $this->create_table(); + } + static function init() + { + self::getInstance(); + } + + static function getInstance() + { + if (!self::$donkeyid) + { + self::$donkeyid = new Donkeyid(); + } + return self::$donkeyid; + } + /** + * 创建共享内存 + */ + private function create_table() + { + $this->table = new \swoole_table(3); + $this->table->column("last_timestamp",\swoole_table::TYPE_INT, 8); + $this->table->column("sequence",\swoole_table::TYPE_INT, 4); + $this->table->create(); + $this->lock = new \swoole_lock(SWOOLE_SPINLOCK); + } + /** + * 获取当前毫秒 + * @return int + */ + private function get_curr_timestamp_ms() + { + return (int)(microtime(true)*1000); + } + /** + * 暂停一毫秒 + * @return int + */ + private function wait_next_ms() + { + usleep(1000); + return $this->get_curr_timestamp_ms(); + } + /** + * 获取id + * @return int + */ + public function dk_get_next_id() + { + $now = $this->get_curr_timestamp_ms(); + $this->lock->lock(); + $col = $this->table->get(self::snowflake); + if ($col == false || $col["last_timestamp"] > $now){ + $last_timestamp = $now; + $sequence = rand(0,10) % 2; + }else{ + $last_timestamp = $col["last_timestamp"]; + $sequence = $col["sequence"]; + } + if ($now == $last_timestamp){ + $sequence = ($sequence+1)&((-1^(-1<wait_next_ms(); + } + } + $this->table->set(self::snowflake,array("last_timestamp"=>$now,"sequence"=>$sequence)); + $this->lock->unlock(); + $id = (($now-($this->epoch*1000)&(-1^(-1<node_id&(-1^(-1<>self::TIMESTAMP_LEFT_SHIFT)+($this->epoch*1000); + $ret["node_id"] = ($id>>self::NODE_ID_LEFT_SHIFT)&(-1^(-1<dk_get_next_id(); + + self::$key = $key; + } + public static function endLog() + { + self::$request_name = -1; + self::$request_id = -1; + self::$key = "master"; + } + + public static function flush() + { + \Swoole::$php->log(self::$key)->flush(); + } + + /** + * + */ + public static function log($value) + { + $text=""; + if (self::$request_name != -1 && self::$request_id != -1){ + $text = self::$request_id."\t"."[".self::$request_name."]"."\t"; + } + $text .= is_scalar($value) ? $value : json_encode($value); + \Swoole::$php->log(self::$key)->info($text); + } + +} \ No newline at end of file diff --git a/src/centre/Lib/LoadTasks.php b/src/centre/Lib/LoadTasks.php new file mode 100644 index 0000000..202b72c --- /dev/null +++ b/src/centre/Lib/LoadTasks.php @@ -0,0 +1,188 @@ + [\swoole_table::TYPE_INT, 1], + "runTime" => [\swoole_table::TYPE_INT, 4], + "taskname" => [\swoole_table::TYPE_STRING, 32], + "rule" => [\swoole_table::TYPE_STRING, 32], + "unique" => [\swoole_table::TYPE_INT, 1], + "status" => [\swoole_table::TYPE_INT, 1], + "execute" => [\swoole_table::TYPE_STRING, 512], + ]; + + + const tablename = "crontab"; + static private $table; + static private $db; + + + const T_START = 0;//正常 + const T_STOP = 1;//暂停 + + /** + * 初始化任务表 + */ + public static function init() + { + $db = new Swoole\Model(Swoole::getInstance()); + $dbname = Swoole::$php->config["db"]["master"]["name"]; + $data = $db->db->query("SELECT count(*) as total FROM information_schema.TABLES WHERE table_name = '" . self::tablename . "' AND TABLE_SCHEMA = '{$dbname}'")->fetch(); + if (!empty($data) && intval($data["total"]) == 0) { + $stmt = $db->db->query(self::$createTable); + if ($stmt) { + Flog::log("执行sql:" . self::$createTable . "执行成功"); + } else { + Flog::log("执行sql:" . self::$createTable . "执行失败"); + } + Flog::flush(); + } + //创建config table + self::createConfigTable(); + //载入tasks + self::$db = table(self::tablename); + self::loadTasks(); + } + + /** + * 创建配置表 + */ + private static function createConfigTable() + { + $conf = Swoole::$php->config["crontab"]; + $load_size = (isset($conf["load_size"]) && $conf["load_size"] > 0) ? $conf["load_size"] : 1024; + self::$table = new \swoole_table($load_size); + foreach (self::$column as $key => $v) { + self::$table->column($key, $v[0], $v[1]); + } + self::$table->create(); + } + + + /** + * 载入任务 + * @return bool + */ + private static function loadTasks() + { + $count = self::$db->count([]); + if (empty($count)) { + Flog::log("未加载到表" . self::tablename . "中的数据"); + return false; + } + $where["limit"] = "0," . $count; + $tasks = self::$db->gets($where); + foreach ($tasks as $task) { + self::$table->set($task["id"], + [ + "taskname" => $task["taskname"], + "rule" => $task["rule"], + "unique" => $task["unique"], + "status" => $task["status"], + "execute" => $task["execute"], + ] + ); + } + return true; + } + /** + * 获取需要执行的任务 + * @return array + */ + public static function getTasks() + { + return self::$table; + } + + /** + * 保存tasks + * @param $tasks + */ + public static function saveTasks($tasks) + { + $ids = []; + foreach ($tasks as $task) { + $ids[] = $task["id"]; + if (self::$table->exist($task["id"])){ + if (!self::$db->set($task["id"],$task)){ + return false; + } + }else{ + $task["createtime"] = date("Y-m-d H:i:s"); + $task["status"] = 0; + if (!self::$db->put($task)){ + print_r($task); + return false; + } + } + self::$table->set($task["id"], + [ + "taskname" => $task["taskname"], + "rule" => $task["rule"], + "unique" => $task["unique"], + "status" => $task["status"], + "execute" => $task["execute"], + ] + ); + } + return $ids; + } + + /** + * 更新任务 + * @param $id + * @param $task + * @return bool + */ + public static function updateTask($id,$task) + { + if (!self::$db->set($id,$task)){ + return false; + } + if (!self::$table->set($id,$task)){ + return false; + } + return true; + } + + /** + * 删除任务 + * @param $id + * @return bool + */ + public static function delTask($id) + { + if (!self::$db->del($id)){ + return false; + } + if (!self::$table->del($id)){ + return false; + } + return true; + } +} \ No newline at end of file diff --git a/src/centre/Lib/ParseCrontab.php b/src/centre/Lib/ParseCrontab.php new file mode 100644 index 0000000..c32207e --- /dev/null +++ b/src/centre/Lib/ParseCrontab.php @@ -0,0 +1,108 @@ + self::_parse_cron_number($cron[0], 0, 59), + 'minutes' => self::_parse_cron_number($cron[1], 0, 59), + 'hours' => self::_parse_cron_number($cron[2], 0, 23), + 'day' => self::_parse_cron_number($cron[3], 1, 31), + 'month' => self::_parse_cron_number($cron[4], 1, 12), + 'week' => self::_parse_cron_number($cron[5], 0, 6), + ); + } elseif (count($cron) == 5) { + $date = array( + 'second' => array(1 => 1), + 'minutes' => self::_parse_cron_number($cron[0], 0, 59), + 'hours' => self::_parse_cron_number($cron[1], 0, 23), + 'day' => self::_parse_cron_number($cron[2], 1, 31), + 'month' => self::_parse_cron_number($cron[3], 1, 12), + 'week' => self::_parse_cron_number($cron[4], 0, 6), + ); + } + if ( + in_array(intval(date('i', $start)), $date['minutes']) && + in_array(intval(date('G', $start)), $date['hours']) && + in_array(intval(date('j', $start)), $date['day']) && + in_array(intval(date('w', $start)), $date['week']) && + in_array(intval(date('n', $start)), $date['month']) + + ) { + return $date['second']; + } + return null; + } + + /** + * 解析单个配置的含义 + * @param $s + * @param $min + * @param $max + * @return array + */ + static protected function _parse_cron_number($s, $min, $max) + { + $result = array(); + $v1 = explode(",", $s); + foreach ($v1 as $v2) { + $v3 = explode("/", $v2); + $step = empty($v3[1]) ? 1 : $v3[1]; + $v4 = explode("-", $v3[0]); + $_min = count($v4) == 2 ? $v4[0] : ($v3[0] == "*" ? $min : $v3[0]); + $_max = count($v4) == 2 ? $v4[1] : ($v3[0] == "*" ? $max : $v3[0]); + for ($i = $_min; $i <= $_max; $i += $step) { + if (intval($i) < $min){ + $result[$min] = $min; + }elseif (intval($i) > $max){ + $result[$max] = $max; + }else{ + $result[$i] = intval($i); + } + } + } + ksort($result); + return $result; + } +} \ No newline at end of file diff --git a/src/centre/Lib/Tasks.php b/src/centre/Lib/Tasks.php new file mode 100644 index 0000000..30b22d8 --- /dev/null +++ b/src/centre/Lib/Tasks.php @@ -0,0 +1,96 @@ + [\swoole_table::TYPE_INT, 8], + "sec" => [\swoole_table::TYPE_INT, 8], + "id" => [\swoole_table::TYPE_INT, 8], + ]; + /** + * 创建配置表 + */ + public static function init() + { + $conf = Swoole::$php->config["crontab"]; + $tasks_size = (isset($conf["tasks_size"]) && $conf["tasks_size"] > 0) ? $conf["tasks_size"] : 1024; + self::$table = new \swoole_table($tasks_size); + foreach (self::$column as $key => $v) { + self::$table->column($key, $v[0], $v[1]); + } + self::$table->create(); + } + + /** + * 每分钟执行一次,判断下一分钟需要执行的任务 + */ + public static function checkTasks() + { + $tasks = LoadTasks::getTasks(); + if (count($tasks) > 0){ + $time = time(); + foreach ($tasks as $id=>$task){ + $ret = ParseCrontab::parse($task["rule"], $time); + if ($ret === false) { + Flog::log(ParseCrontab::$error); + } elseif (!empty($ret)) { + $min = date("YmdHi"); + $time = strtotime(date("Y-m-d H:i")); + foreach ($ret as $sec){ + $k =Donkeyid::getInstance()->dk_get_next_id(); + self::$table->set($k,["min"=>$min,"sec"=>$time+$sec,"id"=>$id]); + } + } + } + } + self::clean(); + } + + /** + * 清理已执行过的任务 + */ + private static function clean() + { + if (count(self::$table) > 0){ + $min = date("YmdHi"); + foreach (self::$table as $id=>$task){ + if ($min > $task["min"]){ + self::$table->del($id); + } + } + } + } + + /** + * 获取当前可以执行的任务 + * @return array + */ + public static function getTasks() + { + $data = []; + if (count(self::$table) <= 0){ + return []; + } + $min = date("YmdHi"); + $time = time(); + foreach (self::$table as $task){ + if ($min == $task["min"] ){ + if ($time == $task["sec"]){ + $data[] = $task["id"]; + } + } + } + return $data; + } +} \ No newline at end of file diff --git a/src/centre/Lib/WorkerServer.php b/src/centre/Lib/WorkerServer.php new file mode 100644 index 0000000..0dab9bc --- /dev/null +++ b/src/centre/Lib/WorkerServer.php @@ -0,0 +1,25 @@ +config->setPath(__DIR__ . '/configs/' . ENV_NAME);//共有配置 + + diff --git a/src/centre/centre.php b/src/centre/centre.php new file mode 100644 index 0000000..eff9f9c --- /dev/null +++ b/src/centre/centre.php @@ -0,0 +1,72 @@ + __DIR__ . '/logs/centre.log']); + $AppSvr = new Lib\CentreServer; + $AppSvr->setLogger($logger); + + $setting = array( + 'worker_num' => 2, + 'task_worker_num'=>2, + 'max_request' => 1000, + 'dispatch_mode' => 3, + 'log_file' => __DIR__ . '/logs/swoole.log', + 'open_length_check' => 1, + 'package_max_length' => $AppSvr->packet_maxlen, + 'package_length_type' => 'N', + 'package_body_offset' => \Swoole\Protocol\SOAServer::HEADER_SIZE, + 'package_length_offset' => 0, + ); + //重定向PHP错误日志到logs目录 + ini_set('error_log', __DIR__ . '/logs/php_errors.log'); + + $listenHost = '127.0.0.1'; + if (ENV_NAME == 'product') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 7) == '192.168') + { + $listenHost = $v; + } + } + } + else if (ENV_NAME == 'test') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 6) == '172.16') + { + $listenHost = $v; + } + } + } + \Lib\LoadTasks::init();//载入任务表 + \Lib\Donkeyid::init();//初始化donkeyid对象 + \Lib\Tasks::init();//创建task表 + $server = Swoole\Network\Server::autoCreate($listenHost, PORT); + $server->setProtocol($AppSvr); + $server->setProcessName("CentreServer"); + $server->run($setting); +}); + diff --git a/src/centre/configs/dev/crontab.php b/src/centre/configs/dev/crontab.php new file mode 100644 index 0000000..5434347 --- /dev/null +++ b/src/centre/configs/dev/crontab.php @@ -0,0 +1,13 @@ +"8192", + "tasks_size"=>"1024", +]; \ No newline at end of file diff --git a/src/centre/configs/dev/db.php b/src/centre/configs/dev/db.php new file mode 100644 index 0000000..a7e8696 --- /dev/null +++ b/src/centre/configs/dev/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "10.10.2.220", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "swoole_crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/centre/configs/dev/log.php b/src/centre/configs/dev/log.php new file mode 100644 index 0000000..678b0a2 --- /dev/null +++ b/src/centre/configs/dev/log.php @@ -0,0 +1,7 @@ + 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/application.log', +); +return $log; \ No newline at end of file diff --git a/src/centre/configs/product/db.php b/src/centre/configs/product/db.php new file mode 100644 index 0000000..a7e8696 --- /dev/null +++ b/src/centre/configs/product/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "10.10.2.220", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "swoole_crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/centre/configs/product/log.php b/src/centre/configs/product/log.php new file mode 100644 index 0000000..678b0a2 --- /dev/null +++ b/src/centre/configs/product/log.php @@ -0,0 +1,7 @@ + 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/application.log', +); +return $log; \ No newline at end of file diff --git a/src/centre/configs/test/db.php b/src/centre/configs/test/db.php new file mode 100644 index 0000000..a7e8696 --- /dev/null +++ b/src/centre/configs/test/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "10.10.2.220", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "swoole_crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/centre/configs/test/log.php b/src/centre/configs/test/log.php new file mode 100644 index 0000000..678b0a2 --- /dev/null +++ b/src/centre/configs/test/log.php @@ -0,0 +1,7 @@ + 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/application.log', +); +return $log; \ No newline at end of file diff --git a/src/centre/worker.php b/src/centre/worker.php new file mode 100644 index 0000000..eea87b7 --- /dev/null +++ b/src/centre/worker.php @@ -0,0 +1,71 @@ + __DIR__ . '/logs/worker.log']); + $AppSvr = new Lib\WorkerServer; + $AppSvr->setLogger($logger); + + $setting = array( + 'worker_num' => 4, + 'max_request' => 1000, + 'dispatch_mode' => 3, + 'log_file' => __DIR__ . '/logs/swoole.log', + 'open_length_check' => 1, + 'package_max_length' => $AppSvr->packet_maxlen, + 'package_length_type' => 'N', + 'package_body_offset' => \Swoole\Protocol\SOAServer::HEADER_SIZE, + 'package_length_offset' => 0, + ); + //重定向PHP错误日志到logs目录 + ini_set('error_log', __DIR__ . '/logs/php_errors.log'); + + $listenHost = '127.0.0.1'; + if (ENV_NAME == 'product') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 7) == '192.168') + { + $listenHost = $v; + } + } + } + else if (ENV_NAME == 'test') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 6) == '172.16') + { + $listenHost = $v; + } + } + } + + + \Lib\LoadTasks::init();//载入任务表 + \Lib\Donkeyid::init();//初始化donkeyid对象 + \Lib\Tasks::init();//创建task表 + + $server = Swoole\Network\Server::autoCreate($listenHost, PORT); + $server->setProtocol($AppSvr); + $server->setProcessName("CentreServer"); + $server->run($setting); +}); diff --git a/test/callTest.php b/test/callTest.php new file mode 100644 index 0000000..c3d7f7b --- /dev/null +++ b/test/callTest.php @@ -0,0 +1,46 @@ +setServers(array('127.0.0.1:8808')); + +$task = [ + "taskname"=>"测试任务1", + "rule"=>"* * * * * *", + "unique"=>"0", + "execute"=>"php server.php start", +]; +$ret = $service->task("App\\Tasks::add",[$task])->getResult(); +var_dump($ret); + +//$id = $ret["data"][0]; +//$task = []; +//$task = [ +// $id, +// ["status"=>"1"], +//]; +// +//$ret = $service->task("App\\Tasks::update",$task)->getResult(); +//var_dump($ret); +// +//$ret = $service->task("App\\Tasks::get",[$id])->getResult(); +//var_dump($ret); +// +//$ret = $service->task("App\\Tasks::getList")->getResult(); +//var_dump($ret); +//$ret = $service->task("App\\Tasks::delete",[$id])->getResult(); +//var_dump($ret); +// +//$ret = $service->task("App\\Tasks::getList")->getResult(); +//var_dump($ret); \ No newline at end of file From addb2233791c245e0b9f380ea02522d3cfb5210a Mon Sep 17 00:00:00 2001 From: ClownFish Date: Mon, 22 Aug 2016 18:54:14 +0800 Subject: [PATCH 05/70] =?UTF-8?q?=E5=AE=8C=E6=88=90worker=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E7=9A=84=E4=BB=BB=E5=8A=A1=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/App/Exec.php | 21 ++++++++ src/centre/App/Robot.php | 28 +++++++++++ src/centre/Lib/CentreServer.php | 3 +- src/centre/Lib/Process.php | 78 ++++++++++++++++++++++++++++++ src/centre/Lib/Robot.php | 49 +++++++++++++++++++ src/centre/Lib/Service.php | 29 +++++++++++ src/centre/Lib/Util.php | 43 ++++++++++++++++ src/centre/Lib/WorkerServer.php | 16 ++++++ src/centre/_init.php | 2 + src/centre/centre.php | 34 ++----------- src/centre/configs/dev/crontab.php | 4 ++ src/centre/test/runTask.php | 12 +++++ src/centre/worker.php | 36 ++------------ 13 files changed, 292 insertions(+), 63 deletions(-) create mode 100644 src/centre/App/Exec.php create mode 100644 src/centre/App/Robot.php create mode 100644 src/centre/Lib/Process.php create mode 100644 src/centre/Lib/Robot.php create mode 100644 src/centre/Lib/Service.php create mode 100644 src/centre/Lib/Util.php create mode 100644 src/centre/test/runTask.php diff --git a/src/centre/App/Exec.php b/src/centre/App/Exec.php new file mode 100644 index 0000000..a75b920 --- /dev/null +++ b/src/centre/App/Exec.php @@ -0,0 +1,21 @@ +0,"msg"=>"注册成功"]; + } + return ["code"=>1,"msg"=>"注册失败"]; + } +} \ No newline at end of file diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php index 556a59d..f56f2bb 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/centre/Lib/CentreServer.php @@ -17,7 +17,6 @@ function onWorkerStart($server, $worker_id) if ($worker_id == 0 ){ //echo "开始计时:".date("Y-m-d H:i:s")."\n"; $server->after((60-date("s"))*1000,function () use ($server){ - $server->task("load"); //echo "开始after计时:".date("Y-m-d H:i:s")."\n"; $server->tick(60000, function () use ($server) { //echo "开始task:".date("Y-m-d H:i:s")."\n"; @@ -27,7 +26,7 @@ function onWorkerStart($server, $worker_id) } if ($worker_id == 1){ $server->tick(1000, function () use ($server) { - echo "开始tick计时:".date("Y-m-d H:i:s")."\n"; + //echo "开始tick计时:".date("Y-m-d H:i:s")."\n"; $tasks = Tasks::getTasks(); $server->task($tasks); }); diff --git a/src/centre/Lib/Process.php b/src/centre/Lib/Process.php new file mode 100644 index 0000000..391fc09 --- /dev/null +++ b/src/centre/Lib/Process.php @@ -0,0 +1,78 @@ + [\swoole_table::TYPE_INT, 8], + "status" => [\swoole_table::TYPE_INT, 1], + "start" => [\swoole_table::TYPE_INT, 8], + "end" => [\swoole_table::TYPE_INT, 8], + ]; + + public $task; + + public static function init() + { + $conf = \Swoole::$php->config["crontab"]; + $robot_process_max = (isset($conf["robot_process_max"]) && $conf["robot_process_max"] > 0) ? $conf["robot_process_max"] : 128; + self::$table = new \swoole_table($robot_process_max); + foreach (self::$column as $key => $v) { + self::$table->column($key, $v[0], $v[1]); + } + self::$table->create(); + } + + public static function signal() + { + \swoole_process::signal(SIGCHLD, function($sig) { + //必须为false,非阻塞模式 + while($ret = \swoole_process::wait(false)) { + $pid = $ret['pid']; + if (self::$table->exist($pid)){ + self::$table->set($pid,["status"=>1,"end"=>microtime(true)]); + } + } + foreach (self::$table as $pid=>$value){ + echo $pid,"\n"; + print_r($value); + echo "\n"; + } + }); + } + /** + * 创建一个子进程 + * @param $task + */ + public static function create_process($id, $task) + { + $cls = new Process(); + $cls->task = $task; + $process = new \swoole_process(array($cls, "run")); + if (($pid = $process->start())) { + self::$table->set($pid,["taskId"=>$id,"status"=>0,"start"=>microtime(true)]); + } + } + + /** + * 子进程执行的入口 + * @param $worker + */ + public function run($worker) + { + $exec = $this->task["execute"]; + $exec = explode(" ",$exec); + $execfile = $exec[0]; + unset($exec[0]); + $worker->exec($execfile,$exec); + } +} \ No newline at end of file diff --git a/src/centre/Lib/Robot.php b/src/centre/Lib/Robot.php new file mode 100644 index 0000000..eb9e1c5 --- /dev/null +++ b/src/centre/Lib/Robot.php @@ -0,0 +1,49 @@ + [\swoole_table::TYPE_STRING, 15], + "port" => [\swoole_table::TYPE_INT, 4], + "status" => [\swoole_table::TYPE_INT, 1], + ]; + public static function init() + { + $conf = \Swoole::$php->config["crontab"]; + $robot_num_max = (isset($conf["robot_num_max"]) && $conf["robot_num_max"] > 0) ? $conf["robot_num_max"] : 2; + self::$table = new \swoole_table($robot_num_max); + foreach (self::$column as $key => $v) { + self::$table->column($key, $v[0], $v[1]); + } + self::$table->create(); + } + + /** + * 注册服务 + * @param $ip + * @param $port + * @return bool + */ + public static function register($ip,$port) + { + $client = new \swoole_client(SWOOLE_SOCK_TCP); + if($client->connect($ip,$port)){ + if (self::$table->set($ip.":".$port,["ip"=>$ip,"port"=>$port,"status"=>0])){ + return $client->close(); + } + } + return false; + } +} \ No newline at end of file diff --git a/src/centre/Lib/Service.php b/src/centre/Lib/Service.php new file mode 100644 index 0000000..5b4699a --- /dev/null +++ b/src/centre/Lib/Service.php @@ -0,0 +1,29 @@ +config["crontab"]; + $host = $config["centre_host"]; + $port = $config["centre_port"]; + $insance = new self($id); + $insance->addServers(array($host.':'.$port)); + self::$insance = $insance; + return self::$insance; + + } + + function call() + { + $args = func_get_args(); + return $this->task($this->namespace . '\\' . $args[0], array_slice($args, 1)); + } +} diff --git a/src/centre/Lib/Util.php b/src/centre/Lib/Util.php new file mode 100644 index 0000000..bebad01 --- /dev/null +++ b/src/centre/Lib/Util.php @@ -0,0 +1,43 @@ + $v) + { + if (substr($v, 0, 7) == '192.168') + { + $listenHost = $v; + } + } + } + else if (ENV_NAME == 'test') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 6) == '172.16') + { + $listenHost = $v; + } + } + } + return $listenHost; + } +} \ No newline at end of file diff --git a/src/centre/Lib/WorkerServer.php b/src/centre/Lib/WorkerServer.php index 0dab9bc..f3568f4 100644 --- a/src/centre/Lib/WorkerServer.php +++ b/src/centre/Lib/WorkerServer.php @@ -11,6 +11,22 @@ class WorkerServer extends Swoole\Protocol\SOAServer { + + + public function onMasterStart($serv) + { +// $listenHost = \Lib\Util::listenHost(); +// $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); +// if (empty($ret) || $ret["code"]){ +// echo $ret["msg"],"\n";exit; +// } + } + + public function onWorkerStart($server, $worker_id) + { + Process::signal();//注册信号 + } + public function call($request, $header) { //初始化日志 diff --git a/src/centre/_init.php b/src/centre/_init.php index 41f0966..b4d3a93 100644 --- a/src/centre/_init.php +++ b/src/centre/_init.php @@ -24,5 +24,7 @@ require_once __DIR__ . '/framework/libs/lib_config.php'; } Swoole::$php->config->setPath(__DIR__ . '/configs/' . ENV_NAME);//共有配置 +Swoole\Loader::addNameSpace('App', __DIR__ . '/App'); +Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); diff --git a/src/centre/centre.php b/src/centre/centre.php index eff9f9c..94e9ee5 100644 --- a/src/centre/centre.php +++ b/src/centre/centre.php @@ -7,16 +7,13 @@ */ require_once __DIR__ . '/_init.php'; -const PORT = 8808; +const PORT = 8901; Swoole\Network\Server::setPidFile(__DIR__ . '/logs/centre.pid'); Swoole\Network\Server::start(function () { - Swoole\Loader::addNameSpace('App', __DIR__ . '/App'); - Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); - $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/centre.log']); $AppSvr = new Lib\CentreServer; $AppSvr->setLogger($logger); @@ -36,34 +33,13 @@ //重定向PHP错误日志到logs目录 ini_set('error_log', __DIR__ . '/logs/php_errors.log'); - $listenHost = '127.0.0.1'; - if (ENV_NAME == 'product') - { - $iplist = swoole_get_local_ip(); - //监听局域网IP - foreach ($iplist as $k => $v) - { - if (substr($v, 0, 7) == '192.168') - { - $listenHost = $v; - } - } - } - else if (ENV_NAME == 'test') - { - $iplist = swoole_get_local_ip(); - //监听局域网IP - foreach ($iplist as $k => $v) - { - if (substr($v, 0, 6) == '172.16') - { - $listenHost = $v; - } - } - } + $listenHost = \Lib\Util::listenHost(); + \Lib\LoadTasks::init();//载入任务表 \Lib\Donkeyid::init();//初始化donkeyid对象 \Lib\Tasks::init();//创建task表 + \Lib\Robot::init();//创建任务处理服务表 + $server = Swoole\Network\Server::autoCreate($listenHost, PORT); $server->setProtocol($AppSvr); $server->setProcessName("CentreServer"); diff --git a/src/centre/configs/dev/crontab.php b/src/centre/configs/dev/crontab.php index 5434347..6a4ceb4 100644 --- a/src/centre/configs/dev/crontab.php +++ b/src/centre/configs/dev/crontab.php @@ -10,4 +10,8 @@ return [ "load_size"=>"8192", "tasks_size"=>"1024", + "robot_num_max"=>"8", + "robot_process_max"=>"128", + "centre_host"=>"127.0.0.1", + "centre_port"=>"8901", ]; \ No newline at end of file diff --git a/src/centre/test/runTask.php b/src/centre/test/runTask.php new file mode 100644 index 0000000..3f1a5a2 --- /dev/null +++ b/src/centre/test/runTask.php @@ -0,0 +1,12 @@ +addServers(["127.0.0.1:8902"]); +$ret = $server->call("Exec::run",["id"=>1111,"execute"=>"/bin/echo hello liuzhiming"])->getResult(); \ No newline at end of file diff --git a/src/centre/worker.php b/src/centre/worker.php index eea87b7..4499972 100644 --- a/src/centre/worker.php +++ b/src/centre/worker.php @@ -6,14 +6,13 @@ * Time: 下午5:50 */ require_once __DIR__ . '/_init.php'; -const PORT = 8808; +const PORT = 8902; Swoole\Network\Server::setPidFile(__DIR__ . '/logs/worker.pid'); Swoole\Network\Server::start(function () { - Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/worker.log']); $AppSvr = new Lib\WorkerServer; @@ -33,36 +32,9 @@ //重定向PHP错误日志到logs目录 ini_set('error_log', __DIR__ . '/logs/php_errors.log'); - $listenHost = '127.0.0.1'; - if (ENV_NAME == 'product') - { - $iplist = swoole_get_local_ip(); - //监听局域网IP - foreach ($iplist as $k => $v) - { - if (substr($v, 0, 7) == '192.168') - { - $listenHost = $v; - } - } - } - else if (ENV_NAME == 'test') - { - $iplist = swoole_get_local_ip(); - //监听局域网IP - foreach ($iplist as $k => $v) - { - if (substr($v, 0, 6) == '172.16') - { - $listenHost = $v; - } - } - } - - - \Lib\LoadTasks::init();//载入任务表 - \Lib\Donkeyid::init();//初始化donkeyid对象 - \Lib\Tasks::init();//创建task表 + $listenHost = \Lib\Util::listenHost(); + + \Lib\Process::init();//载入任务处理表 $server = Swoole\Network\Server::autoCreate($listenHost, PORT); $server->setProtocol($AppSvr); From e5a5c13d01117386adec7403d704832af30882a1 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Mon, 22 Aug 2016 19:06:14 +0800 Subject: [PATCH 06/70] =?UTF-8?q?=E5=AE=8C=E6=88=90worker=E8=BF=9B?= =?UTF-8?q?=E7=A8=8B=E7=9A=84=E4=BB=BB=E5=8A=A1=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/Lib/Process.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/centre/Lib/Process.php b/src/centre/Lib/Process.php index 391fc09..e544d24 100644 --- a/src/centre/Lib/Process.php +++ b/src/centre/Lib/Process.php @@ -17,7 +17,10 @@ class Process "status" => [\swoole_table::TYPE_INT, 1], "start" => [\swoole_table::TYPE_INT, 8], "end" => [\swoole_table::TYPE_INT, 8], + "code"=> [\swoole_table::TYPE_INT, 1], ]; + const PROCESS_START = 0;//程序开始运行 + const PROCESS_STOP = 1;//程序结束运行 public $task; @@ -39,27 +42,22 @@ public static function signal() while($ret = \swoole_process::wait(false)) { $pid = $ret['pid']; if (self::$table->exist($pid)){ - self::$table->set($pid,["status"=>1,"end"=>microtime(true)]); + self::$table->set($pid,["status"=>self::PROCESS_STOP,"end"=>microtime(true),"code"=>$ret["code"]]); } } - foreach (self::$table as $pid=>$value){ - echo $pid,"\n"; - print_r($value); - echo "\n"; - } }); } /** * 创建一个子进程 * @param $task */ - public static function create_process($id, $task) + public static function create_process($task) { - $cls = new Process(); + $cls = new self(); $cls->task = $task; $process = new \swoole_process(array($cls, "run")); if (($pid = $process->start())) { - self::$table->set($pid,["taskId"=>$id,"status"=>0,"start"=>microtime(true)]); + self::$table->set($pid,["taskId"=>$task["id"],"status"=>self::PROCESS_START,"start"=>microtime(true)]); } } @@ -70,6 +68,7 @@ public static function create_process($id, $task) public function run($worker) { $exec = $this->task["execute"]; + $worker->name($exec ."#". $this->task["id"]); $exec = explode(" ",$exec); $execfile = $exec[0]; unset($exec[0]); From 9fc2fa358927fbb8be30f735ce68806c3d7a0064 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Mon, 29 Aug 2016 19:33:31 +0800 Subject: [PATCH 07/70] =?UTF-8?q?centre=E9=80=9A=E7=9F=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=BB=99worker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/App/Exec.php | 3 +-- src/centre/Lib/CentreServer.php | 26 +++++++++++-------- src/centre/Lib/Robot.php | 35 ++++++++++++++++++++++++-- src/centre/Lib/Service.php | 24 ++++++++++-------- src/centre/Lib/WorkerServer.php | 10 ++++---- {test => src/centre/test}/callTest.php | 15 ++++------- 6 files changed, 72 insertions(+), 41 deletions(-) rename {test => src/centre/test}/callTest.php (59%) diff --git a/src/centre/App/Exec.php b/src/centre/App/Exec.php index a75b920..6b8693c 100644 --- a/src/centre/App/Exec.php +++ b/src/centre/App/Exec.php @@ -15,7 +15,6 @@ class Exec { public static function run($task) { - $id = $task["id"]; - Process::create_process($id,$task); + Process::create_process($task); } } \ No newline at end of file diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php index f56f2bb..5c839fd 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/centre/Lib/CentreServer.php @@ -15,18 +15,18 @@ function onWorkerStart($server, $worker_id) { if (!$server->taskworker){ if ($worker_id == 0 ){ - //echo "开始计时:".date("Y-m-d H:i:s")."\n"; - $server->after((60-date("s"))*1000,function () use ($server){ - //echo "开始after计时:".date("Y-m-d H:i:s")."\n"; - $server->tick(60000, function () use ($server) { - //echo "开始task:".date("Y-m-d H:i:s")."\n"; - $server->task("load"); - }); - }); + $server->task("load"); +// $server->after((60-date("s"))*1000,function () use ($server){ +// +// $server->task("load"); +// $server->tick(60000, function () use ($server) { +// $server->task("load"); +// }); +// }); } if ($worker_id == 1){ $server->tick(1000, function () use ($server) { - //echo "开始tick计时:".date("Y-m-d H:i:s")."\n"; + $tasks = Tasks::getTasks(); $server->task($tasks); }); @@ -38,9 +38,13 @@ function onTask($serv, $task_id, $from_id, $data) if ($data == "load"){ Tasks::checkTasks(); }else{ - + foreach ($data as $id) + { + $task = LoadTasks::getTasks()->get($id); +// print_r($task); + Robot::Run($task); + } } - return true; } function onFinish($serv, $task_id, $data) diff --git a/src/centre/Lib/Robot.php b/src/centre/Lib/Robot.php index eb9e1c5..bf5d8dd 100644 --- a/src/centre/Lib/Robot.php +++ b/src/centre/Lib/Robot.php @@ -8,11 +8,12 @@ namespace Lib; - +use Swoole; class Robot { static private $table; + static private $column = [ "ip" => [\swoole_table::TYPE_STRING, 15], @@ -40,10 +41,40 @@ public static function register($ip,$port) { $client = new \swoole_client(SWOOLE_SOCK_TCP); if($client->connect($ip,$port)){ - if (self::$table->set($ip.":".$port,["ip"=>$ip,"port"=>$port,"status"=>0])){ + if (self::$table->set(1,["ip"=>$ip,"port"=>$port,"status"=>0])){ return $client->close(); } } return false; } + + public static function Run($task) + { + echo (date("Y-m-d H:i:s")."\n"); + $num = count(self::$table); + echo "num:".$num."\n"; + + if ($num){ + return false; + } + $rand = rand(1,$num); + $n=0; + foreach (self::$table as $robot) + { + var_dump($robot); + $n++; + if ($rand == $num){ + print_r($num); + $rect = Service::getInstance($robot["ip"],$robot["port"])->call("Exec::run",$task); + $ret = $rect->getResult(30); + if (empty($ret)){ + if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED){ + //TODO 重新选择服务逻辑 + } + } + return $ret; + } + } + return false; + } } \ No newline at end of file diff --git a/src/centre/Lib/Service.php b/src/centre/Lib/Service.php index 5b4699a..a0f011c 100644 --- a/src/centre/Lib/Service.php +++ b/src/centre/Lib/Service.php @@ -4,20 +4,22 @@ class Service extends Swoole\Client\SOA { protected $namespace = "App"; - private static $insance; + private static $insance = []; - public static function getInstance($id = null) + public static function getInstance($ip="",$port="") { - if (!empty(self::$insance)){ - return self::$insance; + if (empty($ip) || empty($port)){ + $config = Swoole::$php->config["crontab"]; + $ip = $config["centre_host"]; + $port = $config["centre_port"]; } - $config = Swoole::$php->config["crontab"]; - $host = $config["centre_host"]; - $port = $config["centre_port"]; - $insance = new self($id); - $insance->addServers(array($host.':'.$port)); - self::$insance = $insance; - return self::$insance; + if (isset(self::$insance[$ip.":".$port]) && !empty(self::$insance[$ip.":".$port])){ + return self::$insance[$ip.":".$port]; + } + $insance = new self(null); + $insance->addServers(array($ip.':'.$port)); + self::$insance[$ip.":".$port] = $insance; + return $insance; } diff --git a/src/centre/Lib/WorkerServer.php b/src/centre/Lib/WorkerServer.php index f3568f4..22f584f 100644 --- a/src/centre/Lib/WorkerServer.php +++ b/src/centre/Lib/WorkerServer.php @@ -15,11 +15,11 @@ class WorkerServer extends Swoole\Protocol\SOAServer public function onMasterStart($serv) { -// $listenHost = \Lib\Util::listenHost(); -// $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); -// if (empty($ret) || $ret["code"]){ -// echo $ret["msg"],"\n";exit; -// } + $listenHost = \Lib\Util::listenHost(); + $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); + if (empty($ret) || $ret["code"]){ + echo $ret["msg"],"\n";exit; + } } public function onWorkerStart($server, $worker_id) diff --git a/test/callTest.php b/src/centre/test/callTest.php similarity index 59% rename from test/callTest.php rename to src/centre/test/callTest.php index c3d7f7b..6b40213 100644 --- a/test/callTest.php +++ b/src/centre/test/callTest.php @@ -5,23 +5,18 @@ * Date: 16-8-18 * Time: 下午3:42 */ -if (!class_exists('Swoole', false)) -{ - require_once '/data/www/public/framework/libs/Swoole/Loader.php'; - Swoole\Loader::addNameSpace('Swoole', '/data/www/public/framework/libs/Swoole'); - spl_autoload_register('\\Swoole\\Loader::autoload', true, true); -} -$service = new Swoole\Client\SOA(); -$service->setServers(array('127.0.0.1:8808')); +include __DIR__."/../_init.php"; +$server = new Lib\Service(); +$server->addServers(["127.0.0.1:8901"]); $task = [ "taskname"=>"测试任务1", "rule"=>"* * * * * *", "unique"=>"0", - "execute"=>"php server.php start", + "execute"=>"echo 'aa' ", ]; -$ret = $service->task("App\\Tasks::add",[$task])->getResult(); +$ret = $server->call("Tasks::add",$task)->getResult(); var_dump($ret); //$id = $ret["data"][0]; From 93b772d4b103b825324cadcd231f5ac570595083 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Tue, 30 Aug 2016 11:31:35 +0800 Subject: [PATCH 08/70] =?UTF-8?q?centre=E9=80=9A=E7=9F=A5=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=BB=99worker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/Lib/CentreServer.php | 30 +++++++++++++++++++----------- src/centre/Lib/LoadTasks.php | 7 ++++++- src/centre/Lib/Robot.php | 18 ++++++++++-------- src/centre/centre.php | 2 +- src/centre/worker.php | 2 +- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php index 5c839fd..9914b2b 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/centre/Lib/CentreServer.php @@ -15,18 +15,16 @@ function onWorkerStart($server, $worker_id) { if (!$server->taskworker){ if ($worker_id == 0 ){ - $server->task("load"); -// $server->after((60-date("s"))*1000,function () use ($server){ -// -// $server->task("load"); -// $server->tick(60000, function () use ($server) { -// $server->task("load"); -// }); -// }); + //$server->task("load"); + $server->after((60-date("s"))*1000,function () use ($server){ + $server->task("load"); + $server->tick(60000, function () use ($server) { + $server->task("load"); + }); + }); } if ($worker_id == 1){ $server->tick(1000, function () use ($server) { - $tasks = Tasks::getTasks(); $server->task($tasks); }); @@ -38,17 +36,27 @@ function onTask($serv, $task_id, $from_id, $data) if ($data == "load"){ Tasks::checkTasks(); }else{ + $ret = []; foreach ($data as $id) { $task = LoadTasks::getTasks()->get($id); -// print_r($task); - Robot::Run($task); + $tmp["id"] = $id; + $tmp["execute"] = $task["execute"]; + $tmp["taskname"] = $task["taskname"]; + LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatus_ing,"runTimeStart"=>microtime()]); + $ret[$id] = Robot::Run($tmp); } + return $ret; } return true; } function onFinish($serv, $task_id, $data) { + if (is_array($data)){ + foreach ($data as $id=>$v){ + LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatus_end,"runTimeEnd"=>microtime()]); + } + } return; } public function call($request, $header) diff --git a/src/centre/Lib/LoadTasks.php b/src/centre/Lib/LoadTasks.php index 202b72c..90b3958 100644 --- a/src/centre/Lib/LoadTasks.php +++ b/src/centre/Lib/LoadTasks.php @@ -28,7 +28,8 @@ class LoadTasks static private $column = [ "runStatus" => [\swoole_table::TYPE_INT, 1], - "runTime" => [\swoole_table::TYPE_INT, 4], + "runTimeStart" => [\swoole_table::TYPE_INT, 8], + "runTimeEnd" => [\swoole_table::TYPE_INT, 8], "taskname" => [\swoole_table::TYPE_STRING, 32], "rule" => [\swoole_table::TYPE_STRING, 32], "unique" => [\swoole_table::TYPE_INT, 1], @@ -45,6 +46,10 @@ class LoadTasks const T_START = 0;//正常 const T_STOP = 1;//暂停 + const RunStatus_normal = 0;//未运行 + const RunStatus_ing = 1;//运行中 + const RunStatus_end = 2;//运行结束 + /** * 初始化任务表 */ diff --git a/src/centre/Lib/Robot.php b/src/centre/Lib/Robot.php index bf5d8dd..eb0539c 100644 --- a/src/centre/Lib/Robot.php +++ b/src/centre/Lib/Robot.php @@ -48,33 +48,35 @@ public static function register($ip,$port) return false; } + /** + * 运行任务 + * @param $task + * @return bool|null + */ public static function Run($task) { - echo (date("Y-m-d H:i:s")."\n"); $num = count(self::$table); - echo "num:".$num."\n"; - - if ($num){ + if (!$num){ return false; } $rand = rand(1,$num); $n=0; foreach (self::$table as $robot) { - var_dump($robot); $n++; if ($rand == $num){ - print_r($num); $rect = Service::getInstance($robot["ip"],$robot["port"])->call("Exec::run",$task); $ret = $rect->getResult(30); if (empty($ret)){ - if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED){ + if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED || $rect->code == Swoole\Client\SOA_Result::ERR_CONNECT){ //TODO 重新选择服务逻辑 + Flog::log($robot["ip"].":".$robot["port"]."已停止服务"); + return false; } } return $ret; } } - return false; + return true; } } \ No newline at end of file diff --git a/src/centre/centre.php b/src/centre/centre.php index 94e9ee5..d4ac467 100644 --- a/src/centre/centre.php +++ b/src/centre/centre.php @@ -20,7 +20,7 @@ $setting = array( 'worker_num' => 2, - 'task_worker_num'=>2, + 'task_worker_num'=>8, 'max_request' => 1000, 'dispatch_mode' => 3, 'log_file' => __DIR__ . '/logs/swoole.log', diff --git a/src/centre/worker.php b/src/centre/worker.php index 4499972..c67cd98 100644 --- a/src/centre/worker.php +++ b/src/centre/worker.php @@ -19,7 +19,7 @@ $AppSvr->setLogger($logger); $setting = array( - 'worker_num' => 4, + 'worker_num' => 8, 'max_request' => 1000, 'dispatch_mode' => 3, 'log_file' => __DIR__ . '/logs/swoole.log', From 956ba827234bec31cbfd95cdd6641a84cc4ee145 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Wed, 31 Aug 2016 16:03:02 +0800 Subject: [PATCH 09/70] =?UTF-8?q?worker=E6=89=A7=E8=A1=8C=E5=AE=8C?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BB=A5=E5=90=8E=E9=80=9A=E7=9F=A5centre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/App/Exec.php | 18 +++++++++++++ src/centre/Lib/CentreServer.php | 10 +++++-- src/centre/Lib/LoadTasks.php | 11 +++++--- src/centre/Lib/Process.php | 33 +++++++++++++++++++++++ src/centre/Lib/Robot.php | 48 +++++++++++++++++++++++---------- src/centre/Lib/Tasks.php | 17 +++++++----- src/centre/Lib/WorkerServer.php | 44 +++++++++++++++++++++++++----- src/centre/worker.php | 3 ++- 8 files changed, 151 insertions(+), 33 deletions(-) diff --git a/src/centre/App/Exec.php b/src/centre/App/Exec.php index 6b8693c..1f5e5d9 100644 --- a/src/centre/App/Exec.php +++ b/src/centre/App/Exec.php @@ -9,6 +9,7 @@ namespace App; +use Lib\LoadTasks; use Lib\Process; class Exec @@ -17,4 +18,21 @@ public static function run($task) { Process::create_process($task); } + + public static function notify($tasks) + { + if (empty($tasks) || count($tasks) <= 0){ + return ["code"=>101,"msg"=>"The tasks can't be empty"]; + } + $header = LoadTasks::getTasks(); + foreach ($tasks as $task){ + if ($task["code"] == 0){ + $runStatus = LoadTasks::RunStatusSuccess; + }else{ + $runStatus = LoadTasks::RunStatusFailed; + } + $header->set($task["taskId"],["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); + } + return ["code"=>0]; + } } \ No newline at end of file diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php index 9914b2b..3f9cbe7 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/centre/Lib/CentreServer.php @@ -43,7 +43,7 @@ function onTask($serv, $task_id, $from_id, $data) $tmp["id"] = $id; $tmp["execute"] = $task["execute"]; $tmp["taskname"] = $task["taskname"]; - LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatus_ing,"runTimeStart"=>microtime()]); + LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatusStart,"runTimeStart"=>microtime()]); $ret[$id] = Robot::Run($tmp); } return $ret; @@ -54,7 +54,13 @@ function onFinish($serv, $task_id, $data) { if (is_array($data)){ foreach ($data as $id=>$v){ - LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatus_end,"runTimeEnd"=>microtime()]); + if ($v){ + $runStatus = LoadTasks::RunStatusToTaskSuccess;//运行成功 + }else{ + $runStatus = LoadTasks::RunStatusToTaskFailed;//运行失败 + } + LoadTasks::getTasks()->set($id,["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); + } } return; diff --git a/src/centre/Lib/LoadTasks.php b/src/centre/Lib/LoadTasks.php index 90b3958..15490de 100644 --- a/src/centre/Lib/LoadTasks.php +++ b/src/centre/Lib/LoadTasks.php @@ -29,7 +29,7 @@ class LoadTasks static private $column = [ "runStatus" => [\swoole_table::TYPE_INT, 1], "runTimeStart" => [\swoole_table::TYPE_INT, 8], - "runTimeEnd" => [\swoole_table::TYPE_INT, 8], + "runUpdateTime" => [\swoole_table::TYPE_INT, 8], "taskname" => [\swoole_table::TYPE_STRING, 32], "rule" => [\swoole_table::TYPE_STRING, 32], "unique" => [\swoole_table::TYPE_INT, 1], @@ -46,9 +46,12 @@ class LoadTasks const T_START = 0;//正常 const T_STOP = 1;//暂停 - const RunStatus_normal = 0;//未运行 - const RunStatus_ing = 1;//运行中 - const RunStatus_end = 2;//运行结束 + const RunStatusNormal = 0;//未运行 + const RunStatusStart = 1;//准备运行 + const RunStatusToTaskSuccess = 2;//发送任务成功 + const RunStatusToTaskFailed = 3;//发送任务失败 + const RunStatusSuccess = 4;//运行成功 + const RunStatusFailed = 5;//运行失败 /** * 初始化任务表 diff --git a/src/centre/Lib/Process.php b/src/centre/Lib/Process.php index e544d24..9d6a675 100644 --- a/src/centre/Lib/Process.php +++ b/src/centre/Lib/Process.php @@ -35,6 +35,9 @@ public static function init() self::$table->create(); } + /** + * 注册信号 + */ public static function signal() { \swoole_process::signal(SIGCHLD, function($sig) { @@ -47,6 +50,36 @@ public static function signal() } }); } + + /** + * 通知中心任务执行结果 + * @return bool + */ + public static function notify() + { + if (count(self::$table) >0){ + $procs= []; + foreach (self::$table as $pid=>$process){ + if ($process["status"] == self::PROCESS_STOP){ + $procs[$pid] = [ + "taskId"=>$process["taskId"], + "start"=>$process["start"], + "end"=>$process["end"], + "code"=>$process["code"], + ]; + } + } + $ret = Service::getInstance()->call("Exec::notify",$procs)->getResult(1); + if (empty($ret)){ + return false; + } + foreach ($procs as $pid=>$v){ + self::$table->del($pid); + } + } + return true; + } + /** * 创建一个子进程 * @param $task diff --git a/src/centre/Lib/Robot.php b/src/centre/Lib/Robot.php index eb0539c..d5a3d60 100644 --- a/src/centre/Lib/Robot.php +++ b/src/centre/Lib/Robot.php @@ -18,7 +18,6 @@ class Robot static private $column = [ "ip" => [\swoole_table::TYPE_STRING, 15], "port" => [\swoole_table::TYPE_INT, 4], - "status" => [\swoole_table::TYPE_INT, 1], ]; public static function init() { @@ -41,7 +40,7 @@ public static function register($ip,$port) { $client = new \swoole_client(SWOOLE_SOCK_TCP); if($client->connect($ip,$port)){ - if (self::$table->set(1,["ip"=>$ip,"port"=>$port,"status"=>0])){ + if (self::$table->set($ip.$port,["ip"=>$ip,"port"=>$port])){ return $client->close(); } } @@ -54,29 +53,50 @@ public static function register($ip,$port) * @return bool|null */ public static function Run($task) + { + if (($robot = self::selectWorker()) == false){ + return false; + } + if (!self::sendTask($robot,$task)){ + Flog::log("业务运行失败,task:".json_encode($task)); + return false; + } + return true; + } + + private static function sendTask($robot,$task) + { + $rect = Service::getInstance($robot["ip"],$robot["port"])->call("Exec::run",$task); + $rect->getResult(); + if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED || $rect->code == Swoole\Client\SOA_Result::ERR_CONNECT){ + Flog::log($robot["ip"].":".$robot["port"]."已停止服务"); + self::$table->del($robot["ip"].$robot["port"]); + if (($robot = self::selectWorker()) == false){ + return false; + } + return self::sendTask($robot,$task); + } + return true; + } + + private static function selectWorker() { $num = count(self::$table); if (!$num){ + Flog::log("No workers available"); return false; } $rand = rand(1,$num); $n=0; - foreach (self::$table as $robot) + foreach (self::$table as $k=>$robot) { $n++; if ($rand == $num){ - $rect = Service::getInstance($robot["ip"],$robot["port"])->call("Exec::run",$task); - $ret = $rect->getResult(30); - if (empty($ret)){ - if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED || $rect->code == Swoole\Client\SOA_Result::ERR_CONNECT){ - //TODO 重新选择服务逻辑 - Flog::log($robot["ip"].":".$robot["port"]."已停止服务"); - return false; - } - } - return $ret; + return $robot; } } - return true; + return false; } + + } \ No newline at end of file diff --git a/src/centre/Lib/Tasks.php b/src/centre/Lib/Tasks.php index 30b22d8..95fd5e3 100644 --- a/src/centre/Lib/Tasks.php +++ b/src/centre/Lib/Tasks.php @@ -14,7 +14,7 @@ class Tasks static private $table; static private $column = [ - "min" => [\swoole_table::TYPE_INT, 8], + "minute" => [\swoole_table::TYPE_INT, 8], "sec" => [\swoole_table::TYPE_INT, 8], "id" => [\swoole_table::TYPE_INT, 8], ]; @@ -49,7 +49,7 @@ public static function checkTasks() $time = strtotime(date("Y-m-d H:i")); foreach ($ret as $sec){ $k =Donkeyid::getInstance()->dk_get_next_id(); - self::$table->set($k,["min"=>$min,"sec"=>$time+$sec,"id"=>$id]); + self::$table->set($k,["minute"=>$min,"sec"=>$time+$sec,"id"=>$id]); } } } @@ -62,14 +62,19 @@ public static function checkTasks() */ private static function clean() { + $ids = []; if (count(self::$table) > 0){ - $min = date("YmdHi"); + $minute = date("YmdHi"); foreach (self::$table as $id=>$task){ - if ($min > $task["min"]){ - self::$table->del($id); + if (intval($minute) > intval($task["minute"])){ + $ids[] = $id; } } } + //删除 + foreach ($ids as $id){ + self::$table->del($id); + } } /** @@ -85,7 +90,7 @@ public static function getTasks() $min = date("YmdHi"); $time = time(); foreach (self::$table as $task){ - if ($min == $task["min"] ){ + if ($min == $task["minute"] ){ if ($time == $task["sec"]){ $data[] = $task["id"]; } diff --git a/src/centre/Lib/WorkerServer.php b/src/centre/Lib/WorkerServer.php index 22f584f..84c346f 100644 --- a/src/centre/Lib/WorkerServer.php +++ b/src/centre/Lib/WorkerServer.php @@ -15,16 +15,48 @@ class WorkerServer extends Swoole\Protocol\SOAServer public function onMasterStart($serv) { - $listenHost = \Lib\Util::listenHost(); - $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); - if (empty($ret) || $ret["code"]){ - echo $ret["msg"],"\n";exit; - } + } public function onWorkerStart($server, $worker_id) { - Process::signal();//注册信号 + if (!$server->taskworker){ + Process::signal();//注册信号 + if ($worker_id == 0){ + //10秒钟发送一次信号给中心服,证明自己的存在 + $server->tick(10000, function () use ($server) { + $this->register(); + }); + } + if ($worker_id == 1){ + //1秒判断一次任务执行状态,并通知主服务器 + $server->tick(1000, function () use ($server) { + $server->task("notify"); + }); + } + } + } + + function onTask($serv, $task_id, $from_id, $data) + { + if ($data == "notify"){ + Process::notify(); + } + return true; + } + function onFinish($serv, $task_id, $data) + { + return; + } + + + public function register() + { + $listenHost = \Lib\Util::listenHost(); + $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); + if (empty($ret) || $ret["code"]){ + Flog::log($ret["msg"]); + } } public function call($request, $header) diff --git a/src/centre/worker.php b/src/centre/worker.php index c67cd98..0e96454 100644 --- a/src/centre/worker.php +++ b/src/centre/worker.php @@ -20,6 +20,7 @@ $setting = array( 'worker_num' => 8, + 'task_worker_num'=>2, 'max_request' => 1000, 'dispatch_mode' => 3, 'log_file' => __DIR__ . '/logs/swoole.log', @@ -38,6 +39,6 @@ $server = Swoole\Network\Server::autoCreate($listenHost, PORT); $server->setProtocol($AppSvr); - $server->setProcessName("CentreServer"); + $server->setProcessName("WorkerServer"); $server->run($setting); }); From 26d4ef31d2d519f54eeac20c0d60424bc5f0f867 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Wed, 31 Aug 2016 19:31:25 +0800 Subject: [PATCH 10/70] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F=E7=9A=84=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=20=E5=AE=8C=E6=88=90=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E6=9C=8D=E5=92=8Cworker=E6=9C=8D=E6=8E=89=E7=BA=BF=E9=87=8D?= =?UTF-8?q?=E7=8E=B0=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/centre/App/Exec.php | 2 ++ src/centre/Lib/CentreServer.php | 15 ++++++++-- src/centre/Lib/Process.php | 11 ++++++- src/centre/Lib/Robot.php | 53 ++++++++++++++++++++++++++------- src/centre/Lib/Service.php | 11 +++++-- src/centre/Lib/TermLog.php | 34 +++++++++++++++++++++ src/centre/Lib/WorkerServer.php | 8 +++-- src/centre/configs/dev/log.php | 5 ++++ 8 files changed, 118 insertions(+), 21 deletions(-) create mode 100644 src/centre/Lib/TermLog.php diff --git a/src/centre/App/Exec.php b/src/centre/App/Exec.php index 1f5e5d9..66ef302 100644 --- a/src/centre/App/Exec.php +++ b/src/centre/App/Exec.php @@ -11,6 +11,7 @@ use Lib\LoadTasks; use Lib\Process; +use Lib\TermLog; class Exec { @@ -32,6 +33,7 @@ public static function notify($tasks) $runStatus = LoadTasks::RunStatusFailed; } $header->set($task["taskId"],["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); + TermLog::log("task已经执行完成,返回值:".json_encode($task),$task["taskId"]); } return ["code"=>0]; } diff --git a/src/centre/Lib/CentreServer.php b/src/centre/Lib/CentreServer.php index 3f9cbe7..5437ffe 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/centre/Lib/CentreServer.php @@ -16,14 +16,20 @@ function onWorkerStart($server, $worker_id) if (!$server->taskworker){ if ($worker_id == 0 ){ //$server->task("load"); + //准点载入任务 $server->after((60-date("s"))*1000,function () use ($server){ $server->task("load"); $server->tick(60000, function () use ($server) { $server->task("load"); }); }); + //清理过期的服务器 + $server->tick(1000, function () use ($server) { + Robot::clean(); + }); } if ($worker_id == 1){ + //定时执行任务 $server->tick(1000, function () use ($server) { $tasks = Tasks::getTasks(); $server->task($tasks); @@ -44,6 +50,7 @@ function onTask($serv, $task_id, $from_id, $data) $tmp["execute"] = $task["execute"]; $tmp["taskname"] = $task["taskname"]; LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatusStart,"runTimeStart"=>microtime()]); + TermLog::log("task任务开始:".json_encode($tmp),$id); $ret[$id] = Robot::Run($tmp); } return $ret; @@ -55,13 +62,15 @@ function onFinish($serv, $task_id, $data) if (is_array($data)){ foreach ($data as $id=>$v){ if ($v){ - $runStatus = LoadTasks::RunStatusToTaskSuccess;//运行成功 + $runStatus = LoadTasks::RunStatusToTaskSuccess;//发送成功 + TermLog::log("task任务发送成功",$id); }else{ - $runStatus = LoadTasks::RunStatusToTaskFailed;//运行失败 + $runStatus = LoadTasks::RunStatusToTaskFailed;//发送失败 + TermLog::log("task任务发送失败",$id); } LoadTasks::getTasks()->set($id,["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); - } + TermLog::flush(); } return; } diff --git a/src/centre/Lib/Process.php b/src/centre/Lib/Process.php index 9d6a675..864b8cb 100644 --- a/src/centre/Lib/Process.php +++ b/src/centre/Lib/Process.php @@ -46,6 +46,8 @@ public static function signal() $pid = $ret['pid']; if (self::$table->exist($pid)){ self::$table->set($pid,["status"=>self::PROCESS_STOP,"end"=>microtime(true),"code"=>$ret["code"]]); + $task = self::$table->get($pid); + TermLog::log("task执行完成:".json_encode($task),$task["taskId"]); } } }); @@ -69,10 +71,16 @@ public static function notify() ]; } } - $ret = Service::getInstance()->call("Exec::notify",$procs)->getResult(1); + TermLog::log("tasks通知中心服:".json_encode($procs)); + $service = new Service(); + $rect = $service->call("Exec::notify",$procs); + $ret = $rect->getResult(1); + unset($service); if (empty($ret)){ + TermLog::log("tasks通知中心服失败,code".$rect->code.",msg".$rect->msg); return false; } + foreach ($procs as $pid=>$v){ self::$table->del($pid); } @@ -90,6 +98,7 @@ public static function create_process($task) $cls->task = $task; $process = new \swoole_process(array($cls, "run")); if (($pid = $process->start())) { + TermLog::log("task开始执行:".json_encode($task),$task["id"]); self::$table->set($pid,["taskId"=>$task["id"],"status"=>self::PROCESS_START,"start"=>microtime(true)]); } } diff --git a/src/centre/Lib/Robot.php b/src/centre/Lib/Robot.php index d5a3d60..9e38527 100644 --- a/src/centre/Lib/Robot.php +++ b/src/centre/Lib/Robot.php @@ -13,11 +13,13 @@ class Robot { static private $table; + static private $ips; static private $column = [ "ip" => [\swoole_table::TYPE_STRING, 15], "port" => [\swoole_table::TYPE_INT, 4], + "lasttime"=>[\swoole_table::TYPE_INT, 8], ]; public static function init() { @@ -38,15 +40,38 @@ public static function init() */ public static function register($ip,$port) { - $client = new \swoole_client(SWOOLE_SOCK_TCP); - if($client->connect($ip,$port)){ - if (self::$table->set($ip.$port,["ip"=>$ip,"port"=>$port])){ - return $client->close(); - } + if (self::$table->set($ip.$port,["ip"=>$ip,"port"=>$port,"lasttime"=>time()])){ + return true; } return false; } + /** + * 清除过期的worker + */ + public static function clean() + { + if (count(self::$table)>0){ + $keys = []; + foreach (self::$table as $k=>$v){ + if ($v["lasttime"] < time()-10){ + $keys[] = $k; + } + } + + foreach ($keys as $k){ + self::$table->del($k); + } + } + } + + private static function loadIps() + { + foreach (self::$table as $k=>$v){ + self::$ips[$k] = $v; + } + } + /** * 运行任务 * @param $task @@ -54,11 +79,13 @@ public static function register($ip,$port) */ public static function Run($task) { + self::loadIps();//载入配置到本地变量 + if (($robot = self::selectWorker()) == false){ return false; } if (!self::sendTask($robot,$task)){ - Flog::log("业务运行失败,task:".json_encode($task)); + TermLog::log("task业务运行失败:".json_encode($task),$task["id"]); return false; } return true; @@ -66,29 +93,33 @@ public static function Run($task) private static function sendTask($robot,$task) { - $rect = Service::getInstance($robot["ip"],$robot["port"])->call("Exec::run",$task); + TermLog::log("task发送给:".$robot["ip"].":".$robot["port"],$task["id"]); + $server = new Service($robot["ip"],$robot["port"]); + $rect = $server->call("Exec::run",$task); $rect->getResult(); if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED || $rect->code == Swoole\Client\SOA_Result::ERR_CONNECT){ - Flog::log($robot["ip"].":".$robot["port"]."已停止服务"); - self::$table->del($robot["ip"].$robot["port"]); + TermLog::log($robot["ip"].":".$robot["port"]."已停止服务,code:".$rect->code,$task["id"]); + unset(self::$ips[$robot["ip"].$robot["port"]]); + unset($server); if (($robot = self::selectWorker()) == false){ return false; } return self::sendTask($robot,$task); } + unset($server); return true; } private static function selectWorker() { - $num = count(self::$table); + $num = count(self::$ips); if (!$num){ Flog::log("No workers available"); return false; } $rand = rand(1,$num); $n=0; - foreach (self::$table as $k=>$robot) + foreach (self::$ips as $k=>$robot) { $n++; if ($rand == $num){ diff --git a/src/centre/Lib/Service.php b/src/centre/Lib/Service.php index a0f011c..7a61000 100644 --- a/src/centre/Lib/Service.php +++ b/src/centre/Lib/Service.php @@ -6,18 +6,23 @@ class Service extends Swoole\Client\SOA protected $namespace = "App"; private static $insance = []; - public static function getInstance($ip="",$port="") + public function __construct($ip='',$port='') { + parent::__construct(); if (empty($ip) || empty($port)){ $config = Swoole::$php->config["crontab"]; $ip = $config["centre_host"]; $port = $config["centre_port"]; } + $this->addServers(array($ip.':'.$port)); + } + + public static function getInstance($ip="",$port="") + { if (isset(self::$insance[$ip.":".$port]) && !empty(self::$insance[$ip.":".$port])){ return self::$insance[$ip.":".$port]; } - $insance = new self(null); - $insance->addServers(array($ip.':'.$port)); + $insance = new self($ip,$port); self::$insance[$ip.":".$port] = $insance; return $insance; diff --git a/src/centre/Lib/TermLog.php b/src/centre/Lib/TermLog.php new file mode 100644 index 0000000..8ef7cd2 --- /dev/null +++ b/src/centre/Lib/TermLog.php @@ -0,0 +1,34 @@ +log(self::$key)->flush(); + } + + public static function log($value,$id="") + { + $text = ""; + if (!empty($id)){ + $text = $id."\t"; + } + $text .= is_scalar($value) ? $value : json_encode($value); + if (DEBUG == "on"){ + echo $text,"\n"; + } + \Swoole::$php->log(self::$key)->info($text); + } +} \ No newline at end of file diff --git a/src/centre/Lib/WorkerServer.php b/src/centre/Lib/WorkerServer.php index 84c346f..8ad2852 100644 --- a/src/centre/Lib/WorkerServer.php +++ b/src/centre/Lib/WorkerServer.php @@ -15,7 +15,7 @@ class WorkerServer extends Swoole\Protocol\SOAServer public function onMasterStart($serv) { - + $this->register(); } public function onWorkerStart($server, $worker_id) @@ -36,7 +36,7 @@ public function onWorkerStart($server, $worker_id) } } } - + function onTask($serv, $task_id, $from_id, $data) { if ($data == "notify"){ @@ -53,10 +53,12 @@ function onFinish($serv, $task_id, $data) public function register() { $listenHost = \Lib\Util::listenHost(); - $ret = Service::getInstance()->call("Robot::register",$listenHost,PORT)->getResult(); + $service = new Service(); + $ret = $service->call("Robot::register",$listenHost,PORT)->getResult(); if (empty($ret) || $ret["code"]){ Flog::log($ret["msg"]); } + unset($service); } public function call($request, $header) diff --git a/src/centre/configs/dev/log.php b/src/centre/configs/dev/log.php index 678b0a2..7d2d084 100644 --- a/src/centre/configs/dev/log.php +++ b/src/centre/configs/dev/log.php @@ -4,4 +4,9 @@ 'cut_file' => true, 'file' => WEBPATH . '/logs/application.log', ); +$log['term'] = array( + 'type' => 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/term.log', +); return $log; \ No newline at end of file From e72197e6f03a8a336934c84dc44cff5782c81132 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Thu, 1 Sep 2016 14:51:36 +0800 Subject: [PATCH 11/70] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/{centre => }/App/Exec.php | 14 +- src/{centre => }/App/Robot.php | 2 +- src/{centre => }/App/Tasks.php | 25 ++ src/{centre => }/Lib/CentreServer.php | 1 + src/{centre => }/Lib/Donkeyid.php | 6 + src/{centre => }/Lib/Flog.php | 1 + src/{centre => }/Lib/LoadTasks.php | 1 + src/{centre => }/Lib/ParseCrontab.php | 1 + src/{centre => }/Lib/Process.php | 4 + src/{centre => }/Lib/Robot.php | 14 +- src/{centre => }/Lib/Service.php | 5 + src/{centre => }/Lib/Tasks.php | 1 + src/{centre => }/Lib/TermLog.php | 1 + src/{centre => }/Lib/Util.php | 0 src/{centre => }/Lib/WorkerServer.php | 11 +- src/{centre => }/_init.php | 0 src/{centre => }/centre.php | 1 - src/centre/App/Cron.php | 24 -- src/centre/configs/dev/crontab.php | 17 -- src/centre/test/callTest.php | 41 --- src/config/config.php | 24 -- src/config/crontab.php | 27 -- src/config/worker.php | 23 -- src/configs/dev/crontab.php | 17 ++ src/{centre => }/configs/dev/db.php | 0 src/{centre => }/configs/dev/log.php | 0 src/{centre => }/configs/product/db.php | 0 src/{centre => }/configs/product/log.php | 0 src/{centre => }/configs/test/db.php | 0 src/{centre => }/configs/test/log.php | 0 src/include/Crontab.class.php | 255 ---------------- src/include/Log.class.php | 19 -- src/include/ParseCrontab.class.php | 120 -------- src/include/Process.class.php | 78 ----- src/include/TickTable.class.php | 49 --- src/include/Worker.class.php | 88 ------ src/include/loadtask/EasyDB.class.php | 278 ------------------ src/include/loadtask/LoadTasks.class.php | 43 --- .../loadtask/LoadTasksByFile.class.php | 67 ----- .../loadtask/LoadTasksByMysql.class.php | 113 ------- src/logs/log_2014-12-28.log | 6 - src/main.php | 250 ---------------- src/plugin/Cmd.class.php | 21 -- src/plugin/Gather.class.php | 17 -- src/plugin/Gearman.class.php | 27 -- src/plugin/PluginBase.class.php | 28 -- src/{centre => }/worker.php | 4 +- src/worker/ReadBookWorker.class.php | 24 -- src/worker/WorkerBase.class.php | 78 ----- test/callTest.php | 19 ++ test/http_test.php | 19 -- test/process_test.php | 46 --- {src/centre/test => test}/runTask.php | 5 +- test/swoole_table.php | 29 -- test/test.php | 43 --- 55 files changed, 119 insertions(+), 1868 deletions(-) rename src/{centre => }/App/Exec.php (77%) rename src/{centre => }/App/Robot.php (91%) rename src/{centre => }/App/Tasks.php (78%) rename src/{centre => }/Lib/CentreServer.php (99%) rename src/{centre => }/Lib/Donkeyid.php (96%) rename src/{centre => }/Lib/Flog.php (97%) rename src/{centre => }/Lib/LoadTasks.php (99%) rename src/{centre => }/Lib/ParseCrontab.php (99%) rename src/{centre => }/Lib/Process.php (96%) rename src/{centre => }/Lib/Robot.php (93%) rename src/{centre => }/Lib/Service.php (92%) rename src/{centre => }/Lib/Tasks.php (98%) rename src/{centre => }/Lib/TermLog.php (94%) rename src/{centre => }/Lib/Util.php (100%) rename src/{centre => }/Lib/WorkerServer.php (90%) rename src/{centre => }/_init.php (100%) rename src/{centre => }/centre.php (99%) delete mode 100644 src/centre/App/Cron.php delete mode 100644 src/centre/configs/dev/crontab.php delete mode 100644 src/centre/test/callTest.php delete mode 100644 src/config/config.php delete mode 100644 src/config/crontab.php delete mode 100644 src/config/worker.php create mode 100644 src/configs/dev/crontab.php rename src/{centre => }/configs/dev/db.php (100%) rename src/{centre => }/configs/dev/log.php (100%) rename src/{centre => }/configs/product/db.php (100%) rename src/{centre => }/configs/product/log.php (100%) rename src/{centre => }/configs/test/db.php (100%) rename src/{centre => }/configs/test/log.php (100%) delete mode 100644 src/include/Crontab.class.php delete mode 100644 src/include/Log.class.php delete mode 100644 src/include/ParseCrontab.class.php delete mode 100644 src/include/Process.class.php delete mode 100644 src/include/TickTable.class.php delete mode 100644 src/include/Worker.class.php delete mode 100644 src/include/loadtask/EasyDB.class.php delete mode 100644 src/include/loadtask/LoadTasks.class.php delete mode 100644 src/include/loadtask/LoadTasksByFile.class.php delete mode 100644 src/include/loadtask/LoadTasksByMysql.class.php delete mode 100644 src/logs/log_2014-12-28.log delete mode 100644 src/main.php delete mode 100644 src/plugin/Cmd.class.php delete mode 100644 src/plugin/Gather.class.php delete mode 100644 src/plugin/Gearman.class.php delete mode 100644 src/plugin/PluginBase.class.php rename src/{centre => }/worker.php (92%) delete mode 100644 src/worker/ReadBookWorker.class.php delete mode 100644 src/worker/WorkerBase.class.php create mode 100644 test/callTest.php delete mode 100644 test/http_test.php delete mode 100644 test/process_test.php rename {src/centre/test => test}/runTask.php (53%) delete mode 100644 test/swoole_table.php delete mode 100644 test/test.php diff --git a/src/centre/App/Exec.php b/src/App/Exec.php similarity index 77% rename from src/centre/App/Exec.php rename to src/App/Exec.php index 66ef302..b018e41 100644 --- a/src/centre/App/Exec.php +++ b/src/App/Exec.php @@ -7,19 +7,27 @@ */ namespace App; - - use Lib\LoadTasks; use Lib\Process; use Lib\TermLog; class Exec { + /** + * 中心服通知worker需要运行任务 + * @param $task + * @return bool + */ public static function run($task) { - Process::create_process($task); + return Process::create_process($task); } + /** + * worker回调中心服 任务执行状态 + * @param $tasks + * @return array + */ public static function notify($tasks) { if (empty($tasks) || count($tasks) <= 0){ diff --git a/src/centre/App/Robot.php b/src/App/Robot.php similarity index 91% rename from src/centre/App/Robot.php rename to src/App/Robot.php index 471dda7..a6a5c54 100644 --- a/src/centre/App/Robot.php +++ b/src/App/Robot.php @@ -13,7 +13,7 @@ class Robot { /** - * 注册服务 + * worker向中心服注册服务 * @param $ip * @param $port * @return array diff --git a/src/centre/App/Tasks.php b/src/App/Tasks.php similarity index 78% rename from src/centre/App/Tasks.php rename to src/App/Tasks.php index e612864..30752c6 100644 --- a/src/centre/App/Tasks.php +++ b/src/App/Tasks.php @@ -13,6 +13,10 @@ class Tasks { + /** + * 获取任务列表 + * @return array + */ public static function getList() { $data = []; @@ -24,6 +28,11 @@ public static function getList() return array('data' => $data); } + /** + * 获取单个任务 + * @param $id + * @return array + */ public static function get($id) { $tasks = LoadTasks::getTasks(); @@ -35,6 +44,11 @@ public static function get($id) return ["code"=>0,"data"=>$task]; } + /** + * 添加任务 + * @param $task + * @return array + */ public static function add($task) { $task["id"] = Donkeyid::getInstance()->dk_get_next_id(); @@ -45,6 +59,12 @@ public static function add($task) return ["code"=>0,"data"=>$ids,"msg"=>"保存成功"]; } + /** + * 修改任务 + * @param $id + * @param $task + * @return array + */ public static function update($id,$task) { if (!LoadTasks::updateTask($id,$task)){ @@ -53,6 +73,11 @@ public static function update($id,$task) return ["code"=>0,"data"=>'',"msg"=>"更新成功"]; } + /** + * 删除任务 + * @param $id + * @return array + */ public static function delete($id) { if (!LoadTasks::delTask($id)){ diff --git a/src/centre/Lib/CentreServer.php b/src/Lib/CentreServer.php similarity index 99% rename from src/centre/Lib/CentreServer.php rename to src/Lib/CentreServer.php index 5437ffe..6b22602 100644 --- a/src/centre/Lib/CentreServer.php +++ b/src/Lib/CentreServer.php @@ -1,5 +1,6 @@ >self::TIMESTAMP_LEFT_SHIFT)+($this->epoch*1000); diff --git a/src/centre/Lib/Flog.php b/src/Lib/Flog.php similarity index 97% rename from src/centre/Lib/Flog.php rename to src/Lib/Flog.php index 7a43b4d..4cdf751 100644 --- a/src/centre/Lib/Flog.php +++ b/src/Lib/Flog.php @@ -1,5 +1,6 @@ start())) { TermLog::log("task开始执行:".json_encode($task),$task["id"]); self::$table->set($pid,["taskId"=>$task["id"],"status"=>self::PROCESS_START,"start"=>microtime(true)]); + return true; } + return false; } /** diff --git a/src/centre/Lib/Robot.php b/src/Lib/Robot.php similarity index 93% rename from src/centre/Lib/Robot.php rename to src/Lib/Robot.php index 9e38527..8e2673a 100644 --- a/src/centre/Lib/Robot.php +++ b/src/Lib/Robot.php @@ -1,5 +1,6 @@ $v){ @@ -73,7 +75,7 @@ private static function loadIps() } /** - * 运行任务 + * 执行任务 * @param $task * @return bool|null */ @@ -91,6 +93,12 @@ public static function Run($task) return true; } + /** + * 分发任务 + * @param $robot + * @param $task + * @return bool + */ private static function sendTask($robot,$task) { TermLog::log("task发送给:".$robot["ip"].":".$robot["port"],$task["id"]); @@ -110,6 +118,10 @@ private static function sendTask($robot,$task) return true; } + /** + * 选择能执行任务的worker + * @return bool + */ private static function selectWorker() { $num = count(self::$ips); diff --git a/src/centre/Lib/Service.php b/src/Lib/Service.php similarity index 92% rename from src/centre/Lib/Service.php rename to src/Lib/Service.php index 7a61000..2707340 100644 --- a/src/centre/Lib/Service.php +++ b/src/Lib/Service.php @@ -1,4 +1,9 @@ register(); } @@ -40,6 +41,7 @@ public function onWorkerStart($server, $worker_id) function onTask($serv, $task_id, $from_id, $data) { if ($data == "notify"){ + //通知中心服 Process::notify(); } return true; @@ -50,6 +52,9 @@ function onFinish($serv, $task_id, $data) } + /** + * 连接中心服注册服务 + */ public function register() { $listenHost = \Lib\Util::listenHost(); @@ -66,7 +71,7 @@ public function call($request, $header) //初始化日志 Flog::startLog($request['call']); Flog::log("call:".$request['call'].",params:".json_encode($request['params'])); - $ret = parent::call($request, $header); // TODO: Change the autogenerated stub + $ret = parent::call($request, $header); Flog::log($ret); Flog::endLog(); Flog::flush(); diff --git a/src/centre/_init.php b/src/_init.php similarity index 100% rename from src/centre/_init.php rename to src/_init.php diff --git a/src/centre/centre.php b/src/centre.php similarity index 99% rename from src/centre/centre.php rename to src/centre.php index d4ac467..426015f 100644 --- a/src/centre/centre.php +++ b/src/centre.php @@ -11,7 +11,6 @@ Swoole\Network\Server::setPidFile(__DIR__ . '/logs/centre.pid'); - Swoole\Network\Server::start(function () { $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/centre.log']); diff --git a/src/centre/App/Cron.php b/src/centre/App/Cron.php deleted file mode 100644 index 4880901..0000000 --- a/src/centre/App/Cron.php +++ /dev/null @@ -1,24 +0,0 @@ -$task) - { - $data[$id] = $task; - } - return array('data' => $data); - } -} \ No newline at end of file diff --git a/src/centre/configs/dev/crontab.php b/src/centre/configs/dev/crontab.php deleted file mode 100644 index 6a4ceb4..0000000 --- a/src/centre/configs/dev/crontab.php +++ /dev/null @@ -1,17 +0,0 @@ -"8192", - "tasks_size"=>"1024", - "robot_num_max"=>"8", - "robot_process_max"=>"128", - "centre_host"=>"127.0.0.1", - "centre_port"=>"8901", -]; \ No newline at end of file diff --git a/src/centre/test/callTest.php b/src/centre/test/callTest.php deleted file mode 100644 index 6b40213..0000000 --- a/src/centre/test/callTest.php +++ /dev/null @@ -1,41 +0,0 @@ -addServers(["127.0.0.1:8901"]); -$task = [ - "taskname"=>"测试任务1", - "rule"=>"* * * * * *", - "unique"=>"0", - "execute"=>"echo 'aa' ", -]; -$ret = $server->call("Tasks::add",$task)->getResult(); -var_dump($ret); - -//$id = $ret["data"][0]; -//$task = []; -//$task = [ -// $id, -// ["status"=>"1"], -//]; -// -//$ret = $service->task("App\\Tasks::update",$task)->getResult(); -//var_dump($ret); -// -//$ret = $service->task("App\\Tasks::get",[$id])->getResult(); -//var_dump($ret); -// -//$ret = $service->task("App\\Tasks::getList")->getResult(); -//var_dump($ret); -//$ret = $service->task("App\\Tasks::delete",[$id])->getResult(); -//var_dump($ret); -// -//$ret = $service->task("App\\Tasks::getList")->getResult(); -//var_dump($ret); \ No newline at end of file diff --git a/src/config/config.php b/src/config/config.php deleted file mode 100644 index b8dc9e7..0000000 --- a/src/config/config.php +++ /dev/null @@ -1,24 +0,0 @@ - array( - 'host' => '127.0.0.1', - 'port' => 3306, - 'username' => 'root', - 'password' => 'root', - 'dbname' => 'crontab', - 'charset' => 'utf8' - ), - "log"=>array( - "level"=>"debug", - "type"=>"file", - "log_path"=> ROOT_PATH."logs/", - ) -); - diff --git a/src/config/crontab.php b/src/config/crontab.php deleted file mode 100644 index 895fa44..0000000 --- a/src/config/crontab.php +++ /dev/null @@ -1,27 +0,0 @@ - - array( - 'taskname' => 'php -i', //任务名称 - 'rule' => '* * * * * *',//定时规则 - "unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行 - 'execute' => 'Cmd',//命令处理类 - 'args' => - array( - 'cmd' => 'php -i',//命令 - 'ext' => '',//附加属性 - ), - ), - 'taskid2' => - array( - 'taskname' => 'test', //任务名称 - 'rule' => array("22:30","22:22:58","22:24:36"), - "unique" => 1, //排他数量,如果已经有这么多任务在执行,即使到了下一次执行时间,也不执行 - "execute" =>"Gather", - 'args' => - array( - 'cmd' => 'gather',//命令 - 'ext' => '',//附加属性 - ), - ), -); diff --git a/src/config/worker.php b/src/config/worker.php deleted file mode 100644 index 99077a5..0000000 --- a/src/config/worker.php +++ /dev/null @@ -1,23 +0,0 @@ -array( - "name"=>"队列1", //备注名 - "processNum"=>1, //启动的进程数量 - "redis"=>array( - "host"=>"127.0.0.1", // redis ip - "port"=>6379, // redis端口 - "timeout"=>30, // 链接超时时间 - "db"=>0, // redis的db号 - "queue"=>"abc" // redis队列名 - ) - ) -); \ No newline at end of file diff --git a/src/configs/dev/crontab.php b/src/configs/dev/crontab.php new file mode 100644 index 0000000..3c2c9e9 --- /dev/null +++ b/src/configs/dev/crontab.php @@ -0,0 +1,17 @@ +"8192",//最多载入任务数量 + "tasks_size"=>"1024",//同时运行任务最大数量 + "robot_num_max"=>"8",//同时挂载worker数量 + "robot_process_max"=>"128",//单个worker同时执行任务数量 + "centre_host"=>"127.0.0.1",//中心服ip + "centre_port"=>"8901",//中心服端口 +]; \ No newline at end of file diff --git a/src/centre/configs/dev/db.php b/src/configs/dev/db.php similarity index 100% rename from src/centre/configs/dev/db.php rename to src/configs/dev/db.php diff --git a/src/centre/configs/dev/log.php b/src/configs/dev/log.php similarity index 100% rename from src/centre/configs/dev/log.php rename to src/configs/dev/log.php diff --git a/src/centre/configs/product/db.php b/src/configs/product/db.php similarity index 100% rename from src/centre/configs/product/db.php rename to src/configs/product/db.php diff --git a/src/centre/configs/product/log.php b/src/configs/product/log.php similarity index 100% rename from src/centre/configs/product/log.php rename to src/configs/product/log.php diff --git a/src/centre/configs/test/db.php b/src/configs/test/db.php similarity index 100% rename from src/centre/configs/test/db.php rename to src/configs/test/db.php diff --git a/src/centre/configs/test/log.php b/src/configs/test/log.php similarity index 100% rename from src/centre/configs/test/log.php rename to src/configs/test/log.php diff --git a/src/include/Crontab.class.php b/src/include/Crontab.class.php deleted file mode 100644 index 0663ac1..0000000 --- a/src/include/Crontab.class.php +++ /dev/null @@ -1,255 +0,0 @@ -loadWorker(); - } - } - - /** - * 过去当前进程的pid - */ - static private function get_pid() - { - if (!function_exists("posix_getpid")) { - self::exit2p("Please install posix extension."); - } - self::$pid = posix_getpid(); - } - - /** - * 写入当前进程的pid到pid文件 - */ - static private function write_pid() - { - file_put_contents(self::$pid_file, self::$pid); - } - - /** - * 根据配置载入需要执行的任务 - */ - static public function load_config() - { - $time = time(); - $config = self::$tasksHandle->getTasks(self::$taskParams); - foreach ($config as $id => $task) { - $ret = ParseCrontab::parse($task["rule"], $time); - if ($ret === false) { - Main::log_write(ParseCrontab::$error); - } elseif (!empty($ret)) { - TickTable::set_task($ret, array_merge($task, array("id" => $id))); - } - } - } - - /** - * 注册定时任务 - */ - static protected function register_timer() - { - swoole_timer_tick(60000, function () { - Crontab::load_config(); - }); - swoole_timer_tick(1000, function ($interval) { - Crontab::do_something($interval); - }); - } - - /** - * 运行任务 - * @param $interval - * @return bool - */ - static public function do_something($interval) - { - - //是否设置了延时执行 -// if (!empty(self::$delay)) { -// foreach (self::$delay as $pid => $task) { -// if (time() >= $task["start"]) { -// (new Process())->create_process($task["task"]["id"], $task["task"]); -// unset(self::$delay[$pid]); -// } -// } -// } - $tasks = TickTable::get_task(); - if (empty($tasks)) return false; - foreach ($tasks as $task) { - if (isset($task["unique"]) && $task["unique"]) { - if (isset(self::$unique_list[$task["id"]]) && (self::$unique_list[$task["id"]] >= $task["unique"])) { - continue; - } - self::$unique_list[$task["id"]] = isset(self::$unique_list[$task["id"]]) ? (self::$unique_list[$task["id"]] + 1) : 0; - } - (new Process())->create_process($task["id"], $task); - } - return true; - } - - /** - * 注册信号 - */ - static private function register_signal() - { - swoole_process::signal(SIGTERM, function ($signo) { - self::exit2p("收到退出信号,退出主进程"); - }); - swoole_process::signal(SIGCHLD, function ($signo) { - while ($ret = swoole_process::wait(false)) { - $pid = $ret['pid']; - if (isset(self::$task_list[$pid])) { - $task = self::$task_list[$pid]; - if ($task["type"] == "crontab") { - $end = microtime(true); - $start = $task["start"]; - $id = $task["id"]; - Main::log_write("{$id} [Runtime:" . sprintf("%0.6f", $end - $start) . "]"); - $task["process"]->close();//关闭进程 - unset(self::$task_list[$pid]); - if (isset(self::$unique_list[$id]) && self::$unique_list[$id] > 0) { - self::$unique_list[$id]--; - } - } - if ($task["type"] == "worker") { - $end = microtime(true); - $start = $task["start"]; - $classname = $task["classname"]; - Main::log_write("{$classname}_{$task["number"]} [Runtime:" . sprintf("%0.6f", $end - $start) . "]"); - $task["process"]->close();//关闭进程 - (new Worker())->create_process($classname, $task["number"], $task["redis"]); - } - } - }; - }); - swoole_process::signal(SIGUSR1, function ($signo) { - //TODO something - }); - - } -} \ No newline at end of file diff --git a/src/include/Log.class.php b/src/include/Log.class.php deleted file mode 100644 index 5cdd092..0000000 --- a/src/include/Log.class.php +++ /dev/null @@ -1,19 +0,0 @@ - self::_parse_cron_number($cron[0], 0, 59), - 'minutes' => self::_parse_cron_number($cron[1], 0, 59), - 'hours' => self::_parse_cron_number($cron[2], 0, 23), - 'day' => self::_parse_cron_number($cron[3], 1, 31), - 'month' => self::_parse_cron_number($cron[4], 1, 12), - 'week' => self::_parse_cron_number($cron[5], 0, 6), - ); - } elseif (count($cron) == 5) { - $date = array( - 'second' => array(1 => 1), - 'minutes' => self::_parse_cron_number($cron[0], 0, 59), - 'hours' => self::_parse_cron_number($cron[1], 0, 23), - 'day' => self::_parse_cron_number($cron[2], 1, 31), - 'month' => self::_parse_cron_number($cron[3], 1, 12), - 'week' => self::_parse_cron_number($cron[4], 0, 6), - ); - } - if ( - in_array(intval(date('i', $start)), $date['minutes']) && - in_array(intval(date('G', $start)), $date['hours']) && - in_array(intval(date('j', $start)), $date['day']) && - in_array(intval(date('w', $start)), $date['week']) && - in_array(intval(date('n', $start)), $date['month']) - - ) { - return $date['second']; - } - return null; - } - - /** - * 解析单个配置的含义 - * @param $s - * @param $min - * @param $max - * @return array - */ - static protected function _parse_cron_number($s, $min, $max) - { - $result = array(); - $v1 = explode(",", $s); - foreach ($v1 as $v2) { - $v3 = explode("/", $v2); - $step = empty($v3[1]) ? 1 : $v3[1]; - $v4 = explode("-", $v3[0]); - $_min = count($v4) == 2 ? $v4[0] : ($v3[0] == "*" ? $min : $v3[0]); - $_max = count($v4) == 2 ? $v4[1] : ($v3[0] == "*" ? $max : $v3[0]); - for ($i = $_min; $i <= $_max; $i += $step) { - $result[$i] = intval($i); - } - } - ksort($result); - return $result; - } - - static protected function _parse_array($crontab_array, $start_time) - { - $result = array(); - foreach ($crontab_array as $val) { - if(count(explode(":",$val)) == 2){ - $val = $val.":01"; - } - $time = strtotime($val); - if ($time >= $start_time && $time < $start_time + 60) { - $result[$time] = $time; - } - } - return $result; - } -} \ No newline at end of file diff --git a/src/include/Process.class.php b/src/include/Process.class.php deleted file mode 100644 index eee2a6f..0000000 --- a/src/include/Process.class.php +++ /dev/null @@ -1,78 +0,0 @@ -task = $task; - $process = new swoole_process(array($this, "run")); - if (!($pid = $process->start())) { - - } - //记录当前任务 - Crontab::$task_list[$pid] = array( - "start" => microtime(true), - "id" => $id, - "task" => $task, - "type" => "crontab", - "process" =>$process, - ); -// swoole_event_add($process->pipe, function ($pipe) use ($process) { -// $task = $process->read(); -// list($pid, $sec) = explode(",", $task); -// if (isset(Crontab::$task_list[$pid])) { -// $tasklist = Crontab::$task_list[$pid]; -// Crontab::$delay[$pid] = array("start"=>time() + $sec,"task"=>$tasklist["task"]); -// $process->write($task); -// } -// }); - } - - /** - * 子进程执行的入口 - * @param $worker - */ - public function run($worker) - { - $class = $this->task["execute"]; - $worker->name("lzm_crontab_" . $class . "_" . $this->task["id"]); - $this->autoload($class); - $c = new $class; - $c->worker = $worker; - $c->run($this->task["args"]); - self::_exit($worker); - } - - private function _exit($worker) - { - $worker->exit(1); - } - - /** - * 子进程 自动载入需要运行的工作类 - * @param $class - */ - public function autoload($class) - { - include(ROOT_PATH . "plugin" . DS . "PluginBase.class.php"); - $file = ROOT_PATH . "plugin" . DS . $class . ".class.php"; - if (file_exists($file)) { - include($file); - } else { - Main::log_write("处理类不存在"); - } - } -} - diff --git a/src/include/TickTable.class.php b/src/include/TickTable.class.php deleted file mode 100644 index c3f9bae..0000000 --- a/src/include/TickTable.class.php +++ /dev/null @@ -1,49 +0,0 @@ - 60){ - self::getInstance()->insert(array("tick"=>$sec,"task"=>$task)); - }else{ - self::getInstance()->insert(array("tick"=>$time+$sec,"task"=>$task)); - } - } - } - - public static function get_task(){ - $time = time(); - $ticks = array(); - while(self::getInstance()->valid()){ - $data = self::getInstance()->extract(); - if($data["tick"] > $time){ - self::getInstance()->insert($data); - break; - }else{ - $ticks[] = $data["task"]; - } - } - return $ticks; - } -} - diff --git a/src/include/Worker.class.php b/src/include/Worker.class.php deleted file mode 100644 index 765e2fa..0000000 --- a/src/include/Worker.class.php +++ /dev/null @@ -1,88 +0,0 @@ -getWorkers() as $classname => $task) { - for ($i = 1; $i <= $task["processNum"]; $i++) { - $this->create_process($classname, $i, $task["redis"]); - } - } - } - - protected function getWorkers() - { - $path = ROOT_PATH . "config/worker.php"; - $config = include $path; - if (empty($config)) { - return array(); - } - return $config; - } - - /** - * 创建一个子进程 - * @param $classname - * @param $number - * @param $redis - */ - public function create_process($classname, $number, $redis) - { - $this->workers["classname"] = $classname; - $this->workers["number"] = $number; - $this->workers["redis"] = $redis; - $process = new swoole_process(array($this, "run")); - if (!($pid = $process->start())) { - - } - //记录当前任务 - Crontab::$task_list[$pid] = array( - "start" => microtime(true), - "classname" => $classname, - "number" => $number, - "redis" => $redis, - "type" => "worker", - "process"=>$process - ); - } - - /** - * 子进程执行的入口 - * @param $worker - */ - public function run($worker) - { - $class = $this->workers["classname"]; - $number = $this->workers["number"]; - $worker->name("lzm_worker_" . $class . "_" . $number); - $this->autoload($class); - $class = $class . "Worker"; - $w = new $class; - $w->content($this->workers["redis"]); - $w->tick($worker); - } - - /** - * 子进程 自动载入需要运行的工作类 - * @param $class - */ - public function autoload($class) - { - include(ROOT_PATH . "worker/WorkerBase.class.php"); - $file = ROOT_PATH . "worker/" . $class . "Worker" . ".class.php"; - if (file_exists($file)) { - include($file); - } else { - Main::log_write("处理类不存在"); - } - } -} \ No newline at end of file diff --git a/src/include/loadtask/EasyDB.class.php b/src/include/loadtask/EasyDB.class.php deleted file mode 100644 index f365500..0000000 --- a/src/include/loadtask/EasyDB.class.php +++ /dev/null @@ -1,278 +0,0 @@ -db_config = array( - 'host' => '127.0.0.1', - 'port' => 3306, - 'username' => 'root', - 'password' => '', - 'dbname' => 'test', - 'charset' => 'utf8' - ); - $this->db_config = array_merge($this->db_config, $config); - try { - $dsn = 'mysql:host='.$this->db_config['host'].';port='.$this->db_config['port'].';dbname='.$this->db_config['dbname']; - parent::__construct($dsn, $this->db_config['username'], $this->db_config['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.$this->db_config['charset'])); - $this->exec('set names '.$this->db_config['charset']); - } catch (PDOException $e) { - echo '

db connect has error!


错误原因:'.$e->getMessage().'
错误报告:'; - echo '
';
-            var_dump($e);
-            echo '
'; - exit(); - } - } - - /* - * 执行一条SQL语句,适用于比较复杂的SQL语句 - * 如果是增删改查的语句,建议使用下面进一步封装的语句 - * 返回值:执行后的结果对象 - */ - public function queryObj($sql, $data = array()){ - $this->lastsql = $sql; - $stmt = $this->prepare($sql); - $stmt->execute($data) ? true : $this->error_info = $stmt->errorInfo(); - return $stmt; - } - - public function executeSql($sql){ - $stmt = $this->prepare($sql); - return $stmt->execute(array()); - } - - //查询语句,返回单条结果 - //返回值:一维数组 - public function queryOne($sql, $data = array(), $type = ''){ - $type = !empty($type) ? $type : $this->fetch_type; - return $this->queryObj($sql, $data)->fetch($type); - } - - //查询语句,返回所有结果 - //返回值:二维数组 - public function queryAll($sql, $data = array(), $type = ''){ - $type = !empty($type) ? $type : $this->fetch_type; - return $this->queryObj($sql, $data)->fetchAll($type); - } - - //执行结果为影响到的行数,只能是insert/delete/update语句 - //返回值:数字,影响到的行数 - public function querySql($sql, $data = array()){ - return $this->queryObj($sql, $data)->rowCount(); - } - - //查询总条目 - public function count($table, $where = '', $data = array()){ - $sql = 'select count(*) as total from `'.$table.'` '; - $sql .= !empty($where) ? ' WHERE '.$where : ''; - $r = $this->queryOne($sql, $data); - return isset($r['total']) ? (int)$r['total'] : 0; - } - - //插入方法,返回值为影响的行数 - //$idata为键值对数组,如array('name'=>'test','age'=>18);其中键为表字段,值为数值 - public function insert($table, $idata){ - $key = array_keys($idata); - $set = ''; - foreach ($key as $v){ - $set .= $v.'=?,'; - } - $set = !empty($set) ? trim($set,',') : ''; - $value = array_values($idata); - return $this->table_insert($table)->setdata($set)->go($value); - } - - //删除语句,返回值同上 - //$idata为条件键值对,如array('name'=>'test','age'=>18);其中键为表字段,值为数值.条件之间的关系为and - public function delete($table, $idata){ - $key = array_keys($idata); - $where = ''; - foreach ($key as $v){ - $where .= '`'.$v.'`=? AND'; - } - $where = !empty($where) ? trim($where, 'AND') : '1=2'; - $value = array_values($idata); - return $this->table_delete($table)->where($where)->go($value); - } - - //更新语句,返回值同上 - /* public function update($sql, $data = array()){ - return $this->querySql($sql, $data); - } */ - - public function update($table, $set, $where){ - $set_ = ''; - $set_key = array_keys($set); - $value = array_values($set); - foreach ($set_key as $v){ - $set_ .= $v.'=?,'; - } - $set_ = trim($set_, ','); - $where_ = ''; - $where_key = array_keys($where); - $where_value = array_values($where); - foreach ($where_key as $v){ - $where_ .= '`'.$v.'`=? AND'; - } - $where_ = !empty($where_) ? trim($where_, 'AND') : '1=2'; - $value = array_merge($value, $where_value); - return $this->table_update($table)->setdata($set_)->where($where_)->go($value); - } - - /* - * 下面是链式操作的一些方法 - * 使用方式类似于 $db->table_select('mytable')->where('id=2')->go(); - * 注意: - * 链式的第一个方法必须是table_????() - * 链式的最后一个方法必须是go(),如果在链式中使用了预编译占位符,需要在go($data)传入参数 - */ - - //查询链式起点,$table:表名 - public function table_select($table){ - $this->sql_stmt = 'SELECT $field$ FROM `$table$` $where$ $other$'; - $this->sql_stmt = str_replace('$table$', $table, $this->sql_stmt); - $this->query_type = 'select'; - return $this; - } - - //更新链式起点,$table:表名 - public function table_update($table){ - $this->sql_stmt = 'UPDATE `$table$` $set$ $where$'; - $this->sql_stmt = str_replace('$table$', $table, $this->sql_stmt); - $this->query_type = 'update'; - return $this; - } - - //删除链式起点,$table:表名 - public function table_delete($table){ - $this->sql_stmt = 'DELETE FROM `$table$` $where$'; - $this->sql_stmt = str_replace('$table$', $table, $this->sql_stmt); - $this->query_type = 'delete'; - return $this; - } - - //插入链式起点,$table:表名 - public function table_insert($table){ - $this->sql_stmt = 'INSERT INTO `$table$` $set$'; - $this->sql_stmt = str_replace('$table$', $table, $this->sql_stmt); - $this->query_type = 'insert'; - return $this; - } - - //链式执行结点,如果链式中使用了预编译占位符,需要在$data参数中传入 - //$data:占位符数据, - //$multi:true,false 返回数据是多条还是一条,只适用于select查询,默认多条 - //$fetch_type:返回数据集的格式,默认索引 - public function go($data = array(), $multi = true, $fetch_type = ''){ - switch ($this->query_type){ - case 'select': - $this->sql_stmt = str_replace('$field$', '*', $this->sql_stmt); - $this->sql_stmt = str_replace(array( - '$other$','$where$' - ), '', $this->sql_stmt); - if ($multi){ - return $this->queryAll($this->sql_stmt, $data, $fetch_type); - }else{ - return $this->queryOne($this->sql_stmt, $data, $fetch_type); - } - break; - - case 'insert': - case 'delete': - $this->sql_stmt = str_replace('$set$', '', $this->sql_stmt); - $this->sql_stmt = str_replace('$where$', ' WHERE 1=2', $this->sql_stmt); - return $this->querySql($this->sql_stmt, $data); - break; - - case 'update': - $this->sql_stmt = str_replace('$set$', '', $this->sql_stmt); - $this->sql_stmt = str_replace('$where$', ' WHERE 1=2', $this->sql_stmt); - $r = $this->queryObj($this->sql_stmt, $data)->errorInfo(); - return isset($r[2]) ? false : true; - break; - - default:break; - } - } - - //链式操作的一些方法 - //field(),where(),order(),group(),limit(),setdata() - public function __call($name, $args){ - - switch (strtoupper($name)){ - case 'FIELD': - $field = !empty($args[0]) ? $args[0] : '*'; - $this->sql_stmt = str_replace('$field$', $field, $this->sql_stmt); - break; - case 'WHERE': - $where = !empty($args[0]) ? ' WHERE '.$args[0] : ''; - $this->sql_stmt = str_replace('$where$', $where, $this->sql_stmt); - break; - case 'ORDER': - $order = !empty($args[0]) ? ' ORDER BY '.$args[0].' $other$' : '$other$'; - $this->sql_stmt = str_replace('$other$', $order, $this->sql_stmt); - break; - case 'GROUP': - $group = !empty($args[0]) ? ' GROUP BY '.$args[0].' $other$' : '$other$'; - $this->sql_stmt = str_replace('$other$', $group, $this->sql_stmt); - break; - case 'LIMIT': - $limit = !empty($args) ? ' $other$ LIMIT '.implode(',', $args) : '$other$'; - $this->sql_stmt = str_replace('$other$', $limit, $this->sql_stmt); - break; - case 'SETDATA': - $set = !empty($args[0]) ? ' SET '.$args[0] : ''; - $this->sql_stmt = str_replace('$set$', $set, $this->sql_stmt); - break; - } - return $this; - } - - //获取正在执行的sql语句 - public function getLastSql(){ - return $this->lastsql; - } - - //设置查询结果集类型 - public function setFetchType($type){ - $this->fetch_type = $type; - } - - //获取错误信息 - public function getErrorInfo($writeLog = false){ - return $writeLog ? $this->log() : array_merge($this->error_info, array('sql'=>$this->lastsql)); - } - - //记录日志 - private function log(){ - try { - $log = "[".date('Y-m-d H:i:s')."]\n"; - $log .= '执行语句:'.$this->lastsql."\n"; - $log .= '错误代码:'.$this->error_info[0]."\n"; - $log .= '错误类型:'.$this->error_info[1]."\n"; - $log .= '错误描述:'.$this->error_info[2]."\n\n"; - file_put_contents($this->log_path, $log, FILE_APPEND); - return ''; - } catch (Exception $e) { - echo $e->getMessage(); - exit(); - } - } - - - - -} \ No newline at end of file diff --git a/src/include/loadtask/LoadTasks.class.php b/src/include/loadtask/LoadTasks.class.php deleted file mode 100644 index 7e934a2..0000000 --- a/src/include/loadtask/LoadTasks.class.php +++ /dev/null @@ -1,43 +0,0 @@ -handle = new LoadTasksByFile($params); - break; - case "mysql": - $this->handle = new LoadTasksByMysql($params); - break; - default: - $this->handle = new LoadTasksByFile($params); - break; - } - } - - /** - * 获取需要执行的任务 - * @return array - */ - public function getTasks() - { - return $this->handle->getTasks(); - } - - /** - * 重载任务配置 - */ - public function reloadTasks() - { - $this->handle->reloadTasks(); - } -} \ No newline at end of file diff --git a/src/include/loadtask/LoadTasksByFile.class.php b/src/include/loadtask/LoadTasksByFile.class.php deleted file mode 100644 index a42a378..0000000 --- a/src/include/loadtask/LoadTasksByFile.class.php +++ /dev/null @@ -1,67 +0,0 @@ -filePath = $file; - } - - /** - * 返回格式化好的任务配置 - * @return array - */ - public function getTasks() - { - $this->loadTasks(); - return self::parseTasks(); - } - - public function reloadTasks() - { - $this->loadTasks(); - $this->config = $this->parseTasks(); - } - - /** - * 从配置文件载入配置 - */ - protected function loadTasks() - { - $this->oriTasks = include($this->filePath); - } - - /** - * 格式化配置文件中的配置 - * @return array - */ - protected function parseTasks() - { - $tasks = array(); - if (is_array($this->oriTasks)) { - foreach ($this->oriTasks as $key => $val) { - $tasks[$key] = array( - "taskname" => $val["taskname"], - "rule" => $val["rule"], - "unique" => $val["unique"], - "execute" => $val["execute"], - "args" => $val["args"] - ); - } - } - return $tasks; - } -} \ No newline at end of file diff --git a/src/include/loadtask/LoadTasksByMysql.class.php b/src/include/loadtask/LoadTasksByMysql.class.php deleted file mode 100644 index 09f0b06..0000000 --- a/src/include/loadtask/LoadTasksByMysql.class.php +++ /dev/null @@ -1,113 +0,0 @@ -config = $this->getDbConfig(); - $this->init(); - } - - /** - * 初始化任务表 - */ - private function init() - { - $db = $this->connectDB(); - $data = $db->queryOne("SELECT count(*) as total FROM information_schema.TABLES WHERE table_name = 'crontab' AND TABLE_SCHEMA = '{$this->config['dbname']}'"); - if(!empty($data) && intval($data["total"]) == 0){ - $stmt = $db->executeSql($this->createTable); - if($stmt){ - Main::log_write("执行sql:".$this->createTable."执行成功"); - }else{ - Main::log_write("执行sql:".$this->createTable."执行失败"); - } - } - } - - /** - * 返回格式化好的任务配置 - * @return array - */ - public function getTasks() - { - $this->loadTasks(); - return self::parseTasks(); - } - - /** - * 从配置文件载入配置 - */ - protected function loadTasks() - { - $db =$this->connectDB(); - $data = $db->queryAll("select * from `crontab` where `status`=0"); - $db = null; - $this->oriTasks = $data; - } - - /** - * 格式化配置文件中的配置 - * @return array - */ - protected function parseTasks() - { - $tasks = array(); - if (is_array($this->oriTasks)) { - foreach ($this->oriTasks as $key => $val) { - $rule = json_decode($val["rule"],true); - if(!is_array($rule)){ - $rule = $val["rule"]; - } - $tasks[$val["taskid"].$val["id"]] = array( - "taskname" => $val["taskname"], - "rule" => $rule, - "unique" => $val["unique"], - "execute" => $val["execute"], - "args" => json_decode($val["args"],true) - ); - } - } - return $tasks; - } - - protected function connectDB() - { - return new EasyDB($this->config); - } - - protected function getDbConfig(){ - $config = include( ROOT_PATH . "config/config.php"); - if(empty($config) || !isset($config["mysql"])){ - Main::log_write("mysql config not found"); - exit(); - } - return $config["mysql"]; - } - -} \ No newline at end of file diff --git a/src/logs/log_2014-12-28.log b/src/logs/log_2014-12-28.log deleted file mode 100644 index 2502f07..0000000 --- a/src/logs/log_2014-12-28.log +++ /dev/null @@ -1,6 +0,0 @@ -14:46:36 : 进程9056不存在,删除pid文件 -14:46:37 : 启动成功 -14:46:38 : tool/sendMail -14:46:38 : tool/sendMail -14:46:38 : php -i >> /tmp/test.log,已执行.status:0 -14:46:59 : 收到退出信号,退出主进程 diff --git a/src/main.php b/src/main.php deleted file mode 100644 index 160e2ea..0000000 --- a/src/main.php +++ /dev/null @@ -1,250 +0,0 @@ - "restart"); - } - } - return $opt; - } - - /** - * 解析pid参数 - * @param $opt - */ - static public function params_p($opt) - { - //记录pid文件位置 - if (isset($opt["p"]) && $opt["p"]) { - Crontab::$pid_file = $opt["p"] . "/pid"; - } - //记录pid文件位置 - if (isset($opt["pid"]) && $opt["pid"]) { - Crontab::$pid_file = $opt["pid"] . "/pid"; - } - if (empty(Crontab::$pid_file)) { - Crontab::$pid_file = ROOT_PATH . "/pid"; - } - } - - /** - * 解析日志路径参数 - * @param $opt - */ - static public function params_l($opt) - { - if (isset($opt["l"]) && $opt["l"]) { - Crontab::$log_path = $opt["l"]; - } - if (isset($opt["log"]) && $opt["log"]) { - Crontab::$log_path = $opt["log"]; - } - if (empty(Crontab::$log_path)) { - Crontab::$log_path = ROOT_PATH . "/logs/"; - } - } - - /** - * 解析配置文件位置参数 - * @param $opt - */ - static public function params_c($opt) - { - if (isset($opt["c"]) && $opt["c"]) { - Crontab::$taskParams = $opt["c"]; - } - if (isset($opt["config"]) && $opt["config"]) { - Crontab::$taskParams = $opt["config"]; - } - if (empty(Crontab::$taskParams)) { - Crontab::$taskParams = ROOT_PATH . "config/crontab.php"; - } - } - - /** - * 解析启动模式参数 - * @param $opt - */ - static public function params_s($opt) - { - //判断传入了s参数但是值,则提示错误 - if ((isset($opt["s"]) && !$opt["s"]) || (isset($opt["s"]) && !in_array($opt["s"], array("start", "stop", "restart")))) { - Main::log_write("Please run: path/to/php main.php -s [start|stop|restart]"); - } - - if (isset($opt["s"]) && in_array($opt["s"], array("start", "stop", "restart"))) { - switch ($opt["s"]) { - case "start": - Crontab::start(); - break; - case "stop": - Crontab::stop(); - break; - case "restart": - Crontab::restart(); - break; - } - } - } - - static public function params_worker($opt){ - if (isset($opt["worker"])) { - Crontab::$worker = true; - } - } - - static public function params_tasktype($opt){ - if (isset($opt["tasktype"])) { - Crontab::$taskType = $opt["tasktype"]; - } - } - - /** - * 记录日志 - * @param $message - */ - static public function log_write($message) - { - $now = date("H:i:s"); - if (Crontab::$daemon) { - $destination = Crontab::$log_path . "log_" . date("Y-m-d") . ".log"; - error_log("{$now} : {$message}\r\n", 3, $destination, ''); - } - echo "{$now} : {$message}\r\n"; - } -} - -//运行 -Main::run(); \ No newline at end of file diff --git a/src/plugin/Cmd.class.php b/src/plugin/Cmd.class.php deleted file mode 100644 index 4af504c..0000000 --- a/src/plugin/Cmd.class.php +++ /dev/null @@ -1,21 +0,0 @@ -addServers($task["server"]); - $client->doBackground($task["cmd"], $task["ext"]); - if (($code = $client->returnCode()) != GEARMAN_SUCCESS) - { - Main::log_write("Gearman:".$task["cmd"]." to ".$task["server"]." error,code=".$code); - exit; - } - Main::log_write("Gearman:".$task["cmd"]." to ".$task["server"]." success,code=".$code); - exit; - - } -} \ No newline at end of file diff --git a/src/plugin/PluginBase.class.php b/src/plugin/PluginBase.class.php deleted file mode 100644 index 68d370b..0000000 --- a/src/plugin/PluginBase.class.php +++ /dev/null @@ -1,28 +0,0 @@ -worker->pid.",".$sec; -// $this->worker->write($task); -// if($this->worker->read() ==$task){ -// return true; -// } -// return false; -// } - - abstract public function run($task); - - -} \ No newline at end of file diff --git a/src/centre/worker.php b/src/worker.php similarity index 92% rename from src/centre/worker.php rename to src/worker.php index 0e96454..35d0300 100644 --- a/src/centre/worker.php +++ b/src/worker.php @@ -8,13 +8,13 @@ require_once __DIR__ . '/_init.php'; const PORT = 8902; -Swoole\Network\Server::setPidFile(__DIR__ . '/logs/worker.pid'); +Swoole\Network\Server::setPidFile(__DIR__ . '/logs/worker'.PORT.'.pid'); Swoole\Network\Server::start(function () { - $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/worker.log']); + $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/worker'.PORT.'.log']); $AppSvr = new Lib\WorkerServer; $AppSvr->setLogger($logger); diff --git a/src/worker/ReadBookWorker.class.php b/src/worker/ReadBookWorker.class.php deleted file mode 100644 index ac4fd35..0000000 --- a/src/worker/ReadBookWorker.class.php +++ /dev/null @@ -1,24 +0,0 @@ -_exit(2); - } - } -} \ No newline at end of file diff --git a/src/worker/WorkerBase.class.php b/src/worker/WorkerBase.class.php deleted file mode 100644 index 270ab5e..0000000 --- a/src/worker/WorkerBase.class.php +++ /dev/null @@ -1,78 +0,0 @@ -Redis = new Redis(); - if(!$this->Redis->pconnect($config["host"],$config["port"],isset($config["timeout"]))){ - Main::log_write(vsprintf("redis can't connect.host=%s,port=%s,timeout=%s",$config)); - exit; - } - if(isset($config["db"]) && is_numeric($config["db"])){ - $this->Redis->select($config["db"]); - } - $this->queue = $config["queue"]; - } - - public function getQueue(){ - return $this->Redis->rpop($this->queue); - } - public function tick($worker){ - $this->worker = $worker; - swoole_timer_tick(500, function() { - while(true){ - $this->checkExit(); - $task = $this->getQueue(); - if(empty($task)){ - break; - } - $this->Run($task); - } - }); - } - protected function _exit() - { - $this->worker->exit(1); - } - - /** - * 判断父进程是否结束 - */ - private function checkExit(){ - $ppid = posix_getppid(); - if($this->ppid == 0){ - $this->ppid = $ppid ; - } - if($this->ppid != $ppid){ - $this->_exit(); - } - } - - /** - * 运行入口 - * @param $task - * @return mixed - */ - abstract public function Run($task); - - - -} \ No newline at end of file diff --git a/test/callTest.php b/test/callTest.php new file mode 100644 index 0000000..ec3d581 --- /dev/null +++ b/test/callTest.php @@ -0,0 +1,19 @@ +"测试任务1", + "rule"=>"* * * * * *", + "unique"=>"0", + "execute"=>"echo 'aa' ", +]; +$ret = $server->call("Tasks::add",$task)->getResult(); +var_dump($ret); \ No newline at end of file diff --git a/test/http_test.php b/test/http_test.php deleted file mode 100644 index a54b704..0000000 --- a/test/http_test.php +++ /dev/null @@ -1,19 +0,0 @@ -on('request',function($request,$response) use($fp){ - - fwrite($fp,rand(100,100000)."->ok"); - $response->end(fread($fp,4096)); -}); -$http->start(); \ No newline at end of file diff --git a/test/process_test.php b/test/process_test.php deleted file mode 100644 index 02eff08..0000000 --- a/test/process_test.php +++ /dev/null @@ -1,46 +0,0 @@ -exec($binpath,array(ROOT_PATH."http_test.php",$worker->pipe)); -} -$process = new swoole_process("fork"); -$process->start(); - -function process_run($worker) -{ - echo "abc\n"; - $worker->exit(0); - exit; -} -function create_process() -{ - $process = new swoole_process("process_run"); - $process->start(); -} - -swoole_timer_add(1000, function ($interval) { - create_process(); - create_process(); -}); - -swoole_process::signal(SIGCHLD, function ($signo) { - while( $pid = pcntl_wait($status,WNOHANG)){ - echo $pid."\n"; - }; -}); - -swoole_event_add($process->pipe, function ($pipe) use ($process) { - $ret = $process->read(); - echo $ret; - $process->write($ret); -}); \ No newline at end of file diff --git a/src/centre/test/runTask.php b/test/runTask.php similarity index 53% rename from src/centre/test/runTask.php rename to test/runTask.php index 3f1a5a2..2337ed0 100644 --- a/src/centre/test/runTask.php +++ b/test/runTask.php @@ -5,8 +5,7 @@ * Date: 16-8-22 * Time: 下午6:35 */ -include __DIR__."/../_init.php"; +include __DIR__."/../src/_init.php"; -$server = new Lib\Service(); -$server->addServers(["127.0.0.1:8902"]); +$server = new Lib\Service("127.0.0.1",8902); $ret = $server->call("Exec::run",["id"=>1111,"execute"=>"/bin/echo hello liuzhiming"])->getResult(); \ No newline at end of file diff --git a/test/swoole_table.php b/test/swoole_table.php deleted file mode 100644 index 35e6ef7..0000000 --- a/test/swoole_table.php +++ /dev/null @@ -1,29 +0,0 @@ -column("id",swoole_table::TYPE_INT,4); -$table->column("name",swoole_table::TYPE_STRING,64); -$table->column('num', swoole_table::TYPE_FLOAT); -$table->create(); -$table->set('tianfenghan@qq.com', array('id' => 145, 'name' => 'rango', 'num' => 3.1415)); - - -$process = new swoole_process('callback_function', false,false); -$process->table = $table; -$pid = $process->start(); -echo "aa\n"; - -function callback_function (swoole_process $worker) -{ - echo "bb\n"; - print_r($worker->table->get("tianfenghan@qq.com")); - -} - -swoole_process::wait(); \ No newline at end of file diff --git a/test/test.php b/test/test.php deleted file mode 100644 index 31ae492..0000000 --- a/test/test.php +++ /dev/null @@ -1,43 +0,0 @@ - 90 ){ -// echo date("H:i:s")."\n"; -// sleep(1); -// break; -// } -// } -//}); -// -//function timesleep(){ -// $rand = rand(0,100); -// echo $rand."\n"; -// return $rand; -// if($rand >5){ -// return false; -// } -// echo $rand."\n"; -// sleep(1); -// return true; -//} - -function _parse_array($crontab_array,$start_time){ - $result = array(); - foreach($crontab_array as $val){ - $time = strtotime($val); - if($time>$start_time && $time+60 >=$start_time){ - $sec = date("s",$time); - $result[intval($sec)] = intval($sec); - } - } - ksort($result); - return $result; -} -print_r(_parse_array(array("22:13","22:14","22:15","22:16"),time())); \ No newline at end of file From e83c430bbe3439ac8453e36e2fe6312ffe9cb09b Mon Sep 17 00:00:00 2001 From: ClownFish Date: Thu, 1 Sep 2016 16:17:27 +0800 Subject: [PATCH 12/70] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Lib/LoadTasks.php | 4 ++-- src/Lib/Process.php | 3 +-- src/Lib/Robot.php | 6 +++--- src/Lib/{WorkerServer.php => RobotServer.php} | 2 +- src/Lib/Service.php | 5 ++--- src/Lib/Tasks.php | 3 +-- src/_init.php | 16 +++++++++++++++- src/centre.php | 5 +---- src/configs/{dev => }/db.php | 0 src/configs/dev/crontab.php | 17 ----------------- src/configs/{dev => }/log.php | 0 src/configs/product/db.php | 14 -------------- src/configs/product/log.php | 7 ------- src/configs/test/db.php | 14 -------------- src/configs/test/log.php | 7 ------- src/{worker.php => robot.php} | 11 ++++------- 16 files changed, 30 insertions(+), 84 deletions(-) rename src/Lib/{WorkerServer.php => RobotServer.php} (97%) rename src/configs/{dev => }/db.php (100%) delete mode 100644 src/configs/dev/crontab.php rename src/configs/{dev => }/log.php (100%) delete mode 100644 src/configs/product/db.php delete mode 100644 src/configs/product/log.php delete mode 100644 src/configs/test/db.php delete mode 100644 src/configs/test/log.php rename src/{worker.php => robot.php} (85%) diff --git a/src/Lib/LoadTasks.php b/src/Lib/LoadTasks.php index 4dc1dd2..d88312d 100644 --- a/src/Lib/LoadTasks.php +++ b/src/Lib/LoadTasks.php @@ -40,6 +40,7 @@ class LoadTasks const tablename = "crontab"; + static private $table; static private $db; @@ -83,8 +84,7 @@ public static function init() */ private static function createConfigTable() { - $conf = Swoole::$php->config["crontab"]; - $load_size = (isset($conf["load_size"]) && $conf["load_size"] > 0) ? $conf["load_size"] : 1024; + $load_size = defined("LOAD_SIZE") ? LOAD_SIZE : 1024; self::$table = new \swoole_table($load_size); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); diff --git a/src/Lib/Process.php b/src/Lib/Process.php index b984ae5..b8bee78 100644 --- a/src/Lib/Process.php +++ b/src/Lib/Process.php @@ -27,8 +27,7 @@ class Process public static function init() { - $conf = \Swoole::$php->config["crontab"]; - $robot_process_max = (isset($conf["robot_process_max"]) && $conf["robot_process_max"] > 0) ? $conf["robot_process_max"] : 128; + $robot_process_max = defined("ROBOT_MAX_PROCESS") ? ROBOT_MAX_PROCESS : 128; self::$table = new \swoole_table($robot_process_max); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); diff --git a/src/Lib/Robot.php b/src/Lib/Robot.php index 8e2673a..7ae0627 100644 --- a/src/Lib/Robot.php +++ b/src/Lib/Robot.php @@ -24,8 +24,7 @@ class Robot ]; public static function init() { - $conf = \Swoole::$php->config["crontab"]; - $robot_num_max = (isset($conf["robot_num_max"]) && $conf["robot_num_max"] > 0) ? $conf["robot_num_max"] : 2; + $robot_num_max = defined("ROBOT_MAX") ? ROBOT_MAX : 2; self::$table = new \swoole_table($robot_num_max); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); @@ -134,10 +133,11 @@ private static function selectWorker() foreach (self::$ips as $k=>$robot) { $n++; - if ($rand == $num){ + if ($rand == $n){ return $robot; } } + Flog::log("没有选中任何服务器,服务器数量:".$num.",随机数:".$rand); return false; } diff --git a/src/Lib/WorkerServer.php b/src/Lib/RobotServer.php similarity index 97% rename from src/Lib/WorkerServer.php rename to src/Lib/RobotServer.php index 32e8254..f1c2a05 100644 --- a/src/Lib/WorkerServer.php +++ b/src/Lib/RobotServer.php @@ -10,7 +10,7 @@ namespace Lib; use Swoole; -class WorkerServer extends Swoole\Protocol\SOAServer +class RobotServer extends Swoole\Protocol\SOAServer { public function onMasterStart($serv) diff --git a/src/Lib/Service.php b/src/Lib/Service.php index 2707340..fba1a77 100644 --- a/src/Lib/Service.php +++ b/src/Lib/Service.php @@ -15,9 +15,8 @@ public function __construct($ip='',$port='') { parent::__construct(); if (empty($ip) || empty($port)){ - $config = Swoole::$php->config["crontab"]; - $ip = $config["centre_host"]; - $port = $config["centre_port"]; + $ip = CENTRE_HOST; + $port = CENTRE_PORT; } $this->addServers(array($ip.':'.$port)); } diff --git a/src/Lib/Tasks.php b/src/Lib/Tasks.php index ebfa57d..eb5713e 100644 --- a/src/Lib/Tasks.php +++ b/src/Lib/Tasks.php @@ -24,8 +24,7 @@ class Tasks */ public static function init() { - $conf = Swoole::$php->config["crontab"]; - $tasks_size = (isset($conf["tasks_size"]) && $conf["tasks_size"] > 0) ? $conf["tasks_size"] : 1024; + $tasks_size = defined("TASKS_SIZE") ? TASKS_SIZE : 1024; self::$table = new \swoole_table($tasks_size); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); diff --git a/src/_init.php b/src/_init.php index b4d3a93..bd80d4c 100644 --- a/src/_init.php +++ b/src/_init.php @@ -3,6 +3,14 @@ define('WEBPATH', __DIR__); define('SWOOLE_SERVER', true); +define("LOAD_SIZE",8192);//最多载入任务数量 +define("TASKS_SIZE",1024);//同时运行任务最大数量 +define("ROBOT_MAX",8);//同时挂载worker数量 +define("ROBOT_MAX_PROCESS",128);//单个worker同时执行任务数量 + +define("CENTRE_HOST","127.0.0.1"); +define("CENTRE_PORT",8901); + $env = get_cfg_var('env.name'); if (empty($env)) { @@ -23,7 +31,13 @@ { require_once __DIR__ . '/framework/libs/lib_config.php'; } -Swoole::$php->config->setPath(__DIR__ . '/configs/' . ENV_NAME);//共有配置 +if (is_dir('/data/www/wwwroot/swoole-crontab/configs/'.ENV_NAME)){ + $config_dir = '/data/www/wwwroot/swoole-crontab/configs/'.ENV_NAME; +}else{ + $config_dir = __DIR__ . '/configs/'; +} + +Swoole::$php->config->setPath($config_dir);//共有配置 Swoole\Loader::addNameSpace('App', __DIR__ . '/App'); Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); diff --git a/src/centre.php b/src/centre.php index 426015f..8deaae4 100644 --- a/src/centre.php +++ b/src/centre.php @@ -7,7 +7,6 @@ */ require_once __DIR__ . '/_init.php'; -const PORT = 8901; Swoole\Network\Server::setPidFile(__DIR__ . '/logs/centre.pid'); @@ -32,14 +31,12 @@ //重定向PHP错误日志到logs目录 ini_set('error_log', __DIR__ . '/logs/php_errors.log'); - $listenHost = \Lib\Util::listenHost(); - \Lib\LoadTasks::init();//载入任务表 \Lib\Donkeyid::init();//初始化donkeyid对象 \Lib\Tasks::init();//创建task表 \Lib\Robot::init();//创建任务处理服务表 - $server = Swoole\Network\Server::autoCreate($listenHost, PORT); + $server = Swoole\Network\Server::autoCreate(CENTRE_HOST, CENTRE_PORT); $server->setProtocol($AppSvr); $server->setProcessName("CentreServer"); $server->run($setting); diff --git a/src/configs/dev/db.php b/src/configs/db.php similarity index 100% rename from src/configs/dev/db.php rename to src/configs/db.php diff --git a/src/configs/dev/crontab.php b/src/configs/dev/crontab.php deleted file mode 100644 index 3c2c9e9..0000000 --- a/src/configs/dev/crontab.php +++ /dev/null @@ -1,17 +0,0 @@ -"8192",//最多载入任务数量 - "tasks_size"=>"1024",//同时运行任务最大数量 - "robot_num_max"=>"8",//同时挂载worker数量 - "robot_process_max"=>"128",//单个worker同时执行任务数量 - "centre_host"=>"127.0.0.1",//中心服ip - "centre_port"=>"8901",//中心服端口 -]; \ No newline at end of file diff --git a/src/configs/dev/log.php b/src/configs/log.php similarity index 100% rename from src/configs/dev/log.php rename to src/configs/log.php diff --git a/src/configs/product/db.php b/src/configs/product/db.php deleted file mode 100644 index a7e8696..0000000 --- a/src/configs/product/db.php +++ /dev/null @@ -1,14 +0,0 @@ - Swoole\Database::TYPE_MYSQLi, - 'host' => "10.10.2.220", - 'port' => 3306, - 'dbms' => 'mysql', - 'user' => "root", - 'passwd' => "root", - 'name' => "swoole_crontab", - 'charset' => "utf8", - 'setname' => true, - 'persistent' => false, //MySQL长连接 -); -return $db; \ No newline at end of file diff --git a/src/configs/product/log.php b/src/configs/product/log.php deleted file mode 100644 index 678b0a2..0000000 --- a/src/configs/product/log.php +++ /dev/null @@ -1,7 +0,0 @@ - 'FileLog', - 'cut_file' => true, - 'file' => WEBPATH . '/logs/application.log', -); -return $log; \ No newline at end of file diff --git a/src/configs/test/db.php b/src/configs/test/db.php deleted file mode 100644 index a7e8696..0000000 --- a/src/configs/test/db.php +++ /dev/null @@ -1,14 +0,0 @@ - Swoole\Database::TYPE_MYSQLi, - 'host' => "10.10.2.220", - 'port' => 3306, - 'dbms' => 'mysql', - 'user' => "root", - 'passwd' => "root", - 'name' => "swoole_crontab", - 'charset' => "utf8", - 'setname' => true, - 'persistent' => false, //MySQL长连接 -); -return $db; \ No newline at end of file diff --git a/src/configs/test/log.php b/src/configs/test/log.php deleted file mode 100644 index 678b0a2..0000000 --- a/src/configs/test/log.php +++ /dev/null @@ -1,7 +0,0 @@ - 'FileLog', - 'cut_file' => true, - 'file' => WEBPATH . '/logs/application.log', -); -return $log; \ No newline at end of file diff --git a/src/worker.php b/src/robot.php similarity index 85% rename from src/worker.php rename to src/robot.php index 35d0300..90d0796 100644 --- a/src/worker.php +++ b/src/robot.php @@ -8,14 +8,11 @@ require_once __DIR__ . '/_init.php'; const PORT = 8902; -Swoole\Network\Server::setPidFile(__DIR__ . '/logs/worker'.PORT.'.pid'); - - +Swoole\Network\Server::setPidFile(__DIR__ . '/logs/robot'.PORT.'.pid'); Swoole\Network\Server::start(function () { - - $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/worker'.PORT.'.log']); - $AppSvr = new Lib\WorkerServer; + $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/robot'.PORT.'.log']); + $AppSvr = new Lib\RobotServer; $AppSvr->setLogger($logger); $setting = array( @@ -39,6 +36,6 @@ $server = Swoole\Network\Server::autoCreate($listenHost, PORT); $server->setProtocol($AppSvr); - $server->setProcessName("WorkerServer"); + $server->setProcessName("RobotServer"); $server->run($setting); }); From fb758e7e8cbfc467a13bb6e54952e6be5c93acf4 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Fri, 2 Sep 2016 17:33:24 +0800 Subject: [PATCH 13/70] =?UTF-8?q?=E4=BF=AE=E6=94=B9gettasklist=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App/Tasks.php | 17 +++++++++++++++-- src/Lib/LoadTasks.php | 39 +++++++++++++++++++++------------------ src/_init.php | 2 +- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/App/Tasks.php b/src/App/Tasks.php index 30752c6..9c0977a 100644 --- a/src/App/Tasks.php +++ b/src/App/Tasks.php @@ -17,15 +17,28 @@ class Tasks * 获取任务列表 * @return array */ - public static function getList() + public static function getList($where=[],$page=1,$size=10) { + + $start = ($page-1)*$size; + $end = $start+$size; $data = []; $tasks = LoadTasks::getTasks(); + $n=0; foreach ($tasks as $id=>$task) { + if ($n < $start) continue; + if ($n > $end) break; + $n++; + $info = LoadTasks::$db->get($id); + if (!empty($info)){ + $task["createtime"]=$info["createtime"]; + $task["updatetime"]=$info["updatetime"]; + } + $task["id"] = $id; $data[$id] = $task; } - return array('data' => $data); + return ["total"=>count($tasks),"rows"=>$data]; } /** diff --git a/src/Lib/LoadTasks.php b/src/Lib/LoadTasks.php index d88312d..8e32afe 100644 --- a/src/Lib/LoadTasks.php +++ b/src/Lib/LoadTasks.php @@ -42,7 +42,7 @@ class LoadTasks const tablename = "crontab"; static private $table; - static private $db; + static public $db; const T_START = 0;//正常 @@ -99,23 +99,26 @@ private static function createConfigTable() */ private static function loadTasks() { - $count = self::$db->count([]); - if (empty($count)) { - Flog::log("未加载到表" . self::tablename . "中的数据"); - return false; - } - $where["limit"] = "0," . $count; - $tasks = self::$db->gets($where); - foreach ($tasks as $task) { - self::$table->set($task["id"], - [ - "taskname" => $task["taskname"], - "rule" => $task["rule"], - "unique" => $task["unique"], - "status" => $task["status"], - "execute" => $task["execute"], - ] - ); + $start = 0; + while (true){ + $where["limit"] = $start.",1000"; + $tasks = self::$db->gets($where); + if (empty($tasks)) break; + foreach ($tasks as $task) { + if (count(self::$table) > LOAD_SIZE){ + return true; + } + self::$table->set($task["id"], + [ + "taskname" => $task["taskname"], + "rule" => $task["rule"], + "unique" => $task["unique"], + "status" => $task["status"], + "execute" => $task["execute"], + ] + ); + } + $start+=1000; } return true; } diff --git a/src/_init.php b/src/_init.php index bd80d4c..f11c7ec 100644 --- a/src/_init.php +++ b/src/_init.php @@ -31,7 +31,7 @@ { require_once __DIR__ . '/framework/libs/lib_config.php'; } -if (is_dir('/data/www/wwwroot/swoole-crontab/configs/'.ENV_NAME)){ +if (is_dir('/data/www/wwwroot/crontab/configs/'.ENV_NAME)){ $config_dir = '/data/www/wwwroot/swoole-crontab/configs/'.ENV_NAME; }else{ $config_dir = __DIR__ . '/configs/'; From 3f2b2dcd651e36630c66f9dd63dc27b53023a373 Mon Sep 17 00:00:00 2001 From: ClownFish Date: Sun, 23 Oct 2016 20:59:31 +0800 Subject: [PATCH 14/70] =?UTF-8?q?v1.0=E7=89=88=E6=9C=AC=E5=AE=8C=E5=B7=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/build.php | 54 + doc/crontab.sql | 190 + src/App/Exec.php | 48 - src/App/Robot.php | 28 - src/App/Tasks.php | 102 - src/Lib/CentreServer.php | 89 - src/Lib/Process.php | 122 - src/Lib/TermLog.php | 35 - src/_init.php | 44 - src/admin/classes/Auth.php | 321 + src/admin/classes/CommonController.php | 81 + src/admin/classes/LoginController.php | 117 + src/admin/classes/ParserDoc.php | 129 + src/admin/classes/RBAC.php | 112 + src/{Lib => admin/classes}/Service.php | 7 +- src/admin/configs/common.php | 14 + src/{configs => admin/configs/dev}/db.php | 4 +- src/{configs => admin/configs/dev}/log.php | 0 src/admin/configs/dev/service.php | 13 + src/admin/configs/product/db.php | 14 + src/admin/configs/product/log.php | 12 + src/admin/configs/product/service.php | 13 + src/admin/configs/test/db.php | 14 + src/admin/configs/test/log.php | 12 + src/admin/configs/test/service.php | 13 + src/admin/configs/user.php | 13 + src/admin/controllers/Agent.php | 133 + src/admin/controllers/Auth.php | 217 + src/admin/controllers/Crongroup.php | 101 + src/admin/controllers/Crontab.php | 170 + src/admin/controllers/Page.php | 64 + src/admin/controllers/Password.php | 37 + src/admin/controllers/Runtimetask.php | 43 + src/admin/controllers/Termlog.php | 84 + src/admin/controllers/User.php | 170 + src/admin/factory/user.php | 4 + src/admin/models/User.php | 13 + src/admin/templates/agent/addoredit.php | 138 + src/admin/templates/agent/index.php | 156 + src/admin/templates/auth/groupedit.php | 128 + src/admin/templates/auth/index.php | 129 + src/admin/templates/auth/nodeedit.php | 107 + src/admin/templates/crongroup/addoredit.php | 105 + src/admin/templates/crongroup/index.php | 110 + src/admin/templates/crontab/addoredit.php | 212 + src/admin/templates/crontab/index.php | 209 + src/admin/templates/include/css.php | 13 + src/admin/templates/include/filter.php | 47 + src/admin/templates/include/header.php | 19 + src/admin/templates/include/javascript.php | 103 + src/admin/templates/include/leftmenu.php | 50 + src/admin/templates/include/msg.php | 11 + src/admin/templates/include/top_menu.php | 36 + src/admin/templates/page/index.php | 193 + .../templates/password/modifypassword.php | 128 + src/admin/templates/runtimetask/index.php | 85 + src/admin/templates/termlog/index.php | 124 + src/admin/templates/user/addoredit.php | 153 + src/admin/templates/user/index.php | 160 + src/admin/templates/user/modifypassword.php | 125 + src/agent/App/Exec.php | 22 + .../Lib/AgentServer.php} | 34 +- src/agent/Lib/Client.php | 36 + src/agent/Lib/FileLog.php | 226 + src/agent/Lib/Flog.php | 43 + .../src/GetOptionKit/Argument.php | 99 + .../src/GetOptionKit/ContinuousOptionKit.php | 43 + .../GetOptionKit/ContinuousOptionParser.php | 209 + .../Exception/InvalidOptionException.php | 8 + .../Exception/RequireValueException.php | 7 + .../src/GetOptionKit/GetOptionKit.php | 80 + .../GetOptionKit/src/GetOptionKit/Init.php | 12 + .../src/GetOptionKit/NonNumericException.php | 19 + .../src/GetOptionKit/OptionParser.php | 172 + .../src/GetOptionKit/OptionPrinter.php | 57 + .../GetOptionKit/OptionPrinterInterface.php | 21 + .../src/GetOptionKit/OptionResult.php | 160 + .../src/GetOptionKit/OptionSpec.php | 300 + .../src/GetOptionKit/OptionSpecCollection.php | 197 + .../src/GetOptionKit/SplClassLoader.php | 149 + src/agent/Lib/Loader.php | 40 + src/agent/Lib/Process.php | 178 + src/agent/Lib/SOAClient.php | 721 + src/agent/Lib/SOAServer.php | 347 + src/agent/Lib/Server.php | 374 + src/agent/Lib/ServerBase.php | 359 + src/{ => agent}/Lib/Util.php | 12 + src/agent/_init.php | 45 + src/agent/agent.php | 41 + src/center/App/Agent.php | 268 + src/center/App/Tasks.php | 281 + src/center/App/Termlog.php | 77 + src/center/Lib/CenterServer.php | 105 + src/center/Lib/Client.php | 36 + src/{ => center}/Lib/Donkeyid.php | 0 src/{ => center}/Lib/Flog.php | 0 src/{ => center}/Lib/LoadTasks.php | 71 +- src/{ => center}/Lib/ParseCrontab.php | 0 src/center/Lib/Report.php | 59 + src/{ => center}/Lib/Robot.php | 78 +- src/{ => center}/Lib/Tasks.php | 25 +- src/center/Lib/TermLog.php | 52 + src/center/Lib/Util.php | 55 + src/center/_init.php | 43 + src/{centre.php => center/center.php} | 19 +- src/center/configs/dev/db.php | 14 + src/center/configs/log.php | 12 + src/center/configs/product/db.php | 14 + src/center/configs/test/db.php | 14 + src/center/console.php | 11 + src/public/index.php | 34 + src/public/static/css/style.css | 129 + src/public/static/css/terminal.css | 145 + .../css/redmond/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 212 bytes .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 0 -> 206 bytes .../images/ui-bg_glass_75_d0e5f5_1x400.png | Bin 0 -> 336 bytes .../images/ui-bg_glass_85_dfeffc_1x400.png | Bin 0 -> 341 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_gloss-wave_55_5c9ccc_500x100.png | Bin 0 -> 5824 bytes .../ui-bg_inset-hard_100_f5f8f9_1x100.png | Bin 0 -> 333 bytes .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin 0 -> 292 bytes .../images/ui-icons_217bc0_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_469bdd_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_6da8d5_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_d8e7f3_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_f9bd01_256x240.png | Bin 0 -> 4549 bytes .../jquery-ui/css/redmond/jquery-ui.css | 1183 + .../jquery-ui/css/redmond/jquery-ui.min.css | 7 + src/public/static/jquery-ui/index.html | 450 + .../static/jquery-ui/js/jquery-1.10.2.js | 9789 ++++++++ .../jquery-ui/js/jquery-ui-1.10.4.custom.js | 15008 +++++++++++ .../js/jquery-ui-1.10.4.custom.min.js | 7 + src/public/static/js/charts.js | 30 + src/public/static/js/combox.js | 129 + src/public/static/js/esl.js | 1780 ++ src/public/static/js/jQuery.md5.js | 214 + src/public/static/js/jquery-ui-zh.js | 23 + src/public/static/js/jquery.json.js | 23 + src/public/static/js/jquery.terminal.js | 4335 ++++ src/public/static/js/php.js | 742 + .../static/smartadmin/ajax/demowidget.php | 88 + .../static/smartadmin/ajax/email-compose.html | 202 + .../static/smartadmin/ajax/email-opened.html | 164 + .../static/smartadmin/ajax/email-reply.html | 241 + .../smartadmin/ajax/email-template.html | 61 + .../smartadmin/ajax/email/email-list.html | 953 + src/public/static/smartadmin/ajax/inbox.html | 185 + .../static/smartadmin/ajax/notify/mail.html | 68 + .../smartadmin/ajax/notify/notifications.html | 94 + .../static/smartadmin/ajax/notify/tasks.html | 79 + .../smartadmin/ajax/website-template.html | 87 + src/public/static/smartadmin/blank_.html | 602 + .../static/smartadmin/bootstrap-forms.html | 3251 +++ src/public/static/smartadmin/buttons.html | 2216 ++ src/public/static/smartadmin/calendar.html | 1042 + src/public/static/smartadmin/ckeditor.html | 670 + .../static/smartadmin/css/bootstrap.css | 5822 +++++ .../static/smartadmin/css/bootstrap.css.map | 1 + .../static/smartadmin/css/bootstrap.min.css | 9 + src/public/static/smartadmin/css/demo.css | 209 + .../smartadmin/css/font-awesome.min.css | 395 + src/public/static/smartadmin/css/invoice.css | 132 + .../static/smartadmin/css/lockscreen.css | 74 + .../smartadmin/css/smartadmin-production.css | 47 + .../css/smartadmin-production_unminified.css | 20541 ++++++++++++++++ .../static/smartadmin/css/smartadmin-rtl.css | 1043 + .../smartadmin/css/smartadmin-skins.css | 1127 + .../static/smartadmin/css/your_style.css | 19 + src/public/static/smartadmin/datatables.html | 4099 +++ src/public/static/smartadmin/dropzone.html | 997 + src/public/static/smartadmin/dummy.php | 0 .../static/smartadmin/email-template.html | 655 + src/public/static/smartadmin/error404.html | 1129 + src/public/static/smartadmin/error500.html | 639 + src/public/static/smartadmin/fa.html | 2102 ++ src/public/static/smartadmin/flot.html | 1723 ++ .../static/smartadmin/fonts/FontAwesome.otf | Bin 0 -> 63008 bytes .../smartadmin/fonts/fontawesome-webfont.eot | Bin 0 -> 38239 bytes .../smartadmin/fonts/fontawesome-webfont.svg | 414 + .../smartadmin/fonts/fontawesome-webfont.ttf | Bin 0 -> 80776 bytes .../smartadmin/fonts/fontawesome-webfont.woff | Bin 0 -> 44476 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes .../static/smartadmin/forgotpassword.html | 215 + .../static/smartadmin/form-elements.html | 1936 ++ .../static/smartadmin/form-templates.html | 2138 ++ src/public/static/smartadmin/forum-post.html | 765 + src/public/static/smartadmin/forum-topic.html | 893 + src/public/static/smartadmin/forum.html | 802 + src/public/static/smartadmin/gallery.html | 699 + .../static/smartadmin/general-elements.html | 3451 +++ src/public/static/smartadmin/glyph.html | 1580 ++ src/public/static/smartadmin/gmap-xml.html | 2191 ++ src/public/static/smartadmin/grid.html | 1069 + .../static/smartadmin/img/ajax-loader.gif | Bin 0 -> 8238 bytes src/public/static/smartadmin/img/alpha.png | Bin 0 -> 962 bytes .../static/smartadmin/img/avatars/1.png | Bin 0 -> 3165 bytes .../static/smartadmin/img/avatars/2.png | Bin 0 -> 3190 bytes .../static/smartadmin/img/avatars/3.png | Bin 0 -> 3217 bytes .../static/smartadmin/img/avatars/4.png | Bin 0 -> 3276 bytes .../static/smartadmin/img/avatars/5.png | Bin 0 -> 3111 bytes .../smartadmin/img/avatars/copyright.txt | 1 + .../static/smartadmin/img/avatars/female.png | Bin 0 -> 284 bytes .../static/smartadmin/img/avatars/index.php | 0 .../static/smartadmin/img/avatars/male.png | Bin 0 -> 268 bytes .../smartadmin/img/avatars/sunny-big.png | Bin 0 -> 12300 bytes .../static/smartadmin/img/avatars/sunny.png | Bin 0 -> 3341 bytes src/public/static/smartadmin/img/clear.png | Bin 0 -> 509 bytes .../static/smartadmin/img/demo/64x64.png | Bin 0 -> 231 bytes .../static/smartadmin/img/demo/basic.png | Bin 0 -> 18672 bytes .../static/smartadmin/img/demo/copyright.txt | 1 + .../img/demo/demo-smartbig-alert.png | Bin 0 -> 3412 bytes .../img/demo/demo-smartmedium-alert.png | Bin 0 -> 2516 bytes .../img/demo/demo-smartsmall-alert.png | Bin 0 -> 1330 bytes .../static/smartadmin/img/demo/hero.png | Bin 0 -> 19077 bytes .../img/demo/image-placeholder-64x64.png | Bin 0 -> 256 bytes .../static/smartadmin/img/demo/index.php | 0 .../static/smartadmin/img/demo/iphoneview.png | Bin 0 -> 106752 bytes src/public/static/smartadmin/img/demo/m1.jpg | Bin 0 -> 125346 bytes src/public/static/smartadmin/img/demo/m2.jpg | Bin 0 -> 81284 bytes src/public/static/smartadmin/img/demo/m3.jpg | Bin 0 -> 49063 bytes .../static/smartadmin/img/demo/newsletter.png | Bin 0 -> 25929 bytes .../smartadmin/img/demo/responseimg.png | Bin 0 -> 487 bytes src/public/static/smartadmin/img/demo/s1.jpg | Bin 0 -> 174851 bytes src/public/static/smartadmin/img/demo/s2.jpg | Bin 0 -> 162045 bytes src/public/static/smartadmin/img/demo/s3.jpg | Bin 0 -> 468756 bytes .../static/smartadmin/img/demo/sa-demo.png | Bin 0 -> 29193 bytes .../static/smartadmin/img/demo/sample.jpg | Bin 0 -> 17932 bytes .../static/smartadmin/img/demo/sidebar.png | Bin 0 -> 22687 bytes .../smartadmin/img/demo/sidebarhero.png | Bin 0 -> 25389 bytes .../static/smartadmin/img/demo/site-1.jpg | Bin 0 -> 56165 bytes .../static/smartadmin/img/demo/site-2.jpg | Bin 0 -> 67458 bytes .../img/demo/widget-colorpicker.png | Bin 0 -> 1574 bytes .../static/smartadmin/img/dropzone/index.php | 0 .../smartadmin/img/dropzone/spritemap.png | Bin 0 -> 7306 bytes .../smartadmin/img/dropzone/spritemap@2x.png | Bin 0 -> 15388 bytes .../smartadmin/img/favicon/1favicon.ico | Bin 0 -> 1150 bytes .../static/smartadmin/img/favicon/favicon.ico | Bin 0 -> 1150 bytes .../static/smartadmin/img/favicon/favicon.png | Bin 0 -> 1239 bytes .../static/smartadmin/img/favicon/index.php | 0 src/public/static/smartadmin/img/flags/de.png | Bin 0 -> 545 bytes src/public/static/smartadmin/img/flags/es.png | Bin 0 -> 469 bytes .../static/smartadmin/img/flags/flags.zip | Bin 0 -> 34424 bytes .../static/smartadmin/img/flags/index.php | 0 src/public/static/smartadmin/img/flags/us.png | Bin 0 -> 609 bytes .../static/smartadmin/img/gradient/index.php | 0 .../static/smartadmin/img/gradient/login.png | Bin 0 -> 807 bytes src/public/static/smartadmin/img/hue.png | Bin 0 -> 494 bytes .../img/invoice/americanexpress.png | Bin 0 -> 7519 bytes .../static/smartadmin/img/invoice/index.php | 0 .../static/smartadmin/img/invoice/license.txt | 2 + .../smartadmin/img/invoice/mastercard.png | Bin 0 -> 7357 bytes .../static/smartadmin/img/invoice/paypal.png | Bin 0 -> 6609 bytes .../static/smartadmin/img/invoice/visa.png | Bin 0 -> 5847 bytes .../static/smartadmin/img/jqueryui/index.php | 0 .../jqueryui/ui-bg_flat_0_999999_40x100.png | Bin 0 -> 220 bytes .../jqueryui/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 87 bytes .../jqueryui/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 115 bytes .../jqueryui/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 98 bytes .../jqueryui/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../jqueryui/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../jqueryui/ui-bg_glass_75_ffffff_1x400.png | Bin 0 -> 99 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 86 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 0 -> 120 bytes .../img/jqueryui/ui-icons_222222_256x240.png | Bin 0 -> 3710 bytes .../img/jqueryui/ui-icons_2e83ff_256x240.png | Bin 0 -> 3712 bytes .../img/jqueryui/ui-icons_428bca_256x240.png | Bin 0 -> 4549 bytes .../img/jqueryui/ui-icons_454545_256x240.png | Bin 0 -> 3707 bytes .../img/jqueryui/ui-icons_555555_256x240.png | Bin 0 -> 6988 bytes .../img/jqueryui/ui-icons_888888_256x240.png | Bin 0 -> 3710 bytes .../img/jqueryui/ui-icons_999999_256x240.png | Bin 0 -> 6986 bytes .../img/jqueryui/ui-icons_cd0a0a_256x240.png | Bin 0 -> 3707 bytes .../img/jqueryui/ui-icons_f0ad4e_256x240.png | Bin 0 -> 4549 bytes .../img/jqueryui/ui-icons_f6cf3b_256x240.png | Bin 0 -> 3919 bytes .../img/jqueryui/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes src/public/static/smartadmin/img/loading.gif | Bin 0 -> 723 bytes .../smartadmin/img/logo-blacknwhite.png | Bin 0 -> 1440 bytes .../static/smartadmin/img/logo-blue.png | Bin 0 -> 1484 bytes src/public/static/smartadmin/img/logo-o.png | Bin 0 -> 628 bytes .../static/smartadmin/img/logo-pale.png | Bin 0 -> 1333 bytes .../static/smartadmin/img/logo-white.png | Bin 0 -> 1473 bytes src/public/static/smartadmin/img/logo.png | Bin 0 -> 1475 bytes .../static/smartadmin/img/mappin-default.png | Bin 0 -> 431 bytes src/public/static/smartadmin/img/mybg.png | Bin 0 -> 2841 bytes .../static/smartadmin/img/pattern/divider.jpg | Bin 0 -> 1820 bytes .../smartadmin/img/pattern/graphy-xs.png | Bin 0 -> 124 bytes .../static/smartadmin/img/pattern/graphy.png | Bin 0 -> 149 bytes .../static/smartadmin/img/pattern/index.php | 0 .../smartadmin/img/pattern/license-info.txt | 3 + .../img/pattern/lightpaperfibers.png | Bin 0 -> 50401 bytes .../static/smartadmin/img/pattern/movable.png | Bin 0 -> 102 bytes .../smartadmin/img/pattern/nistri-xs.png | Bin 0 -> 185 bytes .../static/smartadmin/img/pattern/nistri.png | Bin 0 -> 182 bytes .../img/pattern/overlay-pattern.png | Bin 0 -> 107 bytes .../smartadmin/img/pattern/paper-xs.png | Bin 0 -> 196 bytes .../static/smartadmin/img/pattern/paper.png | Bin 0 -> 35472 bytes .../static/smartadmin/img/pattern/pattern.png | Bin 0 -> 121 bytes .../img/pattern/sneaker_mesh_fabric-xs.png | Bin 0 -> 399 bytes .../img/pattern/sneaker_mesh_fabric.png | Bin 0 -> 7075 bytes .../img/pattern/tileable_wood_texture-xs.png | Bin 0 -> 755 bytes .../img/pattern/tileable_wood_texture.png | Bin 0 -> 97134 bytes src/public/static/smartadmin/img/ribbon.png | Bin 0 -> 610 bytes .../static/smartadmin/img/saturation.png | Bin 0 -> 4252 bytes .../static/smartadmin/img/select2-spinner.gif | Bin 0 -> 1849 bytes src/public/static/smartadmin/img/sort_asc.png | Bin 0 -> 117 bytes .../smartadmin/img/sort_asc_disabled.png | Bin 0 -> 118 bytes .../static/smartadmin/img/sort_both.png | Bin 0 -> 132 bytes .../static/smartadmin/img/sort_desc.png | Bin 0 -> 116 bytes .../smartadmin/img/sort_desc_disabled.png | Bin 0 -> 117 bytes .../smartadmin/img/splash/ipad-landscape.png | Bin 0 -> 138029 bytes .../smartadmin/img/splash/ipad-portrait.png | Bin 0 -> 174279 bytes .../static/smartadmin/img/splash/iphone.png | Bin 0 -> 63096 bytes .../img/splash/sptouch-icon-iphone.png | Bin 0 -> 2677 bytes .../img/splash/touch-icon-ipad-retina.png | Bin 0 -> 12271 bytes .../smartadmin/img/splash/touch-icon-ipad.png | Bin 0 -> 3287 bytes .../img/splash/touch-icon-iphone-retina.png | Bin 0 -> 7110 bytes .../static/smartadmin/img/superbox/index.php | 0 .../img/superbox/superbox-full-1.jpg | Bin 0 -> 71730 bytes .../img/superbox/superbox-full-10.jpg | Bin 0 -> 38002 bytes .../img/superbox/superbox-full-11.jpg | Bin 0 -> 42656 bytes .../img/superbox/superbox-full-12.jpg | Bin 0 -> 100066 bytes .../img/superbox/superbox-full-13.jpg | Bin 0 -> 59434 bytes .../img/superbox/superbox-full-14.jpg | Bin 0 -> 55100 bytes .../img/superbox/superbox-full-15.jpg | Bin 0 -> 48743 bytes .../img/superbox/superbox-full-16.jpg | Bin 0 -> 51185 bytes .../img/superbox/superbox-full-17.jpg | Bin 0 -> 87184 bytes .../img/superbox/superbox-full-18.jpg | Bin 0 -> 71723 bytes .../img/superbox/superbox-full-19.jpg | Bin 0 -> 84379 bytes .../img/superbox/superbox-full-2.jpg | Bin 0 -> 28175 bytes .../img/superbox/superbox-full-20.jpg | Bin 0 -> 82005 bytes .../img/superbox/superbox-full-21.jpg | Bin 0 -> 57390 bytes .../img/superbox/superbox-full-22.jpg | Bin 0 -> 122369 bytes .../img/superbox/superbox-full-23.jpg | Bin 0 -> 120766 bytes .../img/superbox/superbox-full-24.jpg | Bin 0 -> 87651 bytes .../img/superbox/superbox-full-3.jpg | Bin 0 -> 45436 bytes .../img/superbox/superbox-full-4.jpg | Bin 0 -> 87610 bytes .../img/superbox/superbox-full-5.jpg | Bin 0 -> 29440 bytes .../img/superbox/superbox-full-6.jpg | Bin 0 -> 51533 bytes .../img/superbox/superbox-full-7.jpg | Bin 0 -> 45229 bytes .../img/superbox/superbox-full-8.jpg | Bin 0 -> 29514 bytes .../img/superbox/superbox-full-9.jpg | Bin 0 -> 44066 bytes .../img/superbox/superbox-thumb-1.jpg | Bin 0 -> 12576 bytes .../img/superbox/superbox-thumb-10.jpg | Bin 0 -> 8076 bytes .../img/superbox/superbox-thumb-11.jpg | Bin 0 -> 9460 bytes .../img/superbox/superbox-thumb-12.jpg | Bin 0 -> 16451 bytes .../img/superbox/superbox-thumb-13.jpg | Bin 0 -> 11136 bytes .../img/superbox/superbox-thumb-14.jpg | Bin 0 -> 9758 bytes .../img/superbox/superbox-thumb-15.jpg | Bin 0 -> 9800 bytes .../img/superbox/superbox-thumb-16.jpg | Bin 0 -> 10803 bytes .../img/superbox/superbox-thumb-17.jpg | Bin 0 -> 10006 bytes .../img/superbox/superbox-thumb-18.jpg | Bin 0 -> 10251 bytes .../img/superbox/superbox-thumb-19.jpg | Bin 0 -> 15385 bytes .../img/superbox/superbox-thumb-2.jpg | Bin 0 -> 4591 bytes .../img/superbox/superbox-thumb-20.jpg | Bin 0 -> 13585 bytes .../img/superbox/superbox-thumb-21.jpg | Bin 0 -> 7997 bytes .../img/superbox/superbox-thumb-22.jpg | Bin 0 -> 17601 bytes .../img/superbox/superbox-thumb-23.jpg | Bin 0 -> 15826 bytes .../img/superbox/superbox-thumb-24.jpg | Bin 0 -> 12943 bytes .../img/superbox/superbox-thumb-3.jpg | Bin 0 -> 8575 bytes .../img/superbox/superbox-thumb-4.jpg | Bin 0 -> 11941 bytes .../img/superbox/superbox-thumb-5.jpg | Bin 0 -> 6316 bytes .../img/superbox/superbox-thumb-6.jpg | Bin 0 -> 10157 bytes .../img/superbox/superbox-thumb-7.jpg | Bin 0 -> 9451 bytes .../img/superbox/superbox-thumb-8.jpg | Bin 0 -> 6493 bytes .../img/superbox/superbox-thumb-9.jpg | Bin 0 -> 8380 bytes src/public/static/smartadmin/inbox.html | 761 + src/public/static/smartadmin/index.html | 2061 ++ .../static/smartadmin/inline-charts.html | 900 + src/public/static/smartadmin/invoice.html | 834 + src/public/static/smartadmin/jqui.html | 1221 + src/public/static/smartadmin/js/app.js | 1380 ++ .../smartadmin/js/bootstrap/bootstrap.js | 1951 ++ .../smartadmin/js/bootstrap/bootstrap.min.js | 6 + src/public/static/smartadmin/js/demo.js | 190 + .../smartadmin/js/libs/jquery-2.0.2.min.js | 6 + .../js/libs/jquery-ui-1.10.3.min.js | 12 + .../js/notification/SmartNotification.js | 708 + .../js/notification/SmartNotification.min.js | 1 + .../bootstrap-progressbar.js | 164 + .../bootstrap-slider/bootstrap-slider.js | 388 + .../bootstrap-slider/bootstrap-slider.min.js | 1 + .../bootstrap-tagsinput-angular.js | 80 + .../bootstrap-tags/bootstrap-tagsinput.js | 503 + .../bootstrap-tags/bootstrap-tagsinput.min.js | 8 + .../bootstrap-tagsinput.min.js.map | 1 + .../bootstrap-timepicker.js | 1097 + .../bootstrap-timepicker.min.js | 1 + .../jquery.bootstrap.wizard.js | 260 + .../jquery.bootstrap.wizard.min.js | 20 + .../js/plugin/bootstraptree/bootstrap-tree.js | 15 + .../smartadmin/js/plugin/ckeditor/CHANGES.md | 252 + .../smartadmin/js/plugin/ckeditor/LICENSE.md | 1264 + .../smartadmin/js/plugin/ckeditor/README.md | 39 + .../js/plugin/ckeditor/adapters/jquery.js | 10 + .../js/plugin/ckeditor/build-config.js | 166 + .../js/plugin/ckeditor/ckeditor-.js | 873 + .../smartadmin/js/plugin/ckeditor/ckeditor.js | 930 + .../smartadmin/js/plugin/ckeditor/config.js | 10 + .../js/plugin/ckeditor/contents.css | 108 + .../smartadmin/js/plugin/ckeditor/lang/af.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ar.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/bg.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/bn.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/bs.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ca.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/cs.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/cy.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/da.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/de.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/el.js | 5 + .../js/plugin/ckeditor/lang/en-au.js | 5 + .../js/plugin/ckeditor/lang/en-ca.js | 5 + .../js/plugin/ckeditor/lang/en-gb.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/en.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/eo.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/es.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/et.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/eu.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/fa.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/fi.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/fo.js | 5 + .../js/plugin/ckeditor/lang/fr-ca.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/fr.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/gl.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/gu.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/he.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/hi.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/hr.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/hu.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/id.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/is.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/it.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ja.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ka.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/km.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ko.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ku.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/lt.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/lv.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/mk.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/mn.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ms.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/nb.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/nl.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/no.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/pl.js | 5 + .../js/plugin/ckeditor/lang/pt-br.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/pt.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ro.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ru.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/si.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/sk.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/sl.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/sq.js | 5 + .../js/plugin/ckeditor/lang/sr-latn.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/sr.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/sv.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/th.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/tr.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/ug.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/uk.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/vi.js | 5 + .../js/plugin/ckeditor/lang/zh-cn.js | 5 + .../smartadmin/js/plugin/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../dialogs/lang/_translationstatus.txt | 25 + .../plugins/a11yhelp/dialogs/lang/ar.js | 9 + .../plugins/a11yhelp/dialogs/lang/bg.js | 9 + .../plugins/a11yhelp/dialogs/lang/ca.js | 10 + .../plugins/a11yhelp/dialogs/lang/cs.js | 10 + .../plugins/a11yhelp/dialogs/lang/cy.js | 9 + .../plugins/a11yhelp/dialogs/lang/da.js | 9 + .../plugins/a11yhelp/dialogs/lang/de.js | 10 + .../plugins/a11yhelp/dialogs/lang/el.js | 10 + .../plugins/a11yhelp/dialogs/lang/en.js | 9 + .../plugins/a11yhelp/dialogs/lang/eo.js | 10 + .../plugins/a11yhelp/dialogs/lang/es.js | 10 + .../plugins/a11yhelp/dialogs/lang/et.js | 9 + .../plugins/a11yhelp/dialogs/lang/fa.js | 9 + .../plugins/a11yhelp/dialogs/lang/fi.js | 10 + .../plugins/a11yhelp/dialogs/lang/fr-ca.js | 10 + .../plugins/a11yhelp/dialogs/lang/fr.js | 11 + .../plugins/a11yhelp/dialogs/lang/gl.js | 10 + .../plugins/a11yhelp/dialogs/lang/gu.js | 9 + .../plugins/a11yhelp/dialogs/lang/he.js | 9 + .../plugins/a11yhelp/dialogs/lang/hi.js | 9 + .../plugins/a11yhelp/dialogs/lang/hr.js | 9 + .../plugins/a11yhelp/dialogs/lang/hu.js | 10 + .../plugins/a11yhelp/dialogs/lang/id.js | 9 + .../plugins/a11yhelp/dialogs/lang/it.js | 10 + .../plugins/a11yhelp/dialogs/lang/ja.js | 8 + .../plugins/a11yhelp/dialogs/lang/km.js | 9 + .../plugins/a11yhelp/dialogs/lang/ko.js | 9 + .../plugins/a11yhelp/dialogs/lang/ku.js | 10 + .../plugins/a11yhelp/dialogs/lang/lt.js | 9 + .../plugins/a11yhelp/dialogs/lang/lv.js | 11 + .../plugins/a11yhelp/dialogs/lang/mk.js | 9 + .../plugins/a11yhelp/dialogs/lang/mn.js | 9 + .../plugins/a11yhelp/dialogs/lang/nb.js | 9 + .../plugins/a11yhelp/dialogs/lang/nl.js | 10 + .../plugins/a11yhelp/dialogs/lang/no.js | 9 + .../plugins/a11yhelp/dialogs/lang/pl.js | 10 + .../plugins/a11yhelp/dialogs/lang/pt-br.js | 9 + .../plugins/a11yhelp/dialogs/lang/pt.js | 10 + .../plugins/a11yhelp/dialogs/lang/ro.js | 9 + .../plugins/a11yhelp/dialogs/lang/ru.js | 9 + .../plugins/a11yhelp/dialogs/lang/si.js | 8 + .../plugins/a11yhelp/dialogs/lang/sk.js | 10 + .../plugins/a11yhelp/dialogs/lang/sl.js | 10 + .../plugins/a11yhelp/dialogs/lang/sq.js | 9 + .../plugins/a11yhelp/dialogs/lang/sr-latn.js | 9 + .../plugins/a11yhelp/dialogs/lang/sr.js | 9 + .../plugins/a11yhelp/dialogs/lang/sv.js | 10 + .../plugins/a11yhelp/dialogs/lang/th.js | 9 + .../plugins/a11yhelp/dialogs/lang/tr.js | 10 + .../plugins/a11yhelp/dialogs/lang/ug.js | 9 + .../plugins/a11yhelp/dialogs/lang/uk.js | 10 + .../plugins/a11yhelp/dialogs/lang/vi.js | 9 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 7 + .../ckeditor/plugins/about/dialogs/about.js | 7 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 13339 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 6757 bytes .../plugins/clipboard/dialogs/paste.js | 11 + .../colordialog/dialogs/colordialog.js | 13 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/div/dialogs/div.js | 9 + .../plugins/fakeobjects/images/spacer.gif | Bin 0 -> 43 bytes .../ckeditor/plugins/find/dialogs/find.js | 24 + .../ckeditor/plugins/flash/dialogs/flash.js | 24 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/forms/dialogs/button.js | 8 + .../plugins/forms/dialogs/checkbox.js | 8 + .../ckeditor/plugins/forms/dialogs/form.js | 8 + .../plugins/forms/dialogs/hiddenfield.js | 8 + .../ckeditor/plugins/forms/dialogs/radio.js | 8 + .../ckeditor/plugins/forms/dialogs/select.js | 20 + .../plugins/forms/dialogs/textarea.js | 8 + .../plugins/forms/dialogs/textfield.js | 10 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 105 bytes .../js/plugin/ckeditor/plugins/icons.png | Bin 0 -> 20427 bytes .../plugin/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 66930 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 10 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 449 bytes .../ckeditor/plugins/image/dialogs/image.js | 43 + .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor/plugins/link/dialogs/anchor.js | 8 + .../ckeditor/plugins/link/dialogs/link.js | 36 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 763 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1597 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 + .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 260 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 172 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 54 bytes .../plugins/pastefromword/filter/default.js | 31 + .../ckeditor/plugins/preview/preview.html | 10 + .../plugin/ckeditor/plugins/scayt/LICENSE.md | 28 + .../plugin/ckeditor/plugins/scayt/README.md | 25 + .../ckeditor/plugins/scayt/dialogs/options.js | 20 + .../plugins/scayt/dialogs/toolbar.css | 71 + .../showblocks/images/block_address.png | Bin 0 -> 171 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 181 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 136 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 134 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 131 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 129 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 119 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 136 bytes .../ckeditor/plugins/smiley/dialogs/smiley.js | 10 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 465 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 443 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 192 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 464 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 468 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 436 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 442 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 426 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 183 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 241 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 368 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 451 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 450 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 460 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 449 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 408 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 396 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 446 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 446 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 452 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 458 bytes .../dialogs/lang/_translationstatus.txt | 20 + .../plugins/specialchar/dialogs/lang/ar.js | 13 + .../plugins/specialchar/dialogs/lang/bg.js | 13 + .../plugins/specialchar/dialogs/lang/ca.js | 14 + .../plugins/specialchar/dialogs/lang/cs.js | 13 + .../plugins/specialchar/dialogs/lang/cy.js | 14 + .../plugins/specialchar/dialogs/lang/de.js | 13 + .../plugins/specialchar/dialogs/lang/el.js | 13 + .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/eo.js | 12 + .../plugins/specialchar/dialogs/lang/es.js | 13 + .../plugins/specialchar/dialogs/lang/et.js | 13 + .../plugins/specialchar/dialogs/lang/fa.js | 12 + .../plugins/specialchar/dialogs/lang/fi.js | 13 + .../plugins/specialchar/dialogs/lang/fr-ca.js | 10 + .../plugins/specialchar/dialogs/lang/fr.js | 11 + .../plugins/specialchar/dialogs/lang/gl.js | 13 + .../plugins/specialchar/dialogs/lang/he.js | 12 + .../plugins/specialchar/dialogs/lang/hr.js | 13 + .../plugins/specialchar/dialogs/lang/hu.js | 12 + .../plugins/specialchar/dialogs/lang/id.js | 13 + .../plugins/specialchar/dialogs/lang/it.js | 14 + .../plugins/specialchar/dialogs/lang/ja.js | 9 + .../plugins/specialchar/dialogs/lang/ku.js | 13 + .../plugins/specialchar/dialogs/lang/lv.js | 13 + .../plugins/specialchar/dialogs/lang/nb.js | 11 + .../plugins/specialchar/dialogs/lang/nl.js | 13 + .../plugins/specialchar/dialogs/lang/no.js | 11 + .../plugins/specialchar/dialogs/lang/pl.js | 12 + .../plugins/specialchar/dialogs/lang/pt-br.js | 11 + .../plugins/specialchar/dialogs/lang/pt.js | 13 + .../plugins/specialchar/dialogs/lang/ru.js | 13 + .../plugins/specialchar/dialogs/lang/si.js | 13 + .../plugins/specialchar/dialogs/lang/sk.js | 13 + .../plugins/specialchar/dialogs/lang/sl.js | 12 + .../plugins/specialchar/dialogs/lang/sq.js | 13 + .../plugins/specialchar/dialogs/lang/sv.js | 11 + .../plugins/specialchar/dialogs/lang/th.js | 13 + .../plugins/specialchar/dialogs/lang/tr.js | 12 + .../plugins/specialchar/dialogs/lang/ug.js | 13 + .../plugins/specialchar/dialogs/lang/uk.js | 12 + .../plugins/specialchar/dialogs/lang/vi.js | 14 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../specialchar/dialogs/specialchar.js | 14 + .../ckeditor/plugins/table/dialogs/table.js | 21 + .../plugins/tabletools/dialogs/tableCell.js | 16 + .../plugins/templates/dialogs/templates.css | 84 + .../plugins/templates/dialogs/templates.js | 10 + .../plugins/templates/templates/default.js | 6 + .../templates/templates/images/template1.gif | Bin 0 -> 375 bytes .../templates/templates/images/template2.gif | Bin 0 -> 333 bytes .../templates/templates/images/template3.gif | Bin 0 -> 422 bytes .../js/plugin/ckeditor/plugins/wsc/LICENSE.md | 28 + .../js/plugin/ckeditor/plugins/wsc/README.md | 25 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 66 + .../ckeditor/plugins/wsc/dialogs/tmp.html | 118 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 82 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 67 + .../ckeditor/plugins/wsc/dialogs/wsc_ie.js | 11 + .../js/plugin/ckeditor/samples/ajax.html | 82 + .../js/plugin/ckeditor/samples/api.html | 207 + .../js/plugin/ckeditor/samples/appendto.html | 57 + .../ckeditor/samples/datafiltering.html | 401 + .../plugin/ckeditor/samples/divreplace.html | 141 + .../js/plugin/ckeditor/samples/index.html | 128 + .../js/plugin/ckeditor/samples/inlineall.html | 311 + .../plugin/ckeditor/samples/inlinebycode.html | 121 + .../ckeditor/samples/inlinetextarea.html | 110 + .../js/plugin/ckeditor/samples/jquery.html | 97 + .../samples/plugins/dialog/dialog.html | 187 + .../samples/plugins/enterkey/enterkey.html | 103 + .../plugins/htmlwriter/outputforflash.html | 280 + .../plugins/htmlwriter/outputhtml.html | 221 + .../samples/plugins/magicline/magicline.html | 207 + .../samples/plugins/toolbar/toolbar.html | 232 + .../samples/plugins/wysiwygarea/fullpage.html | 77 + .../js/plugin/ckeditor/samples/readonly.html | 73 + .../ckeditor/samples/replacebyclass.html | 57 + .../ckeditor/samples/replacebycode.html | 56 + .../js/plugin/ckeditor/samples/sample.css | 339 + .../js/plugin/ckeditor/samples/sample.js | 33 + .../ckeditor/samples/sample_posteddata.php | 16 + .../js/plugin/ckeditor/samples/tabindex.html | 75 + .../js/plugin/ckeditor/samples/uicolor.html | 69 + .../plugin/ckeditor/samples/uilanguages.html | 119 + .../plugin/ckeditor/samples/xhtmlstyle.html | 231 + .../js/plugin/ckeditor/skins/moono/dialog.css | 5 + .../plugin/ckeditor/skins/moono/dialog_ie.css | 5 + .../ckeditor/skins/moono/dialog_ie7.css | 5 + .../ckeditor/skins/moono/dialog_ie8.css | 5 + .../ckeditor/skins/moono/dialog_iequirks.css | 5 + .../ckeditor/skins/moono/dialog_opera.css | 5 + .../js/plugin/ckeditor/skins/moono/editor.css | 5 + .../ckeditor/skins/moono/editor_gecko.css | 5 + .../plugin/ckeditor/skins/moono/editor_ie.css | 5 + .../ckeditor/skins/moono/editor_ie7.css | 5 + .../ckeditor/skins/moono/editor_ie8.css | 5 + .../ckeditor/skins/moono/editor_iequirks.css | 5 + .../js/plugin/ckeditor/skins/moono/icons.png | Bin 0 -> 20427 bytes .../ckeditor/skins/moono/icons_hidpi.png | Bin 0 -> 66930 bytes .../ckeditor/skins/moono/images/arrow.png | Bin 0 -> 261 bytes .../ckeditor/skins/moono/images/close.png | Bin 0 -> 824 bytes .../skins/moono/images/hidpi/close.png | Bin 0 -> 1792 bytes .../skins/moono/images/hidpi/lock-open.png | Bin 0 -> 1503 bytes .../skins/moono/images/hidpi/lock.png | Bin 0 -> 1616 bytes .../skins/moono/images/hidpi/refresh.png | Bin 0 -> 2320 bytes .../ckeditor/skins/moono/images/lock-open.png | Bin 0 -> 736 bytes .../ckeditor/skins/moono/images/lock.png | Bin 0 -> 728 bytes .../ckeditor/skins/moono/images/refresh.png | Bin 0 -> 953 bytes .../js/plugin/ckeditor/skins/moono/readme.md | 51 + .../smartadmin/js/plugin/ckeditor/styles.js | 111 + .../colorpicker/bootstrap-colorpicker.js | 540 + .../colorpicker/bootstrap-colorpicker.min.js | 1 + .../js/plugin/datatables/ColReorder.min.js | 33 + .../js/plugin/datatables/ColVis.min.js | 37 + .../js/plugin/datatables/DT_bootstrap.js | 232 + .../js/plugin/datatables/FixedColumns.min.js | 1 + .../js/plugin/datatables/ZeroClipboard.js | 367 + .../datatables/jquery.dataTables-cust.js | 12099 +++++++++ .../datatables/jquery.dataTables-cust.min.js | 1 + .../datatables/media/as3/ZeroClipboard.as | 221 + .../datatables/media/as3/ZeroClipboardPdf.as | 310 + .../datatables/media/as3/lib/AlivePDF.swc | Bin 0 -> 131230 bytes .../datatables/media/css/TableTools.css | 321 + .../datatables/media/css/TableTools_JUI.css | 185 + .../datatables/media/images/background.png | Bin 0 -> 944 bytes .../datatables/media/images/collection.png | Bin 0 -> 1166 bytes .../media/images/collection_hover.png | Bin 0 -> 1194 bytes .../plugin/datatables/media/images/copy.png | Bin 0 -> 2184 bytes .../datatables/media/images/copy_hover.png | Bin 0 -> 2797 bytes .../js/plugin/datatables/media/images/csv.png | Bin 0 -> 1607 bytes .../datatables/media/images/csv_hover.png | Bin 0 -> 1854 bytes .../js/plugin/datatables/media/images/pdf.png | Bin 0 -> 4325 bytes .../datatables/media/images/pdf_hover.png | Bin 0 -> 2786 bytes .../plugin/datatables/media/images/print.png | Bin 0 -> 2123 bytes .../datatables/media/images/print_hover.png | Bin 0 -> 2230 bytes .../media/images/psd/collection.psd | Bin 0 -> 25792 bytes .../media/images/psd/copy document.psd | Bin 0 -> 104729 bytes .../media/images/psd/file_types.psd | Bin 0 -> 1090645 bytes .../datatables/media/images/psd/printer.psd | Bin 0 -> 119952 bytes .../js/plugin/datatables/media/images/xls.png | Bin 0 -> 1641 bytes .../datatables/media/images/xls_hover.png | Bin 0 -> 2061 bytes .../plugin/datatables/media/js/TableTools.js | 2475 ++ .../datatables/media/js/TableTools.min.js | 76 + .../datatables/media/js/TableTools.min.js.gz | Bin 0 -> 8757 bytes .../datatables/media/js/ZeroClipboard.js | 367 + .../datatables/media/swf/copy_csv_xls.swf | Bin 0 -> 2142 bytes .../datatables/media/swf/copy_csv_xls_pdf.swf | Bin 0 -> 58814 bytes .../delete-table-row/delete-table-row.js | 59 + .../js/plugin/dropzone/dropzone-amd-module.js | 1552 ++ .../dropzone/dropzone-amd-module.min.js | 1 + .../smartadmin/js/plugin/dropzone/dropzone.js | 1758 ++ .../js/plugin/dropzone/dropzone.min.js | 1 + .../easy-pie-chart/examples/excanvas.js | 924 + .../plugin/easy-pie-chart/examples/index.html | 94 + .../plugin/easy-pie-chart/examples/style.css | 131 + .../easy-pie-chart/jquery.easy-pie-chart.js | 199 + .../jquery.easy-pie-chart.min.js | 1 + .../js/plugin/fastclick/fastclick.js | 25 + .../js/plugin/flot/jquery.flot.cust.js | 2626 ++ .../js/plugin/flot/jquery.flot.fillbetween.js | 183 + .../flot/jquery.flot.fillbetween.min.js | 1 + .../js/plugin/flot/jquery.flot.orderBar.js | 186 + .../plugin/flot/jquery.flot.orderBar.min.js | 1 + .../js/plugin/flot/jquery.flot.pie.js | 812 + .../js/plugin/flot/jquery.flot.pie.min.js | 1 + .../js/plugin/flot/jquery.flot.resize.js | 60 + .../js/plugin/flot/jquery.flot.resize.min.js | 1 + .../js/plugin/flot/jquery.flot.tooltip.js | 154 + .../js/plugin/flot/jquery.flot.tooltip.min.js | 14 + .../js/plugin/fuelux/wizard/wizard.js | 244 + .../fullcalendar/jquery.fullcalendar.js | 5220 ++++ .../fullcalendar/jquery.fullcalendar.min.js | 114 + .../ie-placeholder/jquery.placeholder.min.js | 14 + .../js/plugin/ion-slider/ion.rangeSlider.js | 741 + .../plugin/ion-slider/ion.rangeSlider.min.js | 21 + .../js/plugin/jquery-form/jquery-form.min.js | 7 + .../plugin/jquery-nestable/jquery.nestable.js | 485 + .../jquery-touch/jquery.ui.touch-punch.js | 160 + .../jquery-touch/jquery.ui.touch-punch.min.js | 11 + .../jquery-validate/jquery.validate.min.js | 4 + .../plugin/js-migrate/jquery-migrate-1.2.1.js | 521 + .../js-migrate/jquery-migrate-1.2.1.min.js | 2 + .../smartadmin/js/plugin/knob/jquery.knob.js | 751 + .../js/plugin/knob/jquery.knob.min.js | 2 + .../smartadmin/js/plugin/lazyload/lazyload.js | 390 + .../js/plugin/lazyload/lazyload.min.js | 6 + .../js/plugin/markdown/bootstrap-markdown.js | 993 + .../plugin/markdown/bootstrap-markdown.min.js | 1 + .../smartadmin/js/plugin/markdown/markdown.js | 1616 ++ .../js/plugin/markdown/markdown.min.js | 1 + .../js/plugin/markdown/to-markdown.js | 184 + .../js/plugin/markdown/to-markdown.min.js | 1 + .../plugin/masked-input/jquery.maskedinput.js | 338 + .../masked-input/jquery.maskedinput.min.js | 5 + .../plugin/maxlength/bootstrap-maxlength.js | 332 + .../maxlength/bootstrap-maxlength.min.js | 13 + .../js/plugin/morris/morris-chart-settings.js | 395 + .../smartadmin/js/plugin/morris/morris.js | 1589 ++ .../smartadmin/js/plugin/morris/morris.min.js | 1 + .../js/plugin/morris/raphael.2.1.0.min.js | 10 + .../js/plugin/msie-fix/jquery.mb.browser.js | 102 + .../plugin/msie-fix/jquery.mb.browser.min.js | 23 + .../multiselect/bootstrap-multiselect.js | 653 + .../multiselect/bootstrap-multiselect.min.js | 1 + .../plugin/noUiSlider/jquery.nouislider.css | 120 + .../js/plugin/noUiSlider/jquery.nouislider.js | 916 + .../noUiSlider/jquery.nouislider.min.js | 16 + .../smartadmin/js/plugin/pace/pace.min.js | 2 + .../smartadmin/js/plugin/select2/readme.txt | 1 + .../js/plugin/select2/select2-customized.js | 2713 ++ .../smartadmin/js/plugin/select2/select2.js | 3255 +++ .../js/plugin/select2/select2.min.js | 22 + .../selectToUISlider.jQuery.js | 240 + .../selectToUISlider.jQuery.min.js | 1 + .../controls/slick.allcontrols.min.js | 1 + .../slickgrid/controls/slick.columnpicker.css | 31 + .../slickgrid/controls/slick.columnpicker.js | 145 + .../plugin/slickgrid/controls/slick.pager.css | 41 + .../plugin/slickgrid/controls/slick.pager.js | 147 + .../slickgrid/lib/jquery.event.drag-2.2.js | 402 + .../slickgrid/lib/jquery.event.drop-2.2.js | 302 + .../slickgrid/plugins/slick.allplugins.min.js | 1 + .../slickgrid/plugins/slick.autotooltips.js | 83 + .../plugins/slick.cellcopymanager.js | 86 + .../plugins/slick.cellrangedecorator.js | 66 + .../plugins/slick.cellrangeselector.js | 113 + .../plugins/slick.cellselectionmodel.js | 154 + .../plugins/slick.checkboxselectcolumn.js | 153 + .../slickgrid/plugins/slick.headerbuttons.css | 39 + .../slickgrid/plugins/slick.headerbuttons.js | 177 + .../slickgrid/plugins/slick.headermenu.css | 59 + .../slickgrid/plugins/slick.headermenu.js | 275 + .../slickgrid/plugins/slick.rowmovemanager.js | 138 + .../plugins/slick.rowselectionmodel.js | 187 + .../js/plugin/slickgrid/slick.core.js | 459 + .../js/plugin/slickgrid/slick.dataview.js | 1063 + .../js/plugin/slickgrid/slick.editors.js | 496 + .../js/plugin/slickgrid/slick.editors.js-- | 512 + .../js/plugin/slickgrid/slick.formatters.js | 59 + .../js/plugin/slickgrid/slick.grid.js | 3377 +++ .../slick.groupitemmetadataprovider.js | 146 + .../js/plugin/slickgrid/slick.remotemodel.js | 173 + .../js/plugin/smartclick/smartclick.js | 31 + .../js/plugin/sparkline/jquery.sparkline.js | 3064 +++ .../plugin/sparkline/jquery.sparkline.min.js | 5 + .../js/plugin/summernote/summernote.js | 1840 ++ .../smartadmin/js/plugin/superbox/superbox.js | 79 + .../js/plugin/superbox/superbox.min.js | 1 + .../jquery.ba-throttle-debounce.min.js | 9 + .../js/plugin/typeahead/typeahead.js | 1139 + .../js/plugin/typeahead/typeahead.min.js | 7 + .../js/plugin/typeahead/typeaheadjs.js | 86 + .../js/plugin/typeahead/typeaheadjs.min.js | 30 + .../vectormap/jquery-jvectormap-1.1.1.css | 37 + .../vectormap/jquery-jvectormap-1.1.1.min.js | 7 + .../vectormap/jquery-jvectormap-1.2.2.css | 37 + .../vectormap/jquery-jvectormap-1.2.2.min.js | 1 + .../jquery-jvectormap-world-mill-en.js | 1 + .../plugin/x-editable/jquery.mockjax.min.js | 13 + .../js/plugin/x-editable/moment.min.js | 6 + .../js/plugin/x-editable/x-editable.js | 6674 +++++ .../js/plugin/x-editable/x-editable.min.js | 7 + .../js/smartwidgets/jarvis.widget.js | 1442 ++ .../js/smartwidgets/jarvis.widget.min.js | 1 + src/public/static/smartadmin/lock.html | 147 + src/public/static/smartadmin/login.html | 251 + src/public/static/smartadmin/morris.html | 1911 ++ .../static/smartadmin/nestable-list.html | 1015 + .../static/smartadmin/other-editors.html | 1034 + .../static/smartadmin/php/demo-comment.php | 6 + .../static/smartadmin/php/demo-contacts.php | 12 + .../static/smartadmin/php/demo-register.php | 6 + src/public/static/smartadmin/plugins.html | 2512 ++ .../static/smartadmin/pricing-table.html | 1269 + src/public/static/smartadmin/profile.html | 1164 + src/public/static/smartadmin/register.html | 574 + src/public/static/smartadmin/search.html | 1054 + src/public/static/smartadmin/sound/bigbox.mp3 | Bin 0 -> 61035 bytes src/public/static/smartadmin/sound/bigbox.ogg | Bin 0 -> 42197 bytes .../static/smartadmin/sound/messagebox.mp3 | Bin 0 -> 10368 bytes .../static/smartadmin/sound/messagebox.ogg | Bin 0 -> 18000 bytes .../static/smartadmin/sound/smallbox.mp3 | Bin 0 -> 17024 bytes .../static/smartadmin/sound/smallbox.ogg | Bin 0 -> 24370 bytes src/public/static/smartadmin/table.html | 1180 + src/public/static/smartadmin/timeline.html | 776 + src/public/static/smartadmin/treeview.html | 946 + src/public/static/smartadmin/typography.html | 1725 ++ src/public/static/smartadmin/upload.php | 18 + src/public/static/smartadmin/validation.html | 998 + src/public/static/smartadmin/widgets.html | 2027 ++ src/public/static/smartadmin/wizard.html | 1426 ++ src/robot.php | 41 - 893 files changed, 225721 insertions(+), 609 deletions(-) create mode 100644 bin/build.php create mode 100755 doc/crontab.sql delete mode 100644 src/App/Exec.php delete mode 100644 src/App/Robot.php delete mode 100644 src/App/Tasks.php delete mode 100644 src/Lib/CentreServer.php delete mode 100644 src/Lib/Process.php delete mode 100644 src/Lib/TermLog.php delete mode 100644 src/_init.php create mode 100644 src/admin/classes/Auth.php create mode 100644 src/admin/classes/CommonController.php create mode 100644 src/admin/classes/LoginController.php create mode 100644 src/admin/classes/ParserDoc.php create mode 100644 src/admin/classes/RBAC.php rename src/{Lib => admin/classes}/Service.php (84%) create mode 100644 src/admin/configs/common.php rename src/{configs => admin/configs/dev}/db.php (78%) rename src/{configs => admin/configs/dev}/log.php (100%) create mode 100644 src/admin/configs/dev/service.php create mode 100644 src/admin/configs/product/db.php create mode 100644 src/admin/configs/product/log.php create mode 100644 src/admin/configs/product/service.php create mode 100644 src/admin/configs/test/db.php create mode 100644 src/admin/configs/test/log.php create mode 100644 src/admin/configs/test/service.php create mode 100644 src/admin/configs/user.php create mode 100644 src/admin/controllers/Agent.php create mode 100644 src/admin/controllers/Auth.php create mode 100644 src/admin/controllers/Crongroup.php create mode 100644 src/admin/controllers/Crontab.php create mode 100644 src/admin/controllers/Page.php create mode 100644 src/admin/controllers/Password.php create mode 100644 src/admin/controllers/Runtimetask.php create mode 100644 src/admin/controllers/Termlog.php create mode 100644 src/admin/controllers/User.php create mode 100644 src/admin/factory/user.php create mode 100644 src/admin/models/User.php create mode 100644 src/admin/templates/agent/addoredit.php create mode 100644 src/admin/templates/agent/index.php create mode 100644 src/admin/templates/auth/groupedit.php create mode 100644 src/admin/templates/auth/index.php create mode 100644 src/admin/templates/auth/nodeedit.php create mode 100644 src/admin/templates/crongroup/addoredit.php create mode 100644 src/admin/templates/crongroup/index.php create mode 100644 src/admin/templates/crontab/addoredit.php create mode 100644 src/admin/templates/crontab/index.php create mode 100644 src/admin/templates/include/css.php create mode 100644 src/admin/templates/include/filter.php create mode 100644 src/admin/templates/include/header.php create mode 100644 src/admin/templates/include/javascript.php create mode 100644 src/admin/templates/include/leftmenu.php create mode 100644 src/admin/templates/include/msg.php create mode 100644 src/admin/templates/include/top_menu.php create mode 100644 src/admin/templates/page/index.php create mode 100644 src/admin/templates/password/modifypassword.php create mode 100644 src/admin/templates/runtimetask/index.php create mode 100644 src/admin/templates/termlog/index.php create mode 100644 src/admin/templates/user/addoredit.php create mode 100644 src/admin/templates/user/index.php create mode 100644 src/admin/templates/user/modifypassword.php create mode 100644 src/agent/App/Exec.php rename src/{Lib/RobotServer.php => agent/Lib/AgentServer.php} (70%) create mode 100644 src/agent/Lib/Client.php create mode 100644 src/agent/Lib/FileLog.php create mode 100644 src/agent/Lib/Flog.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/Argument.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionKit.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionParser.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/Exception/InvalidOptionException.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/Exception/RequireValueException.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/GetOptionKit.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/Init.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/NonNumericException.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionParser.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinter.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinterInterface.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionResult.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpec.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpecCollection.php create mode 100644 src/agent/Lib/GetOptionKit/src/GetOptionKit/SplClassLoader.php create mode 100644 src/agent/Lib/Loader.php create mode 100644 src/agent/Lib/Process.php create mode 100644 src/agent/Lib/SOAClient.php create mode 100644 src/agent/Lib/SOAServer.php create mode 100755 src/agent/Lib/Server.php create mode 100644 src/agent/Lib/ServerBase.php rename src/{ => agent}/Lib/Util.php (75%) create mode 100644 src/agent/_init.php create mode 100644 src/agent/agent.php create mode 100644 src/center/App/Agent.php create mode 100644 src/center/App/Tasks.php create mode 100644 src/center/App/Termlog.php create mode 100644 src/center/Lib/CenterServer.php create mode 100644 src/center/Lib/Client.php rename src/{ => center}/Lib/Donkeyid.php (100%) rename src/{ => center}/Lib/Flog.php (100%) rename src/{ => center}/Lib/LoadTasks.php (63%) rename src/{ => center}/Lib/ParseCrontab.php (100%) create mode 100644 src/center/Lib/Report.php rename src/{ => center}/Lib/Robot.php (55%) rename src/{ => center}/Lib/Tasks.php (72%) create mode 100644 src/center/Lib/TermLog.php create mode 100644 src/center/Lib/Util.php create mode 100644 src/center/_init.php rename src/{centre.php => center/center.php} (60%) create mode 100644 src/center/configs/dev/db.php create mode 100644 src/center/configs/log.php create mode 100644 src/center/configs/product/db.php create mode 100644 src/center/configs/test/db.php create mode 100644 src/center/console.php create mode 100644 src/public/index.php create mode 100644 src/public/static/css/style.css create mode 100644 src/public/static/css/terminal.css create mode 100644 src/public/static/jquery-ui/css/redmond/images/animated-overlay.gif create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_glass_85_dfeffc_1x400.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_217bc0_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_2e83ff_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_469bdd_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_6da8d5_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_cd0a0a_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_d8e7f3_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/images/ui-icons_f9bd01_256x240.png create mode 100644 src/public/static/jquery-ui/css/redmond/jquery-ui.css create mode 100644 src/public/static/jquery-ui/css/redmond/jquery-ui.min.css create mode 100644 src/public/static/jquery-ui/index.html create mode 100644 src/public/static/jquery-ui/js/jquery-1.10.2.js create mode 100644 src/public/static/jquery-ui/js/jquery-ui-1.10.4.custom.js create mode 100644 src/public/static/jquery-ui/js/jquery-ui-1.10.4.custom.min.js create mode 100644 src/public/static/js/charts.js create mode 100644 src/public/static/js/combox.js create mode 100644 src/public/static/js/esl.js create mode 100644 src/public/static/js/jQuery.md5.js create mode 100644 src/public/static/js/jquery-ui-zh.js create mode 100644 src/public/static/js/jquery.json.js create mode 100644 src/public/static/js/jquery.terminal.js create mode 100644 src/public/static/js/php.js create mode 100644 src/public/static/smartadmin/ajax/demowidget.php create mode 100644 src/public/static/smartadmin/ajax/email-compose.html create mode 100644 src/public/static/smartadmin/ajax/email-opened.html create mode 100644 src/public/static/smartadmin/ajax/email-reply.html create mode 100644 src/public/static/smartadmin/ajax/email-template.html create mode 100644 src/public/static/smartadmin/ajax/email/email-list.html create mode 100644 src/public/static/smartadmin/ajax/inbox.html create mode 100644 src/public/static/smartadmin/ajax/notify/mail.html create mode 100644 src/public/static/smartadmin/ajax/notify/notifications.html create mode 100644 src/public/static/smartadmin/ajax/notify/tasks.html create mode 100644 src/public/static/smartadmin/ajax/website-template.html create mode 100644 src/public/static/smartadmin/blank_.html create mode 100644 src/public/static/smartadmin/bootstrap-forms.html create mode 100644 src/public/static/smartadmin/buttons.html create mode 100644 src/public/static/smartadmin/calendar.html create mode 100644 src/public/static/smartadmin/ckeditor.html create mode 100644 src/public/static/smartadmin/css/bootstrap.css create mode 100644 src/public/static/smartadmin/css/bootstrap.css.map create mode 100644 src/public/static/smartadmin/css/bootstrap.min.css create mode 100644 src/public/static/smartadmin/css/demo.css create mode 100644 src/public/static/smartadmin/css/font-awesome.min.css create mode 100644 src/public/static/smartadmin/css/invoice.css create mode 100644 src/public/static/smartadmin/css/lockscreen.css create mode 100644 src/public/static/smartadmin/css/smartadmin-production.css create mode 100644 src/public/static/smartadmin/css/smartadmin-production_unminified.css create mode 100644 src/public/static/smartadmin/css/smartadmin-rtl.css create mode 100644 src/public/static/smartadmin/css/smartadmin-skins.css create mode 100644 src/public/static/smartadmin/css/your_style.css create mode 100644 src/public/static/smartadmin/datatables.html create mode 100644 src/public/static/smartadmin/dropzone.html create mode 100644 src/public/static/smartadmin/dummy.php create mode 100644 src/public/static/smartadmin/email-template.html create mode 100644 src/public/static/smartadmin/error404.html create mode 100644 src/public/static/smartadmin/error500.html create mode 100644 src/public/static/smartadmin/fa.html create mode 100644 src/public/static/smartadmin/flot.html create mode 100644 src/public/static/smartadmin/fonts/FontAwesome.otf create mode 100644 src/public/static/smartadmin/fonts/fontawesome-webfont.eot create mode 100644 src/public/static/smartadmin/fonts/fontawesome-webfont.svg create mode 100644 src/public/static/smartadmin/fonts/fontawesome-webfont.ttf create mode 100644 src/public/static/smartadmin/fonts/fontawesome-webfont.woff create mode 100644 src/public/static/smartadmin/fonts/glyphicons-halflings-regular.eot create mode 100644 src/public/static/smartadmin/fonts/glyphicons-halflings-regular.svg create mode 100644 src/public/static/smartadmin/fonts/glyphicons-halflings-regular.ttf create mode 100644 src/public/static/smartadmin/fonts/glyphicons-halflings-regular.woff create mode 100644 src/public/static/smartadmin/forgotpassword.html create mode 100644 src/public/static/smartadmin/form-elements.html create mode 100644 src/public/static/smartadmin/form-templates.html create mode 100644 src/public/static/smartadmin/forum-post.html create mode 100644 src/public/static/smartadmin/forum-topic.html create mode 100644 src/public/static/smartadmin/forum.html create mode 100644 src/public/static/smartadmin/gallery.html create mode 100644 src/public/static/smartadmin/general-elements.html create mode 100644 src/public/static/smartadmin/glyph.html create mode 100644 src/public/static/smartadmin/gmap-xml.html create mode 100644 src/public/static/smartadmin/grid.html create mode 100644 src/public/static/smartadmin/img/ajax-loader.gif create mode 100644 src/public/static/smartadmin/img/alpha.png create mode 100644 src/public/static/smartadmin/img/avatars/1.png create mode 100644 src/public/static/smartadmin/img/avatars/2.png create mode 100644 src/public/static/smartadmin/img/avatars/3.png create mode 100644 src/public/static/smartadmin/img/avatars/4.png create mode 100644 src/public/static/smartadmin/img/avatars/5.png create mode 100644 src/public/static/smartadmin/img/avatars/copyright.txt create mode 100644 src/public/static/smartadmin/img/avatars/female.png create mode 100644 src/public/static/smartadmin/img/avatars/index.php create mode 100644 src/public/static/smartadmin/img/avatars/male.png create mode 100644 src/public/static/smartadmin/img/avatars/sunny-big.png create mode 100644 src/public/static/smartadmin/img/avatars/sunny.png create mode 100644 src/public/static/smartadmin/img/clear.png create mode 100644 src/public/static/smartadmin/img/demo/64x64.png create mode 100644 src/public/static/smartadmin/img/demo/basic.png create mode 100644 src/public/static/smartadmin/img/demo/copyright.txt create mode 100644 src/public/static/smartadmin/img/demo/demo-smartbig-alert.png create mode 100644 src/public/static/smartadmin/img/demo/demo-smartmedium-alert.png create mode 100644 src/public/static/smartadmin/img/demo/demo-smartsmall-alert.png create mode 100644 src/public/static/smartadmin/img/demo/hero.png create mode 100644 src/public/static/smartadmin/img/demo/image-placeholder-64x64.png create mode 100644 src/public/static/smartadmin/img/demo/index.php create mode 100644 src/public/static/smartadmin/img/demo/iphoneview.png create mode 100644 src/public/static/smartadmin/img/demo/m1.jpg create mode 100644 src/public/static/smartadmin/img/demo/m2.jpg create mode 100644 src/public/static/smartadmin/img/demo/m3.jpg create mode 100644 src/public/static/smartadmin/img/demo/newsletter.png create mode 100644 src/public/static/smartadmin/img/demo/responseimg.png create mode 100644 src/public/static/smartadmin/img/demo/s1.jpg create mode 100644 src/public/static/smartadmin/img/demo/s2.jpg create mode 100644 src/public/static/smartadmin/img/demo/s3.jpg create mode 100644 src/public/static/smartadmin/img/demo/sa-demo.png create mode 100644 src/public/static/smartadmin/img/demo/sample.jpg create mode 100644 src/public/static/smartadmin/img/demo/sidebar.png create mode 100644 src/public/static/smartadmin/img/demo/sidebarhero.png create mode 100644 src/public/static/smartadmin/img/demo/site-1.jpg create mode 100644 src/public/static/smartadmin/img/demo/site-2.jpg create mode 100644 src/public/static/smartadmin/img/demo/widget-colorpicker.png create mode 100644 src/public/static/smartadmin/img/dropzone/index.php create mode 100644 src/public/static/smartadmin/img/dropzone/spritemap.png create mode 100644 src/public/static/smartadmin/img/dropzone/spritemap@2x.png create mode 100644 src/public/static/smartadmin/img/favicon/1favicon.ico create mode 100644 src/public/static/smartadmin/img/favicon/favicon.ico create mode 100644 src/public/static/smartadmin/img/favicon/favicon.png create mode 100644 src/public/static/smartadmin/img/favicon/index.php create mode 100644 src/public/static/smartadmin/img/flags/de.png create mode 100644 src/public/static/smartadmin/img/flags/es.png create mode 100644 src/public/static/smartadmin/img/flags/flags.zip create mode 100644 src/public/static/smartadmin/img/flags/index.php create mode 100644 src/public/static/smartadmin/img/flags/us.png create mode 100644 src/public/static/smartadmin/img/gradient/index.php create mode 100644 src/public/static/smartadmin/img/gradient/login.png create mode 100644 src/public/static/smartadmin/img/hue.png create mode 100644 src/public/static/smartadmin/img/invoice/americanexpress.png create mode 100644 src/public/static/smartadmin/img/invoice/index.php create mode 100644 src/public/static/smartadmin/img/invoice/license.txt create mode 100644 src/public/static/smartadmin/img/invoice/mastercard.png create mode 100644 src/public/static/smartadmin/img/invoice/paypal.png create mode 100644 src/public/static/smartadmin/img/invoice/visa.png create mode 100644 src/public/static/smartadmin/img/jqueryui/index.php create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_flat_0_999999_40x100.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_glass_65_ffffff_1x400.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_glass_75_dadada_1x400.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_glass_75_ffffff_1x400.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-bg_inset-soft_95_fef1ec_1x100.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_222222_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_2e83ff_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_428bca_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_454545_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_555555_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_888888_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_999999_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_cd0a0a_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_f0ad4e_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_f6cf3b_256x240.png create mode 100644 src/public/static/smartadmin/img/jqueryui/ui-icons_ffffff_256x240.png create mode 100644 src/public/static/smartadmin/img/loading.gif create mode 100644 src/public/static/smartadmin/img/logo-blacknwhite.png create mode 100644 src/public/static/smartadmin/img/logo-blue.png create mode 100644 src/public/static/smartadmin/img/logo-o.png create mode 100644 src/public/static/smartadmin/img/logo-pale.png create mode 100644 src/public/static/smartadmin/img/logo-white.png create mode 100644 src/public/static/smartadmin/img/logo.png create mode 100644 src/public/static/smartadmin/img/mappin-default.png create mode 100644 src/public/static/smartadmin/img/mybg.png create mode 100644 src/public/static/smartadmin/img/pattern/divider.jpg create mode 100644 src/public/static/smartadmin/img/pattern/graphy-xs.png create mode 100644 src/public/static/smartadmin/img/pattern/graphy.png create mode 100644 src/public/static/smartadmin/img/pattern/index.php create mode 100644 src/public/static/smartadmin/img/pattern/license-info.txt create mode 100644 src/public/static/smartadmin/img/pattern/lightpaperfibers.png create mode 100644 src/public/static/smartadmin/img/pattern/movable.png create mode 100644 src/public/static/smartadmin/img/pattern/nistri-xs.png create mode 100644 src/public/static/smartadmin/img/pattern/nistri.png create mode 100644 src/public/static/smartadmin/img/pattern/overlay-pattern.png create mode 100644 src/public/static/smartadmin/img/pattern/paper-xs.png create mode 100644 src/public/static/smartadmin/img/pattern/paper.png create mode 100644 src/public/static/smartadmin/img/pattern/pattern.png create mode 100644 src/public/static/smartadmin/img/pattern/sneaker_mesh_fabric-xs.png create mode 100644 src/public/static/smartadmin/img/pattern/sneaker_mesh_fabric.png create mode 100644 src/public/static/smartadmin/img/pattern/tileable_wood_texture-xs.png create mode 100644 src/public/static/smartadmin/img/pattern/tileable_wood_texture.png create mode 100644 src/public/static/smartadmin/img/ribbon.png create mode 100644 src/public/static/smartadmin/img/saturation.png create mode 100644 src/public/static/smartadmin/img/select2-spinner.gif create mode 100644 src/public/static/smartadmin/img/sort_asc.png create mode 100644 src/public/static/smartadmin/img/sort_asc_disabled.png create mode 100644 src/public/static/smartadmin/img/sort_both.png create mode 100644 src/public/static/smartadmin/img/sort_desc.png create mode 100644 src/public/static/smartadmin/img/sort_desc_disabled.png create mode 100644 src/public/static/smartadmin/img/splash/ipad-landscape.png create mode 100644 src/public/static/smartadmin/img/splash/ipad-portrait.png create mode 100644 src/public/static/smartadmin/img/splash/iphone.png create mode 100644 src/public/static/smartadmin/img/splash/sptouch-icon-iphone.png create mode 100644 src/public/static/smartadmin/img/splash/touch-icon-ipad-retina.png create mode 100644 src/public/static/smartadmin/img/splash/touch-icon-ipad.png create mode 100644 src/public/static/smartadmin/img/splash/touch-icon-iphone-retina.png create mode 100644 src/public/static/smartadmin/img/superbox/index.php create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-1.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-10.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-11.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-12.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-13.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-14.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-15.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-16.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-17.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-18.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-19.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-2.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-20.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-21.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-22.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-23.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-24.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-3.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-4.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-5.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-6.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-7.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-8.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-full-9.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-1.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-10.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-11.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-12.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-13.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-14.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-15.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-16.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-17.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-18.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-19.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-2.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-20.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-21.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-22.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-23.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-24.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-3.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-4.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-5.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-6.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-7.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-8.jpg create mode 100644 src/public/static/smartadmin/img/superbox/superbox-thumb-9.jpg create mode 100644 src/public/static/smartadmin/inbox.html create mode 100644 src/public/static/smartadmin/index.html create mode 100644 src/public/static/smartadmin/inline-charts.html create mode 100644 src/public/static/smartadmin/invoice.html create mode 100644 src/public/static/smartadmin/jqui.html create mode 100644 src/public/static/smartadmin/js/app.js create mode 100644 src/public/static/smartadmin/js/bootstrap/bootstrap.js create mode 100644 src/public/static/smartadmin/js/bootstrap/bootstrap.min.js create mode 100644 src/public/static/smartadmin/js/demo.js create mode 100644 src/public/static/smartadmin/js/libs/jquery-2.0.2.min.js create mode 100644 src/public/static/smartadmin/js/libs/jquery-ui-1.10.3.min.js create mode 100644 src/public/static/smartadmin/js/notification/SmartNotification.js create mode 100644 src/public/static/smartadmin/js/notification/SmartNotification.min.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-progressbar/bootstrap-progressbar.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-slider/bootstrap-slider.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-slider/bootstrap-slider.min.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-tags/bootstrap-tagsinput-angular.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-tags/bootstrap-tagsinput.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-tags/bootstrap-tagsinput.min.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-tags/bootstrap-tagsinput.min.js.map create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-timepicker/bootstrap-timepicker.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-timepicker/bootstrap-timepicker.min.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-wizard/jquery.bootstrap.wizard.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstrap-wizard/jquery.bootstrap.wizard.min.js create mode 100644 src/public/static/smartadmin/js/plugin/bootstraptree/bootstrap-tree.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/CHANGES.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/LICENSE.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/README.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/adapters/jquery.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/build-config.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/ckeditor-.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/ckeditor.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/config.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/contents.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/af.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ar.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/bg.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/bn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/bs.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/cs.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/cy.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/da.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/de.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/el.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/en-au.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/en-ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/en-gb.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/en.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/eo.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/es.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/et.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/eu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/fa.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/fi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/fo.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/fr-ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/fr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/gl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/gu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/he.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/hi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/hr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/hu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/id.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/is.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/it.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ja.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ka.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/km.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ko.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ku.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/lt.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/lv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/mk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/mn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ms.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/nb.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/nl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/no.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/pl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/pt-br.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/pt.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ro.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ru.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/si.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sq.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sr-latn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/sv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/th.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/tr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/ug.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/uk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/vi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/zh-cn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/lang/zh.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/es.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/id.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/km.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/si.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/th.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/about/dialogs/about.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/div/dialogs/div.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/fakeobjects/images/spacer.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/find/dialogs/find.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/flash/images/placeholder.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/button.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/form.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/select.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/forms/images/hiddenfield.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/icons.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/icons_hidpi.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/iframe/dialogs/iframe.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/iframe/images/placeholder.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/image/dialogs/image.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/image/images/noimage.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/link/dialogs/link.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/link/images/anchor.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/magicline/images/hidpi/icon.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/magicline/images/icon.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/preview/preview.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/LICENSE.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/README.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embarrassed_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/heart.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tongue_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ar.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/bg.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cs.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cy.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/de.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/el.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/en.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/eo.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/es.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/et.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fa.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/gl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/he.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hu.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/id.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/it.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ja.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ku.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/lv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nb.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/no.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ru.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/si.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sl.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sq.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sv.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/th.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/tr.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ug.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/uk.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/vi.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/table/dialogs/table.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/dialogs/templates.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/default.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/LICENSE.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/README.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmp.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc_ie.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/ajax.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/api.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/appendto.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/datafiltering.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/divreplace.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/index.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/inlineall.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinebycode.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinetextarea.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/jquery.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/dialog/dialog.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/enterkey/enterkey.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputforflash.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputhtml.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/magicline/magicline.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/toolbar/toolbar.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/wysiwygarea/fullpage.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/readonly.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebyclass.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebycode.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.js create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/sample_posteddata.php create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/tabindex.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/uicolor.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/uilanguages.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/samples/xhtmlstyle.html create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie7.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie8.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_iequirks.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_opera.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_gecko.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie7.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie8.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_iequirks.css create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons_hidpi.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/arrow.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/close.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/close.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/lock-open.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/lock.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/refresh.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/lock-open.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/lock.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/refresh.png create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/readme.md create mode 100644 src/public/static/smartadmin/js/plugin/ckeditor/styles.js create mode 100644 src/public/static/smartadmin/js/plugin/colorpicker/bootstrap-colorpicker.js create mode 100644 src/public/static/smartadmin/js/plugin/colorpicker/bootstrap-colorpicker.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/ColReorder.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/ColVis.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/DT_bootstrap.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/FixedColumns.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/ZeroClipboard.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/jquery.dataTables-cust.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/jquery.dataTables-cust.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/as3/ZeroClipboard.as create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/as3/ZeroClipboardPdf.as create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/as3/lib/AlivePDF.swc create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/css/TableTools.css create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/css/TableTools_JUI.css create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/background.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/collection.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/collection_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/copy.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/copy_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/csv.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/csv_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/pdf.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/pdf_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/print.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/print_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/psd/collection.psd create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/psd/copy document.psd create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/psd/file_types.psd create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/psd/printer.psd create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/xls.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/images/xls_hover.png create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/js/TableTools.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/js/TableTools.min.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/js/TableTools.min.js.gz create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/js/ZeroClipboard.js create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/swf/copy_csv_xls.swf create mode 100644 src/public/static/smartadmin/js/plugin/datatables/media/swf/copy_csv_xls_pdf.swf create mode 100644 src/public/static/smartadmin/js/plugin/delete-table-row/delete-table-row.js create mode 100644 src/public/static/smartadmin/js/plugin/dropzone/dropzone-amd-module.js create mode 100644 src/public/static/smartadmin/js/plugin/dropzone/dropzone-amd-module.min.js create mode 100644 src/public/static/smartadmin/js/plugin/dropzone/dropzone.js create mode 100644 src/public/static/smartadmin/js/plugin/dropzone/dropzone.min.js create mode 100644 src/public/static/smartadmin/js/plugin/easy-pie-chart/examples/excanvas.js create mode 100644 src/public/static/smartadmin/js/plugin/easy-pie-chart/examples/index.html create mode 100644 src/public/static/smartadmin/js/plugin/easy-pie-chart/examples/style.css create mode 100644 src/public/static/smartadmin/js/plugin/easy-pie-chart/jquery.easy-pie-chart.js create mode 100644 src/public/static/smartadmin/js/plugin/easy-pie-chart/jquery.easy-pie-chart.min.js create mode 100644 src/public/static/smartadmin/js/plugin/fastclick/fastclick.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.cust.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.fillbetween.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.fillbetween.min.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.orderBar.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.orderBar.min.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.pie.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.pie.min.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.resize.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.resize.min.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.tooltip.js create mode 100644 src/public/static/smartadmin/js/plugin/flot/jquery.flot.tooltip.min.js create mode 100644 src/public/static/smartadmin/js/plugin/fuelux/wizard/wizard.js create mode 100644 src/public/static/smartadmin/js/plugin/fullcalendar/jquery.fullcalendar.js create mode 100644 src/public/static/smartadmin/js/plugin/fullcalendar/jquery.fullcalendar.min.js create mode 100644 src/public/static/smartadmin/js/plugin/ie-placeholder/jquery.placeholder.min.js create mode 100644 src/public/static/smartadmin/js/plugin/ion-slider/ion.rangeSlider.js create mode 100644 src/public/static/smartadmin/js/plugin/ion-slider/ion.rangeSlider.min.js create mode 100644 src/public/static/smartadmin/js/plugin/jquery-form/jquery-form.min.js create mode 100644 src/public/static/smartadmin/js/plugin/jquery-nestable/jquery.nestable.js create mode 100644 src/public/static/smartadmin/js/plugin/jquery-touch/jquery.ui.touch-punch.js create mode 100644 src/public/static/smartadmin/js/plugin/jquery-touch/jquery.ui.touch-punch.min.js create mode 100644 src/public/static/smartadmin/js/plugin/jquery-validate/jquery.validate.min.js create mode 100644 src/public/static/smartadmin/js/plugin/js-migrate/jquery-migrate-1.2.1.js create mode 100644 src/public/static/smartadmin/js/plugin/js-migrate/jquery-migrate-1.2.1.min.js create mode 100644 src/public/static/smartadmin/js/plugin/knob/jquery.knob.js create mode 100644 src/public/static/smartadmin/js/plugin/knob/jquery.knob.min.js create mode 100644 src/public/static/smartadmin/js/plugin/lazyload/lazyload.js create mode 100644 src/public/static/smartadmin/js/plugin/lazyload/lazyload.min.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/bootstrap-markdown.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/bootstrap-markdown.min.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/markdown.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/markdown.min.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/to-markdown.js create mode 100644 src/public/static/smartadmin/js/plugin/markdown/to-markdown.min.js create mode 100644 src/public/static/smartadmin/js/plugin/masked-input/jquery.maskedinput.js create mode 100644 src/public/static/smartadmin/js/plugin/masked-input/jquery.maskedinput.min.js create mode 100644 src/public/static/smartadmin/js/plugin/maxlength/bootstrap-maxlength.js create mode 100644 src/public/static/smartadmin/js/plugin/maxlength/bootstrap-maxlength.min.js create mode 100644 src/public/static/smartadmin/js/plugin/morris/morris-chart-settings.js create mode 100644 src/public/static/smartadmin/js/plugin/morris/morris.js create mode 100644 src/public/static/smartadmin/js/plugin/morris/morris.min.js create mode 100644 src/public/static/smartadmin/js/plugin/morris/raphael.2.1.0.min.js create mode 100644 src/public/static/smartadmin/js/plugin/msie-fix/jquery.mb.browser.js create mode 100644 src/public/static/smartadmin/js/plugin/msie-fix/jquery.mb.browser.min.js create mode 100644 src/public/static/smartadmin/js/plugin/multiselect/bootstrap-multiselect.js create mode 100644 src/public/static/smartadmin/js/plugin/multiselect/bootstrap-multiselect.min.js create mode 100644 src/public/static/smartadmin/js/plugin/noUiSlider/jquery.nouislider.css create mode 100644 src/public/static/smartadmin/js/plugin/noUiSlider/jquery.nouislider.js create mode 100644 src/public/static/smartadmin/js/plugin/noUiSlider/jquery.nouislider.min.js create mode 100644 src/public/static/smartadmin/js/plugin/pace/pace.min.js create mode 100644 src/public/static/smartadmin/js/plugin/select2/readme.txt create mode 100644 src/public/static/smartadmin/js/plugin/select2/select2-customized.js create mode 100644 src/public/static/smartadmin/js/plugin/select2/select2.js create mode 100644 src/public/static/smartadmin/js/plugin/select2/select2.min.js create mode 100644 src/public/static/smartadmin/js/plugin/selectToUISlider/selectToUISlider.jQuery.js create mode 100644 src/public/static/smartadmin/js/plugin/selectToUISlider/selectToUISlider.jQuery.min.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/controls/slick.allcontrols.min.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/controls/slick.columnpicker.css create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/controls/slick.columnpicker.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/controls/slick.pager.css create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/controls/slick.pager.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/lib/jquery.event.drag-2.2.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/lib/jquery.event.drop-2.2.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.allplugins.min.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.autotooltips.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.cellcopymanager.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.cellrangedecorator.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.cellrangeselector.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.cellselectionmodel.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.checkboxselectcolumn.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.headerbuttons.css create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.headerbuttons.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.headermenu.css create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.headermenu.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.rowmovemanager.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/plugins/slick.rowselectionmodel.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.core.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.dataview.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.editors.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.editors.js-- create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.formatters.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.grid.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.groupitemmetadataprovider.js create mode 100644 src/public/static/smartadmin/js/plugin/slickgrid/slick.remotemodel.js create mode 100644 src/public/static/smartadmin/js/plugin/smartclick/smartclick.js create mode 100644 src/public/static/smartadmin/js/plugin/sparkline/jquery.sparkline.js create mode 100644 src/public/static/smartadmin/js/plugin/sparkline/jquery.sparkline.min.js create mode 100644 src/public/static/smartadmin/js/plugin/summernote/summernote.js create mode 100644 src/public/static/smartadmin/js/plugin/superbox/superbox.js create mode 100644 src/public/static/smartadmin/js/plugin/superbox/superbox.min.js create mode 100644 src/public/static/smartadmin/js/plugin/throttle-denounce/jquery.ba-throttle-debounce.min.js create mode 100644 src/public/static/smartadmin/js/plugin/typeahead/typeahead.js create mode 100644 src/public/static/smartadmin/js/plugin/typeahead/typeahead.min.js create mode 100644 src/public/static/smartadmin/js/plugin/typeahead/typeaheadjs.js create mode 100644 src/public/static/smartadmin/js/plugin/typeahead/typeaheadjs.min.js create mode 100644 src/public/static/smartadmin/js/plugin/vectormap/jquery-jvectormap-1.1.1.css create mode 100644 src/public/static/smartadmin/js/plugin/vectormap/jquery-jvectormap-1.1.1.min.js create mode 100644 src/public/static/smartadmin/js/plugin/vectormap/jquery-jvectormap-1.2.2.css create mode 100644 src/public/static/smartadmin/js/plugin/vectormap/jquery-jvectormap-1.2.2.min.js create mode 100644 src/public/static/smartadmin/js/plugin/vectormap/jquery-jvectormap-world-mill-en.js create mode 100644 src/public/static/smartadmin/js/plugin/x-editable/jquery.mockjax.min.js create mode 100644 src/public/static/smartadmin/js/plugin/x-editable/moment.min.js create mode 100644 src/public/static/smartadmin/js/plugin/x-editable/x-editable.js create mode 100644 src/public/static/smartadmin/js/plugin/x-editable/x-editable.min.js create mode 100644 src/public/static/smartadmin/js/smartwidgets/jarvis.widget.js create mode 100644 src/public/static/smartadmin/js/smartwidgets/jarvis.widget.min.js create mode 100644 src/public/static/smartadmin/lock.html create mode 100644 src/public/static/smartadmin/login.html create mode 100644 src/public/static/smartadmin/morris.html create mode 100644 src/public/static/smartadmin/nestable-list.html create mode 100644 src/public/static/smartadmin/other-editors.html create mode 100644 src/public/static/smartadmin/php/demo-comment.php create mode 100644 src/public/static/smartadmin/php/demo-contacts.php create mode 100644 src/public/static/smartadmin/php/demo-register.php create mode 100644 src/public/static/smartadmin/plugins.html create mode 100644 src/public/static/smartadmin/pricing-table.html create mode 100644 src/public/static/smartadmin/profile.html create mode 100644 src/public/static/smartadmin/register.html create mode 100644 src/public/static/smartadmin/search.html create mode 100644 src/public/static/smartadmin/sound/bigbox.mp3 create mode 100644 src/public/static/smartadmin/sound/bigbox.ogg create mode 100644 src/public/static/smartadmin/sound/messagebox.mp3 create mode 100644 src/public/static/smartadmin/sound/messagebox.ogg create mode 100644 src/public/static/smartadmin/sound/smallbox.mp3 create mode 100644 src/public/static/smartadmin/sound/smallbox.ogg create mode 100644 src/public/static/smartadmin/table.html create mode 100644 src/public/static/smartadmin/timeline.html create mode 100644 src/public/static/smartadmin/treeview.html create mode 100644 src/public/static/smartadmin/typography.html create mode 100644 src/public/static/smartadmin/upload.php create mode 100644 src/public/static/smartadmin/validation.html create mode 100644 src/public/static/smartadmin/widgets.html create mode 100644 src/public/static/smartadmin/wizard.html delete mode 100644 src/robot.php diff --git a/bin/build.php b/bin/build.php new file mode 100644 index 0000000..6ed7938 --- /dev/null +++ b/bin/build.php @@ -0,0 +1,54 @@ +#!/usr/local/bin/php +buildFromDirectory(dirname(__DIR__) . "/src/agent/"); + //$phar->compressFiles(\Phar::GZ); + $phar->stopBuffering(); + $phar->setStub($phar->createDefaultStub('agent.php')); + echo "crontab-agent.phar打包成功\n"; +} +elseif ($dst == 'centre') +{ + $pharFile = __DIR__ . '/crontab-centre.phar'; + if (file_exists($pharFile)) unlink($pharFile); + $phar = new Phar($pharFile); + $phar->buildFromDirectory(dirname(__DIR__) . "/src/center/"); + //$phar->compressFiles(\Phar::GZ); + $phar->stopBuffering(); + $phar->setStub($phar->createDefaultStub('centre.php')); + echo "crontab-center.phar打包成功\n"; +} +elseif ($dst == 'phar') +{ + if (empty($argv[2])) + { + die("使用方法:php {$argv[0]} {$argv[1]} 源码目录\n"); + } + + if (!is_dir($argv[2])) + { + die("目录({$argv[2]})不存在\n"); + } + $dirname = basename($argv[2]); + $filename = $dirname . '.phar'; + $pharFile = __DIR__ . '/'.$filename; + $phar = new Phar($pharFile); + $phar->buildFromDirectory($argv[2]); + $phar->compressFiles(\Phar::GZ); + $phar->stopBuffering(); + $phar->setStub($phar->createDefaultStub('main.php')); + echo "{$filename}打包成功\n"; +} \ No newline at end of file diff --git a/doc/crontab.sql b/doc/crontab.sql new file mode 100755 index 0000000..5cb536d --- /dev/null +++ b/doc/crontab.sql @@ -0,0 +1,190 @@ +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for agents +-- ---------------------------- +DROP TABLE IF EXISTS `agents`; +CREATE TABLE `agents` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `alias` varchar(64) NOT NULL COMMENT '别名', + `ip` varchar(20) NOT NULL, + `port` int(10) NOT NULL, + `status` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0 正常 1暂停', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of agents +-- ---------------------------- +INSERT INTO `agents` VALUES ('1', 'Crontab服务', '127.0.0.1', '8902', '0'); + +-- ---------------------------- +-- Table structure for agent_group +-- ---------------------------- +DROP TABLE IF EXISTS `agent_group`; +CREATE TABLE `agent_group` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `gid` int(10) NOT NULL, + `aid` int(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of agent_group +-- ---------------------------- +INSERT INTO `agent_group` VALUES ('1', '1', '1'); + +-- ---------------------------- +-- Table structure for crongroup +-- ---------------------------- +DROP TABLE IF EXISTS `crongroup`; +CREATE TABLE `crongroup` ( + `gid` int(10) unsigned NOT NULL AUTO_INCREMENT, + `gname` varchar(32) NOT NULL, + `manager` varchar(255) DEFAULT NULL COMMENT '负责人', + PRIMARY KEY (`gid`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of crongroup +-- ---------------------------- +INSERT INTO `crongroup` VALUES ('1', '本机', null); + +-- ---------------------------- +-- Table structure for crontab +-- ---------------------------- +DROP TABLE IF EXISTS `crontab`; +CREATE TABLE `crontab` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `gid` int(10) NOT NULL, + `taskname` varchar(64) NOT NULL, + `rule` varchar(32) NOT NULL COMMENT '规则 可以是crontab规则也可以是启动的间隔时间', + `runnumber` tinyint(5) NOT NULL DEFAULT '0' COMMENT '并发任务数 0不限制 其他表示限制的数量', + `execute` varchar(512) NOT NULL COMMENT '运行命令行', + `status` tinyint(5) NOT NULL DEFAULT '0' COMMENT ' 0正常 1 暂停', + `runuser` varchar(32) NOT NULL COMMENT '进程运行时用户', + `manager` varchar(255) DEFAULT NULL COMMENT '负责人', + `agents` varchar(1024) DEFAULT NULL, + `createtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `updatetime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of crontab +-- ---------------------------- +INSERT INTO `crontab` VALUES ('3097968986801831941', '1', '测试任务', '* * * * *', '0', '/bin/echo 'hello swoole-crontab'', '0', 'nobody', 'admin', '1', '2016-10-23 12:45:27', null); + +-- ---------------------------- +-- Table structure for group_user +-- ---------------------------- +DROP TABLE IF EXISTS `group_user`; +CREATE TABLE `group_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `gid` int(11) NOT NULL, + `uid` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of group_user +-- ---------------------------- +INSERT INTO `group_user` VALUES ('25', '1', '1'); + +-- ---------------------------- +-- Table structure for rbac_group +-- ---------------------------- +DROP TABLE IF EXISTS `rbac_group`; +CREATE TABLE `rbac_group` ( + `gid` int(11) NOT NULL AUTO_INCREMENT, + `gname` varchar(32) NOT NULL COMMENT '分组名', + `status` tinyint(5) NOT NULL COMMENT '状态 0 正常 1不正常', + `lastupdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`gid`), + UNIQUE KEY `gname` (`gname`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of rbac_group +-- ---------------------------- +INSERT INTO `rbac_group` VALUES ('1', '管理员', '0', '2016-10-23 12:37:55'); + +-- ---------------------------- +-- Table structure for rbac_node +-- ---------------------------- +DROP TABLE IF EXISTS `rbac_node`; +CREATE TABLE `rbac_node` ( + `idx` int(11) NOT NULL AUTO_INCREMENT, + `gid` int(11) NOT NULL COMMENT '分组id', + `node` varchar(255) NOT NULL, + PRIMARY KEY (`idx`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of rbac_node +-- ---------------------------- +INSERT INTO `rbac_node` VALUES ('1', '1', 'App\\Controller\\Crontab'); +INSERT INTO `rbac_node` VALUES ('2', '1', 'App\\Controller\\Auth'); +INSERT INTO `rbac_node` VALUES ('3', '1', 'App\\Controller\\User'); +INSERT INTO `rbac_node` VALUES ('4', '1', 'App\\Controller\\Crongroup'); +INSERT INTO `rbac_node` VALUES ('5', '1', 'App\\Controller\\Runtimetask'); +INSERT INTO `rbac_node` VALUES ('6', '1', 'App\\Controller\\Agent'); +INSERT INTO `rbac_node` VALUES ('7', '1', 'App\\Controller\\Termlog'); + +-- ---------------------------- +-- Table structure for rbac_user +-- ---------------------------- +DROP TABLE IF EXISTS `rbac_user`; +CREATE TABLE `rbac_user` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `username` varchar(32) NOT NULL, + `password` varchar(128) NOT NULL, + `nickname` varchar(32) NOT NULL, + `lastlogin` datetime DEFAULT NULL, + `lastip` varchar(20) DEFAULT NULL, + `blocking` tinyint(2) NOT NULL DEFAULT '0' COMMENT '是否禁用 0 未禁用1禁用', + `createtime` datetime NOT NULL, + `lastupdate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of rbac_user +-- ---------------------------- +INSERT INTO `rbac_user` VALUES ('1', 'admin', 'dd94709528bb1c83d08f3088d4043f4742891f4f', 'Admin管理员', '2016-10-23 12:51:22', '192.168.244.2', '0', '2016-09-18 22:13:40', '2016-10-23 20:51:27'); + +-- ---------------------------- +-- Table structure for rbac_user_group +-- ---------------------------- +DROP TABLE IF EXISTS `rbac_user_group`; +CREATE TABLE `rbac_user_group` ( + `idx` int(11) NOT NULL AUTO_INCREMENT, + `userid` bigint(20) NOT NULL, + `gid` int(11) NOT NULL, + PRIMARY KEY (`idx`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of rbac_user_group +-- ---------------------------- +INSERT INTO `rbac_user_group` VALUES ('1', '1', '1'); + +-- ---------------------------- +-- Table structure for term_logs +-- ---------------------------- +DROP TABLE IF EXISTS `term_logs`; +CREATE TABLE `term_logs` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `taskid` bigint(20) NOT NULL, + `runid` bigint(20) NOT NULL, + `explain` varchar(64) NOT NULL, + `msg` longtext, + `createtime` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `taskid` (`taskid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of term_logs +-- ---------------------------- diff --git a/src/App/Exec.php b/src/App/Exec.php deleted file mode 100644 index b018e41..0000000 --- a/src/App/Exec.php +++ /dev/null @@ -1,48 +0,0 @@ -101,"msg"=>"The tasks can't be empty"]; - } - $header = LoadTasks::getTasks(); - foreach ($tasks as $task){ - if ($task["code"] == 0){ - $runStatus = LoadTasks::RunStatusSuccess; - }else{ - $runStatus = LoadTasks::RunStatusFailed; - } - $header->set($task["taskId"],["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); - TermLog::log("task已经执行完成,返回值:".json_encode($task),$task["taskId"]); - } - return ["code"=>0]; - } -} \ No newline at end of file diff --git a/src/App/Robot.php b/src/App/Robot.php deleted file mode 100644 index a6a5c54..0000000 --- a/src/App/Robot.php +++ /dev/null @@ -1,28 +0,0 @@ -0,"msg"=>"注册成功"]; - } - return ["code"=>1,"msg"=>"注册失败"]; - } -} \ No newline at end of file diff --git a/src/App/Tasks.php b/src/App/Tasks.php deleted file mode 100644 index 9c0977a..0000000 --- a/src/App/Tasks.php +++ /dev/null @@ -1,102 +0,0 @@ -$task) - { - if ($n < $start) continue; - if ($n > $end) break; - $n++; - $info = LoadTasks::$db->get($id); - if (!empty($info)){ - $task["createtime"]=$info["createtime"]; - $task["updatetime"]=$info["updatetime"]; - } - $task["id"] = $id; - $data[$id] = $task; - } - return ["total"=>count($tasks),"rows"=>$data]; - } - - /** - * 获取单个任务 - * @param $id - * @return array - */ - public static function get($id) - { - $tasks = LoadTasks::getTasks(); - if (!$tasks->exist($id)){ - return ["code"=>101,"msg"=>"不存在"]; - } - $task = $tasks->get($id); - $task["id"] = $id; - return ["code"=>0,"data"=>$task]; - } - - /** - * 添加任务 - * @param $task - * @return array - */ - public static function add($task) - { - $task["id"] = Donkeyid::getInstance()->dk_get_next_id(); - $ids = LoadTasks::saveTasks([$task]); - if ($ids === false){ - return ["code"=>102,"data"=>$ids,"msg"=>"添加失败"]; - } - return ["code"=>0,"data"=>$ids,"msg"=>"保存成功"]; - } - - /** - * 修改任务 - * @param $id - * @param $task - * @return array - */ - public static function update($id,$task) - { - if (!LoadTasks::updateTask($id,$task)){ - return ["code"=>102,"msg"=>"更新失败"]; - } - return ["code"=>0,"data"=>'',"msg"=>"更新成功"]; - } - - /** - * 删除任务 - * @param $id - * @return array - */ - public static function delete($id) - { - if (!LoadTasks::delTask($id)){ - return ["code"=>102,"msg"=>"删除失败"]; - } - return ["code"=>0,"data"=>'',"msg"=>"删除成功"]; - } - -} \ No newline at end of file diff --git a/src/Lib/CentreServer.php b/src/Lib/CentreServer.php deleted file mode 100644 index 6b22602..0000000 --- a/src/Lib/CentreServer.php +++ /dev/null @@ -1,89 +0,0 @@ -taskworker){ - if ($worker_id == 0 ){ - //$server->task("load"); - //准点载入任务 - $server->after((60-date("s"))*1000,function () use ($server){ - $server->task("load"); - $server->tick(60000, function () use ($server) { - $server->task("load"); - }); - }); - //清理过期的服务器 - $server->tick(1000, function () use ($server) { - Robot::clean(); - }); - } - if ($worker_id == 1){ - //定时执行任务 - $server->tick(1000, function () use ($server) { - $tasks = Tasks::getTasks(); - $server->task($tasks); - }); - } - } - } - function onTask($serv, $task_id, $from_id, $data) - { - if ($data == "load"){ - Tasks::checkTasks(); - }else{ - $ret = []; - foreach ($data as $id) - { - $task = LoadTasks::getTasks()->get($id); - $tmp["id"] = $id; - $tmp["execute"] = $task["execute"]; - $tmp["taskname"] = $task["taskname"]; - LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatusStart,"runTimeStart"=>microtime()]); - TermLog::log("task任务开始:".json_encode($tmp),$id); - $ret[$id] = Robot::Run($tmp); - } - return $ret; - } - return true; - } - function onFinish($serv, $task_id, $data) - { - if (is_array($data)){ - foreach ($data as $id=>$v){ - if ($v){ - $runStatus = LoadTasks::RunStatusToTaskSuccess;//发送成功 - TermLog::log("task任务发送成功",$id); - }else{ - $runStatus = LoadTasks::RunStatusToTaskFailed;//发送失败 - TermLog::log("task任务发送失败",$id); - } - LoadTasks::getTasks()->set($id,["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); - } - TermLog::flush(); - } - return; - } - public function call($request, $header) - { - //初始化日志 - Flog::startLog($request['call']); - Flog::log("call:".$request['call'].",params:".json_encode($request['params'])); - $ret = parent::call($request, $header); // TODO: Change the autogenerated stub - Flog::log($ret); - Flog::endLog(); - Flog::flush(); - return $ret; - } -} \ No newline at end of file diff --git a/src/Lib/Process.php b/src/Lib/Process.php deleted file mode 100644 index b8bee78..0000000 --- a/src/Lib/Process.php +++ /dev/null @@ -1,122 +0,0 @@ - [\swoole_table::TYPE_INT, 8], - "status" => [\swoole_table::TYPE_INT, 1], - "start" => [\swoole_table::TYPE_INT, 8], - "end" => [\swoole_table::TYPE_INT, 8], - "code"=> [\swoole_table::TYPE_INT, 1], - ]; - const PROCESS_START = 0;//程序开始运行 - const PROCESS_STOP = 1;//程序结束运行 - - public $task; - - public static function init() - { - $robot_process_max = defined("ROBOT_MAX_PROCESS") ? ROBOT_MAX_PROCESS : 128; - self::$table = new \swoole_table($robot_process_max); - foreach (self::$column as $key => $v) { - self::$table->column($key, $v[0], $v[1]); - } - self::$table->create(); - } - - /** - * 注册信号 - */ - public static function signal() - { - \swoole_process::signal(SIGCHLD, function($sig) { - //必须为false,非阻塞模式 - while($ret = \swoole_process::wait(false)) { - $pid = $ret['pid']; - if (self::$table->exist($pid)){ - self::$table->set($pid,["status"=>self::PROCESS_STOP,"end"=>microtime(true),"code"=>$ret["code"]]); - $task = self::$table->get($pid); - TermLog::log("task执行完成:".json_encode($task),$task["taskId"]); - } - } - }); - } - - /** - * 通知中心任务执行结果 - * @return bool - */ - public static function notify() - { - if (count(self::$table) >0){ - $procs= []; - foreach (self::$table as $pid=>$process){ - if ($process["status"] == self::PROCESS_STOP){ - $procs[$pid] = [ - "taskId"=>$process["taskId"], - "start"=>$process["start"], - "end"=>$process["end"], - "code"=>$process["code"], - ]; - } - } - TermLog::log("tasks通知中心服:".json_encode($procs)); - $service = new Service(); - $rect = $service->call("Exec::notify",$procs); - $ret = $rect->getResult(1); - unset($service); - if (empty($ret)){ - TermLog::log("tasks通知中心服失败,code".$rect->code.",msg".$rect->msg); - return false; - } - - foreach ($procs as $pid=>$v){ - self::$table->del($pid); - } - } - return true; - } - - /** - * 创建一个子进程 - * @param $task - * @return bool - */ - public static function create_process($task) - { - $cls = new self(); - $cls->task = $task; - $process = new \swoole_process(array($cls, "run")); - if (($pid = $process->start())) { - TermLog::log("task开始执行:".json_encode($task),$task["id"]); - self::$table->set($pid,["taskId"=>$task["id"],"status"=>self::PROCESS_START,"start"=>microtime(true)]); - return true; - } - return false; - } - - /** - * 子进程执行的入口 - * @param $worker - */ - public function run($worker) - { - $exec = $this->task["execute"]; - $worker->name($exec ."#". $this->task["id"]); - $exec = explode(" ",$exec); - $execfile = $exec[0]; - unset($exec[0]); - $worker->exec($execfile,$exec); - } -} \ No newline at end of file diff --git a/src/Lib/TermLog.php b/src/Lib/TermLog.php deleted file mode 100644 index a19374a..0000000 --- a/src/Lib/TermLog.php +++ /dev/null @@ -1,35 +0,0 @@ -log(self::$key)->flush(); - } - - public static function log($value,$id="") - { - $text = ""; - if (!empty($id)){ - $text = $id."\t"; - } - $text .= is_scalar($value) ? $value : json_encode($value); - if (DEBUG == "on"){ - echo $text,"\n"; - } - \Swoole::$php->log(self::$key)->info($text); - } -} \ No newline at end of file diff --git a/src/_init.php b/src/_init.php deleted file mode 100644 index f11c7ec..0000000 --- a/src/_init.php +++ /dev/null @@ -1,44 +0,0 @@ -config->setPath($config_dir);//共有配置 -Swoole\Loader::addNameSpace('App', __DIR__ . '/App'); -Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); - - diff --git a/src/admin/classes/Auth.php b/src/admin/classes/Auth.php new file mode 100644 index 0000000..07a0915 --- /dev/null +++ b/src/admin/classes/Auth.php @@ -0,0 +1,321 @@ +config = $config; + if (empty($config['login_table'])) + { + throw new \Exception(__CLASS__ . ' request login_table config.'); + } + if (!empty($config['login_db'])) + { + $this->login_db = $config['login_db']; + } + else + { + $this->login_db = 'master'; + } + $this->login_table = $config['login_table']; + $this->db = Swoole::$php->db($this->login_db); + $_SESSION[self::$session_prefix . 'save_key'] = array(); + } + + function saveUserInfo($key='userinfo') + { + $_SESSION[self::$session_prefix.$key] = $this->user; + $_SESSION[self::$session_prefix.'save_key'][] = self::$session_prefix.$key; + } + /** + * 更新用户信息 + * @param $set + * @return bool + */ + function updateStatus($set = null) + { + if (empty($set)) + { + $set = array( + self::$lastlogin => date('Y-m-d H:i:s'), + self::$lastip => \Swoole::$php->request->getClientIP() + ); + } + return $this->db->update($this->user[self::$userid], $set, $this->login_table); + } + + function setSession($key) + { + $_SESSION[$key] = $this->user[$key]; + $_SESSION[self::$session_prefix . 'save_key'][] = self::$session_prefix . $key; + } + + /** + * 获取登录用户的UID + * @return int + */ + function getUid() + { + return $_SESSION[self::$session_prefix.'user_id']; + } + + /** + * 获取登录用户的信息 + * @return array + */ + function getUserInfo() + { + return $this->user; + } + + /** + * 登录 + * @param $username + * @param $password + * @param bool $auto_login 是否自动登录 + * @return bool + */ + function login($username, $password, $auto_login = false) + { + Swoole\Cookie::set(self::$session_prefix . 'username', $username, time() + self::$cookie_life); + $this->user = $this->db->query('select ' . $this->select . ' from ' . $this->login_table . " where " . self::$username . "='$username' limit 1")->fetch(); + if (empty($this->user)) + { + $this->errCode = self::ERR_NO_EXIST; + return false; + } + else + { + //验证密码是否正确 + if (self::verifyPassword($username, $password, $this->user[self::$password])) + { + $_SESSION[self::$session_prefix . 'isLogin'] = true; + $_SESSION[self::$session_prefix . 'user_id'] = $this->user[self::$userid]; + if ($auto_login) + { + $this->autoLogin(); + } + return true; + } + else + { + $this->errCode = self::ERR_PASSWORD; + return false; + } + } + } + + /** + * 检查是否登录 + * @return bool + */ + function isLogin() + { + if (isset($_SESSION[self::$session_prefix . 'isLogin']) and $_SESSION[self::$session_prefix . 'isLogin'] == 1) + { + return true; + } + elseif (isset($_COOKIE[self::$session_prefix . 'autologin']) and isset($_COOKIE[self::$session_prefix . 'username']) and isset($_COOKIE[self::$session_prefix . 'password'])) + { + return $this->login($_COOKIE[self::$session_prefix . 'username'], $_COOKIE[self::$session_prefix . 'password'], $auto = 1); + } + return false; + } + /** + * 自动登录,如果自动登录则在本地记住密码 + */ + function autoLogin() + { + Swoole\Cookie::set(self::$session_prefix . 'autologin', 1, time() + self::$cookie_life); + Swoole\Cookie::set(self::$session_prefix . 'username', $this->user[self::$username], time() + self::$cookie_life); + Swoole\Cookie::set(self::$session_prefix . 'password', $this->user[self::$password], time() + self::$cookie_life); + } + + /** + * 修改密码 + * @param $uid + * @param $old_pwd + * @param $new_pwd + * @return bool + * @throws \Exception + */ + function changePassword($uid, $old_pwd, $new_pwd) + { + $table = table($this->login_table, $this->login_db); + $table->primary = self::$userid; + $_res = $table->gets(array('select' => self::$username . ',' . self::$password, 'limit' => 1, self::$userid => $uid)); + if (count($_res) < 1) + { + $this->errMessage = '用户不存在'; + $this->errCode = 1; + return false; + } + + $user = $_res[0]; + if ($user[self::$password] != self::makePasswordHash($user[self::$username], $old_pwd)) + { + $this->errMessage = '原密码不正确'; + $this->errCode = 2; + return false; + } + else + { + $table->set($uid, array(self::$password => self::makePasswordHash($user[self::$username], $new_pwd)), self::$userid); + return true; + } + } + + /** + * 注销登录 + * @return bool + */ + function logout() + { + /** + * 启动Session + */ + if (!\Swoole::$php->session->isStart) + { + \Swoole::$php->session->start(); + } + /** + * 如果设置为true,退出登录时,销毁所有Session + */ + if (self::$session_destroy) + { + $_SESSION = array(); + return true; + } + unset($_SESSION[self::$session_prefix . 'isLogin']); + unset($_SESSION[self::$session_prefix . 'user_id']); + + if (!empty($_SESSION[self::$session_prefix . 'save_key'])) + { + foreach ($_SESSION[self::$session_prefix . 'save_key'] as $sk) + { + unset($_SESSION[$sk]); + } + } + unset($_SESSION[self::$session_prefix . 'save_key']); + if (isset($_COOKIE[self::$session_prefix . 'password'])) + { + Swoole\Cookie::set(self::$session_prefix . 'password', '', 0); + } + return true; + } + + /** + * 验证密码 + * @param $username + * @param $input_password + * @param $real_password + * @return bool + * @throws \Exception + */ + public static function verifyPassword($username, $input_password, $real_password) + { + //使用PHP内置的password + if (self::$password_hash == 'crypt') + { + if (!function_exists('password_verify')) + { + throw new \Exception("require password_verify function."); + } + return password_verify($input_password, $real_password); + } + else + { + $pwd_hash = self::makePasswordHash($username, $input_password); + return $real_password == $pwd_hash; + } + } + + /** + * 产生一个密码串,连接用户名和密码,并使用sha1产生散列 + * @param $username + * @param $password + * @throws \Exception + * @return string + */ + public static function makePasswordHash($username, $password) + { + //sha1 用户名+密码 + if (self::$password_hash == 'sha1') + { + return sha1($username . $password); + } + //使用PHP内置的password + elseif(self::$password_hash == 'crypt') + { + if (!function_exists('password_hash')) + { + throw new \Exception("require password_hash function."); + } + $options = [ + 'cost' => self::$password_cost, + 'salt' => mcrypt_create_iv(self::$password_salt_size, MCRYPT_DEV_URANDOM), + ]; + return password_hash($password, PASSWORD_BCRYPT, $options); + } + //md5 用户名+密码 + elseif (self::$password_hash == 'md5') + { + return md5($username . $password); + } + elseif (self::$password_hash == 'sha1_single') + { + return sha1($password); + } + elseif (self::$password_hash == 'md5_single') + { + return md5($password); + } + return false; + } +} + diff --git a/src/admin/classes/CommonController.php b/src/admin/classes/CommonController.php new file mode 100644 index 0000000..e24b435 --- /dev/null +++ b/src/admin/classes/CommonController.php @@ -0,0 +1,81 @@ + "未运行", + self::RunStatusStart => "准备运行", + self::RunStatusToTaskSuccess => "发送任务成功", + self::RunStatusToTaskFailed => "发送任务失败", + self::RunStatusSuccess => "运行成功", + self::RunStatusFailed => "运行失败", + ]; + + public function __construct(\Swoole $swoole) + { + parent::__construct($swoole); + $group = App\Service::getInstance()->call("Tasks::getGroups",$_SESSION["user_id"])->getResult(10); + $this->assign("_group",$group); + if (!isset($_SESSION["_gid"])){ + foreach ($group as $k=>$v){ + $_SESSION["_gid"] = $k; + $_SESSION["_gname"] = $v; + break; + } + } + $this->assign("_gid", $_SESSION["_gid"]); + $this->assign("_gname",$_SESSION["_gname"]); + } + + protected function is_ajax() + { + if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"])=="xmlhttprequest"){ + $this->is_ajax = true; + return true; + } + return false; + } + + + protected function echoJson($data) + { + if (!empty($_REQUEST['jsonp'])) + { + $this->http->header('Content-type', 'application/x-javascript'); + return $_REQUEST['jsonp'] . "(" . json_encode($data) . ");"; + } + else + { + $this->http->header('Content-type', 'application/json'); + return json_encode($data); + } + } + protected function setMessage($code,$message) + { + $this->assign("msg",array("code"=>$code,"message"=>$message)); + } + + public static function beginTransaction() + { + return \Swoole::$php->db->start(); + } + public static function rollback() + { + return \Swoole::$php->db->rollback(); + } + + public static function commit() + { + return \Swoole::$php->db->commit(); + } +} \ No newline at end of file diff --git a/src/admin/classes/LoginController.php b/src/admin/classes/LoginController.php new file mode 100644 index 0000000..20af6f9 --- /dev/null +++ b/src/admin/classes/LoginController.php @@ -0,0 +1,117 @@ +session->start(); + // 控制器方法名 + define('VIEW_NAME', trim(\Swoole::$php->env['mvc']['view'])); + if (!$this->isLogin()) + { + if (!empty($_SERVER['REQUEST_URI'])) + { + $this->swoole->http->redirect($this->swoole->config['user']['login_url']."?refer=".base64_encode($_SERVER['REQUEST_URI'])); + } + else + { + $this->swoole->http->redirect($this->swoole->config['user']['login_url']); + } + $this->swoole->http->finish(); + } + else + { + $this->uid = $_SESSION['user_id']; + $this->userinfo = $_SESSION['userinfo']; + if (!empty($this->userinfo['blocking'])) + { + $this->http->finish("

您的账户已被禁用!


请联系:管理员


重新登陆"); + } + if (!RBAC::auth(\Swoole::$php->env['mvc']) && $this->uid != 1){ + $this->http->finish("

您的账户没有权限!


请联系:管理员

返回上一页
重新登陆"); + } + } + } + protected function isLogin() + { + if (isset($_SESSION['isLogin']) and $_SESSION['isLogin'] == 1) + { + return true; + } + return false; + } + + /** + * 检查是否允许 + * @param $optype + * @param $id + * @return bool + */ + protected function isAllow($optype, $id = 0) + { + if ($this->userinfo['usertype'] == 0) + { + return true; + } + else + { + if (empty($this->userinfo['rules'])) + { + return false; + } + else + { + return strstr($this->userinfo['rules'], $optype) !== false; + } + } + } + + protected function isActiveMenu($m, $v = '') + { + if ($this->env['mvc']['controller'] == $m) + { + if (!empty($v)) + { + return $this->env['mvc']['view'] == $v; + } + return true; + } + else + { + return false; + } + } + + protected function isShowMenu($m,$v) + { + return RBAC::auth(["controller"=>$m,"view"=>$v]); + } + + protected function validate(array $data, callable $callback, &$errors) + { + return call_user_func_array($callback, [$data, &$errors]); + } + + protected function redirect($url) + { + return $this->http->header('Location', $url); + } + + protected function success($msg, $url) + { + return \Swoole\JS::js_goto($msg, $url); + } + + protected function error($msg) + { + $this->assign('msg', $msg); + $this->display('common/error.php'); + } +} diff --git a/src/admin/classes/ParserDoc.php b/src/admin/classes/ParserDoc.php new file mode 100644 index 0000000..ed4993e --- /dev/null +++ b/src/admin/classes/ParserDoc.php @@ -0,0 +1,129 @@ +params = []; + if ($doc == '') { + return $this->params; + } + // Get the comment + if (preg_match('#^/\*\*(.*)\*/#s', $doc, $comment) === false) + return $this->params; + $comment = trim($comment [1]); + // Get all the lines and strip the * from the first character + if (preg_match_all('#^\s*\*(.*)#m', $comment, $lines) === false) + return $this->params; + $this->parseLines($lines [1]); + return $this->params; + } + + private function parseLines($lines) + { + foreach ($lines as $line) { + $parsedLine = $this->parseLine($line); // Parse the line + + if ($parsedLine === false && !isset ($this->params ['description'])) { + if (isset ($desc)) { + // Store the first line in the short description + $this->params ['description'] = implode(PHP_EOL, $desc); + } + $desc = array(); + } elseif ($parsedLine !== false) { + $desc [] = $parsedLine; // Store the line in the long description + } + } + $desc = implode(' ', $desc); + if (!empty ($desc)) + $this->params ['long_description'] = $desc; + } + + private function parseLine($line) + { + // trim the whitespace from the line + $line = trim($line); + + if (empty ($line)) + return false; // Empty line + + if (strpos($line, '@') === 0) { + if (strpos($line, ' ') > 0) { + // Get the parameter name + $param = substr($line, 1, strpos($line, ' ') - 1); + $value = substr($line, strlen($param) + 2); // Get the value + } else { + $param = substr($line, 1); + $value = ''; + } + // Parse the line and return false if the parameter is valid + if ($this->setParam($param, $value)) + return false; + } + + return $line; + } + + private function setParam($param, $value) + { + if ($param == 'param' || $param == 'return') + $value = $this->formatParamOrReturn($value); + if ($param == 'class') + list ($param, $value) = $this->formatClass($value); + + if (empty ($this->params [$param])) { + $this->params [$param] = $value; + } else if ($param == 'param') { + $arr = array( + $this->params [$param], + $value + ); + $this->params [$param] = $arr; + } else { + $this->params [$param] = $value + $this->params[$param]; + } + return true; + } + + private function formatClass($value) + { + $r = preg_split("[|]", $value); + if (is_array($r)) { + $param = $r [0]; + parse_str($r [1], $value); + foreach ($value as $key => $val) { + $val = explode(',', $val); + if (count($val) > 1) + $value [$key] = $val; + } + } else { + $param = 'Unknown'; + } + return array( + $param, + $value + ); + } + + private function formatParamOrReturn($string) + { + $pos = strpos($string, ' '); + $type = substr($string, 0, $pos); + if (!empty($type)) + return '(' . $type . ')' . substr($string, $pos + 1); + else + return $string; + } +} \ No newline at end of file diff --git a/src/admin/classes/RBAC.php b/src/admin/classes/RBAC.php new file mode 100644 index 0000000..6f722b1 --- /dev/null +++ b/src/admin/classes/RBAC.php @@ -0,0 +1,112 @@ +$ref){ + $classdoc = $ref->getDocComment(); + if (empty($classdoc)) continue; + $classdoc = $pc->parse($classdoc); + if (!isset($classdoc["RBAC"])) continue; + $classRBAC = $classdoc["RBAC"]; + $RBAClist[$ref->name]["describe"] = $classRBAC; + $methods = $ref->getMethods(\ReflectionMethod::IS_PUBLIC); + foreach ($methods as $method){ + if ($method->class != $key){ + continue; + } + $mothoddoc = $pc->parse($method->getDocComment()); + if (!isset($mothoddoc["RBAC"])) continue; + $methodRBAC = $mothoddoc["RBAC"]; + $RBAClist[$ref->name]["methods"][$method->name]["describe"] = $methodRBAC; + } + } + return $RBAClist; + } + private static function getReflectionList($actionPath) + { + $list = []; + foreach (new \DirectoryIterator($actionPath) as $fileInfo) { + if($fileInfo->isDot()) continue; + if (!$fileInfo->isFile()) continue; + include_once $fileInfo->getPath()."/".$fileInfo->getFilename(); + $cls = "App\\Controller\\".str_replace(".php","",$fileInfo->getFilename()); + if (!class_exists($cls)) continue; + $list[$cls] = new \ReflectionClass($cls); + } + return $list; + } + + /** + * 获取用户有的权限 + * @param $userid + * @return array + */ + public static function loadAccess($userid) + { + $data = table("rbac_user_group")->db->query("select DISTINCT(n.node) from rbac_node as n WHERE n.gid IN(SELECT g.gid FROM rbac_user_group as ug LEFT JOIN rbac_group as g ON ug.gid=g.gid WHERE ug.userid='{$userid}');")->fetchall(); + if (empty($data)){ + return array(); + } + $node = []; + foreach ($data as $value){ + $node[strtoupper($value["node"])] = true; + } + return $node; + } + + /** + * 验证权限 + * @param $mvc + * @return bool + */ + public static function auth($mvc) + { + if ($_SESSION["user_id"] == 1){ + return true; + } + $exclude = \Swoole::$php->config["common"]["RBAC_EXCLUDE"]; + if (!empty($exclude)){ + if (isset($exclude[$mvc["controller"]])){ + $cks = $exclude[$mvc["controller"]]; + if ($cks == true) return true; + $view = strtoupper($mvc["view"]); + if (isset($cks[$view]) && $cks[$view] == true){ + return true; + } + } + } + + $_cls = strtoupper("App\\Controller\\".$mvc["controller"]); + $rbac_list = isset($_SESSION["rbac_list"])?$_SESSION["rbac_list"]:[]; + if (isset($rbac_list[$_cls])){ + return true; + } + $_meth = $_cls."::".strtoupper($mvc["view"]); + if (isset($rbac_list[$_meth])){ + return true; + } + return false; + + } + +} \ No newline at end of file diff --git a/src/Lib/Service.php b/src/admin/classes/Service.php similarity index 84% rename from src/Lib/Service.php rename to src/admin/classes/Service.php index fba1a77..bd98f1c 100644 --- a/src/Lib/Service.php +++ b/src/admin/classes/Service.php @@ -4,7 +4,7 @@ * Class Service * @package Lib */ -namespace Lib; +namespace App; use Swoole; class Service extends Swoole\Client\SOA { @@ -15,8 +15,9 @@ public function __construct($ip='',$port='') { parent::__construct(); if (empty($ip) || empty($port)){ - $ip = CENTRE_HOST; - $port = CENTRE_PORT; + $service = Swoole::$php->config["service"]; + $ip = $service["CENTRE_HOST"]; + $port = $service["CENTRE_PORT"]; } $this->addServers(array($ip.':'.$port)); } diff --git a/src/admin/configs/common.php b/src/admin/configs/common.php new file mode 100644 index 0000000..f337165 --- /dev/null +++ b/src/admin/configs/common.php @@ -0,0 +1,14 @@ + 'CronTab 管理', + 'logo_url'=> '/static/smartadmin/img/logo-o.png', + 'login_url' => WEBROOT . '/Page/index', + 'logout_url' => WEBROOT . '/page/logout/', + 'home_url' => WEBROOT . '/crontab/index/', + //忽视权限验证 + 'RBAC_EXCLUDE'=>[ + "password"=>[ + "modifyPassword"=>true + ] + ] +]; \ No newline at end of file diff --git a/src/configs/db.php b/src/admin/configs/dev/db.php similarity index 78% rename from src/configs/db.php rename to src/admin/configs/dev/db.php index a7e8696..6cc380f 100644 --- a/src/configs/db.php +++ b/src/admin/configs/dev/db.php @@ -1,12 +1,12 @@ Swoole\Database::TYPE_MYSQLi, - 'host' => "10.10.2.220", + 'host' => "192.168.1.15", 'port' => 3306, 'dbms' => 'mysql', 'user' => "root", 'passwd' => "root", - 'name' => "swoole_crontab", + 'name' => "crontab", 'charset' => "utf8", 'setname' => true, 'persistent' => false, //MySQL长连接 diff --git a/src/configs/log.php b/src/admin/configs/dev/log.php similarity index 100% rename from src/configs/log.php rename to src/admin/configs/dev/log.php diff --git a/src/admin/configs/dev/service.php b/src/admin/configs/dev/service.php new file mode 100644 index 0000000..066a12d --- /dev/null +++ b/src/admin/configs/dev/service.php @@ -0,0 +1,13 @@ +"127.0.0.1", + "CENTRE_PORT"=>8901, +]; \ No newline at end of file diff --git a/src/admin/configs/product/db.php b/src/admin/configs/product/db.php new file mode 100644 index 0000000..6cc380f --- /dev/null +++ b/src/admin/configs/product/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "192.168.1.15", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/admin/configs/product/log.php b/src/admin/configs/product/log.php new file mode 100644 index 0000000..7d2d084 --- /dev/null +++ b/src/admin/configs/product/log.php @@ -0,0 +1,12 @@ + 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/application.log', +); +$log['term'] = array( + 'type' => 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/term.log', +); +return $log; \ No newline at end of file diff --git a/src/admin/configs/product/service.php b/src/admin/configs/product/service.php new file mode 100644 index 0000000..066a12d --- /dev/null +++ b/src/admin/configs/product/service.php @@ -0,0 +1,13 @@ +"127.0.0.1", + "CENTRE_PORT"=>8901, +]; \ No newline at end of file diff --git a/src/admin/configs/test/db.php b/src/admin/configs/test/db.php new file mode 100644 index 0000000..6cc380f --- /dev/null +++ b/src/admin/configs/test/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "192.168.1.15", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/admin/configs/test/log.php b/src/admin/configs/test/log.php new file mode 100644 index 0000000..7d2d084 --- /dev/null +++ b/src/admin/configs/test/log.php @@ -0,0 +1,12 @@ + 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/application.log', +); +$log['term'] = array( + 'type' => 'FileLog', + 'cut_file' => true, + 'file' => WEBPATH . '/logs/term.log', +); +return $log; \ No newline at end of file diff --git a/src/admin/configs/test/service.php b/src/admin/configs/test/service.php new file mode 100644 index 0000000..066a12d --- /dev/null +++ b/src/admin/configs/test/service.php @@ -0,0 +1,13 @@ +"127.0.0.1", + "CENTRE_PORT"=>8901, +]; \ No newline at end of file diff --git a/src/admin/configs/user.php b/src/admin/configs/user.php new file mode 100644 index 0000000..20806eb --- /dev/null +++ b/src/admin/configs/user.php @@ -0,0 +1,13 @@ +"rbac_user", + "login_url"=>"/page/index", + "home_url"=>"/auth/index", +]; \ No newline at end of file diff --git a/src/admin/controllers/Agent.php b/src/admin/controllers/Agent.php new file mode 100644 index 0000000..3b947a6 --- /dev/null +++ b/src/admin/controllers/Agent.php @@ -0,0 +1,133 @@ +call("Agent::getAgents",$gets,$page,$pagesize)->getResult(10); + $pager = new Swoole\Pager(array('total'=> $ret["total"], 'perpage' => $pagesize, 'nowindex' => $page)); + $this->assign('pager', array('total' => $ret["total"], 'pagesize' => $pagesize, 'render' => $pager->render())); + $this->assign("list",$this->formatData($ret["rows"])); + $group = App\Service::getInstance()->call("Tasks::getGroups",$_SESSION["user_id"])->getResult(10); + $this->assign("group",$group); + $this->display(); + } + + private function formatData($data) + { + foreach ($data as &$value) + { + $value["status_f"] = $value["status"] == 1?"暂停":"正常"; + $value["isregister_f"] = $value["isregister"] == 1?"已注册":"未注册"; + } + return $data; + } + + /** + * @RBAC 添加编辑代理 + * addOrEdit + */ + public function addOrEdit() + { + $default = []; + if (isset($_GET["id"])){ + $id = $_GET["id"]; + $ret = App\Service::getInstance()->call("Agent::getAgent",$id)->getResult(10); + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if ($ret["code"]){ + $this->setMessage($ret["code"],$ret["msg"]); + }else{ + + $data = $ret["data"]; + foreach ($data as $key=>$value){ + $this->tpl_var[$key] = $value; + } + + $default = $data["gids"]; + } + } + } + + if (!empty($_POST)){ + $task = []; + if (isset($_POST["gids"])){ + $task["gids"] = $_POST["gids"]; + unset($task["gids"]["-1"]);//去除全部这个选项 + } + if (isset($_POST["alias"])){ + $task["alias"] =trim($_POST["alias"]); + } + if (isset($_POST["ip"])){ + $task["ip"] = trim($_POST["ip"]); + } + if (isset($_POST["status"])){ + $task["status"] = trim($_POST["status"]); + } + if ($_POST["id"]){ + $ret = App\Service::getInstance()->call("Agent::updateAgent",$_POST["id"],$task)->getResult(10); + }else{ + $task["port"] = 8902; + $ret = App\Service::getInstance()->call("Agent::addAgent",$task)->getResult(10); + } + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if (isset($ret["data"])) $_POST["id"] = $ret["data"]; + $this->setMessage($ret["code"],$ret["msg"]); + } + foreach ($_POST as $key=>$value){ + $this->tpl_var[$key] = $value; + } + $default = $_POST["gids"]; + + } + + $group = App\Service::getInstance()->call("Tasks::getGroups",$_SESSION["user_id"])->getResult(10); + $group["-1"] = "全部"; + $this->assign('gids', \Swoole\Form::muti_select('gids[]', $group, $default, null, array('class' => 'select2 select2-offscreen', 'multiple' => "1", 'style' => "width:200%"), false)); + $this->display(); + } + /** + * @RBAC 删除代理 + * @return array|string + */ + public function delete() + { + if ($_POST["cid"]){ + $ret = App\Service::getInstance()->call("Agent::deleteAgent",$_POST["cid"])->getResult(10); + if (empty($ret)){ + return $this->message(1,"没有响应"); + }else{ + return $this->message($ret["code"],$ret["msg"]); + } + } + } +} \ No newline at end of file diff --git a/src/admin/controllers/Auth.php b/src/admin/controllers/Auth.php new file mode 100644 index 0000000..912ec2b --- /dev/null +++ b/src/admin/controllers/Auth.php @@ -0,0 +1,217 @@ +gets($gets, $pager); + $this->assign('pager', array('total' => $pager->total, 'pagesize' => $gets['pagesize'], 'render' => $pager->render())); + $this->assign("list",$list); + $this->display(); + } + + /** + * + * @RBAC 编辑分组 + */ + public function groupedit() + { + $default = []; + $mod = table("rbac_group"); + $mod->primary = "gid"; + $table = table("rbac_user_group"); + $table->primary = "idx"; + if (isset($_GET["gid"])){ + $gid = $_GET["gid"]; + $data = $mod->get($gid,"gid"); + if(!$data->exist()){ + $this->setMessage(1,"不存在gid".$gid); + }else{ + $this->tpl_var["gid"] = $data["gid"]; + $this->tpl_var["gname"] = $data["gname"]; + $this->tpl_var["status"] = $data["status"]; + } + } + if (!empty($_POST)){ + $gid = isset($_POST["gid"])?$_POST["gid"]:""; + $gname= $_POST["gname"]; + $status = $_POST["status"]; + $userids = $_POST["user_uids"]; + $info = $mod->get($gname,"gname"); + if (empty($gid)){ + if ($info->exist()){ + $this->setMessage(1,"已存在此名称的分组"); + }else{ + self::beginTransaction(); + $data =[ + "gname"=>$gname, + "status"=>$status, + "lastupdate"=> date("Y-m-d H:i:s"), + ]; + $gid = $mod->put($data); + $table->dels(["gid"=>$gid]); + foreach ($userids as $u){ + $table->put(["gid"=>$gid,"userid"=>$u]); + } + self::commit(); + $this->setMessage(0,"添加成功"); + } + + }else{ + if ($info->exist() && $info["gid"] != $gid){ + $this->setMessage(1,"已存在此名称的分组"); + }else{ + $data =[ + "gid"=>$gid, + "gname"=>$gname, + "status"=>$status, + "lastupdate"=> date("Y-m-d H:i:s"), + ]; + self::beginTransaction(); + $table->dels(["gid"=>$gid]); + foreach ($userids as $u){ + $table->put(["gid"=>$gid,"userid"=>$u]); + } + if ($mod->set($gid,$data)){ + self::commit(); + $this->setMessage(0,"操作成功"); + }else{ + self::rollback(); + $this->setMessage(1,"操作失败"); + } + } + + } + foreach ($_POST as $key=>$value){ + $this->tpl_var[$key] = $value; + } + } + $userlist = model('User')->gets(["order"=>"username asc"]); + $user_uids = []; + foreach ($userlist as $v){ + $user_uids[$v["id"]] = $v["nickname"]."(".$v["username"].")"; + } + + if (!empty($gid)){ + $usrs = $table->gets(["gid"=>$gid]); + foreach ($usrs as $u){ + $default[] = $u["userid"]; + } + } + $this->assign('user_uids', \Swoole\Form::muti_select('user_uids[]', $user_uids, $default, null, array('class' => 'select2 select2-offscreen', 'multiple' => "1", 'style' => "width:100%"), false)); + $this->display(); + } + + + /** + * @RBAC 节点权限 + * @throws \Exception + */ + public function nodeedit() + { + $gid = $_REQUEST["gid"]; + $list = []; + if (!empty($gid)){ + $table = table("rbac_node"); + $table->primary = "idx"; + if (!empty($_POST)){ + $ret = $this->formatNodeList(); + self::beginTransaction(); + if ($table->dels(array("gid"=>$gid))){ + foreach ($ret as $d){ + $table->put($d); + } + self::commit(); + $this->setMessage(0,"操作成功"); + } + } + $list = App\RBAC::getPublicActionList(); + $data = $table->gets(array("gid"=>$gid)); + $nodes = []; + foreach ($data as $k=>$val){ + $nodes[$val["node"]] = true; + } + foreach ($list as $key=>&$value){ + if (isset($nodes[$key])){ + $value["checked"] = true; + continue; + } + foreach ($value["methods"] as $k=>&$v){ + if (isset($nodes[$key."::".$k])){ + $v["checked"] = true; + } + } + } + } + $this->assign("gid",$gid); + $this->assign("list",$list); + $this->display(); + } + + private function formatNodeList() + { + $data = $_POST; + $gid = $data["gid"]; + unset($data["gid"]); + $all = []; + foreach ($data as $key=>$value){ + if ($key == "gid") continue; + if (stripos($key,"::") === false){ + $all[$key] = "on"; + } + } + foreach ($data as $key=>$value){ + foreach ($all as $k=>$v){ + if (stripos($key,$k) !== false){ + unset($data[$key]); + } + } + } + $list = array_merge($data,$all); + $ret = []; + foreach ($list as $p=>$o){ + $ret[] = ["gid"=>$gid,"node"=>str_replace("\\\\","\\",$p)]; + } + return $ret; + } + +} \ No newline at end of file diff --git a/src/admin/controllers/Crongroup.php b/src/admin/controllers/Crongroup.php new file mode 100644 index 0000000..58f3ee1 --- /dev/null +++ b/src/admin/controllers/Crongroup.php @@ -0,0 +1,101 @@ +call("Tasks::getGroups")->getResult(10); + $this->assign("list",$ret); + $this->display(); + } + /** + * @RBAC 添加编辑分组 + * addOrEdit + */ + public function addOrEdit() + { + $uids =[]; + if (isset($_GET["gid"])){ + $gid = $_GET["gid"]; + $ret = App\Service::getInstance()->call("Tasks::getGroup",$gid)->getResult(10); + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if ($ret["code"]){ + $this->setMessage($ret["code"],$ret["msg"]); + }else{ + $data = $ret["data"]; + foreach ($data as $key=>$value){ + $this->tpl_var[$key] = $value; + } + $uids = isset($data["uids"])?$data["uids"]:[]; + + } + } + } + if (!empty($_POST)){ + $group = []; + if (isset($_POST["gname"])){ + $group["gname"] =trim($_POST["gname"]); + } + if (isset($_POST["uids"])){ + $group["uids"] = $_POST["uids"]; + } + if ($_POST["gid"]){ + $ret = App\Service::getInstance()->call("Tasks::updateGroup",$_POST["gid"],$group)->getResult(10); + }else{ + $ret = App\Service::getInstance()->call("Tasks::addGroup",$group)->getResult(10); + } + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if (isset($ret["data"])) $_POST["gid"] = $ret["data"]; + $this->setMessage($ret["code"],$ret["msg"]); + } + foreach ($_POST as $key=>$value){ + $this->tpl_var[$key] = $value; + } + $uids = isset($_POST["uids"])?$_POST["uids"]:[]; + } + $userlist = model('User')->gets(["order"=>"username asc"]); + $user_uids = []; + foreach ($userlist as $v){ + $user_uids[$v["id"]] = $v["nickname"]."(".$v["username"].")"; + } + $this->assign('uids', \Swoole\Form::muti_select('uids[]', $user_uids, $uids, null, array('class' => 'select2 select2-offscreen', 'multiple' => "1", 'style' => "width:100%"), false)); + $this->display(); + } + + /** + * @RBAC 删除分组 + * @return array|string + */ + public function delete() + { + if ($_POST["gid"]){ + $ret = App\Service::getInstance()->call("Tasks::deleteGroup",$_POST["gid"])->getResult(10); + if (empty($ret)){ + return $this->message(1,"没有响应"); + }else{ + return $this->message($ret["code"],$ret["msg"]); + } + } + } +} \ No newline at end of file diff --git a/src/admin/controllers/Crontab.php b/src/admin/controllers/Crontab.php new file mode 100644 index 0000000..2efdd5c --- /dev/null +++ b/src/admin/controllers/Crontab.php @@ -0,0 +1,170 @@ +call("Tasks::getList",$gets,$page,$pagesize)->getResult(10); + $pager = new Swoole\Pager(array('total'=> $ret["total"], 'perpage' => $pagesize, 'nowindex' => $page)); + $this->assign('pager', array('total' => $ret["total"], 'pagesize' => $pagesize, 'render' => $pager->render())); + $this->assign("list",$this->formatData($ret["rows"])); +// $group = App\Service::getInstance()->call("Tasks::getGroups",$_SESSION["user_id"])->getResult(10); +// $this->assign("group",$group); + $this->display(); + } + + + + private function formatData($data) + { + foreach ($data as &$value) + { + $value["status_f"] = $value["status"] == 1?"暂停":"正常"; + $value["runStatus_f"] = isset(self::$runStatus[$value["runStatus"]])?self::$runStatus[$value["runStatus"]]:"未知"; + } + return $data; + } + + /** + * @RBAC 添加编辑定时任务 + */ + public function addOrEdit() + { + $manager = [$_SESSION["userinfo"]["username"]]; + $this->assign("gname",$_SESSION["_gname"]); + if (isset($_GET["id"])){ + $id = $_GET["id"]; + $ret = App\Service::getInstance()->call("Tasks::get",$id)->getResult(10); + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if ($ret["code"]){ + $this->setMessage($ret["code"],$ret["msg"]); + }else{ + $data = $ret["data"]; + foreach ($data as $key=>$value){ + $this->tpl_var[$key] = $value; + } + $manager = isset($data["manager"])?explode(",",$data["manager"]):[]; + $agentids = isset($data["agents"])?explode(",",$data["agents"]):[]; + $agentids = array_flip($agentids); + } + } + } + if (!empty($_POST)){ + $task = []; + if (isset($_POST["taskname"])){ + $task["taskname"] = trim($_POST["taskname"]); + } + if (isset($_POST["rule"])){ + $task["rule"] =trim($_POST["rule"]); + } + if (isset($_POST["runnumber"])){ + $task["runnumber"] = trim($_POST["runnumber"]); + } + if (isset($_POST["execute"])){ + $task["execute"] = trim($_POST["execute"]); + } + if (isset($_POST["status"])){ + $task["status"] = trim($_POST["status"]); + } + if (isset($_POST["runuser"])){ + $task["runuser"] = trim($_POST["runuser"]); + } + if (isset($_POST["manager"])){ + $task["manager"] = implode(",",$_POST["manager"]); + } + if (isset($_POST["agents"])){ + $task["agents"] = implode(",",$_POST["agents"]); + } + if ($_POST["id"]){ + $ret = App\Service::getInstance()->call("Tasks::update",$_POST["id"],$task)->getResult(10); + }else{ + $task["gid"] = $_SESSION["_gid"]; + $ret = App\Service::getInstance()->call("Tasks::add",$task)->getResult(10); + } + if ($this->is_ajax()){ + if (empty($ret)){ + return $this->message(1,"没有响应"); + }else{ + return $this->message($ret["code"],$ret["msg"]); + } + }else{ + if (empty($ret)){ + $this->setMessage(1,"没有响应"); + }else{ + if (isset($ret["data"][0])) $_POST["id"] = $ret["data"][0]; + $this->setMessage($ret["code"],$ret["msg"]); + } + foreach ($_POST as $key=>$value){ + $this->tpl_var[$key] = $value; + } + } + $manager = isset($_POST["manager"])?$_POST["manager"]:[]; + $agentids = isset($_POST["agents"])?$_POST["agents"]:[]; + $agentids = array_flip($agentids); + } + $group = App\Service::getInstance()->call("Tasks::getGroups")->getResult(10); + $this->assign("group",$group); + $userlist = model('User')->gets(["order"=>"username asc"]); + $user_uids = []; + foreach ($userlist as $v){ + $user_uids[$v["username"]] = $v["nickname"]."(".$v["username"].")"; + } + $this->assign('manager', \Swoole\Form::muti_select('manager[]', $user_uids, $manager, null, array('class' => 'select2 select2-offscreen', 'multiple' => "1", 'style' => "width:100%"), false)); + + $agents = App\Service::getInstance()->call("Agent::getAgentByGid",$_SESSION["_gid"])->getResult(10); + if (!empty($agents)){ + foreach ($agents as &$value) + { + if (isset($agentids[$value["id"]])){ + $value["checked"] = true; + } + } + } + $this->assign("agents",$agents); + $this->display(); + } + + /** + * @RBAC 删除定时任务 + * @return array|string + */ + public function delete() + { + if ($_POST["id"]){ + $ret = App\Service::getInstance()->call("Tasks::delete",$_POST["id"])->getResult(10); + if (empty($ret)){ + return $this->message(1,"没有响应"); + }else{ + return $this->message($ret["code"],$ret["msg"]); + } + } + } +} \ No newline at end of file diff --git a/src/admin/controllers/Page.php b/src/admin/controllers/Page.php new file mode 100644 index 0000000..133b182 --- /dev/null +++ b/src/admin/controllers/Page.php @@ -0,0 +1,64 @@ +login(); + $this->display(); + } + + public function login() + { + $this->session->start(); + if ($this->user->isLogin()){ + $this->http->redirect($this->config["user"]["home_url"]); + return; + } + if (!empty($_POST)){ + if (!empty($_POST['password'])) + { + $r = $this->user->login(trim($_POST['username']), $_POST['password'],$_POST["auto_login"]); + if ($r) + { + $this->user->saveUserinfo(); + $this->user->updateStatus(); + $_SESSION["rbac_list"] = RBAC::loadAccess($_SESSION['user_id']); + + $this->http->redirect($this->config["user"]["home_url"]); + return; + } + else + { + $this->assign("message","用户名或密码错误"); + } + } + } + } + + /** + * 登出 + */ + function logout() + { + $this->session->start(); + $_SESSION = array(); + $this->swoole->http->redirect($this->swoole->config['user']['login_url']); + } + + public function switch_group() + { + $this->session->start(); + $gid = $_GET["gid"]; + $gname = $_GET["gname"]; + $_SESSION["_gid"] = $gid; + $_SESSION["_gname"] = $gname; + $this->request->redirect($_GET['refer']); + } +} diff --git a/src/admin/controllers/Password.php b/src/admin/controllers/Password.php new file mode 100644 index 0000000..87cc88e --- /dev/null +++ b/src/admin/controllers/Password.php @@ -0,0 +1,37 @@ +user->isLogin()){ + $this->http->redirect("/page/index"); + return; + } + if (!empty($_POST)){ + $userid = $_SESSION["user_id"]; + $oldpasswd = $_POST["oldpassword"]; + $password = $_POST["password"]; + if (!$this->user->changePassword($userid,$oldpasswd,$password)){ + $this->setMessage(1,"修改失败"); + goto end; + } + $this->setMessage(0,"修改成功"); + } + end: + $this->display(); + } +} \ No newline at end of file diff --git a/src/admin/controllers/Runtimetask.php b/src/admin/controllers/Runtimetask.php new file mode 100644 index 0000000..07f5285 --- /dev/null +++ b/src/admin/controllers/Runtimetask.php @@ -0,0 +1,43 @@ +call("Tasks::getRuntimeTasks",$page,$pagesize)->getResult(10); + $pager = new Swoole\Pager(array('total'=> $ret["total"], 'perpage' => $pagesize, 'nowindex' => $page)); + $this->assign('pager', array('total' => $ret["total"], 'pagesize' => $pagesize, 'render' => $pager->render())); + $this->assign("list",$this->formatData($ret["rows"])); + $this->display(); + } + private function formatData($data) + { + foreach ($data as &$value) + { + $value["runStatus_f"] = isset(self::$runStatus[$value["runStatus"]])?self::$runStatus[$value["runStatus"]]:"未知"; + } + return $data; + } +} \ No newline at end of file diff --git a/src/admin/controllers/Termlog.php b/src/admin/controllers/Termlog.php new file mode 100644 index 0000000..5878c75 --- /dev/null +++ b/src/admin/controllers/Termlog.php @@ -0,0 +1,84 @@ += '" . $begin_date."'"; + $end_date = isset($_GET["end_date"])?$_GET["end_date"]:""; + if (!empty($end_date)){ + $end_date = date("Y-m-d",strtotime($end_date) + 86400);// 至当天结束 + $gets['where'][] = "createtime < '" . $end_date."'"; + } + $page = !empty($_GET['page']) ? $_GET['page'] : 1; + $ret = App\Service::getInstance()->call("Termlog::getLogs",$gets,$page,$pagesize)->getResult(30); + $pager = new Swoole\Pager(array('total'=> $ret["total"], 'perpage' => $pagesize, 'nowindex' => $page)); + $this->assign('pager', array('total' => $ret["total"], 'pagesize' => $pagesize, 'render' => $pager->render())); + if (!empty($ret["rows"])){ + $this->assign("list",$this->formatData($ret["rows"])); + }else{ + $this->assign("list",[]); + } + $this->display(); + } + + private function formatData($data) + { + foreach ($data as &$value) + { + if (!empty($value["msg"])){ + $value["msg"] = $this->dump($value["msg"],false); + } + } + return $data; + } + + function dump($var, $echo=true) { + $tmp = json_decode($var,true); + if ($tmp == NULL){ + $tmp = $var; + } + ob_start(); + print_r($tmp); + $output = ob_get_clean(); + if (!extension_loaded('xdebug')) { + $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output); + $output = '
' . htmlspecialchars($output, ENT_QUOTES) . '
'; + } + if ($echo) { + echo($output); + return null; + }else + return $output; + } +} \ No newline at end of file diff --git a/src/admin/controllers/User.php b/src/admin/controllers/User.php new file mode 100644 index 0000000..f99e685 --- /dev/null +++ b/src/admin/controllers/User.php @@ -0,0 +1,170 @@ +gets($gets, $pager); + $this->assign('pager', array('total' => $pager->total, 'pagesize' => $gets['pagesize'], 'render' => $pager->render())); + $this->assign("list",$list); + $this->display(); + } + + /** + * @RBAC 添加修改用户 + * 添加修改用户 + */ + public function addOrEdit() + { + $user = model("User"); + if (!empty($_POST)){ + $userinfo = []; + if (isset($_POST["username"])){ + $userinfo["username"] = trim($_POST["username"]); + if ($user->get($userinfo["username"],"username")->exist()){ + $this->setMessage(102,"用户名已存在"); + foreach ($_POST as $k=>$v) + $this->tpl_var[$k] =$v; + goto end; + } + } + if (isset($_POST["password"])){ + $userinfo["password"] = App\Auth::makePasswordHash($userinfo["username"],trim($_POST["password"])); + } + if (isset($_POST["nickname"])){ + $userinfo["nickname"] = trim($_POST["nickname"]); + } + if (isset($_POST["blocking"])){ + $userinfo["blocking"] = trim($_POST["blocking"]); + } + + if (empty($_POST["id"])){ + $userinfo["createtime"] = date("Y-m-d H:i:s"); + if (!($id = $user->put($userinfo))){ + $this->setMessage(102,"添加失败"); + goto end; + } + $this->setMessage(0,"添加成功"); + }else{ + if (!$user->set($_POST["id"],$userinfo)){ + $this->setMessage(102,"修改失败"); + goto end; + } + $this->setMessage(0,"修改成功"); + $id = $_POST["id"]; + } + } + if (isset($_GET["id"])){ + $id = trim($_GET["id"]); + } + if (empty($id)) goto end; + $userinfo = $user->get($id); + if (!$userinfo->exist()){ + $this->setMessage(1,"用户不存在"); + goto end; + } + $this->tpl_var["id"] = $userinfo["id"]; + $this->tpl_var["username"] = $userinfo["username"]; + $this->tpl_var["nickname"] = $userinfo["nickname"]; + $this->tpl_var["blocking"] = $userinfo["blocking"]; + + end: + $this->display(); + } + + /** + * @RBAC 删除用户 + * 删除用户 + */ + public function delete() + { + if (isset($_POST["id"])){ + $id = trim($_POST["id"]); + if ($id == 1){ + return $this->message(1,"不能删除管理员"); + } + $user = model("User"); + if (!$user->del($id)){ + return $this->message(1,"删除用户失败"); + } + $table = table("rbac_user_group"); + if (!$table->dels(["userid"=>$id])){ + return $this->message(1,"删除用户分组关系失败"); + } + return $this->message(0,"删除成功"); + } + } + + /** + * @RBAC 修改密码 + * 修改密码 + */ + public function modifypassword() + { + $userid = $_REQUEST["id"]; + if ($userid){ + $user = model("User"); + $userinfo = $user->get($userid); + if (!$userinfo->exist()){ + $this->setMessage(1,"用户不存在"); + goto end; + } + if (!empty($_POST)){ + $username = $_POST["username"]; + $password = $_POST["password"]; + $ret = $user->set($userid,["password"=>App\Auth::makePasswordHash($username,$password)]); + if (!$ret){ + $this->setMessage(1,"修改失败"); + goto end; + } + $this->setMessage(0,"修改成功"); + } + $this->tpl_var["id"] = $userinfo["id"]; + $this->tpl_var["username"] = $userinfo["username"]; + } + end: + $this->display(); + } + +} \ No newline at end of file diff --git a/src/admin/factory/user.php b/src/admin/factory/user.php new file mode 100644 index 0000000..53ecb9a --- /dev/null +++ b/src/admin/factory/user.php @@ -0,0 +1,4 @@ +config['user']); +return $user; diff --git a/src/admin/models/User.php b/src/admin/models/User.php new file mode 100644 index 0000000..ce50691 --- /dev/null +++ b/src/admin/models/User.php @@ -0,0 +1,13 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

编辑Agent

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + diff --git a/src/admin/templates/agent/index.php b/src/admin/templates/agent/index.php new file mode 100644 index 0000000..9a2877e --- /dev/null +++ b/src/admin/templates/agent/index.php @@ -0,0 +1,156 @@ + + + +
+ +
+
+ +
+ + +
+ +
+
+ +

任务处理器

+ +
+
+
+
+
+
+
+
+
+ +
+ +
+
+ 查询 +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID名称分组IPPORT状态是否注册心跳时间操作
+ ">编辑 + ">删除 +
+
+
+
+ +
+
+ + +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/auth/groupedit.php b/src/admin/templates/auth/groupedit.php new file mode 100644 index 0000000..fc0f455 --- /dev/null +++ b/src/admin/templates/auth/groupedit.php @@ -0,0 +1,128 @@ + + +
+ +
+
+ +
+ + +
+ + +
+ +
+ +

编辑分组

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + diff --git a/src/admin/templates/auth/index.php b/src/admin/templates/auth/index.php new file mode 100644 index 0000000..42d6663 --- /dev/null +++ b/src/admin/templates/auth/index.php @@ -0,0 +1,129 @@ + + + +
+ +
+
+ +
+ + +
+ +
+
+ +

权限管理

+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
分组id分组名状态最近修改时间操作
+ ">编辑 + ">修改权限 +
+
+
+
+ +
+
+ + +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/auth/nodeedit.php b/src/admin/templates/auth/nodeedit.php new file mode 100644 index 0000000..1abdd79 --- /dev/null +++ b/src/admin/templates/auth/nodeedit.php @@ -0,0 +1,107 @@ + + +
+ +
+
+ +
+ + +
+ + +
+ +
+ +

修改权限

+
+ +
+ + +
+ + +
+ + + +
+
+ + +
+ $value){ ?> +
+ +
+ + $v){?> + + +
+
+ +
+ +
+ + +
+
+
+ + +
+ + +
+ + +
+ + +
+ +
+ +
+ + + + + diff --git a/src/admin/templates/crongroup/addoredit.php b/src/admin/templates/crongroup/addoredit.php new file mode 100644 index 0000000..41c2890 --- /dev/null +++ b/src/admin/templates/crongroup/addoredit.php @@ -0,0 +1,105 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

编辑分组

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + diff --git a/src/admin/templates/crongroup/index.php b/src/admin/templates/crongroup/index.php new file mode 100644 index 0000000..5176ad4 --- /dev/null +++ b/src/admin/templates/crongroup/index.php @@ -0,0 +1,110 @@ + + + +
+ +
+
+ +
+ + +
+ +
+
+ +

分组管理

+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ + + + + + + + + + $d) + { + ?> + + + + + + + +
分组ID分组名操作
+ 编辑 + 删除 +
+
+
+
+ + +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/crontab/addoredit.php b/src/admin/templates/crontab/addoredit.php new file mode 100644 index 0000000..d9727f2 --- /dev/null +++ b/src/admin/templates/crontab/addoredit.php @@ -0,0 +1,212 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

添加任务

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+
+ + + +$gname): ?> + + + + + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ Note:并发任务数 0不限制 其他表示限制的数量 +
+
+
+ + +
+
+ + +
+
+ +
+ $d){ ?> +
+ +
+ +
+
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + diff --git a/src/admin/templates/crontab/index.php b/src/admin/templates/crontab/index.php new file mode 100644 index 0000000..33f29b1 --- /dev/null +++ b/src/admin/templates/crontab/index.php @@ -0,0 +1,209 @@ + + + +
+ +
+
+ +
+ + +
+ +
+
+ +

定时任务管理

+ + + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + + + +$gname): ?> + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ID分组名任务名规则并发数状态命令运行时用户运行状态运行开始时间运行结束时间操作
+ ">编辑 + " status="10"> + 暂停 开始 + + ">删除 +
+
+
+
+ +
+
+ + +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/include/css.php b/src/admin/templates/include/css.php new file mode 100644 index 0000000..909964b --- /dev/null +++ b/src/admin/templates/include/css.php @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/src/admin/templates/include/filter.php b/src/admin/templates/include/filter.php new file mode 100644 index 0000000..d882a23 --- /dev/null +++ b/src/admin/templates/include/filter.php @@ -0,0 +1,47 @@ +
+ +
+
+ +
+
+ 时间: + ~ + +
\ No newline at end of file diff --git a/src/admin/templates/include/header.php b/src/admin/templates/include/header.php new file mode 100644 index 0000000..fc3e7e9 --- /dev/null +++ b/src/admin/templates/include/header.php @@ -0,0 +1,19 @@ + + + + + <?=Swoole::$php->config['common']['site_name']?> + + + + + + + + diff --git a/src/admin/templates/include/javascript.php b/src/admin/templates/include/javascript.php new file mode 100644 index 0000000..bee10de --- /dev/null +++ b/src/admin/templates/include/javascript.php @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+
+
+

+
+ + diff --git a/src/admin/templates/include/leftmenu.php b/src/admin/templates/include/leftmenu.php new file mode 100644 index 0000000..a8025b5 --- /dev/null +++ b/src/admin/templates/include/leftmenu.php @@ -0,0 +1,50 @@ + diff --git a/src/admin/templates/include/msg.php b/src/admin/templates/include/msg.php new file mode 100644 index 0000000..c35f491 --- /dev/null +++ b/src/admin/templates/include/msg.php @@ -0,0 +1,11 @@ + +
+
+
"> + × +

+

+
+
+
+ \ No newline at end of file diff --git a/src/admin/templates/include/top_menu.php b/src/admin/templates/include/top_menu.php new file mode 100644 index 0000000..023295b --- /dev/null +++ b/src/admin/templates/include/top_menu.php @@ -0,0 +1,36 @@ +
+ + +
+
+ 当前项目: + + + +
+ \ No newline at end of file diff --git a/src/admin/templates/page/index.php b/src/admin/templates/page/index.php new file mode 100644 index 0000000..c48a84a --- /dev/null +++ b/src/admin/templates/page/index.php @@ -0,0 +1,193 @@ + + + + + + + SmartAdmin + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ 用户登陆 +
+ +
+ +
+
+ + + Error! +
+
+ +
+ + +
+
+ + +
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/admin/templates/password/modifypassword.php b/src/admin/templates/password/modifypassword.php new file mode 100644 index 0000000..2a617b8 --- /dev/null +++ b/src/admin/templates/password/modifypassword.php @@ -0,0 +1,128 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

修改密码

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + \ No newline at end of file diff --git a/src/admin/templates/runtimetask/index.php b/src/admin/templates/runtimetask/index.php new file mode 100644 index 0000000..9a7203f --- /dev/null +++ b/src/admin/templates/runtimetask/index.php @@ -0,0 +1,85 @@ + + + +
+ +
+
+ +
+ + +
+ +
+
+ +

运行中任务

+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
运行任期到期运行时间任务ID任务名运行状态查看日志
+ 0){?> + 查看日志 + +
+
+
+
+ +
+
+ + +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/termlog/index.php b/src/admin/templates/termlog/index.php new file mode 100644 index 0000000..e5cd3ce --- /dev/null +++ b/src/admin/templates/termlog/index.php @@ -0,0 +1,124 @@ + + +
+ + +
+ + + +
+ + + +
+ +
+
+ +

查询条件

+
+ +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ 查询 +
+
+
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + +
+ +  []
+ + + + +
+
+ +
+
+
+ +
+ + + +
+ + +
+ + + + + \ No newline at end of file diff --git a/src/admin/templates/user/addoredit.php b/src/admin/templates/user/addoredit.php new file mode 100644 index 0000000..5724107 --- /dev/null +++ b/src/admin/templates/user/addoredit.php @@ -0,0 +1,153 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

编辑用户

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + \ No newline at end of file diff --git a/src/admin/templates/user/index.php b/src/admin/templates/user/index.php new file mode 100644 index 0000000..3b44ce3 --- /dev/null +++ b/src/admin/templates/user/index.php @@ -0,0 +1,160 @@ + + + +
+ +
+
+ +
+ + +
+ + +
+
+ + + + + + + diff --git a/src/admin/templates/user/modifypassword.php b/src/admin/templates/user/modifypassword.php new file mode 100644 index 0000000..4daf4b5 --- /dev/null +++ b/src/admin/templates/user/modifypassword.php @@ -0,0 +1,125 @@ + + +
+ +
+
+ +
+ + +
+ + +
+
+ +

修改密码

+ +
+ + +
+ + +
+ +
+ + + +
+ +
+ +
+ + +
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+ + +
+ +
+
+ +
+ + + + + \ No newline at end of file diff --git a/src/agent/App/Exec.php b/src/agent/App/Exec.php new file mode 100644 index 0000000..8cda751 --- /dev/null +++ b/src/agent/App/Exec.php @@ -0,0 +1,22 @@ +taskworker){ - Process::signal();//注册信号 - if ($worker_id == 0){ + if ($server->taskworker){ + if ($worker_id == (WORKER_NUM+self::REGISTER_TASKS)){ //10秒钟发送一次信号给中心服,证明自己的存在 $server->tick(10000, function () use ($server) { $this->register(); }); } - if ($worker_id == 1){ + if ($worker_id == (WORKER_NUM+self::NOTIFY_TASKS)){ //1秒判断一次任务执行状态,并通知主服务器 $server->tick(1000, function () use ($server) { - $server->task("notify"); + //通知中心服 + Process::notify(); }); } + }else{ + Process::signal();//注册信号 } } function onTask($serv, $task_id, $from_id, $data) { - if ($data == "notify"){ - //通知中心服 - Process::notify(); - } - return true; + } function onFinish($serv, $task_id, $data) { - return; + } @@ -57,9 +57,9 @@ function onFinish($serv, $task_id, $data) */ public function register() { - $listenHost = \Lib\Util::listenHost(); - $service = new Service(); - $ret = $service->call("Robot::register",$listenHost,PORT)->getResult(); + $listenHost = Util::listenHost(); + $service = new Client(); + $ret = $service->call("Agent::register",$listenHost,PORT)->getResult(3); if (empty($ret) || $ret["code"]){ Flog::log($ret["msg"]); } @@ -69,11 +69,9 @@ public function register() public function call($request, $header) { //初始化日志 - Flog::startLog($request['call']); Flog::log("call:".$request['call'].",params:".json_encode($request['params'])); $ret = parent::call($request, $header); Flog::log($ret); - Flog::endLog(); Flog::flush(); return $ret; } diff --git a/src/agent/Lib/Client.php b/src/agent/Lib/Client.php new file mode 100644 index 0000000..1e13402 --- /dev/null +++ b/src/agent/Lib/Client.php @@ -0,0 +1,36 @@ +addServers(array(CENTER_HOST.':'.CENTER_PORT)); + } + + public static function getInstance($ip="",$port="") + { + if (isset(self::$insance[$ip.":".$port]) && !empty(self::$insance[$ip.":".$port])){ + return self::$insance[$ip.":".$port]; + } + $insance = new self($ip,$port); + self::$insance[$ip.":".$port] = $insance; + return $insance; + + } + + function call() + { + $args = func_get_args(); + return $this->task($this->namespace . '\\' . $args[0], array_slice($args, 1)); + } +} diff --git a/src/agent/Lib/FileLog.php b/src/agent/Lib/FileLog.php new file mode 100644 index 0000000..d114a4f --- /dev/null +++ b/src/agent/Lib/FileLog.php @@ -0,0 +1,226 @@ + 0, + 'INFO' => 1, + 'NOTICE' => 2, + 'WARN' => 3, + 'ERROR' => 4, + ); + + protected static $level_str = array( + 'TRACE', + 'INFO', + 'NOTICE', + 'WARN', + 'ERROR', + ); + + static $date_format = '[Y-m-d H:i:s]'; + + protected $log_file; + protected $log_dir; + protected $fp; + //是否按日期存储日志 + protected $archive; + //是否切割文件 + protected $cut_file = false; + //待写入文件的日志队列(缓冲区) + protected $queue = array(); + //是否记录更详细的信息(目前记多了文件名、行号) + protected $verbose = false; + protected $enable_cache = true; + protected $date; + + function __construct($config) + { + if (is_string($config)) { + $file = $config; + $config = array('file' => $file); + } + $this->cut_file = isset($config["cut_file"]) && $config["cut_file"] == true; + $this->archive = isset($config['date']) && $config['date'] == true; + $this->verbose = isset($config['verbose']) && $config['verbose'] == true; + $this->enable_cache = isset($config['enable_cache']) ? (bool)$config['enable_cache'] : true; + + //按日期存储日志 + if ($this->archive) { + if (isset($config['dir'])) { + $this->date = date('Ymd'); + $this->log_dir = rtrim($config['dir'], '/'); + $this->log_file = $this->log_dir . '/' . $this->date . '.log'; + } else { + throw new \Exception(__CLASS__ . ": require \$config['dir']"); + } + } else { + if (isset($config['file'])) { + $this->log_file = $config['file']; + } else { + throw new \Exception(__CLASS__ . ": require \$config[file]"); + } + } + + //自动创建目录 + $dir = dirname($this->log_file); + if (file_exists($dir)) { + if (!is_writeable($dir) && !chmod($dir, 0777)) { + throw new \Exception(__CLASS__ . ": {$dir} unwriteable."); + } + } elseif (mkdir($dir, 0777, true) === false) { + throw new \Exception(__CLASS__ . ": mkdir dir {$dir} fail."); + } + + $this->fp = $this->openFile($this->log_file); + + if (isset($config['level'])) { + $this->setLevel(intval($config['level'])); + } + $this->config = $config; + } + + static function convert($level) + { + if (!is_numeric($level)) { + $level = self::$level_code[strtoupper($level)]; + } + return $level; + } + + function __call($func, $param) + { + $this->put($param[0], $func); + } + + function setLevel($level = self::TRACE) + { + $this->level_line = $level; + } + + + function format($msg, $level, &$date = null) + { + $level = self::convert($level); + if ($level < $this->level_line) { + return false; + } + $level_str = self::$level_str[$level]; + + $now = new \DateTime('now'); + $date = $now->format('Ymd'); + $log = $now->format(self::$date_format) . "\t{$level_str}\t{$msg}"; + if ($this->verbose) { + $debug_info = debug_backtrace(); + $file = isset($debug_info[1]['file']) ? $debug_info[1]['file'] : null; + $line = isset($debug_info[1]['line']) ? $debug_info[1]['line'] : null; + + if ($file && $line) { + $log .= "\t{$file}\t{$line}"; + } + } + $log .= "\n"; + + return $log; + } + + /** + * 写入日志队列 + * @param $msg string 信息 + * @param $level int 事件类型 + * @return bool + */ + function put($msg, $level = self::INFO) + { + $msg = $this->format($msg, $level, $date); + + if (!isset($this->queue[$date])) { + $this->queue[$date] = array(); + } + $this->queue[$date][] = $msg; + + // 如果没有开启缓存,直接将缓冲区的内容写入文件 + // 如果缓冲区内容日志条数达到一定程度,写入文件 + if (count($this->queue, COUNT_RECURSIVE) >= 11 + || $this->enable_cache == false + ) { + $this->flush(); + } + } + + /** + * 将日志队列(缓冲区)的日志写入文件 + */ + function flush() + { + if (empty($this->queue)) { + return; + } + + foreach ($this->queue as $date => $logs) { + $date = strval($date); + $log_str = implode('', $logs); + + // 按日期存储日志的情况下,如果日期变化(第二天) + // 重新设置一下log文件和文件指针 + if ($this->archive && $this->date != $date) { + fclose($this->fp); + $this->date = $date; + $this->log_file = $this->log_dir . '/' . $this->date . '.log'; + $this->fp = $this->openFile($this->log_file); + } + + //fputs($this->fp, $log_str); + if ($this->cut_file && filesize($this->log_file) > 209715200) //200M + { + if ($this->archive) { + $new_log_file = $this->log_dir . '/' . $this->date . '.log.' . date('His'); + } else { + $new_log_file = $this->log_file . "." . date('YmdHis'); + } + fclose($this->fp); + rename($this->log_file, $new_log_file); + $this->fp = fopen($this->log_file, 'a+'); + } + fputs($this->fp, $log_str); + } + + $this->queue = array(); + } + + private function openFile($file) + { + if (!file_exists($file) && touch($file)) { + $old = umask(0); + chmod($file, 0777); + umask($old); + } + + $fp = fopen($this->log_file, 'a+'); + + if (!$fp) { + throw new \Exception(__CLASS__ . ": can not open log_file[{$file}]."); + } + + return $fp; + } + + function __destruct() + { + $this->flush(); + } +} diff --git a/src/agent/Lib/Flog.php b/src/agent/Lib/Flog.php new file mode 100644 index 0000000..51767df --- /dev/null +++ b/src/agent/Lib/Flog.php @@ -0,0 +1,43 @@ + getRunPath() . '/logs/agent'.PORT.'.log']); + } + return self::$_instance; + } + + + public static function flush() + { + self::getInstance()->flush(); + } + + /** + * + */ + public static function log($value) + { + $text=""; + $text .= is_scalar($value) ? $value : json_encode($value); + self::getInstance()->put($text); + } + +} \ No newline at end of file diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/Argument.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Argument.php new file mode 100644 index 0000000..12dcaf4 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Argument.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; + +class Argument +{ + public $arg; + + function __construct($arg) + { + $this->arg = $arg; + } + + + function isLongOption() + { + return substr($this->arg,0,2) === '--'; + } + + function isShortOption() + { + return (substr($this->arg,0,1) === '-' ) + && (substr($this->arg,1,1) !== '-'); + } + + function isEmpty() + { + return empty($this->arg); + } + + + + /** + * check current argument is an option + * + * -a + * --foo + */ + function isOption() + { + return $this->isShortOption() || $this->isLongOption(); + } + + function getOptionName() + { + if( preg_match('/^[-]+([a-zA-Z0-9-]+)/',$this->arg,$regs) ) { + return $regs[1]; + } + } + + function containsOptionValue() + { + return preg_match('/=.+/',$this->arg); + } + + function getOptionValue() + { + if( preg_match('/=(.+)/',$this->arg,$regs) ) { + return $regs[1]; + } + } + + /** + * check combined short flags + * + * like: -abc + */ + function withExtraFlagOptions() + { + return preg_match('/^-[a-zA-Z0-9]{2,}/',$this->arg); + } + + function extractExtraFlagOptions() + { + $args = array(); + for($i=2;$i< strlen($this->arg); ++$i) { + $args[] = '-' . $this->arg[$i]; + } + $this->arg = substr($this->arg,0,2); # -[a-z] + return $args; + } + + function __toString() + { + return $this->arg; + } + +} + + + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionKit.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionKit.php new file mode 100644 index 0000000..bec679b --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionKit.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpec; +use GetOptionKit\OptionSpecCollection; +use GetOptionKit\OptionResult; +use GetOptionKit\OptionParser; +use GetOptionKit\ContinuousOptionParser; +use Exception; + +/* A wrapper class for continuous option parser */ +class ContinuousOptionKit extends GetOptionKit +{ + function __construct() + { + $this->specs = new OptionSpecCollection; + $this->parser = new ContinuousOptionParser( $this->specs ); + } + + function parse( $argv ) + { + return $this->parser->parse( $argv ); + } + + function isEnd() + { + return $this->parser->isEnd(); + } + + function continueParse() + { + return $this->parser->continueParse(); + } +} + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionParser.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionParser.php new file mode 100644 index 0000000..21605c3 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/ContinuousOptionParser.php @@ -0,0 +1,209 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpec; +use GetOptionKit\OptionResult; +use GetOptionKit\Argument; +use GetOptionKit\OptionParser; +use Exception; +use GetOptionKit\Exception\InvalidOptionException; +use GetOptionKit\Exception\RequireValueException; + +/** + * A common command line argument format: + * + * app.php + * [--app-options] + * + * [subcommand + * --subcommand-options] + * [subcommand + * --subcommand-options] + * [subcommand + * --subcommand-options] + * + * [arguments] + * + * ContinuousOptionParser is for the process flow: + * + * init app options, + * parse app options + * + * + * + * while not end + * if stop at command + * shift command + * parse command options + * else if stop at arguments + * shift arguments + * execute current command with the arguments. + * + * Example code: + * + * + * // subcommand stack + * $subcommands = array('subcommand1','subcommand2','subcommand3'); + * + * // different command has its own options + * $subcommand_specs = array( + * 'subcommand1' => $cmdspecs, + * 'subcommand2' => $cmdspecs, + * 'subcommand3' => $cmdspecs, + * ); + * + * // for saved options + * $subcommand_options = array(); + * + * // command arguments + * $arguments = array(); + * + * $argv = explode(' ','-v -d -c subcommand1 -a -b -c subcommand2 -c subcommand3 arg1 arg2 arg3'); + * + * // parse application options first + * $parser = new ContinuousOptionParser( $appspecs ); + * $app_options = $parser->parse( $argv ); + * while( ! $parser->isEnd() ) { + * if( $parser->getCurrentArgument() == $subcommands[0] ) { + * $parser->advance(); + * $subcommand = array_shift( $subcommands ); + * $parser->setSpecs( $subcommand_specs[$subcommand] ); + * $subcommand_options[ $subcommand ] = $parser->continueParse(); + * } else { + * $arguments[] = $parser->advance(); + * } + * } + * + * + **/ +class ContinuousOptionParser extends OptionParser +{ + public $index; + public $length; + public $argv; + + /* for the constructor , the option specs is application options */ + function __construct($specs = array()) + { + parent::__construct($specs); + $this->index = 1; + } + + function startFrom($index) + { + $this->index = $index; + } + + function isEnd() + { + # echo "!! {$this->index} >= {$this->length}\n"; + return ($this->index >= $this->length); + } + + function advance() + { + $arg = $this->argv[ $this->index++ ]; + return $arg; + } + + function getCurrentArgument() + { + return $this->argv[ $this->index ]; + } + + function continueParse() + { + return $this->parse($this->argv); + } + + function parse($argv) + { + // create new Result object. + $result = new OptionResult; + + if( ! $this->argv ) { + $this->argv = $argv; + $this->length = count($argv); + } + + if( $this->isEnd() ) { + return $result; + } + + // from last parse index + for( ; $this->index < $this->length; ++$this->index ) + { + $arg = new Argument( $argv[$this->index] ); + + /* let the application decide for: command or arguments */ + if( ! $arg->isOption() ) { + # echo "stop at {$this->index}\n"; + return $result; + } + + // if the option is with extra flags, + // split it out, and insert into the argv array + // + // like -abc + if( $arg->withExtraFlagOptions() ) { + $extra = $arg->extractExtraFlagOptions(); + array_splice( $argv, $this->index + 1, 0, $extra ); + $argv[$this->index] = $arg->arg; // update argument to current argv list. + $len = count($argv); // update argv list length + } + + $next = null; + if( $this->index + 1 < count($argv) ) + $next = new Argument( $argv[$this->index + 1] ); + + $spec = $this->specs->getSpec( $arg->getOptionName() ); + if( ! $spec ) + throw new InvalidOptionException("Invalid option: " . $arg ); + + if( $spec->isAttributeRequire() ) + { + if ( ! $this->foundRequireValue($spec,$arg,$next) ) { + throw new RequireValueException( "Option '{$arg->getOptionName()}' requires a value." ); + } + + $this->takeOptionValue($spec,$arg,$next); + if( $next && ! $next->isOption() ) + $this->index++; + $result->set($spec->getId(), $spec); + } + elseif( $spec->isAttributeMultiple() ) + { + $this->pushOptionValue($spec,$arg,$next); + if( $next && ! $next->isOption() ) + $this->index++; + $result->set( $spec->getId() , $spec); + } + elseif( $spec->isAttributeOptional() ) + { + $this->takeOptionValue($spec,$arg,$next); + if( $spec->value && $next && ! $next->isOption() ) + $this->index++; + $result->set( $spec->getId() , $spec); + } + elseif( $spec->isAttributeFlag() ) + { + $spec->value = true; + $result->set( $spec->getId() , $spec); + } + else + { + throw new Exception('Unknown attribute.'); + } + } + return $result; + } + +} diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/Exception/InvalidOptionException.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Exception/InvalidOptionException.php new file mode 100644 index 0000000..cc8eab5 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Exception/InvalidOptionException.php @@ -0,0 +1,8 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpec; +use GetOptionKit\OptionSpecCollection; +use GetOptionKit\OptionResult; +use GetOptionKit\OptionParser; +use Exception; + +class GetOptionKit +{ + /** + * @var OptionParser + */ + public $parser; + /** + * @var OptionPrinter + */ + public $specs; + + function __construct() + { + $this->specs = new OptionSpecCollection; + $this->parser = new OptionParser( $this->specs ); + } + + /* + * return current parser + * */ + function getParser() + { + return $this->parser; + } + + /* get all option specification */ + function getSpecs() + { + return $this->specs; + } + + /* a helper to build option specification object from string spec + * + * @param $specString string + * @param $description string + * @param $key + * + * */ + function add( $specString, $description , $key = null ) + { + $spec = $this->specs->add($specString,$description,$key); + return $spec; + } + + /* get option specification by Id */ + function get($id) + { + return $this->specs->get($id); + } + + + function parse( $argv ) + { + $result = $this->parser->parse( $argv ); + $opt = array(); + foreach( $result as $key => $spec ) + { + $opt[$key] = $spec; + } + return $opt; + } +} + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/Init.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Init.php new file mode 100644 index 0000000..fe08c1c --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/Init.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use Exception; + +class NonNumericException extends Exception +{ + +} + + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionParser.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionParser.php new file mode 100644 index 0000000..9c0c648 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionParser.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpec; +use GetOptionKit\OptionSpecCollection; +use GetOptionKit\OptionResult; +use GetOptionKit\Argument; +use Exception; +use GetOptionKit\Exception\InvalidOptionException; +use GetOptionKit\Exception\RequireValueException; + +class OptionParser +{ + public $specs; + public $longOptions; + public $shortOptions; + + function __construct($specs) + { + if( $specs ) { + if( ! is_a($specs,'\GetOptionKit\OptionSpecCollection') ) + throw new Exception('not option spec collection class.'); + $this->specs = $specs; + } else { + $this->specs = new \GetOptionKit\OptionSpecCollection; + } + } + + function setSpecs(OptionSpecCollection $specs) + { + $this->specs = $specs; + } + + + /* a helper to build option specification object from string spec + * + * @param $specString string + * @param $description string + * @param $key + * + * */ + function addSpec( $specString, $description , $key = null ) + { + $spec = $this->specs->add($specString,$description,$key); + return $spec; + } + + /* get option specification by Id */ + function getSpec($id) + { + return $this->specs->get($id); + } + + + + + /* detect option */ + function isOption($arg) + { + return substr($arg,0,1) === '-'; + } + + /* take option value from current argument or from the next argument */ + function takeOptionValue($spec,$arg,$next) + { + if( $arg->containsOptionValue() ) { + $spec->setValue( $arg->getOptionValue() ); + } + elseif( $next && ! $next->isOption() ) { + $spec->setValue( $next->arg ); + } + else { + $spec->setValue(true); + } + } + + /* + * push value to multipl value option + */ + function pushOptionValue($spec,$arg,$next) + { + if( $arg->containsOptionValue() ) + $spec->pushValue( $arg->getOptionValue() ); + elseif( ! $next->isOption() ) + $spec->pushValue( $next->arg ); + } + + function foundRequireValue($spec,$arg,$next) + { + /* argument doesn't contain value and next argument is option */ + if( $arg->containsOptionValue() ) + return true; + + if( ! $arg->containsOptionValue() && $next && ! $next->isEmpty() && ! $next->isOption() ) + return true; + + return false; + } + + + function parse($argv) + { + $result = new OptionResult; + $len = count($argv); + for( $i = 0; $i < $len; ++$i ) + { + $arg = new Argument( $argv[$i] ); + if( ! $arg->isOption() ) { + $result->addArgument( $arg ); + continue; + } + + // if the option is with extra flags, + // split it out, and insert into the argv array + if( $arg->withExtraFlagOptions() ) { + $extra = $arg->extractExtraFlagOptions(); + array_splice( $argv, $i+1, 0, $extra ); + $argv[$i] = $arg->arg; // update argument to current argv list. + $len = count($argv); // update argv list length + } + + $next = new Argument( @$argv[$i + 1] ); + $spec = $this->specs->getSpec( $arg->getOptionName() ); + if( ! $spec ) + throw new InvalidOptionException("Invalid option: " . $arg ); + + if( $spec->isAttributeRequire() ) + { + if ( ! $this->foundRequireValue($spec,$arg,$next) ) { + throw new RequireValueException( "Option {$arg->getOptionName()} require a value." ); + } + + $this->takeOptionValue($spec,$arg,$next); + if( ! $next->isOption() ) + $i++; + $result->set($spec->getId(), $spec); + } + elseif( $spec->isAttributeMultiple() ) + { + $this->pushOptionValue($spec,$arg,$next); + if( $next->isOption() ) + $i++; + $result->set( $spec->getId() , $spec); + } + elseif( $spec->isAttributeOptional() ) + { + $this->takeOptionValue($spec,$arg,$next); + if( $spec->value && ! $next->isOption() ) + $i++; + $result->set( $spec->getId() , $spec); + } + elseif( $spec->isAttributeFlag() ) + { + $spec->value = true; + $result->set( $spec->getId() , $spec); + } + else + { + throw new Exception('Unknown attribute.'); + } + } + return $result; + } +} diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinter.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinter.php new file mode 100644 index 0000000..5b0a235 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinter.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpecCollection; + +class OptionPrinter implements OptionPrinterInterface +{ + public $specs; + + function __construct( OptionSpecCollection $specs) + { + $this->specs = $specs; + } + + /** + * render option descriptions + * + * @param integer $width column width + * @return string output + */ + function outputOptions($width = 40) + { + echo "* Available options:\n"; + $lines = array(); + foreach( $this->specs->all() as $spec ) + { + $c1 = $spec->getReadableSpec(); + $line = sprintf("% {$width}s %s", $c1, $spec->description); + $lines[] = $line; + } + return $lines; + } + + /** + * print options descriptions to stdout + */ + function printOptions($program = null) + { + if (empty($program)) + { + global $argv; + $program = "{$argv[0]}"; + } + echo str_repeat("=", 80)."\nUsage: {$program}\n".str_repeat("=", 80)."\n"; + $lines = $this->outputOptions(); + echo join( "\n" , $lines ); + echo "\n"; + } +} diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinterInterface.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinterInterface.php new file mode 100644 index 0000000..0bbd47c --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionPrinterInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; + +use GetOptionKit\OptionSpecCollection; + +interface OptionPrinterInterface +{ + function __construct( OptionSpecCollection $specs); + function printOptions(); +} + + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionResult.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionResult.php new file mode 100644 index 0000000..63fb0cf --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionResult.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use ArrayAccess; +use Iterator; +use GetOptionKit\Argument; +use GetOptionKit\OptionSpec; + + +/** + * Define the getopt parsing result + * + * create option result from array() + * + * OptionResult::create($spec, array( + * 'key' => 'value' + * ), array( ... arguments ... ) ); + * + */ +class OptionResult + implements Iterator, ArrayAccess +{ + /** + * @var array option specs, key => OptionSpec object + * */ + public $keys = array(); + + private $currentKey; + + /* arguments */ + public $arguments = array(); + + function __construct() + { + + } + + function __isset($key) + { + return isset($this->keys[$key]); + } + + function __get($key) + { + if( isset($this->keys[ $key ]) ) + return @$this->keys[ $key ]->value; + } + + function __set($key,$value) + { + $this->keys[ $key ] = $value; + } + + function has($key) + { + return isset($this->keys[ $key ]); + } + + function set($key, OptionSpec $value) + { + $this->keys[ $key ] = $value; + } + + function addArgument( Argument $arg) + { + $this->arguments[] = $arg; + } + + function getArguments() + { + return array_map( function($e) { return $e->__toString(); }, $this->arguments ); + } + + + /** + * Iterator methods + */ + function rewind() + { + return reset($this->keys); + } + + function current() + { + return current($this->keys)->value; + } + + function key() + { + return key($this->keys); + } + + function next() + { + return next($this->keys); + } + + function valid() + { + return key($this->keys) !== null; + } + + + public function offsetSet($name,$value) + { + $this->keys[ $name ] = $value; + } + + public function offsetExists($name) + { + return isset($this->keys[ $name ]); + } + + public function offsetGet($name) + { + return $this->keys[ $name ]; + } + + public function offsetUnset($name) + { + unset($this->keys[$name]); + } + + public function toArray() + { + $array = array(); + foreach( $this->keys as $key => $option ) { + $array[ $key ] = $option->value; + } + return $array; + } + + static function create($specs,$values = array(),$arguments = null ) + { + $new = new self; + foreach( $specs as $spec ) { + $id = $spec->getId(); + if( isset($values[ $id ]) ) { + $new->$id = $spec; + $spec->setValue( $values[$id] ); + } + if( $arguments ) { + foreach( $arguments as $arg ) { + $new->addArgument( new Argument( $arg ) ); + } + } + } + return $new; + } + +} + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpec.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpec.php new file mode 100644 index 0000000..97b2c12 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpec.php @@ -0,0 +1,300 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ + +namespace GetOptionKit; +use GetOptionKit\NonNumericException; + +class OptionSpec +{ + public $short; + public $long; + public $description; /* description */ + public $key; /* key to store values */ + public $value; + public $type; + + public $valueName; /* name for the value place holder, for printing */ + + const attr_multiple = 1; + const attr_optional = 2; + const attr_require = 4; + const attr_flag = 8; + + const type_string = 1; + const type_integer = 2; + + function __construct($specString = null) + { + if( $specString ) { + $this->initFromSpecString($specString); + } + } + + /* + * build spec attributes from spec string + * + **/ + function initFromSpecString($specString) + { + $pattern = '/ + ( + (?:[a-zA-Z0-9-]+) + (?: + \| + (?:[a-zA-Z0-9-]+) + )? + ) + ([:+?])? + (?:=([si]|string|integer))? + /x'; + + if( preg_match( $pattern, $specString , $regs ) === false ) { + throw new Exception( "Unknown spec string" ); + } + + $orig = $regs[0]; + $name = $regs[1]; + $attributes = @$regs[2]; + $type = @$regs[3]; + + $short = null; + $long = null; + + // check long,short option name. + if( strpos($name,'|') !== false ) { + list($short,$long) = explode('|',$name); + } elseif( strlen($name) === 1 ) { + $short = $name; + } elseif( strlen($name) > 1 ) { + $long = $name; + } + + $this->short = $short; + $this->long = $long; + + // option is required. + if( strpos($attributes,':') !== false ) { + $this->setAttributeRequire(); + } + // option with multiple value + elseif( strpos($attributes,'+') !== false ) { + $this->setAttributeMultiple(); + } + // option is optional.(zero or one value) + elseif( strpos($attributes,'?') !== false ) { + $this->setAttributeOptional(); + } + + // option is multiple value and optional (zero or more) + elseif( strpos($attributes,'*') !== false ) { + throw new Exception('not implemented yet'); + } + // is a flag option + else { + $this->setAttributeFlag(); + } + + if( $type ) { + if( $type === 's' || $type === 'string' ) { + $this->setTypeString(); + } + elseif( $type === 'i' || $type === 'integer' ) { + $this->setTypeInteger(); + } + } + } + + + /* + * get the option key for result key mapping. + */ + function getId() + { + if( $this->key ) + return $this->key; + if( $this->long ) + return $this->long; + if( $this->short ) + return $this->short; + } + + function setAttributeRequire() + { + $this->attributes = self::attr_require; + } + + function setAttributeMultiple() + { + $this->attributes = self::attr_multiple; + $this->value = array(); # for value pushing + } + + function setAttributeOptional() + { + $this->attributes = self::attr_optional; + } + + function setAttributeFlag() + { + $this->attributes = self::attr_flag; + } + + + function isAttributeFlag() + { + return $this->attributes & self::attr_flag; + } + + function isAttributeMultiple() + { + return $this->attributes & self::attr_multiple; + } + + function isAttributeRequire() + { + return $this->attributes & self::attr_require; + } + + function isAttributeOptional() + { + return $this->attributes & self::attr_optional; + } + + + function setTypeString() + { + $this->type = self::type_string; + } + + function setTypeInteger() + { + $this->type = self::type_integer; + } + + function isTypeString() + { + return $this->type & self::type_string; + } + + function isTypeInteger() + { + return $this->type & self::type_integer; + } + + /* + * check value constraint type + * current for integer and string. + */ + function checkType($value) + { + if( $this->type !== null ) { + // check type constraints + if( $this->isTypeInteger() ) { + if( ! is_numeric($value) ) + throw new NonNumericException; + $value = (int) $value; + } + } + return $value; + } + + /* + * set option value + */ + function setValue($value) + { + $value = $this->checkType($value); + $this->value = $value; + } + + + /* + * push option value, when the option accept multiple values + */ + function pushValue($value) + { + $value = $this->checkType($value); + $this->value[] = $value; + } + + function setDescription($desc) + { + $this->description = $desc; + } + + function setValueName($name) + { + $this->valueName = $name; + } + + + /* + * set option spec key for saving option result + */ + function setKey($key) + { + $this->key = $key; + } + + /* + * get readable spec for printing + * + */ + function getReadableSpec() + { + $c1 = ''; + if( $this->short && $this->long ) + $c1 = sprintf('-%s, --%s',$this->short,$this->long); + elseif( $this->short ) + $c1 = sprintf('-%s',$this->short); + elseif( $this->long ) + $c1 = sprintf('--%s',$this->long ); + + $valueName = 'value'; + if( $this->valueName ) + $valueName = $this->valueName; + + if( $this->isAttributeRequire() ) { + $c1 .= " <$valueName>"; + } + elseif( $this->isAttributeMultiple() ) { + $c1 .= " <$valueName>+"; // better expression + } + elseif( $this->isAttributeOptional() ) { + $c1 .= " [<$valueName>]"; + } + elseif( $this->isAttributeFlag() ) { + + } + return $c1; + } + + function validate() + { + // validate current value + } + + function __toString() + { + $c1 = $this->getReadableSpec(); + $return = ''; + $return .= sprintf("* key:%-8s spec:%s desc:%s",$this->getId(), $c1,$this->description) . "\n"; + if( is_array($this->value) ) { + $return .= ' ' . print_r( $this->value, true ) . "\n"; + } else { + $return .= sprintf(" value => %s" , $this->value) . "\n"; + } + return $return; + } + +} + + diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpecCollection.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpecCollection.php new file mode 100644 index 0000000..9d7eeb2 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/OptionSpecCollection.php @@ -0,0 +1,197 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; +use GetOptionKit\OptionSpec; +use Iterator; + +class OptionSpecCollection + implements Iterator +{ + public $data = array(); + + public $longOptions = array(); + public $shortOptions = array(); + + function __construct() + { + $this->data = array(); + } + + function __clone() + { + foreach( $this->data as $k => $v ) { + $this->data[ $k ] = clone $v; + } + foreach( $this->longOptions as $k => $v ) { + $this->longOptions[ $k ] = clone $v; + } + foreach( $this->shortOptions as $k => $v ) { + $this->shortOptions[ $k ] = clone $v; + } + } + + function add() + { + $num = func_num_args(); + $args = func_get_args(); + $first = $args[0]; + + if( is_object($first) && is_a( $first , '\GetOptionKit\OptionSpec' ) ) { + $this->addSpec( $first ); + } + elseif( is_string( $first ) ) { + $specString = $args[0]; + $description = @$args[1]; + $key = @$args[2]; + + // parse spec string + $spec = new OptionSpec($specString); + if( $description ) + $spec->description = $description; + if( $key ) + $spec->key = $key; + $this->add( $spec ); + return $spec; + } + else { + throw new Exception( 'Unknown Spec Type' ); + } + } + + function addSpec( OptionSpec $spec ) + { + $this->data[ $spec->getId() ] = $spec; + if( $spec->long ) + $this->longOptions[ $spec->long ] = $spec; + if( $spec->short ) + $this->shortOptions[ $spec->short ] = $spec; + if( ! $spec->long && ! $spec->short ) + throw new Exception('Wrong option spec'); + } + + function getLongOption( $name ) + { + return @$this->longOptions[ $name ]; + } + + function getShortOption( $name ) + { + return @$this->shortOptions[ $name ]; + } + + /* get spec by spec id */ + function get($id) + { + return @$this->data[ $id ]; + } + + function getSpec($name) + { + if( isset($this->longOptions[ $name ] )) + return $this->longOptions[ $name ]; + if( isset($this->shortOptions[ $name ] )) + return $this->shortOptions[ $name ]; + } + + function size() + { + return count($this->data); + } + + function all() + { + return $this->data; + } + + function toArray() + { + $array = array(); + foreach($this->data as $k => $spec) { + $item = array(); + if( $spec->long ) + $item['long'] = $spec->long; + if( $spec->short ) + $item['short'] = $spec->short; + $item['description'] = $spec->description; + $array[] = $item; + } + return $array; + } + + /** + * render option descriptions + * + * @param integer $width column width + * @return string output + */ + function outputOptions($width = 24) + { + # echo "* Available options:\n"; + $lines = array(); + foreach( $this->all() as $spec ) + { + $c1 = $spec->getReadableSpec(); + if( strlen($c1) > $width ) + { + $line = sprintf("% {$width}s", $c1) . "\n" . $spec->description; + } + else + { + $line = sprintf("% {$width}s %s",$c1, $spec->description ); + } + $lines[] = $line; + } + return $lines; + } + + /** + * print options descriptions to stdout + */ + function printOptions($program = null) + { + if (empty($program)) + { + global $argv; + $program = "{$argv[0]}"; + } + echo str_repeat("=", 80)."\nUsage: {$program}\n".str_repeat("=", 80)."\n"; + $lines = $this->outputOptions(); + echo join( "\n" , $lines ); + echo "\n\n"; + } + + /* iterator methods */ + public function rewind() + { + return reset($this->data); + } + + public function current() + { + return current($this->data); + } + + public function key() + { + return key($this->data); + } + + public function next() + { + return next($this->data); + } + + public function valid() + { + return key($this->data) !== null; + } + +} diff --git a/src/agent/Lib/GetOptionKit/src/GetOptionKit/SplClassLoader.php b/src/agent/Lib/GetOptionKit/src/GetOptionKit/SplClassLoader.php new file mode 100644 index 0000000..10135e5 --- /dev/null +++ b/src/agent/Lib/GetOptionKit/src/GetOptionKit/SplClassLoader.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + */ +namespace GetOptionKit; + +/** + * SplClassLoader implementation that implements the technical interoperability + * standards for PHP 5.3 namespaces and class names. + * + * http://groups.google.com/group/php-standards/web/final-proposal + * + * // Example which loads classes for the Doctrine Common package in the + * // Doctrine\Common namespace. + * $classLoader = new SplClassLoader('Doctrine\Common', '/path/to/doctrine'); + * $classLoader->register(); + * + * @author Jonathan H. Wage + * @author Roman S. Borschel + * @author Matthew Weier O'Phinney + * @author Kris Wallsmith + * @author Fabien Potencier + */ +class SplClassLoader +{ + private $_fileExtension = '.php'; + private $_namespace; + private $_includePath; + private $_namespaceSeparator = '\\'; + + /** + * Creates a new SplClassLoader that loads classes of the + * specified namespace. + * + * @param string $ns The namespace to use. + */ + public function __construct($ns = null, $includePath = null) + { + $this->_namespace = $ns; + $this->_includePath = $includePath; + } + + + /** + * Sets the namespace separator used by classes in the namespace of this class loader. + * + * @param string $sep The separator to use. + */ + public function setNamespaceSeparator($sep) + { + $this->_namespaceSeparator = $sep; + } + + /** + * Gets the namespace seperator used by classes in the namespace of this class loader. + * + * @return void + */ + public function getNamespaceSeparator() + { + return $this->_namespaceSeparator; + } + + /** + * Sets the base include path for all class files in the namespace of this class loader. + * + * @param string $includePath + */ + public function setIncludePath($includePath) + { + $this->_includePath = $includePath; + } + + /** + * Gets the base include path for all class files in the namespace of this class loader. + * + * @return string $includePath + */ + public function getIncludePath() + { + return $this->_includePath; + } + + /** + * Sets the file extension of class files in the namespace of this class loader. + * + * @param string $fileExtension + */ + public function setFileExtension($fileExtension) + { + $this->_fileExtension = $fileExtension; + } + + /** + * Gets the file extension of class files in the namespace of this class loader. + * + * @return string $fileExtension + */ + public function getFileExtension() + { + return $this->_fileExtension; + } + + /** + * Installs this class loader on the SPL autoload stack. + */ + public function register() + { + spl_autoload_register(array($this, 'loadClass')); + } + + /** + * Uninstalls this class loader from the SPL autoloader stack. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $className The name of the class to load. + * @return void + */ + public function loadClass($className) + { + if (null === $this->_namespace || $this->_namespace.$this->_namespaceSeparator === substr($className, 0, strlen($this->_namespace.$this->_namespaceSeparator))) { + $fileName = ''; + $namespace = ''; + if (false !== ($lastNsPos = strripos($className, $this->_namespaceSeparator))) { + $namespace = substr($className, 0, $lastNsPos); + $className = substr($className, $lastNsPos + 1); + $fileName = str_replace($this->_namespaceSeparator, DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; + } + $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . $this->_fileExtension; + + $target = ($this->_includePath !== null ? $this->_includePath . DIRECTORY_SEPARATOR : '') . $fileName; + if( file_exists($target) ) + require $target; + } + } +} diff --git a/src/agent/Lib/Loader.php b/src/agent/Lib/Loader.php new file mode 100644 index 0000000..529781b --- /dev/null +++ b/src/agent/Lib/Loader.php @@ -0,0 +1,40 @@ + 1 and isset(self::$namespaces[$root[0]])) + { + include self::$namespaces[$root[0]].'/'.str_replace('\\', '/', $root[1]).'.php'; + } + } + + /** + * 设置根命名空间 + * @param $root + * @param $path + */ + static function addNameSpace($root, $path) + { + self::$namespaces[$root] = $path; + } +} \ No newline at end of file diff --git a/src/agent/Lib/Process.php b/src/agent/Lib/Process.php new file mode 100644 index 0000000..918e1bd --- /dev/null +++ b/src/agent/Lib/Process.php @@ -0,0 +1,178 @@ + [\swoole_table::TYPE_INT, 8], + "runid" => [\swoole_table::TYPE_INT, 8], + "status" => [\swoole_table::TYPE_INT, 1], + "start" => [\swoole_table::TYPE_FLOAT, 8], + "end" => [\swoole_table::TYPE_FLOAT, 8], + "code"=> [\swoole_table::TYPE_INT, 1], + "pipe"=> [\swoole_table::TYPE_INT, 8], + ]; + const PROCESS_START = 0;//程序开始运行 + const PROCESS_STOP = 1;//程序结束运行 + + public $task; + + private static $process_stdout = []; + + public static function init() + { + self::$table = new \swoole_table(ROBOT_MAX_PROCESS); + foreach (self::$column as $key => $v) { + self::$table->column($key, $v[0], $v[1]); + } + self::$table->create(); + } + + /** + * 注册信号 + */ + public static function signal() + { + \swoole_process::signal(SIGCHLD, function($sig) { + //必须为false,非阻塞模式 + while($ret = \swoole_process::wait(false)) { + $pid = $ret['pid']; + if (self::$table->exist($pid)){ + $task = self::$table->get($pid); + $task["status"] = self::PROCESS_STOP; + $task["end"] = microtime(true); + $task["code"] = $ret["code"]; + self::$table->set($pid,$task); + swoole_event_del($task["pipe"]); + + self::log($task["runid"],$task["taskId"],"进程运行完成,输出值",isset(self::$process_stdout[$pid])?self::$process_stdout[$pid]:""); + unset(self::$process_stdout[$pid]); + } + } + }); + } + + /** + * 通知中心任务执行结果 + * @return bool + */ + public static function notify() + { + if (count(self::$table) >0){ + $procs= []; + $client = new Client(); + foreach (self::$table as $pid=>$process){ + if ($process["status"] == self::PROCESS_STOP){ + $procs[$pid] = [ + "taskId"=>$process["taskId"], + "runid"=>$process["runid"], + "start"=>$process["start"], + "end"=>$process["end"], + "code"=>$process["code"], + ]; + } + } + if (empty($procs)) return true; + foreach ($procs as $pid=>$proc){ + self::log($proc["runid"],$proc["taskId"],"通知中心服",$proc); + } + $rect = $client->call("Agent::notify",$procs); + $ret = $rect->getResult(10); + unset($service); + if (empty($ret)){ + Flog::log("tasks通知中心服失败,code".$rect->code.",msg".$rect->msg); + return false; + } + foreach ($procs as $pid=>$v){ + self::$table->del($pid); + } + } + return true; + } + + /** + * 创建一个子进程 + * @param $task + * @return bool + */ + public static function create_process($task) + { + $cls = new self(); + $cls->task = $task; + $process = new \swoole_process(array($cls, "run"),true,true); + if (($pid = $process->start())) { + swoole_event_add($process->pipe, function($pipe) use ($process,$pid) { + if (!isset(self::$process_stdout[$pid])) self::$process_stdout[$pid]=""; + self::$process_stdout[$pid] .= $process->read(); + }); + self::log($task["runid"],$task["id"],"进程开始执行",$task); + self::$table->set($pid,["taskId"=>$task["id"],"runid"=>$task["runid"],"status"=>self::PROCESS_START,"start"=>microtime(true),"pipe"=>$process->pipe]); + return true; + } + return false; + } + + /** + * 子进程执行的入口 + * @param $worker + */ + public function run($worker) + { + $exec = $this->task["execute"]; + $worker->name($exec ."#". $this->task["id"]); + $exec = explode(" ",trim($exec)); + $execfile = array_shift($exec); + if (!self::changeUser($this->task["runuser"])){ + echo "修改运行时用户失败\n"; + exit(101); + } + $worker->exec($execfile,$exec); + } + + /** + * 修改运行时用户 + * @param $user + * @return bool + */ + static function changeUser($user) + { + if (!function_exists('posix_getpwnam')) + { + trigger_error(__METHOD__ . ": require posix extension."); + + return false; + } + $user = posix_getpwnam($user); + if ($user) + { + posix_setuid($user['uid']); + posix_setgid($user['gid']); + return true; + } + else + { + return false; + } + } + + + static function log($runid,$taskid,$explain,$msg="") + { + $log = [ + "taskid"=>$taskid, + "runid"=>$runid, + "explain"=>$explain, + "msg"=>is_scalar($msg) ? $msg : json_encode($msg), + "createtime"=>date("Y-m-d H:i:s"), + ]; + (new Client())->call("Termlog::addLogs",[$log])->getResult(); + } +} \ No newline at end of file diff --git a/src/agent/Lib/SOAClient.php b/src/agent/Lib/SOAClient.php new file mode 100644 index 0000000..48c0f57 --- /dev/null +++ b/src/agent/Lib/SOAClient.php @@ -0,0 +1,721 @@ +haveSwoole = extension_loaded('swoole'); + $this->haveSockets = extension_loaded('sockets'); + } + + /** + * 设置编码类型 + * @param $json + * @param $gzip + */ + function setEncodeType($json, $gzip) + { + if ($json) + { + $this->encode_json = true; + } + if ($gzip) + { + $this->encode_gzip = true; + } + } + + /** + * 获取SOA服务实例 + * @param $id + * @return SOA + */ + static function getInstance($id = null) + { + $key = empty($id) ? 'default' : $id; + if (empty(self::$_instances[$key])) + { + $object = new static($id); + } + else + { + $object = self::$_instances[$key]; + } + return $object; + } + + protected function beforeRequest($retObj) + { + + } + + protected function afterRequest($retObj) + { + + } + + /** + * 生成请求串号 + * @return int + */ + static function getRequestId() + { + $us = strstr(microtime(), ' ', true); + return intval(strval($us * 1000 * 1000) . rand(100, 999)); + } + + /** + * 连接到服务器 + * @param SOA_Result $retObj + * @return bool + * @throws \Exception + */ + protected function connectToServer(SOA_Result $retObj) + { + $ret = false; + //循环连接 + while (count($this->servers) > 0) + { + $svr = $this->getServer(); + $key = $svr['host'].':'.$svr['port'].'-'.$retObj->index; + $socket = new \swoole_client(SWOOLE_SOCK_TCP | SWOOLE_KEEP, SWOOLE_SOCK_SYNC, $key); + $socket->set(array( + 'open_length_check' => true, + 'package_max_length' => $this->packet_maxlen, + 'package_length_type' => 'N', + 'package_body_offset' => SOAServer::HEADER_SIZE, + 'package_length_offset' => 0, + )); + $ret = $socket->connect($svr['host'], $svr['port'], $this->timeout); + $socketFd = $socket->sock; + + + //连接被拒绝,证明服务器已经挂了 + //TODO 如果连接失败,需要上报机器存活状态 + if ($ret === false and $socket->errCode == 111) + { + $this->onConnectServerFailed($svr); + unset($socket); + } + else + { + $retObj->socket = $socket; + $retObj->server_host = $svr['host']; + $retObj->server_port = $svr['port']; + //使用SOCKET的编号作为ID + $retObj->id = $socketFd; + break; + } + } + return $ret; + } + + /** + * 发送请求 + * @param $send + * @param SOA_result $retObj + * @return bool + */ + protected function request($send, $retObj) + { + $retObj->send = $send; + $this->beforeRequest($retObj); + + $retObj->index = $this->requestIndex ++; + connect_to_server: + if ($this->connectToServer($retObj) === false) + { + $retObj->code = SOA_Result::ERR_CONNECT; + return false; + } + //请求串号 + $retObj->requestId = self::getRequestId(); + //打包格式 + $encodeType = $this->encode_gzip ? SOAServer::DECODE_JSON : SOAServer::DECODE_PHP; + if ($this->encode_gzip) + { + $encodeType |= SOAServer::DECODE_GZIP; + } + //发送失败了 + if ($retObj->socket->send(SOAServer::encode($retObj->send, $encodeType, 0, $retObj->requestId)) === false) + { + //连接被重置了,重现连接到服务器 + if ($this->haveSwoole and $retObj->socket->errCode == 104) + { + goto connect_to_server; + } + $retObj->code = SOA_Result::ERR_SEND; + unset($retObj->socket); + return false; + } + //加入wait_list + $this->waitList[$retObj->id] = $retObj; + return true; + } + + /** + * 设置环境变量 + * @return array + */ + public function getEnv() + { + return $this->env; + } + + /** + * 获取环境变量 + * @param array $env + */ + public function setEnv($env) + { + $this->env = $env; + } + + /** + * 设置一项环境变量 + * @param $k + * @param $v + */ + public function putEnv($k, $v) + { + $this->env[$k] = $v; + } + + /** + * 完成请求 + * @param $retData + * @param $retObj + */ + protected function finish($retData, $retObj) + { + //解包失败了 + if ($retData === false) + { + $retObj->code = SOA_Result::ERR_UNPACK; + } + //调用成功 + elseif ($retData['errno'] === self::OK) + { + $retObj->code = self::OK; + $retObj->data = $retData['data']; + } + //服务器返回失败 + else + { + $retObj->code = $retData['errno']; + $retObj->data = null; + } + unset($this->waitList[$retObj->id]); + //执行after钩子函数 + $this->afterRequest($retObj); + //执行回调函数 + if ($retObj->callback) + { + call_user_func($retObj->callback, $retObj); + } + } + + /** + * 添加服务器 + * @param array $servers + */ + function addServers(array $servers) + { + if (isset($servers['host'])) + { + $this->servers[] = $servers; + } + else + { + $this->servers = array_merge($this->servers, $servers); + } + } + + /** + * 设置服务器 + * @param array $servers + */ + function setServers(array $servers) + { + $this->servers = $servers; + } + + /** + * 从配置中取出一个服务器配置 + * @return array + * @throws \Exception + */ + function getServer() + { + if (empty($this->servers)) + { + throw new \Exception("servers config empty."); + } + //随机选择1个Server + $this->currentServerId = array_rand($this->servers); + $_svr = $this->servers[$this->currentServerId]; + $svr = array('host' => '', 'port' => 0); + list($svr['host'], $svr['port']) = explode(':', $_svr, 2); + return $svr; + } + + /** + * 连接服务器失败了 + * @param $svr + */ + function onConnectServerFailed($svr) + { + //从Server列表中移除 + unset($this->servers[$this->currentServerId]); + } + + /** + * RPC调用 + * + * @param $function + * @param $params + * @param $callback + * @return SOA_Result + */ + function task($function, $params = array(), $callback = null) + { + $retObj = new SOA_Result($this); + $send = array('call' => $function, 'params' => $params); + if (count($this->env) > 0) + { + //调用端环境变量 + $send['env'] = $this->env; + } + $this->request($send, $retObj); + $retObj->callback = $callback; + return $retObj; + } + + protected function recvWaitWithSockets($timeout) + { + $st = microtime(true); + $t_sec = (int)$timeout; + $t_usec = (int)(($timeout - $t_sec) * 1000 * 1000); + $buffer = $header = array(); + $success_num = 0; + + while (true) + { + $write = $error = $read = array(); + if(empty($this->waitList)) + { + break; + } + foreach($this->waitList as $obj) + { + if($obj->socket !== null) + { + $read[] = $obj->socket->getSocket(); + } + } + if (empty($read)) + { + break; + } + $n = socket_select($read, $write, $error, $t_sec, $t_usec); + if ($n > 0) + { + //可读 + foreach($read as $sock) + { + $id = (int)$sock; + + /** + * @var $retObj SOA_Result + */ + $retObj = $this->waitList[$id]; + $data = $retObj->socket->recv(); + //socket被关闭了 + if (empty($data)) + { + $retObj->code = SOA_Result::ERR_CLOSED; + unset($this->waitList[$id], $retObj->socket); + continue; + } + //一个新的请求,缓存区中没有数据 + if (!isset($buffer[$id])) + { + //这里仅使用了length和type,uid,serid未使用 + $header[$id] = unpack(SOAServer::HEADER_STRUCT, substr($data, 0, SOAServer::HEADER_SIZE)); + //错误的包头 + if ($header[$id] === false or $header[$id]['length'] <= 0) + { + $retObj->code = SOA_Result::ERR_HEADER; + unset($this->waitList[$id]); + continue; + } + //错误的长度值 + elseif ($header[$id]['length'] > $this->packet_maxlen) + { + $retObj->code = SOA_Result::ERR_TOOBIG; + unset($this->waitList[$id]); + continue; + } + $buffer[$id] = substr($data, SOAServer::HEADER_SIZE); + } + else + { + $buffer[$id] .= $data; + } + //达到规定的长度 + if (strlen($buffer[$id]) == $header[$id]['length']) + { + //请求串号与响应串号不一致 + if ($retObj->requestId != $header[$id]['serid']) + { + trigger_error(__CLASS__." requestId[{$retObj->requestId}]!=responseId[{$header['serid']}]", E_USER_WARNING); + continue; + } + //成功处理 + $this->finish(SOAServer::decode($buffer[$id], $header[$id]['type']), $retObj); + $success_num++; + } + //继续等待数据 + } + } + //发生超时 + if ((microtime(true) - $st) > $timeout) + { + foreach($this->waitList as $obj) + { + //TODO 如果请求超时了,需要上报服务器负载 + $obj->code = ($obj->socket->connected) ? SOA_Result::ERR_TIMEOUT : SOA_Result::ERR_CONNECT; + //执行after钩子函数 + $this->afterRequest($obj); + } + //清空当前列表 + $this->waitList = array(); + return $success_num; + } + } + //未发生任何超时 + $this->waitList = array(); + $this->requestIndex = 0; + return $success_num; + } + + /** + * 使用Swoole扩展 + * @param $timeout + * @return int + */ + protected function recvWaitWithSwoole($timeout) + { + $st = microtime(true); + $success_num = 0; + + while (true) + { + $write = $error = $read = array(); + if (empty($this->waitList)) + { + break; + } + foreach ($this->waitList as $obj) + { + if ($obj->socket !== null) + { + $read[] = $obj->socket; + } + } + if (empty($read)) + { + break; + } + + $n = swoole_client_select($read, $write, $error, $timeout); + if ($n > 0) + { + //可读 + foreach($read as $sock) + { + $id = $sock->sock; + + /** + * @var $retObj SOA_Result + */ + $retObj = $this->waitList[$id]; + $data = $retObj->socket->recv(); + //socket被关闭了 + if (empty($data)) + { + $retObj->code = SOA_Result::ERR_CLOSED; + unset($this->waitList[$id], $retObj->socket); + continue; + } + else + { + $header = unpack(SOAServer::HEADER_STRUCT, substr($data, 0, SOAServer::HEADER_SIZE)); + //串号不一致,丢弃结果 + if ($header['serid'] != $retObj->requestId) + { + trigger_error(__CLASS__." requestId[{$retObj->requestId}]!=responseId[{$header['serid']}]", E_USER_WARNING); + continue; + } + //成功处理 + $this->finish(SOAServer::decode(substr($data, SOAServer::HEADER_SIZE), $header['type']), $retObj); + $success_num++; + } + } + } + //发生超时 + if ((microtime(true) - $st) > $timeout) + { + foreach ($this->waitList as $obj) + { + $obj->code = ($obj->socket->isConnected()) ? SOA_Result::ERR_TIMEOUT : SOA_Result::ERR_CONNECT; + //执行after钩子函数 + $this->afterRequest($obj); + } + //清空当前列表 + $this->waitList = array(); + return $success_num; + } + } + + //未发生任何超时 + $this->waitList = array(); + $this->requestIndex = 0; + return $success_num; + } + + /** + * 并发请求 + * @param float $timeout + * @return int + */ + function wait($timeout = 0.5) + { + if ($this->haveSwoole) + { + return $this->recvWaitWithSwoole($timeout); + } + elseif ($this->haveSockets) + { + return $this->recvWaitWithSockets($timeout); + } + + $st = microtime(true); + $t_sec = (int)$timeout; + $t_usec = (int)(($timeout - $t_sec) * 1000 * 1000); + $buffer = $header = array(); + $success_num = 0; + + while (true) + { + $write = $error = $read = array(); + if(empty($this->waitList)) + { + break; + } + foreach($this->waitList as $obj) + { + if($obj->socket !== null) + { + $read[] = $obj->socket->getSocket(); + } + } + if (empty($read)) + { + break; + } + + $n = stream_select($read, $write, $error, $t_sec, $t_usec); + if ($n > 0) + { + //可读 + foreach($read as $sock) + { + $id = (int)$sock; + + /** + * @var $retObj SOA_Result + */ + $retObj = $this->waitList[$id]; + $data = $retObj->socket->recv(); + //socket被关闭了 + if (empty($data)) + { + $retObj->code = SOA_Result::ERR_CLOSED; + unset($this->waitList[$id], $retObj->socket); + continue; + } + //一个新的请求,缓存区中没有数据 + if (!isset($buffer[$id])) + { + //这里仅使用了length和type,uid,serid未使用 + $header[$id] = unpack(SOAServer::HEADER_STRUCT, substr($data, 0, SOAServer::HEADER_SIZE)); + //错误的包头 + if ($header[$id] === false or $header[$id]['length'] <= 0) + { + $retObj->code = SOA_Result::ERR_HEADER; + unset($this->waitList[$id]); + continue; + } + //错误的长度值 + elseif ($header[$id]['length'] > $this->packet_maxlen) + { + $retObj->code = SOA_Result::ERR_TOOBIG; + unset($this->waitList[$id]); + continue; + } + $buffer[$id] = substr($data, SOAServer::HEADER_SIZE); + } + else + { + $buffer[$id] .= $data; + } + //达到规定的长度 + if (strlen($buffer[$id]) == $header[$id]['length']) + { + //请求串号与响应串号不一致 + if ($retObj->requestId != $header[$id]['serid']) + { + trigger_error(__CLASS__." requestId[{$retObj->requestId}]!=responseId[{$header['serid']}]", E_USER_WARNING); + continue; + } + //成功处理 + $this->finish(SOAServer::decode($buffer[$id], $header[$id]['type']), $retObj); + $success_num++; + } + //继续等待数据 + } + } + //发生超时 + if ((microtime(true) - $st) > $timeout) + { + foreach($this->waitList as $obj) + { + //TODO 如果请求超时了,需要上报服务器负载 + $obj->code = ($obj->socket->connected) ? SOA_Result::ERR_TIMEOUT : SOA_Result::ERR_CONNECT; + //执行after钩子函数 + $this->afterRequest($obj); + } + //清空当前列表 + $this->waitList = array(); + return $success_num; + } + } + //未发生任何超时 + $this->waitList = array(); + $this->requestIndex = 0; + return $success_num; + } + +} + +/** + * SOA服务请求结果对象 + * Class SOA_Result + * @package Swoole\Client + */ +class SOA_Result +{ + public $id; + public $code = self::ERR_NO_READY; + public $msg; + public $data = null; + public $send; //要发送的数据 + public $type; + public $index; + + /** + * 请求串号 + */ + public $requestId; + + /** + * 回调函数 + * @var mixed + */ + public $callback; + + /** + * @var \Swoole\Client\TCP + */ + public $socket = null; + + /** + * SOA服务器的IP地址 + * @var string + */ + public $server_host; + + /** + * SOA服务器的端口 + * @var int + */ + public $server_port; + + /** + * @var SOA + */ + protected $soa_client; + + const ERR_NO_READY = 8001; //未就绪 + const ERR_CONNECT = 8002; //连接服务器失败 + const ERR_TIMEOUT = 8003; //服务器端超时 + const ERR_SEND = 8004; //发送失败 + const ERR_SERVER = 8005; //server返回了错误码 + const ERR_UNPACK = 8006; //解包失败了 + + const ERR_HEADER = 8007; //错误的协议头 + const ERR_TOOBIG = 8008; //超过最大允许的长度 + const ERR_CLOSED = 8009; //连接被关闭 + + function __construct($soa_client) + { + $this->soa_client = $soa_client; + } + + function getResult($timeout = 0.5) + { + if ($this->code == self::ERR_NO_READY) + { + $this->soa_client->wait($timeout); + } + return $this->data; + } +} diff --git a/src/agent/Lib/SOAServer.php b/src/agent/Lib/SOAServer.php new file mode 100644 index 0000000..e7be938 --- /dev/null +++ b/src/agent/Lib/SOAServer.php @@ -0,0 +1,347 @@ +log = $log; + } + + function run($array) + { + //\Swoole\Error::$echo_html = true; + $this->server->run($array); + } + + function daemonize() + { + $this->server->daemonize(); + } + + /** + * 打印Log信息 + * @param $msg + * @param string $type + */ + function log($msg) + { + $this->log->info($msg); + } + + function task($task, $dstWorkerId = -1, $callback = null) + { + $this->server->task($task, $dstWorkerId = -1, $callback); + } + + function onStart($server) + { + + } + + function onConnect($server, $client_id, $from_id) + { + + } + + + function onWorkerStop($serv, $worker_id) + { + $this->log("Worker[$worker_id] is stop"); + } + + function onShutdown($server) + { + $this->log("Worker is stop"); + FLog::flush(); + } + + function onTimer($serv, $interval) + { + $this->log("Timer[$interval] call"); + } + + function onReceive($serv, $fd, $from_id, $data) + { + if (!isset($this->_buffer[$fd]) or $this->_buffer[$fd] === '') + { + //超过buffer区的最大长度了 + if (count($this->_buffer) >= $this->buffer_maxlen) + { + $n = 0; + foreach ($this->_buffer as $k => $v) + { + $this->close($k); + $n++; + //清理完毕 + if ($n >= $this->buffer_clear_num) + { + break; + } + } + $this->log("clear $n buffer"); + } + //解析包头 + $header = unpack(self::HEADER_STRUCT, substr($data, 0, self::HEADER_SIZE)); + //错误的包头 + if ($header === false) + { + $this->close($fd); + } + $header['fd'] = $fd; + $this->_headers[$fd] = $header; + //长度错误 + if ($header['length'] - self::HEADER_SIZE > $this->packet_maxlen or strlen($data) > $this->packet_maxlen) + { + return $this->sendErrorMessage($fd, self::ERR_TOOBIG); + } + //加入缓存区 + $this->_buffer[$fd] = substr($data, self::HEADER_SIZE); + } + else + { + $this->_buffer[$fd] .= $data; + } + + //长度不足 + if (strlen($this->_buffer[$fd]) < $this->_headers[$fd]['length']) + { + return true; + } + + //数据解包 + $request = self::decode($this->_buffer[$fd], $this->_headers[$fd]['type']); + if ($request === false) + { + $this->sendErrorMessage($fd, self::ERR_UNPACK); + } + //执行远程调用 + else + { + //当前请求的头 + self::$requestHeader = $_header = $this->_headers[$fd]; + //调用端环境变量 + if (!empty($request['env'])) + { + self::$clientEnv = $request['env']; + } + //socket信息 + self::$clientEnv['_socket'] = $this->server->connection_info($header['fd']); + $response = $this->call($request, $_header); + //发送响应 + $ret = $this->server->send($fd, self::encode($response, $_header['type'], $_header['uid'], $_header['serid'])); + if ($ret === false) + { + trigger_error("SendToClient failed. params=".var_export($request, true)."\nheaders=".var_export($_header, true), E_USER_WARNING); + } + //退出进程 + if (self::$stop) + { + exit(0); + } + } + //清理缓存 + unset($this->_buffer[$fd], $this->_headers[$fd]); + return true; + } + + /** + * 获取客户端环境信息 + * @return array + */ + static function getClientEnv() + { + return self::$clientEnv; + } + + /** + * 获取请求头信息,包括UID、Serid串号等 + * @return array + */ + static function getRequestHeader() + { + return self::$requestHeader; + } + + function sendErrorMessage($fd, $errno) + { + return $this->server->send($fd, self::encode(array('errno' => $errno), $this->_headers[$fd]['type'])); + } + + /** + * 打包数据 + * @param $data + * @param $type + * @param $uid + * @param $serid + * @return string + */ + static function encode($data, $type = self::DECODE_PHP, $uid = 0, $serid = 0) + { + //启用压缩 + if ($type & self::DECODE_GZIP) + { + $_type = $type & ~self::DECODE_GZIP; + $gzip_compress = true; + } + else + { + $gzip_compress = false; + $_type = $type; + } + switch($_type) + { + case self::DECODE_JSON: + $body = json_encode($data); + break; + case self::DECODE_PHP: + default: + $body = serialize($data); + break; + } + if ($gzip_compress) + { + $body = gzencode($body); + } + return pack(SOAServer::HEADER_PACK, strlen($body), $type, $uid, $serid) . $body; + } + + /** + * 解包数据 + * @param string $data + * @param int $unseralize_type + * @return string + */ + static function decode($data, $unseralize_type = self::DECODE_PHP) + { + if ($unseralize_type & self::DECODE_GZIP) + { + $unseralize_type &= ~self::DECODE_GZIP; + $data = gzdecode($data); + } + switch ($unseralize_type) + { + case self::DECODE_JSON: + return json_decode($data, true); + case self::DECODE_PHP; + default: + return unserialize($data); + } + } + + /** + * @param $serv + * @param int $fd + * @param $from_id + */ + function onClose($serv, $fd, $from_id) + { + unset($this->_buffer[$fd]); + } + + /** + * 增加命名空间 + * @param $name + * @param $path + * + * @throws \Exception + */ + function addNameSpace($name, $path) + { + if (!is_dir($path)) + { + throw new \Exception("$path is not real path."); + } + Loader::addNameSpace($name, $path); + } + + /** + * 调用远程函数 + * @param $request + * @return array + */ + protected function call($request, $header) + { + if (empty($request['call'])) + { + return array('errno' => self::ERR_PARAMS); + } + //函数不存在 + if (!is_callable($request['call'])) + { + return array('errno' => self::ERR_NOFUNC); + } + $ret = call_user_func_array($request['call'], $request['params']); + if ($ret === false) + { + return array('errno' => self::ERR_CALL); + } + return array('errno' => 0, 'data' => $ret); + } + + /** + * 关闭连接 + * @param $fd + */ + protected function close($fd) + { + $this->server->close($fd); + unset($this->_buffer[$fd], $this->_headers[$fd]); + } +} \ No newline at end of file diff --git a/src/agent/Lib/Server.php b/src/agent/Lib/Server.php new file mode 100755 index 0000000..5b951b9 --- /dev/null +++ b/src/agent/Lib/Server.php @@ -0,0 +1,374 @@ + '启用守护进程模式', + 'h|host?' => '指定监听地址', + 'p|port?' => '指定监听端口', + 'help' => '显示帮助界面', + 'b|base' => '使用BASE模式启动', + 'w|worker?' => '设置Worker进程的数量', + 'r|thread?' => '设置Reactor线程的数量', + 't|tasker?' => '设置Task进程的数量', + ); + + /** + * @var \swoole_server + */ + protected $sw; + protected $pid_file; + + /** + * 设置PID文件 + * @param $pidFile + */ + static function setPidFile($pidFile) + { + self::$pidFile = $pidFile; + } + + /** + * 杀死所有进程 + * @param $name + * @param int $signo + * @return string + */ + static function killProcessByName($name, $signo = 9) + { + $cmd = 'ps -eaf |grep "' . $name . '" | grep -v "grep"| awk "{print $2}"|xargs kill -'.$signo; + return exec($cmd); + } + + /** + * + * $opt->add( 'f|foo:' , 'option requires a value.' ); + * $opt->add( 'b|bar+' , 'option with multiple value.' ); + * $opt->add( 'z|zoo?' , 'option with optional value.' ); + * $opt->add( 'v|verbose' , 'verbose message.' ); + * $opt->add( 'd|debug' , 'debug message.' ); + * $opt->add( 'long' , 'long option name only.' ); + * $opt->add( 's' , 'short option name only.' ); + * + * @param $specString + * @param $description + * @throws ServerOptionException + */ + static function addOption($specString, $description) + { + if (!self::$optionKit) + { + Loader::addNameSpace('GetOptionKit', WEBPATH."/Lib/GetOptionKit/src/GetOptionKit"); + self::$optionKit = new \GetOptionKit\GetOptionKit; + } + foreach (self::$defaultOptions as $k => $v) + { + if ($k[0] == $specString[0]) + { + throw new ServerOptionException("不能添加系统保留的选项名称"); + } + } + //解决Windows平台乱码问题 + if (PHP_OS == 'WINNT') + { + $description = iconv('utf-8', 'gbk', $description); + } + self::$optionKit->add($specString, $description); + } + + /** + * @param callable $function + */ + static function beforeStop(callable $function) + { + self::$beforeStopCallback = $function; + } + + /** + * @param callable $function + */ + static function beforeReload(callable $function) + { + self::$beforeReloadCallback = $function; + } + + /** + * 显示命令行指令 + */ + static function start($startFunction) + { + if (empty(self::$pidFile)) + { + throw new \Exception("require pidFile."); + } + $pid_file = self::$pidFile; + if (is_file($pid_file)) + { + $server_pid = file_get_contents($pid_file); + } + else + { + $server_pid = 0; + } + + if (!self::$optionKit) + { + Loader::addNameSpace('GetOptionKit', WEBPATH."/Lib/GetOptionKit/src/GetOptionKit"); + self::$optionKit = new \GetOptionKit\GetOptionKit; + } + + $kit = self::$optionKit; + foreach(self::$defaultOptions as $k => $v) + { + //解决Windows平台乱码问题 + if (PHP_OS == 'WINNT') + { + $v = iconv('utf-8', 'gbk', $v); + } + $kit->add($k, $v); + } + global $argv; + $opt = $kit->parse($argv); + if (empty($argv[1]) or isset($opt['help'])) + { + goto usage; + } + elseif ($argv[1] == 'reload') + { + if (empty($server_pid)) + { + exit("Server is not running"); + } + if (self::$beforeReloadCallback) + { + call_user_func(self::$beforeReloadCallback, $opt); + } + posix_kill($server_pid, SIGUSR1); + exit; + } + elseif ($argv[1] == 'stop') + { + if (empty($server_pid)) + { + exit("Server is not running\n"); + } + if (self::$beforeStopCallback) + { + call_user_func(self::$beforeStopCallback, $opt); + } + posix_kill($server_pid, SIGTERM); + exit; + } + elseif ($argv[1] == 'start') + { + //已存在ServerPID,并且进程存在 + if (!empty($server_pid) and posix_kill($server_pid, 0)) + { + exit("Server is already running.\n"); + } + } + else + { + usage: + $kit->specs->printOptions("php {$argv[0]} start|stop|reload"); + exit; + } + self::$options = $opt; + $startFunction($opt); + } + + /** + * 自动推断扩展支持 + * 默认使用swoole扩展,其次是libevent,最后是select(支持windows) + * @param $host + * @param $port + * @param bool $ssl + * @return Server + */ + static function autoCreate($host, $port, $ssl = false) + { + + return new self($host, $port, $ssl); + } + + function __construct($host, $port, $ssl = false) + { + $flag = $ssl ? (SWOOLE_SOCK_TCP | SWOOLE_SSL) : SWOOLE_SOCK_TCP; + if (!empty(self::$options['base'])) + { + self::$swooleMode = SWOOLE_BASE; + } + elseif (extension_loaded('swoole')) + { + self::$swooleMode = SWOOLE_PROCESS; + } + + $this->sw = new \swoole_server($host, $port, self::$swooleMode, $flag); + $this->host = $host; + $this->port = $port; + $this->runtimeSetting = array( + //'reactor_num' => 4, //reactor thread num + //'worker_num' => 4, //worker process num + 'backlog' => 128, //listen backlog + //'open_cpu_affinity' => 1, + //'open_tcp_nodelay' => 1, + //'log_file' => '/tmp/swoole.log', + ); + } + + function daemonize() + { + $this->runtimeSetting['daemonize'] = 1; + } + + function connection_info($fd) + { + return $this->sw->connection_info($fd); + } + + function onMasterStart($serv) + { + swoole_set_process_name($this->getProcessName() . ': master -host=' . $this->host . ' -port=' . $this->port); + if (!empty($this->runtimeSetting['pid_file'])) + { + file_put_contents(self::$pidFile, $serv->master_pid); + } + if (method_exists($this->protocol, 'onMasterStart')) + { + $this->protocol->onMasterStart($serv); + } + } + + function onMasterStop($serv) + { + if (!empty($this->runtimeSetting['pid_file'])) + { + unlink(self::$pidFile); + } + if (method_exists($this->protocol, 'onMasterStop')) + { + $this->protocol->onMasterStop($serv); + } + } + + function onManagerStop() + { + + } + + function onWorkerStart($serv, $worker_id) + { + if ($worker_id >= $serv->setting['worker_num']) + { + swoole_set_process_name($this->getProcessName() . ': task'); + } + else + { + swoole_set_process_name($this->getProcessName() . ': worker'); + } + if (method_exists($this->protocol, 'onStart')) + { + $this->protocol->onStart($serv, $worker_id); + } + if (method_exists($this->protocol, 'onWorkerStart')) + { + $this->protocol->onWorkerStart($serv, $worker_id); + } + } + + function run($setting = array()) + { + $this->runtimeSetting = array_merge($this->runtimeSetting, $setting); + if (self::$pidFile) + { + $this->runtimeSetting['pid_file'] = self::$pidFile; + } + if (!empty(self::$options['daemon'])) + { + $this->runtimeSetting['daemonize'] = true; + } + if (!empty(self::$options['worker'])) + { + $this->runtimeSetting['worker_num'] = intval(self::$options['worker']); + } + if (!empty(self::$options['thread'])) + { + $this->runtimeSetting['reator_num'] = intval(self::$options['thread']); + } + if (!empty(self::$options['tasker'])) + { + $this->runtimeSetting['task_worker_num'] = intval(self::$options['tasker']); + } + $this->sw->set($this->runtimeSetting); + $version = explode('.', SWOOLE_VERSION); + //1.7.0 + if ($version[1] >= 7) + { + $this->sw->on('ManagerStart', function ($serv) + { + swoole_set_process_name($this->getProcessName() . ': manager'); + }); + } + + $this->sw->on('Start', array($this, 'onMasterStart')); + $this->sw->on('Shutdown', array($this, 'onMasterStop')); + $this->sw->on('ManagerStop', array($this, 'onManagerStop')); + $this->sw->on('WorkerStart', array($this, 'onWorkerStart')); + $this->sw->on('Connect', array($this->protocol, 'onConnect')); + $this->sw->on('Receive', array($this->protocol, 'onReceive')); + $this->sw->on('Close', array($this->protocol, 'onClose')); + $this->sw->on('WorkerStop', array($this->protocol, 'onShutdown')); + + //swoole-1.8已经移除了onTimer回调函数 + if ($version[1] < 8) + { + if (is_callable(array($this->protocol, 'onTimer'))) + { + $this->sw->on('Timer', array($this->protocol, 'onTimer')); + } + } + + if (is_callable(array($this->protocol, 'onTask'))) + { + $this->sw->on('Task', array($this->protocol, 'onTask')); + $this->sw->on('Finish', array($this->protocol, 'onFinish')); + } + $this->sw->start(); + } + + function shutdown() + { + return $this->sw->shutdown(); + } + + function close($client_id) + { + return $this->sw->close($client_id); + } + + function send($client_id, $data) + { + return $this->sw->send($client_id, $data); + } + + function __call($func, $params) + { + return call_user_func_array(array($this->sw, $func), $params); + } +} + +class ServerOptionException extends \Exception +{ + +} \ No newline at end of file diff --git a/src/agent/Lib/ServerBase.php b/src/agent/Lib/ServerBase.php new file mode 100644 index 0000000..7168f46 --- /dev/null +++ b/src/agent/Lib/ServerBase.php @@ -0,0 +1,359 @@ +host = $host; + $this->port = $port; + $this->timeout = $timeout; + } + + function addListener($host, $port, $type) + { + + } + + /** + * 设置进程名称 + * @param $name + */ + function setProcessName($name) + { + $this->processName = $name; + } + + /** + * 获取进程名称 + * @return string + */ + function getProcessName() + { + if (empty($this->processName)) + { + global $argv; + return "php {$argv[0]}"; + } + else + { + return $this->processName; + } + } + + /** + * 设置通信协议 + * @param $protocol + * @throws \Exception + */ + function setProtocol($protocol) + { + $this->protocol = $protocol; + $protocol->server = $this; + } + + /** + * 设置选项 + * @param $key + * @param $value + */ + static function setOption($key, $value) + { + self::$options[$key] = $value; + } + + function connection_info($fd) + { + $peername = stream_socket_get_name($this->fds[$fd], true); + list($ip, $port) = explode(':', $peername); + return array('remote_port' => $port, 'remote_ip' => $ip); + } + + /** + * 接受连接 + * @return bool|int + */ + function accept() + { + $client_socket = stream_socket_accept($this->server_sock, 0); + //惊群 + if ($client_socket === false) + { + return false; + } + $client_socket_id = (int)$client_socket; + stream_set_blocking($client_socket, $this->client_block); + $this->client_sock[$client_socket_id] = $client_socket; + $this->client_num++; + if ($this->client_num > $this->max_connect) + { + fclose($client_socket); + return false; + } + else + { + //设置写缓冲区 + stream_set_write_buffer($client_socket, $this->write_buffer_size); + return $client_socket_id; + } + } + + function spawn($setting) + { + $num = 0; + if (isset($setting['worker_num'])) + { + $num = (int)$setting['worker_num']; + } + if ($num < 2) + { + return null; + } + if (!extension_loaded('pcntl')) + { + die(__METHOD__ . " require pcntl extension!"); + } + $pids = array(); + for ($i = 0; $i < $num; $i++) + { + $pid = pcntl_fork(); + if ($pid > 0) + { + $pids[] = $pid; + } + else + { + break; + } + } + return $pids; + } + + function startWorker() + { + + } + + abstract function run($setting); + + /** + * 发送数据到客户端 + * @param $client_id + * @param $data + * @return bool + */ + abstract function send($client_id, $data); + + /** + * 关闭连接 + * @param $client_id + * @return mixed + */ + abstract function close($client_id); + + abstract function shutdown(); + + function daemonize() + { + if (!function_exists('pcntl_fork')) + { + throw new \Exception(__METHOD__ . ": require pcntl_fork."); + } + $pid = pcntl_fork(); + if ($pid == -1) + { + die("fork(1) failed!\n"); + } + elseif ($pid > 0) + { + //让由用户启动的进程退出 + exit(0); + } + + //建立一个有别于终端的新session以脱离终端 + posix_setsid(); + + $pid = pcntl_fork(); + if ($pid == -1) + { + die("fork(2) failed!\n"); + } + elseif ($pid > 0) + { + //父进程退出, 剩下子进程成为最终的独立进程 + exit(0); + } + } + + function onError($errno, $errstr) + { + exit("$errstr ($errno)"); + } + + /** + * 创建一个Stream Server Socket + * @param $uri + * @param int $block + * @return resource + */ + function create($uri, $block = 0) + { + //UDP + if ($uri{0} == 'u') + { + $socket = stream_socket_server($uri, $errno, $errstr, STREAM_SERVER_BIND); + } + //TCP + else + { + $socket = stream_socket_server($uri, $errno, $errstr); + } + + if (!$socket) + { + $this->onError($errno, $errstr); + } + //设置socket为非堵塞或者阻塞 + stream_set_blocking($socket, $block); + return $socket; + } + + function create_socket($uri, $block = false) + { + $set = parse_url($uri); + if ($uri{0} == 'u') + { + $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + } + else + { + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + } + + if ($block) + { + socket_set_block($sock); + } + else + { + socket_set_nonblock($sock); + } + socket_bind($sock, $set['host'], $set['port']); + socket_listen($sock); + return $sock; + } + + function sendData($fp, $string) + { + $length = strlen($string); + for($written = 0; $written < $length; $written += $fwrite) + { + $fwrite = fwrite($fp, substr($string, $written)); + if($fwrite<=0 or $fwrite===false) return $written; + } + return $written; + } + + function log($log) + { + echo $log, NL; + } +} + +function sw_run($cmd) +{ + if (PHP_OS == 'WINNT') + { + pclose(popen("start /B " . $cmd, "r")); + } + else + { + exec($cmd . " > /dev/null &"); + } +} + +function sw_gc_array($array) +{ + $new = array(); + foreach ($array as $k => $v) + { + $new[$k] = $v; + unset($array[$k]); + } + unset($array); + return $new; +} + +interface TCP_Server_Driver +{ + function run($num = 1); + + function send($client_id, $data); + + function close($client_id); + + function shutdown(); + + function setProtocol($protocol); +} + +interface UDP_Server_Driver +{ + function run($num = 1); + + function shutdown(); + + function setProtocol($protocol); +} + +interface TCP_Server_Protocol +{ + function onStart(); + + function onConnect($client_id); + + function onReceive($client_id, $data); + + function onClose($client_id); + + function onShutdown($server); +} + +interface UDP_Server_Protocol +{ + function onStart(); + + function onData($peer, $data); + + function onShutdown(); +} diff --git a/src/Lib/Util.php b/src/agent/Lib/Util.php similarity index 75% rename from src/Lib/Util.php rename to src/agent/Lib/Util.php index bebad01..bb173f3 100644 --- a/src/Lib/Util.php +++ b/src/agent/Lib/Util.php @@ -40,4 +40,16 @@ static function listenHost() } return $listenHost; } + + + public static function errCodeMsg($code = 0, $message = '', $data = array()) + { + $res = array( + 'code' => $code, + 'msg' => $message ? $message : ($code ? 'fail' : 'success'), + 'data' => $data + ); + + return $res; + } } \ No newline at end of file diff --git a/src/agent/_init.php b/src/agent/_init.php new file mode 100644 index 0000000..188c4b3 --- /dev/null +++ b/src/agent/_init.php @@ -0,0 +1,45 @@ + getRunPath() . '/logs/agent'.PORT.'.log']); + $AppSvr = new Lib\AgentServer; + $AppSvr->setLogger($logger); + + $setting = array( + 'worker_num' => WORKER_NUM, + 'task_worker_num'=>TASK_NUM, + 'max_request' => 1000, + 'dispatch_mode' => 3, + 'log_file' => getRunPath() . '/logs/swoole.log', + 'open_length_check' => 1, + 'package_max_length' => $AppSvr->packet_maxlen, + 'package_length_type' => 'N', + 'package_body_offset' => Lib\SOAServer::HEADER_SIZE, + 'package_length_offset' => 0, + ); + //重定向PHP错误日志到logs目录 + ini_set('error_log', getRunPath() . '/logs/php_errors.log'); + + $listenHost = Lib\Util::listenHost(); + + Lib\Process::init();//载入任务处理表 + + $server = Lib\Server::autoCreate($listenHost, PORT); + $server->setProtocol($AppSvr); + $server->setProcessName("AgentServer"); + $server->run($setting); +}); diff --git a/src/center/App/Agent.php b/src/center/App/Agent.php new file mode 100644 index 0000000..01bce6e --- /dev/null +++ b/src/center/App/Agent.php @@ -0,0 +1,268 @@ +set($task["taskId"],["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); + if ( Lib\Tasks::$table->exist($task["runid"])) Lib\Tasks::$table->set($task["runid"],["runStatus"=>$runStatus]); + Lib\TermLog::log($task["runid"],$task["taskId"],"任务已经执行完成",$task); + } + return Lib\Util::errCodeMsg(0,"ok"); + } + + /** + * 获取在线worker + * @param int $page + * @param int $size + * @return array + */ + public static function getRobots($page=1,$size=10) + { + $start = ($page-1)*$size; + $end = $start+$size; + $data = []; + $list = Lib\Robot::$table; + $n=0; + foreach ($list as $id=>$rb) + { + $n++; + if ($n <= $start) continue; + if ($n > $end) break; + $data[$id] = $rb; + } + return ["total"=>count($list),"rows"=>$data]; + } + + /** + * 获取任务列表 + * @return array + */ + public static function getAgents($gets=[],$page=1,$pagesize=10) + { + //页数 + if (!empty($pagesize)) + { + $gets['pagesize'] = intval($pagesize); + } + else + { + $gets['pagesize'] = 20; + } + $agg = table("agent_group"); + if (isset($gets["gid"])){ + $glist =$agg->gets(["gid"=>$gets["gid"]]); + if (!empty($glist)){ + foreach ($glist as $g){ + $tmp[] = $g["aid"]; + } + $gets["in"] = ["id",$tmp]; + } + unset($gets["gid"]); + } + $gets['page'] = !empty($page) ? $page : 1; + $pager=""; + $list = table("agents")->gets($gets, $pager); + + $groups = Tasks::getGroups(); + foreach ($list as $k=>$task) + { + $gids = $agg->gets(["aid"=>$task["id"]]); + $tmp = Lib\Robot::$table->get($task["ip"].":".$task["port"]); + if (!empty($tmp)){ + $list[$k]["lasttime"] = $tmp["lasttime"]; + $list[$k]["isregister"] = 1; + }else{ + $list[$k]["isregister"] = 0; + } + $list[$k]["gname"] = "全部"; + if (!empty($gids)){ + $gname =""; + foreach ($gids as $gid){ + if ($gid == "-1") { + $gname[] = "全部"; + }else{ + $gname[]= isset($groups[$gid["gid"]])?$groups[$gid["gid"]]:"未知"; + } + } + $list[$k]["gname"] = $gname; + } + } + return ["total"=>$pager->total,"rows"=>$list]; + } + + /** + * 获取单个任务 + * @param $id + * @return array + */ + public static function getAgent($id) + { + $agent = table("agents")->get($id); + if (!$agent->exist()){ + return Lib\Util::errCodeMsg(101,"不存在"); + } + $gids = table("agent_group")->gets(["aid"=>$id]); + $data = [ + "id"=>$agent["id"], + "alias"=>$agent["alias"], + "ip"=>$agent["ip"], + "port"=>$agent["port"], + "status"=>$agent["status"], + "gids"=>["-1"], + ]; + if (!empty($gids)){ + foreach ($gids as $gid){ + $gname[$gid["gid"]]= $gid["gid"]; + } + $data["gids"] = $gname; + } + return Lib\Util::errCodeMsg(0,"",$data); + } + + /** + * 根据分组id获取agent列表 + * @param $gid + * @return array + * @throws \Exception + */ + public static function getAgentByGid($gid) + { + $agg = table("agent_group"); + $glist =$agg->gets(["gid"=>$gid]); + if (empty($glist)){ + return []; + } + foreach ($glist as $g){ + $aids[] = $g["aid"]; + } + if (empty($aids)) return []; + $gets["in"] = ["id",$aids]; + $list = table("agents")->gets($gets); + $data = []; + foreach ($list as $value){ + $data[] = [ + "id"=>$value["id"], + "alias"=>$value["alias"], + "ip"=>$value["ip"], + ]; + } + return $data; + } + + /** + * 添加任务 + * @param $agent + * @return array + */ + public static function addAgent($agent) + { + if (empty($agent)) return Lib\Util::errCodeMsg(101,"参数为空"); + $gids = $agent["gids"]; + unset($agent["gids"]); + $id = table("agents")->put($agent); + if ($id === false){ + return Lib\Util::errCodeMsg(102,"添加失败"); + } + $agent_group = table("agent_group"); + foreach ($gids as $gid){ + $agent_group->put(["gid"=>$gid,"aid"=>$id]); + } + //重新加载代理 + Lib\Robot::$aTable->set($id,["ip"=>$agent["ip"],"port"=>$agent["port"]]); + return Lib\Util::errCodeMsg(0,"保存成功",$id); + } + + /** + * 修改任务 + * @param $id + * @param $agent + * @return array + */ + public static function updateAgent($id,$agent) + { + if (empty($id) || empty($agent)) return Lib\Util::errCodeMsg(101,"参数为空"); + $gids = $agent["gids"]; + unset($agent["gids"]); + if (!table("agents")->set($id,$agent)){ + return Lib\Util::errCodeMsg(102,"更新失败"); + } + $agent_group = table("agent_group"); + $agent_group->dels(["aid"=>$id]); + //var_dump($id); + foreach ($gids as $gid){ + if ($gid <= 0)continue; + $agent_group->put(["gid"=>$gid,"aid"=>$id]); + } + self::reload($id); + return Lib\Util::errCodeMsg(0,"更新成功"); + } + + /** + * 删除任务代理 + * @param $id + * @return array + */ + public static function deleteAgent($id) + { + if (empty($id)) return Lib\Util::errCodeMsg(101,"参数为空"); + if (!table("agents")->del($id)){ + return Lib\Util::errCodeMsg(102,"删除失败"); + } + table("agent_group")->dels(["aid"=>$id]); + self::reload($id); + return Lib\Util::errCodeMsg(0,"删除成功"); + } + + + private static function reload($aid) + { + $agents= table("agents"); + $info = $agents->get($aid); + if (empty($info) && $info["status"] == 1){ + Lib\Robot::$aTable->del($aid); + } + } + + + +} \ No newline at end of file diff --git a/src/center/App/Tasks.php b/src/center/App/Tasks.php new file mode 100644 index 0000000..dff8d65 --- /dev/null +++ b/src/center/App/Tasks.php @@ -0,0 +1,281 @@ +primary = "gid"; + $list=[]; + if (empty($uid)){ + $list = $table->gets(["order"=>"gid asc"]); + }else{ + $t = table("group_user"); + $t->select = "*"; + $gids = $t->gets(["uid"=>$uid]); + $tmp = []; + foreach ($gids as $gid){ + $tmp[] = $gid["gid"]; + } + if (!empty($tmp)){ + $list = $table->gets(["in"=>["gid",$tmp]]); + } + } + + if (empty($list)){ + $list = []; + }else{ + $data = []; + foreach ($list as $value){ + $data[$value["gid"]] = $value["gname"]; + } + $list = $data; + } + return $list; + } + + /** + * 获取单个分组 + * @param $gid + * @return array + */ + public static function getGroup($gid) + { + $table = table("crongroup"); + $table->primary = "gid"; + $data = $table->get($gid); + if (!$data->exist()){ + return Util::errCodeMsg(101,"不存在"); + } + $t = table("group_user"); + $t->select = "uid"; + $uids = $t->gets(["gid"=>$gid]); + $da = []; + foreach ($uids as $v){ + $da[] = $v["uid"]; + } + return Util::errCodeMsg(0,"",["gid"=>$gid,"gname"=>$data["gname"],"uids"=>$da]); + } + + /** + * 添加分组 + * @param $group + * @return array + */ + public static function addGroup($group) + { + if (empty($group)) return Util::errCodeMsg(101,"参数为空"); + $table = table("crongroup"); + $table->primary = "gid"; + $uids = $group["uids"]; + unset($group["uids"]); + if (!($gid =$table->put($group))){ + return Util::errCodeMsg(102,"添加失败"); + } + $t = table("group_user"); + foreach ($uids as $uid){ + $t->put(["gid"=>$gid,"uid"=>$uid]); + } + return Util::errCodeMsg(0,"保存成功",$gid); + } + + /** + * 修改分组 + * @param $gid + * @param $group + * @return array + */ + public static function updateGroup($gid,$group) + { + if (empty($gid) || empty($group)) return Util::errCodeMsg(101,"参数为空"); + $table = table("crongroup"); + $table->primary = "gid"; + $uids=[]; + if (isset($group["uids"])){ + $uids = $group["uids"]; + unset($group["uids"]); + } + if (!$table->set($gid,$group)){ + return Util::errCodeMsg(102,"更新失败"); + } + $t = table("group_user"); + $t->dels(["gid"=>$gid]); + foreach ($uids as $uid){ + $t->put(["gid"=>$gid,"uid"=>$uid]); + } + return Util::errCodeMsg(0,"更新成功",$gid); + } + + /** + * 删除分组 + * @param $gid + * @return array + */ + public static function deleteGroup($gid) + { + if (empty($gid)) return Util::errCodeMsg(101,"参数为空"); + if (table("crontab")->count(["gid"=>$gid]) > 0){ + return Util::errCodeMsg(101,"该分组下有定时任务,不能删除"); + } + $table = table("crongroup"); + $table->primary = "gid"; + if (!$table->del($gid)){ + return Util::errCodeMsg(102,"删除失败"); + } + $t = table("group_user"); + $t->dels(["gid"=>$gid]); + return Util::errCodeMsg(0,"删除成功"); + } + + + + /** + * 获取任务列表 + * @return array + */ + public static function getList($gets=[],$page=1,$pagesize=10) + { + + //页数 + if (!empty($pagesize)) + { + $gets['pagesize'] = intval($pagesize); + } + else + { + $gets['pagesize'] = 20; + } + $gets['page'] = !empty($page) ? $page : 1; + $pager=""; + $list = table("crontab")->gets($gets, $pager); + $tasks = LoadTasks::getTasks(); + $group = self::getGroups(); + foreach ($list as &$task) + { + $tmp = $tasks->get($task["id"]); + $task["runStatus"] = $tmp["runStatus"]; + $task["runTimeStart"] = $tmp["runTimeStart"]; + $task["runUpdateTime"] = $tmp["runUpdateTime"]; + if (isset($group[$task["gid"]])){ + $task["gname"] = $group[$task["gid"]]; + } + } + return ["total"=>$pager->total,"rows"=>$list]; + } + + /** + * 获取单个任务 + * @param $id + * @return array + */ + public static function get($id) + { + $tasks = table("crontab"); + $task = $tasks->get($id); + if (!$task->exist($id)){ + return Util::errCodeMsg(101,"不存在"); + } + $data["id"] = $id; + $data["gid"] = $task["gid"]; + $data["taskname"] = $task["taskname"]; + $data["rule"] = $task["rule"]; + $data["runnumber"] = $task["runnumber"]; + $data["execute"] = $task["execute"]; + $data["status"] = $task["status"]; + $data["runuser"] = $task["runuser"]; + $data["manager"] = $task["manager"]; + $data["agents"] = $task["agents"]; + $group = self::getGroups(); + if (isset($group[$task["gid"]])){ + $data["gname"] = $group[$task["gid"]]; + } + return Util::errCodeMsg(0,"",$data); + } + + /** + * 添加任务 + * @param $task + * @return array + */ + public static function add($task) + { + if (empty($task)) return Util::errCodeMsg(101,"参数为空"); + $task["id"] = Donkeyid::getInstance()->dk_get_next_id(); + $ids = LoadTasks::saveTasks([$task]); + if ($ids === false){ + return Util::errCodeMsg(102,"添加失败"); + } + return Util::errCodeMsg(0,"保存成功",$ids); + } + + /** + * 修改任务 + * @param $id + * @param $task + * @return array + */ + public static function update($id,$task) + { + if (empty($id) || empty($task)) return Util::errCodeMsg(101,"参数为空"); + if (!LoadTasks::updateTask($id,$task)){ + return ["code"=>102,"msg"=>"更新失败"]; + } + return Util::errCodeMsg(0,"更新成功"); + } + + /** + * 删除任务 + * @param $id + * @return array + */ + public static function delete($id) + { + if (empty($id)) return Util::errCodeMsg(101,"参数为空"); + if (!LoadTasks::delTask($id)){ + return Util::errCodeMsg(102,"删除失败"); + } + return Util::errCodeMsg(0,"删除成功"); + } + + + /** + * 获取即将运行和已经运行的任务 + */ + public static function getRuntimeTasks($page=1,$size=20) + { + $start = ($page-1)*$size; + $end = $start+$size; + $data = []; + $list = \Lib\Tasks::$table; + $tasks = LoadTasks::getTasks(); + $n=0; + foreach ($list as $id=>$rb) + { + $n++; + if ($n <= $start) continue; + if ($n > $end) break; + $tmp = $tasks->get($rb["id"]); + $rb["taskname"] = $tmp["taskname"]; + $data[$id] = $rb; + } + return ["total"=>count($list),"rows"=>$data]; + } + +} \ No newline at end of file diff --git a/src/center/App/Termlog.php b/src/center/App/Termlog.php new file mode 100644 index 0000000..3ea0c52 --- /dev/null +++ b/src/center/App/Termlog.php @@ -0,0 +1,77 @@ +$log["taskid"], + "runid"=>$log["runid"], + "explain"=>$log["explain"], + "msg"=>is_scalar($log["msg"]) ? $log["msg"] : json_encode($log["msg"]), + "createtime"=>$log["createtime"], + ]; + Lib\TermLog::getInstance()->put($tmp); + } + return Lib\Util::errCodeMsg(0,"保存成功"); + } + + public static function getLogs($gets=[],$page=1,$pagesize=10) + { + //页数 + if (!empty($pagesize)) + { + $gets['pagesize'] = intval($pagesize); + } + else + { + $gets['pagesize'] = 20; + } + $gets['page'] = !empty($page) ? $page : 1; + $gets["order"] = "runid DESC,createtime ASC"; + $pager=""; + $db = table("term_logs"); + $list = $db->gets($gets, $pager); + $tasks = Lib\LoadTasks::getTasks(); + foreach ($list as &$value) + { + $tmp = $tasks->get($value["taskid"]); + $value["taskname"] = $tmp["taskname"]; + } + return ["total"=>$pager->total,"rows"=>$list]; + } + + public static function cleanLogs() + { + + $datetime = date("Y-m-d",strtotime(date("Y-m-d")."-1 month")); + $db = table("term_logs"); + if (!$db->dels(["where"=>["createtime<'".$datetime."'"]])) + { + return Lib\Util::errCodeMsg(1,"删除失败"); + } + return Lib\Util::errCodeMsg(0,"删除成功"); + } + +} \ No newline at end of file diff --git a/src/center/Lib/CenterServer.php b/src/center/Lib/CenterServer.php new file mode 100644 index 0000000..4fbb4a1 --- /dev/null +++ b/src/center/Lib/CenterServer.php @@ -0,0 +1,105 @@ +taskworker){ + if ($worker_id == (WORKER_NUM+self::LOAD_TASKS)){ + //准点载入任务 + $server->after((60-date("s"))*1000,function () use ($server){ + Tasks::checkTasks(); + $server->tick(60000, function () use ($server) { + Tasks::checkTasks(); + }); + }); + } + if ($worker_id == WORKER_NUM+self::GET_TASKS){ + $server->tick(1000, function () use ($server) { + $tasks = Tasks::getTasks(); + $server->sendMessage(json_encode($tasks),(WORKER_NUM+self::EXEC_TASKS)); + }); + } + if ($worker_id == WORKER_NUM+self::CLEAN_TASKS){ + //清理过期的服务器 + $server->tick(1000, function () use ($server) { + Robot::clean(); + }); + } + } + } + public function onTask() + { + + } + public function onFinish(){} + + public function onPipeMessage($serv, $src_worker_id, $data) + { + $data = json_decode($data); + if ($src_worker_id == WORKER_NUM+self::GET_TASKS){ + $ret = []; + foreach ($data as $k=>$id) + { + $task = LoadTasks::getTasks()->get($id); + $tmp["id"] = $id; + $tmp["execute"] = $task["execute"]; + $tmp["agents"] = $task["agents"]; + $tmp["taskname"] = $task["taskname"]; + $tmp["runuser"] = $task["runuser"]; + $tmp["runid"] = $k; + //任务标示 + LoadTasks::getTasks()->set($id,["runStatus"=>LoadTasks::RunStatusStart,"runTimeStart"=>microtime()]); + //正在运行标示 + if ( Tasks::$table->exist($k)) Tasks::$table->set($k,["runStatus"=>LoadTasks::RunStatusStart,"runid"=>$k]); + TermLog::log($tmp["runid"],$id,"任务开始",$tmp); + $ret[$k] = [ + "id"=>$id, + "ret"=>Robot::Run($tmp) + ]; + } + $serv->sendMessage(json_encode($ret),WORKER_NUM+self::MANAGER_TASKS); + }else if ($src_worker_id == WORKER_NUM+self::MANAGER_TASKS){ + foreach ($data as $k=>$v){ + if ($v["ret"]){ + $runStatus = LoadTasks::RunStatusToTaskSuccess;//发送成功 + TermLog::log($k,$v["id"],"任务发送成功"); + }else{ + $runStatus = LoadTasks::RunStatusToTaskFailed;//发送失败 + TermLog::log($k,$v["id"],"任务发送失败"); + Report::taskSendFailed($v["id"],$k);//报警 + } + LoadTasks::getTasks()->set($v["id"],["runStatus"=>$runStatus,"runUpdateTime"=>microtime()]); + if ( Tasks::$table->exist($k)) Tasks::$table->set($k,["runStatus"=>$runStatus]); + } + } + } + + public function call($request, $header) + { + //初始化日志 + Flog::startLog($request['call']); + Flog::log("call:".$request['call'].",params:".json_encode($request['params'])); + $ret = parent::call($request, $header); // TODO: Change the autogenerated stub + Flog::log($ret); + Flog::endLog(); + Flog::flush(); + return $ret; + } +} \ No newline at end of file diff --git a/src/center/Lib/Client.php b/src/center/Lib/Client.php new file mode 100644 index 0000000..782c9e0 --- /dev/null +++ b/src/center/Lib/Client.php @@ -0,0 +1,36 @@ +addServers(array($ip.':'.$port)); + } + + public static function getInstance($ip="",$port="") + { + if (isset(self::$insance[$ip.":".$port]) && !empty(self::$insance[$ip.":".$port])){ + return self::$insance[$ip.":".$port]; + } + $insance = new self($ip,$port); + self::$insance[$ip.":".$port] = $insance; + return $insance; + + } + + function call() + { + $args = func_get_args(); + return $this->task($this->namespace . '\\' . $args[0], array_slice($args, 1)); + } +} diff --git a/src/Lib/Donkeyid.php b/src/center/Lib/Donkeyid.php similarity index 100% rename from src/Lib/Donkeyid.php rename to src/center/Lib/Donkeyid.php diff --git a/src/Lib/Flog.php b/src/center/Lib/Flog.php similarity index 100% rename from src/Lib/Flog.php rename to src/center/Lib/Flog.php diff --git a/src/Lib/LoadTasks.php b/src/center/Lib/LoadTasks.php similarity index 63% rename from src/Lib/LoadTasks.php rename to src/center/Lib/LoadTasks.php index 8e32afe..dd357c5 100644 --- a/src/Lib/LoadTasks.php +++ b/src/center/Lib/LoadTasks.php @@ -13,36 +13,24 @@ class LoadTasks { - private static $createTable = " - CREATE TABLE `crontab` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `taskname` varchar(32) NOT NULL, - `rule` varchar(32) NOT NULL COMMENT '规则 可以是crontab规则也可以是启动的间隔时间', - `unique` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0 唯一任务 大于0表示同时可并行的任务进程个数', - `execute` varchar(512) NOT NULL COMMENT '运行命令行', - `status` tinyint(5) NOT NULL DEFAULT '0' COMMENT '0 正常 1 暂停', - `createtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `updatetime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - "; - static private $column = [ "runStatus" => [\swoole_table::TYPE_INT, 1], "runTimeStart" => [\swoole_table::TYPE_INT, 8], "runUpdateTime" => [\swoole_table::TYPE_INT, 8], - "taskname" => [\swoole_table::TYPE_STRING, 32], + "taskname" => [\swoole_table::TYPE_STRING, 64], + "gid" => [\swoole_table::TYPE_INT, 4], "rule" => [\swoole_table::TYPE_STRING, 32], - "unique" => [\swoole_table::TYPE_INT, 1], + "runnumber" => [\swoole_table::TYPE_INT, 1], "status" => [\swoole_table::TYPE_INT, 1], + "runuser" => [\swoole_table::TYPE_STRING, 64], "execute" => [\swoole_table::TYPE_STRING, 512], + "agents" => [\swoole_table::TYPE_STRING, 512], ]; const tablename = "crontab"; static private $table; - static public $db; const T_START = 0;//正常 @@ -60,22 +48,9 @@ class LoadTasks */ public static function init() { - $db = new Swoole\Model(Swoole::getInstance()); - $dbname = Swoole::$php->config["db"]["master"]["name"]; - $data = $db->db->query("SELECT count(*) as total FROM information_schema.TABLES WHERE table_name = '" . self::tablename . "' AND TABLE_SCHEMA = '{$dbname}'")->fetch(); - if (!empty($data) && intval($data["total"]) == 0) { - $stmt = $db->db->query(self::$createTable); - if ($stmt) { - Flog::log("执行sql:" . self::$createTable . "执行成功"); - } else { - Flog::log("执行sql:" . self::$createTable . "执行失败"); - } - Flog::flush(); - } //创建config table self::createConfigTable(); //载入tasks - self::$db = table(self::tablename); self::loadTasks(); } @@ -84,8 +59,7 @@ public static function init() */ private static function createConfigTable() { - $load_size = defined("LOAD_SIZE") ? LOAD_SIZE : 1024; - self::$table = new \swoole_table($load_size); + self::$table = new \swoole_table(LOAD_SIZE); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); } @@ -99,10 +73,11 @@ private static function createConfigTable() */ private static function loadTasks() { + $db = table("crontab"); $start = 0; while (true){ $where["limit"] = $start.",1000"; - $tasks = self::$db->gets($where); + $tasks = $db->gets($where); if (empty($tasks)) break; foreach ($tasks as $task) { if (count(self::$table) > LOAD_SIZE){ @@ -112,9 +87,12 @@ private static function loadTasks() [ "taskname" => $task["taskname"], "rule" => $task["rule"], - "unique" => $task["unique"], + "gid" => $task["gid"], + "runnumber" => $task["runnumber"], "status" => $task["status"], + "runuser" => $task["runuser"], "execute" => $task["execute"], + "agents" => $task["agents"], ] ); } @@ -134,21 +112,22 @@ public static function getTasks() /** * 保存tasks * @param $tasks + * @return array|bool */ public static function saveTasks($tasks) { $ids = []; + $db = table("crontab"); foreach ($tasks as $task) { + $task["execute"] = self::merge_spaces($task["execute"]); $ids[] = $task["id"]; if (self::$table->exist($task["id"])){ - if (!self::$db->set($task["id"],$task)){ + if (!$db->set($task["id"],$task)){ return false; } }else{ $task["createtime"] = date("Y-m-d H:i:s"); - $task["status"] = 0; - if (!self::$db->put($task)){ - print_r($task); + if (!$db->put($task)){ return false; } } @@ -156,15 +135,23 @@ public static function saveTasks($tasks) [ "taskname" => $task["taskname"], "rule" => $task["rule"], - "unique" => $task["unique"], + "gid" => $task["gid"], + "runnumber" => $task["runnumber"], "status" => $task["status"], + "runuser" => $task["runuser"], "execute" => $task["execute"], + "agents" => $task["agents"], ] ); } return $ids; } + static public function merge_spaces ( $string ) + { + return preg_replace("/\s(?=\s)/","\\1", $string ); + } + /** * 更新任务 * @param $id @@ -173,7 +160,9 @@ public static function saveTasks($tasks) */ public static function updateTask($id,$task) { - if (!self::$db->set($id,$task)){ + if (isset($task["execute"])) + $task["execute"] = self::merge_spaces($task["execute"]); + if (!table("crontab")->set($id,$task)){ return false; } if (!self::$table->set($id,$task)){ @@ -189,7 +178,7 @@ public static function updateTask($id,$task) */ public static function delTask($id) { - if (!self::$db->del($id)){ + if (!table("crontab")->del($id)){ return false; } if (!self::$table->del($id)){ diff --git a/src/Lib/ParseCrontab.php b/src/center/Lib/ParseCrontab.php similarity index 100% rename from src/Lib/ParseCrontab.php rename to src/center/Lib/ParseCrontab.php diff --git a/src/center/Lib/Report.php b/src/center/Lib/Report.php new file mode 100644 index 0000000..2dba1a8 --- /dev/null +++ b/src/center/Lib/Report.php @@ -0,0 +1,59 @@ +get($taskid); + $content = "发送任务[".$task["taskname"]."]失败,taskid.".$taskid.",runid:".$runid; + if (ENV_NAME == "product" && !empty($task["manager"])){ + self::alert($content,$task["manager"]); + } + Flog::log($content); + return true; + } + + /** + * 执行失败报警 + * @param $taskid + * @param $runid + * @param $code + * @return bool + */ + static public function taskFailed($taskid,$runid,$code) + { + $task = table("crontab")->get($taskid); + $content = "执行任务[".$task["taskname"]."]失败,taskid.".$taskid.",runid:".$runid.",code:".$code; + if (ENV_NAME == "product" && !empty($task["manager"])){ + self::alert($content,$task["manager"]); + } + Flog::log($content); + return true; + } + + static public function alert($content,$users) + { + $url = vsprintf(self::report_url."?content=%s&users=%s",array($content,$users)); + $curl = new Swoole\Client\CURL(); + $ret = $curl->get($url); + Flog::log("告警信息返回结果".$ret); + } +} \ No newline at end of file diff --git a/src/Lib/Robot.php b/src/center/Lib/Robot.php similarity index 55% rename from src/Lib/Robot.php rename to src/center/Lib/Robot.php index 7ae0627..5f46728 100644 --- a/src/Lib/Robot.php +++ b/src/center/Lib/Robot.php @@ -13,23 +13,52 @@ class Robot { - static private $table; + static public $table; + static public $groupTable; + static public $aTable; static private $ips; - static private $column = [ + "lasttime"=>[\swoole_table::TYPE_INT, 8], + ]; + static private $aColumn = [ "ip" => [\swoole_table::TYPE_STRING, 15], "port" => [\swoole_table::TYPE_INT, 4], - "lasttime"=>[\swoole_table::TYPE_INT, 8], ]; public static function init() { - $robot_num_max = defined("ROBOT_MAX") ? ROBOT_MAX : 2; - self::$table = new \swoole_table($robot_num_max); + self::$table = new \swoole_table(ROBOT_MAX); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); } self::$table->create(); + + self::$aTable = new \swoole_table(1024); + foreach (self::$aColumn as $key => $v) { + self::$aTable->column($key, $v[0], $v[1]); + } + self::$aTable->create(); + self::loadAgents(); + } + + /** + * 载入分组代理信息 + * @return bool + */ + public static function loadAgents() + { + $agents = table("agents")->gets(["status"=>0]); + if (empty($agents)) + { + return false; + } + foreach ($agents as $agent){ + self::$aTable->set($agent["id"],[ + "ip"=>$agent["ip"], + "port"=>$agent["port"], + ]); + } + return true; } /** @@ -40,7 +69,7 @@ public static function init() */ public static function register($ip,$port) { - if (self::$table->set($ip.$port,["ip"=>$ip,"port"=>$port,"lasttime"=>time()])){ + if (self::$table->set($ip.":".$port,["lasttime"=>time()])){ return true; } return false; @@ -82,11 +111,11 @@ public static function Run($task) { self::loadIps();//载入配置到本地变量 - if (($robot = self::selectWorker()) == false){ + if (($robot = self::selectWorker($task["agents"])) == false){ return false; } if (!self::sendTask($robot,$task)){ - TermLog::log("task业务运行失败:".json_encode($task),$task["id"]); + TermLog::log($task["runid"],$task["id"],"发送业务失败",$task); return false; } return true; @@ -100,15 +129,15 @@ public static function Run($task) */ private static function sendTask($robot,$task) { - TermLog::log("task发送给:".$robot["ip"].":".$robot["port"],$task["id"]); - $server = new Service($robot["ip"],$robot["port"]); - $rect = $server->call("Exec::run",$task); - $rect->getResult(); + TermLog::log($task["runid"],$task["id"],"发送到agent服务器",$robot); + $client = new Client(explode(":",$robot)[0],explode(":",$robot)[1]); + $rect = $client->call("Exec::run",$task); + $rect->getResult(3); if($rect->code == Swoole\Client\SOA_Result::ERR_CLOSED || $rect->code == Swoole\Client\SOA_Result::ERR_CONNECT){ - TermLog::log($robot["ip"].":".$robot["port"]."已停止服务,code:".$rect->code,$task["id"]); - unset(self::$ips[$robot["ip"].$robot["port"]]); + TermLog::log($task["runid"],$task["id"],"agent服务器停止服务",$robot."已停止服务,code:".$rect->code); + unset(self::$ips[$robot]); unset($server); - if (($robot = self::selectWorker()) == false){ + if (($robot = self::selectWorker($task["agents"])) == false){ return false; } return self::sendTask($robot,$task); @@ -121,19 +150,30 @@ private static function sendTask($robot,$task) * 选择能执行任务的worker * @return bool */ - private static function selectWorker() + private static function selectWorker($agents) { $num = count(self::$ips); if (!$num){ Flog::log("No workers available"); return false; } - $rand = rand(1,$num); + $agents = explode(",",$agents); + if (empty($agents)) + { + Flog::log("没有配置运行服务器"); + return false; + } + + $rand = rand(1,count($agents)); $n=0; - foreach (self::$ips as $k=>$robot) + foreach ($agents as $k=>$aid) { $n++; - if ($rand == $n){ + if ($rand <= $n){ + $aip = self::$aTable->get($aid); + if (empty($aip)) continue; + $robot = $aip["ip"].":".$aip["port"]; + if (!isset(self::$ips[$robot])) continue; return $robot; } } diff --git a/src/Lib/Tasks.php b/src/center/Lib/Tasks.php similarity index 72% rename from src/Lib/Tasks.php rename to src/center/Lib/Tasks.php index eb5713e..7629be3 100644 --- a/src/Lib/Tasks.php +++ b/src/center/Lib/Tasks.php @@ -12,20 +12,21 @@ use Swoole; class Tasks { - static private $table; + static public $table; static private $column = [ "minute" => [\swoole_table::TYPE_INT, 8], "sec" => [\swoole_table::TYPE_INT, 8], "id" => [\swoole_table::TYPE_INT, 8], + "runid" => [\swoole_table::TYPE_INT, 8], + "runStatus" => [\swoole_table::TYPE_INT, 1], ]; /** * 创建配置表 */ public static function init() { - $tasks_size = defined("TASKS_SIZE") ? TASKS_SIZE : 1024; - self::$table = new \swoole_table($tasks_size); + self::$table = new \swoole_table(TASKS_SIZE); foreach (self::$column as $key => $v) { self::$table->column($key, $v[0], $v[1]); } @@ -41,6 +42,7 @@ public static function checkTasks() if (count($tasks) > 0){ $time = time(); foreach ($tasks as $id=>$task){ + if ($task["status"] != LoadTasks::T_START) continue; $ret = ParseCrontab::parse($task["rule"], $time); if ($ret === false) { Flog::log(ParseCrontab::$error); @@ -49,12 +51,13 @@ public static function checkTasks() $time = strtotime(date("Y-m-d H:i")); foreach ($ret as $sec){ $k =Donkeyid::getInstance()->dk_get_next_id(); - self::$table->set($k,["minute"=>$min,"sec"=>$time+$sec,"id"=>$id]); + self::$table->set($k,["minute"=>$min,"sec"=>$time+$sec,"id"=>$id,"runStatus"=>LoadTasks::RunStatusNormal]); } } } } self::clean(); + return true; } /** @@ -66,9 +69,15 @@ private static function clean() if (count(self::$table) > 0){ $minute = date("YmdHi"); foreach (self::$table as $id=>$task){ - if (intval($minute) > intval($task["minute"])){ + if ($task["runStatus"] == LoadTasks::RunStatusSuccess || $task["runStatus"] == LoadTasks::RunStatusFailed){ $ids[] = $id; + continue; + }else{ + if (intval($minute) > intval($task["minute"])+2){ + $ids[] = $id; + } } + } } //删除 @@ -89,10 +98,10 @@ public static function getTasks() } $min = date("YmdHi"); $time = time(); - foreach (self::$table as $task){ + foreach (self::$table as $k=>$task){ if ($min == $task["minute"] ){ - if ($time == $task["sec"]){ - $data[] = $task["id"]; + if ($time == $task["sec"] && $task["runStatus"] == LoadTasks::RunStatusNormal){ + $data[$k] = $task["id"]; } } } diff --git a/src/center/Lib/TermLog.php b/src/center/Lib/TermLog.php new file mode 100644 index 0000000..7ec0b9c --- /dev/null +++ b/src/center/Lib/TermLog.php @@ -0,0 +1,52 @@ +table = "term_logs"; + $this->db = \Swoole::$php->db('master'); + } + + function put($log) + { + \Swoole::$php->db->insert($log, $this->table); + } + + public static function getInstance() + { + if (empty($handle)){ + self::$handle = new self(); + } + return self::$handle; + } + + public static function log($runid,$taskid,$explain,$msg="") + { + $log = [ + "taskid"=>$taskid, + "runid"=>$runid, + "explain"=>$explain, + "msg"=>is_scalar($msg) ? $msg : json_encode($msg), + "createtime"=>date("Y-m-d H:i:s"), + ]; + if (DEBUG == "on"){ + echo $log["createtime"]."\t".$log["runid"]."\t".$log["taskid"]."\t".$log["explain"]."\t".$log["msg"],"\n"; + } + self::getInstance()->put($log); + } +} \ No newline at end of file diff --git a/src/center/Lib/Util.php b/src/center/Lib/Util.php new file mode 100644 index 0000000..bb173f3 --- /dev/null +++ b/src/center/Lib/Util.php @@ -0,0 +1,55 @@ + $v) + { + if (substr($v, 0, 7) == '192.168') + { + $listenHost = $v; + } + } + } + else if (ENV_NAME == 'test') + { + $iplist = swoole_get_local_ip(); + //监听局域网IP + foreach ($iplist as $k => $v) + { + if (substr($v, 0, 6) == '172.16') + { + $listenHost = $v; + } + } + } + return $listenHost; + } + + + public static function errCodeMsg($code = 0, $message = '', $data = array()) + { + $res = array( + 'code' => $code, + 'msg' => $message ? $message : ($code ? 'fail' : 'success'), + 'data' => $data + ); + + return $res; + } +} \ No newline at end of file diff --git a/src/center/_init.php b/src/center/_init.php new file mode 100644 index 0000000..93beebd --- /dev/null +++ b/src/center/_init.php @@ -0,0 +1,43 @@ +config->setPath(__DIR__ . '/configs/' . ENV_NAME);//共有配置 +Swoole::$php->config->setPath(__DIR__ . '/configs');//共有配置 +Swoole\Loader::addNameSpace('App', __DIR__ . '/App'); +Swoole\Loader::addNameSpace('Lib', __DIR__ . '/Lib'); + + diff --git a/src/centre.php b/src/center/center.php similarity index 60% rename from src/centre.php rename to src/center/center.php index 8deaae4..0833678 100644 --- a/src/centre.php +++ b/src/center/center.php @@ -8,20 +8,20 @@ require_once __DIR__ . '/_init.php'; -Swoole\Network\Server::setPidFile(__DIR__ . '/logs/centre.pid'); +Swoole\Network\Server::setPidFile(getRunPath() . '/logs/center.pid'); Swoole\Network\Server::start(function () { - $logger = new Swoole\Log\FileLog(['file' => __DIR__ . '/logs/centre.log']); - $AppSvr = new Lib\CentreServer; + $logger = new Swoole\Log\FileLog(['file' => getRunPath() . '/logs/center.log']); + $AppSvr = new Lib\CenterServer; $AppSvr->setLogger($logger); $setting = array( - 'worker_num' => 2, - 'task_worker_num'=>8, + 'worker_num' => WORKER_NUM, + 'task_worker_num'=>TASK_NUM, 'max_request' => 1000, 'dispatch_mode' => 3, - 'log_file' => __DIR__ . '/logs/swoole.log', + 'log_file' => getRunPath() . '/logs/swoole.log', 'open_length_check' => 1, 'package_max_length' => $AppSvr->packet_maxlen, 'package_length_type' => 'N', @@ -29,16 +29,17 @@ 'package_length_offset' => 0, ); //重定向PHP错误日志到logs目录 - ini_set('error_log', __DIR__ . '/logs/php_errors.log'); + ini_set('error_log', getRunPath() . '/logs/php_errors.log'); \Lib\LoadTasks::init();//载入任务表 \Lib\Donkeyid::init();//初始化donkeyid对象 \Lib\Tasks::init();//创建task表 \Lib\Robot::init();//创建任务处理服务表 - $server = Swoole\Network\Server::autoCreate(CENTRE_HOST, CENTRE_PORT); + $server = Swoole\Network\Server::autoCreate(CENTER_HOST, CENTRE_PORT); $server->setProtocol($AppSvr); - $server->setProcessName("CentreServer"); + $server->setProcessName("CenterServer"); + $server->on("PipeMessage",array($AppSvr, 'onPipeMessage')); $server->run($setting); }); diff --git a/src/center/configs/dev/db.php b/src/center/configs/dev/db.php new file mode 100644 index 0000000..6cc380f --- /dev/null +++ b/src/center/configs/dev/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "192.168.1.15", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/center/configs/log.php b/src/center/configs/log.php new file mode 100644 index 0000000..d18361c --- /dev/null +++ b/src/center/configs/log.php @@ -0,0 +1,12 @@ + 'FileLog', + 'cut_file' => true, + 'file' => getRunPath() . '/logs/application.log', +); +$log['term'] = array( + 'type' => 'FileLog', + 'cut_file' => true, + 'file' => getRunPath() . '/logs/term.log', +); +return $log; \ No newline at end of file diff --git a/src/center/configs/product/db.php b/src/center/configs/product/db.php new file mode 100644 index 0000000..6cc380f --- /dev/null +++ b/src/center/configs/product/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "192.168.1.15", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/center/configs/test/db.php b/src/center/configs/test/db.php new file mode 100644 index 0000000..6cc380f --- /dev/null +++ b/src/center/configs/test/db.php @@ -0,0 +1,14 @@ + Swoole\Database::TYPE_MYSQLi, + 'host' => "192.168.1.15", + 'port' => 3306, + 'dbms' => 'mysql', + 'user' => "root", + 'passwd' => "root", + 'name' => "crontab", + 'charset' => "utf8", + 'setname' => true, + 'persistent' => false, //MySQL长连接 +); +return $db; \ No newline at end of file diff --git a/src/center/console.php b/src/center/console.php new file mode 100644 index 0000000..d5f17b8 --- /dev/null +++ b/src/center/console.php @@ -0,0 +1,11 @@ +call("Termlog::cleanLogs")->getResult(30); +var_dump($ret); \ No newline at end of file diff --git a/src/public/index.php b/src/public/index.php new file mode 100644 index 0000000..76212d9 --- /dev/null +++ b/src/public/index.php @@ -0,0 +1,34 @@ +config->setPath(APPSPATH . '/configs'); +Swoole::$php->config->setPath(APPSPATH . '/configs/' . ENV_NAME); +$php->runMVC(); \ No newline at end of file diff --git a/src/public/static/css/style.css b/src/public/static/css/style.css new file mode 100644 index 0000000..54aa24f --- /dev/null +++ b/src/public/static/css/style.css @@ -0,0 +1,129 @@ +.custom-combobox { + position: relative; + display: inline-block; +} +.custom-combobox-toggle { + position: absolute; + top: 0; + bottom: 0; + margin-left: -1px; + padding: 0; + height: 23px; + /* support: IE7 */ + *height: 1.7em; + *top: 0.1em; +} +.custom-combobox-input { + margin: 0; + font-size: 12px; + padding: 0.3em; + width: 160px; + line-height: 1.4; +} + +.ui-datepicker tr { + height: 24px; +} + +.logs { + color: #fff; + display: block; + padding-bottom: 10px; +} + +.log-box { + + height: 600px; + overflow-y: scroll; +} +.term { + color: #fff; + background-color: #000; + font-size: 14px; + line-height: 15px; + height: 600px; + padding: 10px; + overflow-x: scroll; +} + +.log-bg { + +} +.ps1 { + padding-bottom: 20px; +} +.log > span { + display: block; + padding-top: 5px; +} + +.log > span:hover { + color: #fff; +} + +.log > span > span { + line-height: 20px; +} + +.log-ip { + /*font-weight:bold;*/ + font-style:italic; + color:#5f895f; + /*text-shadow:0 0 5px #5f895f;*/ +} +.log-time { + /*font-weight:bold;*/ + font-style:italic; + color:#c26565; +} + +.log-content { + font-weight:bold; + color:#487182; +} +.pager-box { + text-align: center!important; +} +.pager { + color: #2E6AB1; + font-size: 14px; + line-height: 200%; + display: inline-block; +} +.pager span,.pager a{ + /*border: 1px solid #9AAFE5;*/ + /*border-radius: 3px;*/ + /*color: #2E6AB1;*/ + /*margin: 0 2px;*/ + /*padding: 2px 5px;*/ + /*text-decoration: none;*/ + padding: 6px 12px; + line-height: 1.428571429; + text-decoration: none; + color: #3276b1; + background-color: #fff; + border: 1px solid #ddd; + /*margin-left: -1px;*/ + -webkit-box-shadow: inset 0 -2px 0 rgba(0,0,0,.05); + float: left; +} + +.pager a:hover{ + color: #214e75; + background-color: #eee; + border-color: #ddd; + text-decoration: none; +} +.pager span.current { + /*background-color: #2E6AB1;*/ + /*border: 1px solid navy;*/ + /*border-radius: 3px;*/ + /*color: #FFFFFF;*/ + /*font-weight: bold;*/ + /*margin: 0 2px;*/ + /*padding: 2px 5px;*/ + color: #fff; + background-color: #3276b1; + border-color: #3276b1; + cursor: default; +} \ No newline at end of file diff --git a/src/public/static/css/terminal.css b/src/public/static/css/terminal.css new file mode 100644 index 0000000..0e6db5c --- /dev/null +++ b/src/public/static/css/terminal.css @@ -0,0 +1,145 @@ +/* + * This css file is part of jquery terminal + * + * Licensed under GNU LGPL Version 3 license + * Copyright (c) 2011-2013 Jakub Jankiewicz + * + */ +.terminal .terminal-output .format, .cmd .format, +.cmd .prompt, .cmd .prompt div, .terminal .terminal-output div div{ + display: inline-block; +} +.cmd .clipboard { + position: absolute; + bottom: 0; + left: 0; + opacity: 0.01; + filter: alpha(opacity = 0.01); + filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0.01); + width: 2px; +} +.cmd > .clipboard { + position: fixed; +} +.terminal { + padding: 10px; + position: relative; + overflow: hidden; +} +.cmd { + padding: 0; + margin: 0; + height: 1.3em; + /*margin-top: 3px; */ +} +.cmd .cursor.blink { + -webkit-animation: blink 1s infinite steps(1, start); + -moz-animation: blink 1s infinite steps(1, start); + -ms-animation: blink 1s infinite steps(1, start); + animation: blink 1s infinite steps(1, start); +} +@keyframes blink { + 0%, 100% { + background-color: #000; + color: #aaa; + } + 50% { + background-color: #bbb; /* not #aaa because it's seem there is Google Chrome bug */ + color: #000; + } +} +@-webkit-keyframes blink { + 0%, 100% { + background-color: #000; + color: #aaa; + } + 50% { + background-color: #bbb; + color: #000; + } +} +@-ms-keyframes blink { + 0%, 100% { + background-color: #000; + color: #aaa; + } + 50% { + background-color: #bbb; + color: #000; + } +} +@-moz-keyframes blink { + 0%, 100% { + background-color: #000; + color: #aaa; + } + 50% { + background-color: #bbb; + color: #000; + } +} +.terminal .terminal-output div div, .cmd .prompt { + display: block; + line-height: 14px; + height: auto; +} +.cmd .prompt { + float: left; +} +.terminal, .cmd { + font-family: monospace; + /*font-family: "微软雅黑";*/ + color: #ccc; + background-color: #000; + font-size: 14px; + line-height: 14px; + padding-top: 8px; +} +.terminal-output > div { + padding-top: 10px; + min-height: 18px; +} +.terminal .terminal-output div span { + display: inline-block; +} +.cmd span { + float: left; + /*display: inline-block; */ +} +.terminal .inverted, .cmd .inverted, .cmd .cursor.blink { + background-color: #aaa; + color: #000; +} +.terminal .terminal-output div div::-moz-selection, +.terminal .terminal-output div span::-moz-selection, +.terminal .terminal-output div div a::-moz-selection { + background-color: #aaa; + color: #000; +} +.terminal .terminal-output div div::selection, +.terminal .terminal-output div div a::selection, +.terminal .terminal-output div span::selection, +.cmd > span::selection, +.cmd .prompt span::selection { + background-color: #aaa; + color: #000; +} +.terminal .terminal-output div.error, .terminal .terminal-output div.error div { + color: red; +} +.tilda { + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 1100; +} +.clear { + clear: both; +} +.terminal a { + color: #0F60FF; +} +.terminal a:hover { + color: red; +} \ No newline at end of file diff --git a/src/public/static/jquery-ui/css/redmond/images/animated-overlay.gif b/src/public/static/jquery-ui/css/redmond/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png b/src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..f70d3718c3b2405f23ccd2acaa49fe1590a18b20 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`FMFwr$K4>7c~GBvd_wA3{)w=yuO)ZP6KMMG|WN@iLmZVem-%pi9& Nc)I$ztaD0e0sxg`GRgn| literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png b/src/public/static/jquery-ui/css/redmond/images/ui-bg_flat_55_fbec88_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd3c04d3e2a8f52c5aca270d46726586a6d7011 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F$P6UUt$JVyq?iMILR^2p>EL%3lLT@(3p^r= zfwTu0yPeFo12XtMT^vI+&L<~Gur6-+#lXN6!N6E*)>aObQY~?fC`m~yNwrEYN(E93 zMh1o^x&|h?M&==gmR6>wR>sD<2If`<2Jnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12XzNT^vI^j=w#>kdKj3=J?0=@27v6%;IVMUg1JcliIElxdYl6axRlf zzjoc!(_FUE@@3iW-UpIBAN=Qk@QpurwKhJKtwDjK>A`E8?p60quDJ!5u2r;lD_g}Z zoV~Vb=3H*wH!=D_yF(V8(VMzqOVPpQnp?N;GJIZCld^S(TIzDS*}~dvVf|)n|IgrS zQura8|6q%H3BUHj1fa`QOI#yLQW8s2t&)pUffR$0fuV`6fr+k>d5EEnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12QIix;Tb-9DjR7k?RnHg!{+uf13{~G&Ln=`oO=hJOs{);)V=83A}=O}g86Gs>w%OA6 z;^IdBdxdlMKWE!C8<`)MX5lF!N|bSMAyJX*T_7?(9+7( s)XK<6*TCG$z~JlB7vE7doT7)78&qol`;+08+StOaK4? literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png b/src/public/static/jquery-ui/css/redmond/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ffac060a74e3d0a053ad7c4b59a4ec38cc293425 GIT binary patch literal 332 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 literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png b/src/public/static/jquery-ui/css/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..30211ac74c394df6958cb45d8dbdc67faa32906a GIT binary patch literal 333 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 E19GBNuK)l5 literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-icons_2e83ff_256x240.png b/src/public/static/jquery-ui/css/redmond/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..84b601bf0f726bf95801da487deaf2344a32e4b8 GIT binary patch literal 4549 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 F{{S81aohj^ literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-icons_469bdd_256x240.png b/src/public/static/jquery-ui/css/redmond/images/ui-icons_469bdd_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..5dff3f962cd744033b2aef575491451a8b2ce6a8 GIT binary patch literal 4549 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 F{{RRLc7^}| literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-icons_6da8d5_256x240.png b/src/public/static/jquery-ui/css/redmond/images/ui-icons_6da8d5_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f7809f8566cd0aaef9af00e7caeca9d3720cf1b0 GIT binary patch literal 4549 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 DTfr$v literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-icons_d8e7f3_256x240.png b/src/public/static/jquery-ui/css/redmond/images/ui-icons_d8e7f3_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..9b46228fb1e80406b2a9a65b694e5674494c2775 GIT binary patch literal 4549 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 DwY1D= literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/images/ui-icons_f9bd01_256x240.png b/src/public/static/jquery-ui/css/redmond/images/ui-icons_f9bd01_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f0531ad5b02b7f891d84a6b6db6ce7290b65de GIT binary patch literal 4549 zcmeHK_fr#0w@yL`gaFc{D^V0dT4;jQP=bNbK{_u%ib`*aQiD{bOA$~IUa5i*=~5&V zL7IS}X($mvdXY{j`OrJ_&DiShpE9y*mGl8u9O$bY%>MDw z0PP+(RRG|ela7|U*`x1kb}&a$9V?^<{dOtyx!ng0d-3}*r!T**ek)sPtVsCo?$KDV z#1>$;L8YbugMWC(#8~!nc>GKiU!i9qgeckFsmAQeHUhc{gnA^U7*xUqak*bav014= z9_(6u8Chq6k>NSXzERw7cA(}q0`^P4fGg7`cAvoywkeB!1jDDcXDn}QEeU@^`i6?oHC^uxzeq^qCH6Jjv{rctr9Ugkg zijtRR$xEQe^4xnUW2fTw{OZ(JaVTTZx- z#g5&`JcsW88m!_v&WT0M-uIy%0;V+|DncTCrZzxlQv5}erdqe!Vm732`Sya0a>AgD5 zYN>g&&eBeB98-hgT`-<=^H8%+6jFvaelX=l&`zpbZkmQH7G1*w7fYbB#{>f10gORZ+3nEl^S3)NO`wRV7lpQwEp7aqLIrL+b-d3<0&O^1sw$f#7mzHke16eU- z1uXlcC=S=j#=Kn=G%J$pX_Eta&T!g~M=`KrU{(#V39U9#jCkQNlyxKbyeO~+7lIC0>9#!;|zM(1;ZERYM{chRPt-J#^{E13hK|t z*?JXN9BaGyC=u#yQ7u30|D|STfXe&CiuThX7BrWxMg^iSY1eYM*Ga%QDur*GqKy$w zT>&CyoO#=@6*dJyZ?P%JqaBUae3-+Y#+Jo~qcUJt zqZ6-saPeWdCI}$QP`_?%RB{JsF*GWAeRy%u-^mfsF^w~{e^ z=btX7_KEwTT)x%Y70)rB;)U*ps(L=A*#=nMr-}pL2FrdjKVJ+>vm>wDP10s) z`~y0i&P`6Qv`3$j_gcJILsQ?FV{hZ zt3u=&jSzUxj|gRZ^~Be#8g}T52M-S0DF(tob`1bGCt{ouM1L>tr~xeXK?eh<#jWDC z{GMhqy2j@`8NRmN+ya}^KlwleDFE{&aKthx{5_d^u#-!OhflfyU;|1QOB?AKaXaYO zFMhouuPMTLX2w96t%@2FD$FC?xtHu5$95rDr7M4_F|t~-@_ymTyJdktX;aEqIe5{~ zuuZ9w2}`1&lb5{rjUT@Z9Ep8^pX!>}w$80zFt6x2?W$sFy|gCMyf4S&aUoT6t1e-8 zP#2$fAPW<@-Rznu%e)zi_QZ z<@V&4-*O?0o0*H1{DtiATDJyBi}LT4?g+n%nduz|dKw8;`bBT?xkbpL6iS*&+UVhf|F0x`#7_v#L;*ZpPdf~t-v_jb5cCGK6Q(z zomI2JSl^8y2#}MucCVG^`JOzDk2uG}XXv|pROh?aU%W@Tc;hlJor^aVQa2eUeN0wnq)(xI*_dQu0 zq&eVNk<1MhiD^B2VQ2$#q8h3!$e&!+eY>Len`W^_KE-1O@H3UmEG&?ZW3)&j z$F_ogQsVn|csdr&Wx;}q0nBWM|IO$RaU!{y<`w*}s+0$JyD`(&mJ+B(8=*tRv?As6 zN4zuHgMbg&0__&|At!Rd;n{w9JCc{w%GcXcuX%fo7NnkV4)|-z%nbGJAo-e&TSa2N z`BU1l1nT^qOJYt|H=o^5m&O-OA3WV_J}uppTzghgT!o{Bd4Bh=GQ+5jw3U4kwCmP` zCndwj9ebA=x(v>IYwk9VK`Unjzm4M3vG2j(zlL zsmAv@G_SuceP(v_Ju5p&9jt8X_MoA?_RbUvz$E#h@k)#J6p^!5!ueg8>#vxvWBVkc zeQyDeuZ4rg4X4b77b|(fG$jPnEshA) zDxnRw=p87xeb;J^uz#T-WjG$$g9!`{c4slN|F%5%v~yuA#{H3{Qa5f?_W?ke{$r-W zT^oLI5BH{>3S@*)_yi`%Z&$jPyGR_T^N!{=qP>vsP?^Fw~v?BVHd1)m&z8qj<{N+8>KKgLep4KaCpdHP+{ z_~?aOEpB|4?QE|%1>$4`>*}}Nt+rZM?T3mUy#bYUfu~(T({(pvN!V>c27RbaU>;ow zBj$mjePCa!*5o^mk8#(FE9l$|bSA73LHA05!TL$p`X~Pt%-;Rk$TDa(76tv_n*%AevUX$%P{ZB>_9M-Ta4w z-hL`pV88hkf!!n?Nx(aCnq(7E+gkF!tdjUde@24I`;(~!C8n`3Gh)@|R<~W9gI@Ld zzXdGoi+E7*tTT;EXUexl=u_1R(i=*|t>$15&Irq5R8**-DTNt*nW7%mpP*bR{h@>O zZ(T#9e%>oMY##A9ok-p(!1eV!5^kHJmiL0VUOaXqL>V5OZ zoY&m$W527fvy)=au*gISMxu*emNfR-t*nT~AYY%O@A2oev-sc^5;9NTjp3}6Pg&CL zt?(VEP2X#*I|R@{8E92#V4wU4 D=xKF{ literal 0 HcmV?d00001 diff --git a/src/public/static/jquery-ui/css/redmond/jquery-ui.css b/src/public/static/jquery-ui/css/redmond/jquery-ui.css new file mode 100644 index 0000000..0a7ecf2 --- /dev/null +++ b/src/public/static/jquery-ui/css/redmond/jquery-ui.css @@ -0,0 +1,1183 @@ +/*! jQuery UI - v1.10.4 - 2014-04-27 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin-top: 2px; + padding: .5em .5em .5em .7em; + min-height: 0; /* support: IE7 */ +} +.ui-accordion .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-noicons { + padding-left: .7em; +} +.ui-accordion .ui-accordion-icons .ui-accordion-icons { + padding-left: 2.2em; +} +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { + position: absolute; + left: .5em; + top: 50%; + margin-top: -8px; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-button { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + overflow: visible; /* removes extra width in IE */ +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2.2em; +} +/* button elements seem to need a little more width */ +button.ui-button-icon-only { + width: 2.4em; +} +.ui-button-icons-only { + width: 3.4em; +} +button.ui-button-icons-only { + width: 3.7em; +} + +/* button text element */ +.ui-button .ui-button-text { + display: block; + line-height: normal; +} +.ui-button-text-only .ui-button-text { + padding: .4em 1em; +} +.ui-button-icon-only .ui-button-text, +.ui-button-icons-only .ui-button-text { + padding: .4em; + text-indent: -9999999px; +} +.ui-button-text-icon-primary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 1em .4em 2.1em; +} +.ui-button-text-icon-secondary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 2.1em .4em 1em; +} +.ui-button-text-icons .ui-button-text { + padding-left: 2.1em; + padding-right: 2.1em; +} +/* no icon support for input elements, provide padding by default */ +input.ui-button { + padding: .4em 1em; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon, +.ui-button-text-icon-primary .ui-icon, +.ui-button-text-icon-secondary .ui-icon, +.ui-button-text-icons .ui-icon, +.ui-button-icons-only .ui-icon { + position: absolute; + top: 50%; + margin-top: -8px; +} +.ui-button-icon-only .ui-icon { + left: 50%; + margin-left: -8px; +} +.ui-button-text-icon-primary .ui-button-icon-primary, +.ui-button-text-icons .ui-button-icon-primary, +.ui-button-icons-only .ui-button-icon-primary { + left: .5em; +} +.ui-button-text-icon-secondary .ui-button-icon-secondary, +.ui-button-text-icons .ui-button-icon-secondary, +.ui-button-icons-only .ui-button-icon-secondary { + right: .5em; +} + +/* button sets */ +.ui-buttonset { + margin-right: 7px; +} +.ui-buttonset .ui-button { + margin-left: 0; + margin-right: -.3em; +} + +/* workarounds */ +/* reset extra padding in Firefox, see h5bp.com/l */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 49%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + height: 18px; + line-height: 18px; + text-align: center; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} +.ui-dialog { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-se { + width: 12px; + height: 12px; + right: -5px; + bottom: -5px; + background-position: 16px 16px; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-menu { + list-style: none; + padding: 2px; + margin: 0; + display: block; + outline: none; +} +.ui-menu .ui-menu { + margin-top: -3px; + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + padding: 0; + width: 100%; + text-align: left; + height: 30px; + line-height: 30px; + /* support: IE10, see #8844 */ + list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); +} +.ui-menu .ui-menu-divider { + margin: 5px -2px 5px -2px; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-menu-item a { + text-decoration: none; + display: block; + padding: 2px .4em; + line-height: 1.5; + min-height: 0; /* support: IE7 */ + font-weight: normal; +} +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} + +.ui-menu .ui-state-disabled { + font-weight: normal; + margin: .4em 0 .2em; + line-height: 1.5; +} +.ui-menu .ui-state-disabled a { + cursor: default; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item a { + position: relative; + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: .2em; + left: .2em; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + position: static; + float: right; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("images/animated-overlay.gif"); + height: 100%; + filter: alpha(opacity=25); + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: default; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* For IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 22px; +} +.ui-spinner-button { + width: 16px; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top: none; + border-bottom: none; + border-right: none; +} +/* vertically center icon */ +.ui-spinner .ui-icon { + position: absolute; + margin-top: -8px; + top: 50%; + left: 0; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} + +/* TR overrides */ +.ui-spinner .ui-icon-triangle-1-s { + /* need to fix icons sprite */ + background-position: -65px -16px; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; + -webkit-box-shadow: 0 0 5px #aaa; + box-shadow: 0 0 5px #aaa; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Lucida Grande,Lucida Sans,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Lucida Grande,Lucida Sans,Arial,sans-serif; + font-size: 1em; +} +.ui-widget-content { + border: 1px solid #a6c9e2; + background: #fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x; + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #4297d7; + background: #5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x; + color: #ffffff; + font-weight: bold; +} +.ui-widget-header a { + color: #ffffff; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + border: 1px solid #c5dbec; + background: #dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x; + /*font-weight: bold;*/ + /*color: #2e6e9e;*/ +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited { + color: #2e6e9e; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus { + border: 1px solid #79b7e7; + background: #d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x; + font-weight: bold; + color: #1d5987; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited { + color: #1d5987; + text-decoration: none; +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + border: 1px solid #79b7e7; + background: #f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x; + font-weight: bold; + color: #e17009; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #e17009; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #fad42e; + background: #fbec88 url("images/ui-bg_flat_55_fbec88_40x100.png") 50% 50% repeat-x; + color: #363636; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #cd0a0a; + background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; + color: #cd0a0a; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #cd0a0a; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #cd0a0a; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_469bdd_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_d8e7f3_256x240.png"); +} +.ui-state-default .ui-icon { + background-image: url("images/ui-icons_6da8d5_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon { + background-image: url("images/ui-icons_217bc0_256x240.png"); +} +.ui-state-active .ui-icon { + background-image: url("images/ui-icons_f9bd01_256x240.png"); +} +.ui-state-highlight .ui-icon { + background-image: url("images/ui-icons_2e83ff_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cd0a0a_256x240.png"); +} + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 5px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 5px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 5px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 5px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; + opacity: .3; + filter: Alpha(Opacity=30); +} +.ui-widget-shadow { + margin: -8px 0 0 -8px; + padding: 8px; + background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; + opacity: .3; + filter: Alpha(Opacity=30); + border-radius: 8px; +} diff --git a/src/public/static/jquery-ui/css/redmond/jquery-ui.min.css b/src/public/static/jquery-ui/css/redmond/jquery-ui.min.css new file mode 100644 index 0000000..b778559 --- /dev/null +++ b/src/public/static/jquery-ui/css/redmond/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.10.4 - 2014-04-27 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5dbec;background:#dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2e6e9e}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#2e6e9e;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #79b7e7;background:#d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1d5987}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#1d5987;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #79b7e7;background:#f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e17009}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e17009;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88 url("images/ui-bg_flat_55_fbec88_40x100.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_469bdd_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_6da8d5_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_217bc0_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_f9bd01_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} \ No newline at end of file diff --git a/src/public/static/jquery-ui/index.html b/src/public/static/jquery-ui/index.html new file mode 100644 index 0000000..726fe8f --- /dev/null +++ b/src/public/static/jquery-ui/index.html @@ -0,0 +1,450 @@ + + + + + jQuery UI Example Page + + + + + + + + +

Welcome to jQuery UI!

+ +
+

This page demonstrates the widgets you downloaded using the theme you selected in the download builder. We've included and linked to minified versions of jQuery, your personalized copy of jQuery UI (js/jquery-ui-.custom.min.js), and css//jquery-ui-.custom.min.css which imports the entire jQuery UI CSS Framework. You can choose to link a subset of the CSS Framework depending on your needs.

+

You've downloaded components and a theme that are compatible with jQuery 1.6+. Please make sure you are using jQuery 1.6+ in your production environment.

+
+ +

YOUR COMPONENTS:

+ + + +

Accordion

+
+

First

+
Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
+

Second

+
Phasellus mattis tincidunt nibh.
+

Third

+
Nam dui erat, auctor a, dignissim quis.
+
+ + + + +

Autocomplete

+
+ +
+ + + + +

Button

+ +
+
+ + + +
+
+ + + + +

Tabs

+
+ +
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
+
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
+
+ + + + +

Dialog

+

Open Dialog

+ +

Overlay and Shadow Classes (not currently used in UI widgets)

+
+

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

+ + +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+
+ +
+ + +
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+ + + +

Framework Icons (content color preview)

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+ + + +

Slider

+
+ + + + +

Datepicker

+
+ + + + +

Progressbar

+
+ + + +

Highlight / Error

+
+
+

+ Hey! Sample ui-state-highlight style.

+
+
+
+
+
+

+ Alert: Sample ui-state-error style.

+
+
+ + + diff --git a/src/public/static/jquery-ui/js/jquery-1.10.2.js b/src/public/static/jquery-ui/js/jquery-1.10.2.js new file mode 100644 index 0000000..c5c6482 --- /dev/null +++ b/src/public/static/jquery-ui/js/jquery-1.10.2.js @@ -0,0 +1,9789 @@ +/*! + * jQuery JavaScript Library v1.10.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03T13:48Z + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // The deferred used on DOM ready + readyList, + + // A central reference to the root jQuery(document) + rootjQuery, + + // Support: IE<10 + // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` + core_strundefined = typeof undefined, + + // Use the correct document accordingly with window argument (sandbox) + location = window.location, + document = window.document, + docElem = document.documentElement, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // [[Class]] -> type pairs + class2type = {}, + + // List of deleted data cache ids, so we can reuse them + core_deletedIds = [], + + core_version = "1.10.2", + + // Save a reference to some core methods + core_concat = core_deletedIds.concat, + core_push = core_deletedIds.push, + core_slice = core_deletedIds.slice, + core_indexOf = core_deletedIds.indexOf, + core_toString = class2type.toString, + core_hasOwn = class2type.hasOwnProperty, + core_trim = core_version.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + + // Used for splitting on whitespace + core_rnotwhite = /\S+/g, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }, + + // The ready event handler + completed = function( event ) { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } + }, + // Clean-up method for dom ready events + detach = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: core_version, + + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), + + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + if ( obj == null ) { + return String( obj ); + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ core_toString.call(obj) ] || "object" : + typeof obj; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( jQuery.support.ownLast ) { + for ( key in obj ) { + return core_hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + if ( scripts ) { + jQuery( scripts ).remove(); + } + return jQuery.merge( [], parsed.childNodes ); + }, + + parseJSON: function( data ) { + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + if ( data === null ) { + return data; + } + + if ( typeof data === "string" ) { + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + if ( data ) { + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + } + } + } + + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + core_push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return core_concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations. + // Note: this method belongs to the css module but it's needed here for the support module. + // If support gets modularized, this method should be moved back to the css module. + swap: function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || type !== "function" && + ( length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj ); +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +/*! + * Sizzle CSS Selector Engine v1.10.2 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03 + */ +(function( window, undefined ) { + +var i, + support, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rsibling = new RegExp( whitespace + "*[+~]" ), + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent.attachEvent && parent !== parent.top ) { + parent.attachEvent( "onbeforeunload", function() { + setDocument(); + }); + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = assert(function( div ) { + div.innerHTML = "
"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Support: Opera 10-12/IE8 + // ^= $= *= and empty values + // Should not select anything + // Support: Windows 8 Native Apps + // The type attribute is restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "t", "" ); + + if ( div.querySelectorAll("[t^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val === undefined ? + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null : + val; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] && match[4] !== undefined ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + elem[ name ] === true ? name.toLowerCase() : null; + } + }); +} + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function( support ) { + + var all, a, input, select, fragment, opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = "
a"; + + // Finish early in limited (non-browser) environments + all = div.getElementsByTagName("*") || []; + a = div.getElementsByTagName("a")[ 0 ]; + if ( !a || !a.style || !all.length ) { + return support; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + support.getSetAttribute = div.className !== "t"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName("tbody").length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName("link").length; + + // Get the style information from getAttribute + // (IE uses .cssText instead) + support.style = /top/.test( a.getAttribute("style") ); + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + support.hrefNormalized = a.getAttribute("href") === "/a"; + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + support.opacity = /^0.5/.test( a.style.opacity ); + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + support.cssFloat = !!a.style.cssFloat; + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + support.checkOn = !!input.value; + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + support.optSelected = opt.selected; + + // Tests for enctype support on a form (#6743) + support.enctype = !!document.createElement("form").enctype; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; + + // Will be defined later + support.inlineBlockNeedsLayout = false; + support.shrinkWrapBlocks = false; + support.pixelPosition = false; + support.deleteExpando = true; + support.noCloneEvent = true; + support.reliableMarginRight = true; + support.boxSizingReliable = true; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Support: IE<9 + // Iteration over object's inherited properties before its own. + for ( i in jQuery( support ) ) { + break; + } + support.ownLast = i !== "0"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + div.innerHTML = "
t
"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior. + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + + // Workaround failing boxSizing test due to offsetWidth returning wrong value + // with some non-1 values of body zoom, ticket #13543 + jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { + support.boxSizing = div.offsetWidth === 4; + }); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "
"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})({}); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "applet": true, + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + data = null, + i = 0, + elem = this[0]; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( name.indexOf("data-") === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n\f]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // Use proper attribute retrieval(#6932, #12072) + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + elem[ propName ] = false; + // Support: IE<9 + // Also clear defaultChecked/defaultSelected (if appropriate) + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + elem[ name ]; + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + } +}); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; + + jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + function( elem, name, isXML ) { + var fn = jQuery.expr.attrHandle[ name ], + ret = isXML ? + undefined : + /* jshint eqeqeq: false */ + (jQuery.expr.attrHandle[ name ] = undefined) != + getter( elem, name, isXML ) ? + + name.toLowerCase() : + null; + jQuery.expr.attrHandle[ name ] = fn; + return ret; + } : + function( elem, name, isXML ) { + return isXML ? + undefined : + elem[ jQuery.camelCase( "default-" + name ) ] ? + name.toLowerCase() : + null; + }; +}); + +// fix oldIE attroperties +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = { + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = + // Some attributes are constructed with empty-string values when not defined + function( elem, name, isXML ) { + var ret; + return isXML ? + undefined : + (ret = elem.getAttributeNode( name )) && ret.value !== "" ? + ret.value : + null; + }; + jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ret.specified ? + ret.value : + undefined; + }, + set: nodeHook.set + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }; + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }; +} + +jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +}); + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !jQuery.support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + // Support: Webkit + // "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +var isSimple = /^.[^:#\[\.,]*$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + cur = ret.push( cur ); + break; + } + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( isSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var + // Snapshot the DOM in case .domManip sweeps something relevant into its fragment + args = jQuery.map( this, function( elem ) { + return [ elem.nextSibling, elem.parentNode ]; + }), + i = 0; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + var next = args[ i++ ], + parent = args[ i++ ]; + + if ( parent ) { + // Don't use the snapshot next if it has moved (#13810) + if ( next && next.parentNode !== parent ) { + next = this.nextSibling; + } + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + // Allow new content to include elements from the context set + }, true ); + + // Force removal if there was no new content (e.g., from empty arguments) + return i ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback, allowIntersection ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback, allowIntersection ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery._evalUrl( node.src ); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + }, + + _evalUrl: function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } +}); +jQuery.fn.extend({ + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("');return d.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0], +d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var i=[],g=c.html;"<"!=g.charAt(0)&&(g=""+g+"");var j=c.focus;j&&(this.focus=function(){this.selectParentTab();"function"==typeof j&&j.call(this);this.fire("focus")},c.isFocusable&& +(this.isFocusable=this.isFocusable),this.keyboardFocusable=!0);CKEDITOR.ui.dialog.uiElement.call(this,e,c,i,"span",null,null,"");i=i.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",i[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push(""+f+""); +for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()? +"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},isEnabled:function(){return!this._.disabled}, +eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},focus:function(){var b=this.selectParentTab(); +setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement, +{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0','
'," diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/LICENSE.md b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/LICENSE.md new file mode 100644 index 0000000..610c807 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor SCAYT Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/README.md b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/README.md new file mode 100644 index 0000000..3b1ad94 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/README.md @@ -0,0 +1,25 @@ +CKEditor SCAYT Plugin +===================== + +This plugin brings Spell Check As You Type (SCAYT) into CKEditor. + +SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation. +2. Enable the "scayt" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'scayt'; + +That's all. SCAYT will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/dialogs/options.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/dialogs/options.js new file mode 100644 index 0000000..82bf80b --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/scayt/dialogs/options.js @@ -0,0 +1,20 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("scaytcheck",function(j){function w(){return"undefined"!=typeof document.forms["optionsbar_"+a]?document.forms["optionsbar_"+a].options:[]}function x(b,a){if(b){var e=b.length;if(void 0==e)b.checked=b.value==a.toString();else for(var d=0;d'+b+"")}function o(b){f.getById("dic_message_"+a).setHtml(''+b+"")} +function p(b){for(var b=(""+b).split(","),a=0,e=b.length;a
\t
\t
\t\t\t\t\t
\t
\t\t\t\t\t
\t
\t\t\t\t
\t
\t\t\t\t\t
'}]},{id:"langs",label:g.languagesTab,elements:[{type:"html",id:"langs", +html:'
\t
\t
'}]},{id:"dictionaries",label:g.dictionariesTab,elements:[{type:"html",style:"",id:"dictionaries",html:'
\t
\t
Dictionary name
\t\t\t\t\t
\t\t\t\t\t\t
\t\t
\t\t\t\t\t\t\t\t\t\t\t\t\t\t
\t
'}]},{id:"about", +label:g.aboutTab,elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'
'}]}],B={title:g.title,minWidth:360,minHeight:220,onShow:function(){var b=this;b.data=j.fire("scaytDialog",{});b.options=b.data.scayt_control.option();b.chosed_lang=b.sLang=b.data.scayt_control.sLang;if(!b.data||!b.data.scayt||!b.data.scayt_control)alert("Error loading application service"),b.hide();else{var a=0;s?b.data.scayt.getCaption(j.langCode||"en",function(e){0'+h["button_"+d[c]]+"");f.getById("dic_info_"+a).setHtml(h.dic_info)}if(1== +l[0])for(c in v)d="label_"+v[c],g=f.getById(d+"_"+a),"undefined"!=typeof g&&("undefined"!=typeof h[d]&&"undefined"!=typeof k.options[v[c]])&&(g.setHtml(h[d]),g.getParent().$.style.display="block");d='

'+h.version+window.scayt.getAboutInfo().version.toString()+"

"+h.about_throwt_copy+"

";f.getById("scayt_about_"+a).setHtml(d);d=function(a,b){var c=f.createElement("label");c.setAttribute("for","cke_option"+a);c.setStyle("display", +"inline");c.setHtml(b[a]);k.sLang==a&&(k.chosed_lang=a);var d=f.createElement("div"),e=CKEDITOR.dom.element.createFromHtml('');e.on("click",function(){this.$.checked=true;k.chosed_lang=a});d.append(e);d.append(c);return{lang:b[a],code:a,radio:d}};if(1==l[1]){for(c in e.rtl)i[i.length]=d(c,e.ltr);for(c in e.ltr)i[i.length]=d(c,e.ltr);i.sort(function(a, +b){return b.lang>a.lang?-1:1});e=f.getById("scayt_lcol_"+a);d=f.getById("scayt_rcol_"+a);for(c=0;cq4ZMK7AWs*^5RHjfCs=bGFyJ}5rCi$0g;Eiyc$vVI-oU!%8itj<4gTe~DWM4flGr|! literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_blockquote.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_blockquote.png new file mode 100644 index 0000000000000000000000000000000000000000..cae3aec621af5da1a22171d6c955a06d45e03344 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?p!3-puF6poUDYgKg5Z8u=hX4QnKfl(y1}MT* z666>BpW*3t11}&i#?!?yMC1I~N#1-6iX6`I@9SSieh55%L@`H3tj*1vyXn?JTP=h1 zq7yq#inQ1U$#A%{JZas0Y|*Yj-mdKI;Vst0CM~$$^ZZW literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h1.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h1.png new file mode 100644 index 0000000000000000000000000000000000000000..3a64347350e5a48d2702f2fc4d436dfb5524b3a8 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^fBpW*3t11}&?&C|s(MB;LCf(tv(kuC#=47L(MHnu%k5)vC;DY>yMnpz<~Nr#D{ Y!iwS9`#nLcfI1jFUHx3vIVCg!04>HO?EnA( literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h2.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h2.png new file mode 100644 index 0000000000000000000000000000000000000000..8062ebe8e4b80bfae9dba6f1cbc84b7c2b555976 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^fBpW*3t11}&?*VDx@L?S#n!G)dYNSA?w0P`#k=BC3P2N_qUJBT-4c=7DO8doF9 fNNuhK(>NH)c^ICE+osk7H8Oa*`njxgN@xNASv4n& literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h3.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h3.png new file mode 100644 index 0000000000000000000000000000000000000000..5b6a4030284aace8cfa05e67b37966b86355b2aa GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^fBpW*3t11}&?%hSa%L?S#n!G)dYNSA?w0P`#k=BC3P2N_qUA6V8c*n1$0ZBpW*3t11}&?$J50zL?S#n;RplI5pF|=3^ukBMK(7kCkKYhy=%G{bsE!bmPKkf dt!S9##L&E&;e&1D*BGEa22WQ%mvv4FO#lL=CawSg literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h5.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h5.png new file mode 100644 index 0000000000000000000000000000000000000000..e153de09988a289dff08d61d489c3c7338b593c9 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^fBpW*3t11}&?$J50zL?S#n!G)dYNS8r_0JFe?&V=A*6{bgq3QHsnEjWrVTveFe e%(Oz4iJ@cy!$Tj3Ri}XZ7(8A5T-G@yGywnxt0t@f literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h6.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_h6.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d993a9d238e58a8116cc24120c3769f6e239fa GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^fBpW*3t11}&?!_&nvL}F@kf(tv(kuC!V0p?j8%uUS#jzP>U3QZERJQZ)0&Yxv* ZVJKb9@F*b4cN0(#gQu&X%Q~loCICblBq#s? literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_p.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_p.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6035d209b9821cb749ae4dfae48b560cd5e385 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp@K+Mm<3?w=JZgmAxYymzYt_=+h|NsAgeyw*6P=u)@ z$S?Rm!_(~sUO=9lr;B3M1&>3+5$Ci8pAABUjyE$GRWf)gF>JMO?|24O O$>8bg=d#Wzp$PysVj{=@ literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_pre.png b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/showblocks/images/block_pre.png new file mode 100644 index 0000000000000000000000000000000000000000..d11a0fffbe66e209b8db4b1ef18ce95960743114 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^VnEE#!3-p?Z$2Ldq}T#{LR=df8vg(P|NL6-8lVVM zNswRge}<>q4ZMIneNPw15Q*^QgdU2@V209Ek!=f;}v)6L}p2dBgj&IOGy1 g@NDunVAO48-1Co7KKYsRW1v'+a.options+"",'
"],l=h.length,a=0;a');var m="cke_smile_label_"+a+"_"+CKEDITOR.tools.getNextNumber();d.push('");a%g==g-1&&d.push("")}if(a");d.push("")}d.push("
"); +e={type:"html",id:"smileySelector",html:d.join(""),onLoad:function(a){i=a.sender},focus:function(){var a=this;setTimeout(function(){a.getElement().getElementsByTag("a").getItem(0).focus()},0)},onClick:k,style:"width: 100%; border-collapse: separate;"};return{title:f.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[e]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/angel_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/angel_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cf4894758f019612996cb5bd2a716e2a81ec1fc GIT binary patch literal 465 zcmV;?0WSVWNk%w1VH5xq0M$PL{lzEPm>m7K8Ln>^|JO!qF{At9X#BAx{?0`Dx;)aD zGyl~%>82e2z90Yp|NFit|Kn8uvlaW|lKt_;{Oh&;_t^j7P5=7m^4DGbv@HG3T-nEZ z{_mje&v%|^4Ex`GiCPT6P890YrTn}u`lurR{r3OPF8=-R|JrKb$CCfoC-ApP`tsxb z!Zp;hXZ5ii_qiX=v6}tKJogD&popkQ#;>n3v*QYSisZ#&!g!}sV{QLd?|NHch zEC2uhA^8LW002J#EC2ui02BZe000K=z@KnPEEkt{;i9a;a1( zsLX-1a&0`o5$WfGM{2lt0F@K+f6dMW+1 zOZb&h_JTrrPz(8+KkT}W z4-Zyb9DL7*ga9!v9srB@Hyv1Gi;P95*6|+F2?2EsWIJ6369xt$0308RiUJG_LjwyU zGA9%;2_6{~E;b|>1O$}}8X71R85Sd-HyR`e1Ok-@4-XX;2^J+5DjOR*2n7hYZwwC{ zBO!1~_$vI}!m2+6^%xARsIT8+Ani5)u~;6A=0kG$sWF l*)G8PE}06T|mq1*rf literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/broken_heart.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/broken_heart.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6d0166a47735697f12678ffb1a08a1a7200968b GIT binary patch literal 192 zcmZ?wbhEHb6k!ly*v!qaMW5-RKhJG1uA`PLmmS$YHtM{qQh%MV@GMH`b&ABJ5WfHa z|1%%~#h)yU3=G^1Iv_ES84N7B1t&dM@3nZmz)4`Lq8#Vb$|eUN*X#)$C3RYcI%~PT zWqogKk9jz?<75ppLqg&SK|!v_Q_Ety++1HUv98hMODHgWwOC8N)5K}_3f@WSr=k`z j?0o3$&8|}U*w|FGP?9k}PO7Q7L!`31uYW?nAcHjkUg|+l literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/confused_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/confused_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..a52db7a4e5c61690dfd5e8485ef9eb0af1d69a68 GIT binary patch literal 464 zcmV;>0WbbXNk%w1VH5xq0M$PLyoVdum>K`mJOAZd|Ns1}b`|iZ7@KDe{^eu;vlaj1 zQvbFV|KLsk+erW4Q2)ar|Gyvp{qOj&8UOm{|KeAPS`7coEPYkF|JXtQ&N2JqlKbC% zYA~hz>$U&gN0)NF`?MMU=xWWo-u=#8{@q&o^5eay)c(aV^|2lQ?1cWe8UFX!|KCdP z=;Hpm9Os}I{?tSNafrI6eI-c9(j9N*OK|JrK(@x{uN zF8}}kA^8LW002J#EC2ui02BZe000K3*4k-i|92W#E zJuMs@9}yZ5e?pN2A|E0I2ptn97bX!K5D7yuAuBWy1QP-R8Y^=pH!iY53Ihxj8zdPR z7#SxcBPT8@!#@}-9tb2bySvg0DhmnK4j9=KGXMnuF98eh;*UQW83H~P6$SVe2R1ej z)r2s3@Swm810W0lI8Xrqhy?NkLO>xw0tgTi0vsp+5eq>b6f2I4XoR4+aRHsET*;D1 G5CA*YUCMv} literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/cry_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/cry_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ef6ba4fb5c4b06e3a9162a55c92623f547e8a09 GIT binary patch literal 468 zcmV;_0W1DTNk%w1VH5xq0M$PL|K(hjWDft}OxLF{{@g_W-%6==7W}#>`m-6;m>cM^ zE$OBl|Kd{rz8(Mn{{O@)|JFMFjSHQ&dQ|LkyB8UF8}*QYT5+G_9X_}RyL=D$Ge z%1ry;ef`c{=-A8m!y@#_Bmd4L_w@Py?1bmYV(f_}?az0ygLwV!z5mWJ`uYF*s3P&Y zG5`PnA^8LW002J#EC2ui02BZe000Kjz@KnPEEIu(gT z6f2A>3N?`dJPI5hmqQdTBQy#n5Hc_dusR#1LKG<+A_));J0~0^2`{rn0}U5>GXiWe z7YiN>v_B384FU!RY#9Xw9}+zWMLQYSHvkOh784Q@7~n+&9~T+`^z<5*(Lxa(9uFD_ e03TF1aDY!76DBZpSV*v7lOGiZHgrcM2mm`bZN3Ho literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embaressed_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embaressed_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9cedc56bdb0cdd234679cceabafc9256bc2852c GIT binary patch literal 442 zcmV;r0Y&~tNk%w1VH5xq0M$PL_lh{u$ngEPD*xnD|JOSG_~`wy7uuK^{zrF zIRF3u{pV@_%qjlNH~;2b?db6S&P0@F6#w8&|J_GwFs1&x9{<=viCPT$s3Q24QTdxc zc~A@f@1XpYG5xJt|G^mlz7qfb`}(Un=D$Gu;*#gcV*m0_`lm$wv`f^pXRdb?_JTsn zlrH$OA-|n;?!hzu_t^i}C+DCT{p2>eha&X8YyaXv|Lju#?p^BCrT^M$``>;3)I<9D z|NsC0A^8LW002J#EC2ui02BZe000Kpz@KnPEEks*DGD_$0vpuSZnh)T8wVU57&93j!v;tc76Jn5><0!e83yHx k76Q6hfnkL{1pcf9EXL44LMK9s89?X|qQ#3Civ$4xJDD%WfB*mh literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embarrassed_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/embarrassed_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9cedc56bdb0cdd234679cceabafc9256bc2852c GIT binary patch literal 442 zcmV;r0Y&~tNk%w1VH5xq0M$PL_lh{u$ngEPD*xnD|JOSG_~`wy7uuK^{zrF zIRF3u{pV@_%qjlNH~;2b?db6S&P0@F6#w8&|J_GwFs1&x9{<=viCPT$s3Q24QTdxc zc~A@f@1XpYG5xJt|G^mlz7qfb`}(Un=D$Gu;*#gcV*m0_`lm$wv`f^pXRdb?_JTsn zlrH$OA-|n;?!hzu_t^i}C+DCT{p2>eha&X8YyaXv|Lju#?p^BCrT^M$``>;3)I<9D z|NsC0A^8LW002J#EC2ui02BZe000Kpz@KnPEEks*DGD_$0vpuSZnh)T8wVU57&93j!v;tc76Jn5><0!e83yHx k76Q6hfnkL{1pcf9EXL44LMK9s89?X|qQ#3Civ$4xJDD%WfB*mh literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/envelope.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/envelope.gif new file mode 100644 index 0000000000000000000000000000000000000000..94e0b1fa59d04474bad8443fdc072c41f1fc905e GIT binary patch literal 426 zcmZ?wbhEHb6k!lyxT?YM?~>2||NrmL6nnlv;@|baw<}Hmyx#ilu+6JQI`22?JesZa zdbRw&Gaesz8UEN|{bgVFt@-l*&O7`)Y4dcW?*2C6Z`;-W|NZu1nZ)l$lm31@`eD20 zv;7ViCWv2OZg6Uf-oLw1k5@YU`t+Z^ zfkA^o2V@w?PYi6w9i|j`=t%XSc(P$ZfC!gYQep#x?ebHZ3sYY7adj|Wk*G^CTJE6G zaxg>SgQ8Poh0PU}t#$#P8g0ySY*}Jr)m02U^-fHje9cvCA&h(so!uHt>^$rf*tpr1 z#KqZJ7?_>;rcR6HTq?xP%q7ge!ikS_8V@t?(rFC5%*+Bz-rUnf**TXnu$(){bkvFU zIPcE=`I$AvFnO*1s~ zDOsr2A=tOzwkOY)_z$Ae3=EU|*mtzNoELC1aW^a1>~rd>j&32v4|R^N35e*9IP=2R bBm2VFA8He>=d0A!3uiU8wzW$NGFSrun#)1b literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/kiss.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/kiss.gif new file mode 100644 index 0000000000000000000000000000000000000000..70e52551417b6d1c551a5217f837e71674118695 GIT binary patch literal 241 zcmZ?wbhEHb6k!lyI3mLEIz{4Hl+bQB)&qVbuk#gNPfR`*tN$p3?|iVp{RD;Gq3Zwt z|2q>Ucd|2Lcd^(1|9}4d{c}4@=iJ6wudXcp|NlP&A)xq^g^>Yhl@3TD$W8{8OQ>PKUo+V7<3tQK)OMGVqoh%Fs;BtN2=dLnZbdFgQwT6&@*Kl6Z1ud zfC`?q#~7X;n!zEUlW!!DF~>t(ec^671256f3MTqm|H8{e+1c1QSh!hry}4YOm^nE7 z*;%wZJaw5gTiCfZ zRl4rz;(1UD{mxwe{qdZ2F#Y5<+M74|^y>5R`}Y0+`I|r3$FJk5K;^M5``>-{xgXTC zXaE2IA^8LW002J#EC2ui02BZe000Kyz@KnPEE93mJleFmOUi911oFEeA6`37P%2z z0?h(6DJdEf$3F`sB@qK9ItMi-4-XpS6=Fgd6cHsGCxA5o0yrBL)j}2+7$hj|3NA7a tDCn6Rat}j~4<>RP5FkR}6$}$Z2w(%iVUu$h06d^q@1n<#Ab$h_06QGh!|nh8 literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/regular_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/regular_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5bc34be362f6774593dda685a0e6b6ddd963dfd GIT binary patch literal 450 zcmV;z0X_alNk%w1VH5xq0M$PL{pX9mh8O?kTd|Fx|L14_-c$LzC;#G7{k9tawif^Y z{{P}h|KCgh!y*6ONB`PJ|FRSQx*h+s75?v_iCPS5Fr|@W589s}|H~}=>$U#(*#F%_ zo@fmJ{`&Q?9skxn{>CQ%;#dFNJNC*n|NZv=z99SGeg4u+{{8&_&Lhx}7yso|{<|6f z&N1%6GyeVW^YQ!5yWaoULauid=-A8q;&J=_|9w@uy{FXw=SKh1H0HlRrI6c@VVRe5 zz5oCJA^8LW002J#EC2ui02BZe000Kxz@KnPEEVjE9cUBr_ohz>dP?A{ZDT4Im>1x(KP6 zN)A=S4J9oy5eNwh%Rd4iTO%q93l0n30oM?3KOZd{I}`yI@BtJT5)j!!ZWu1|791A+ s$|Rt}7tO#73lu1Dh#)~=7B?j#c<|8Bp%a1)JlK82e1SN^^r|I$1EA)I_y``>;3_t^gLp#T2*`tsxd z`seP!Gw9gMy{FXWu`QQt8Tqgk%9Jku(lr0uNB`R}v4eQ(<@f*n_VuwH{Oh&awLFw+ ztN;K1A^8LW002J#EC2ui02BZe000K*z@KnPEEqrhw~o=Hn2lCdxh zHY;)wNldtw#iLVkIIhshM59S$zP3uuJ%UqsrJ|6@(B?K@WA1j`pLLw771hpg%8!QAXD=8NPus;kL3nVQ(B^3z) zDk=dcz`+$v2?ZS(*ccT60|&1|6&()~7A`U;5)v^02N2$lKW-v45+3&G0s{~Y!9oTA z4g^R*5F!Ku2?7rAgC}IcfC0ZQTmZ0R#zHI?AV5%{;DE;l42@_U>G6rllPI4A0RTIR CY|IM) literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/shades_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/shades_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4540175035281da7afa2b185641392121bde669 GIT binary patch literal 449 zcmV;y0Y3gmNk%w1VH5xq0M$PL|JOpBY7_tCRQAI>sCF0s-c$eLK>y%O|K(f%(>vXq z8~*&i_3>{9K|ci6|TYA~hLvuD4Zbm+J@|MYL#n>YX5JMO_VkYSmcXLio9n&YWJv4eR3 zvJ?Kd8S9=1|LIB5sZ#Ff;`Of-_q7?nh7AN}Mu{<S z11BdJ7dK>z?d7Ms3Y literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/teeth_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/teeth_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d734d15486da5ebf1286f634eac6773e7e6e297 GIT binary patch literal 442 zcmV;r0Y&~tNk%w1VH5xq0M$PLZZn^eV-Nq$H2&sg{N#rJ*+c%_TL1t5|K(f%wG{u= zJlU=`|NH9y!zcgZQUBmg|KCdfy&?bo_WbL$u6Gpw;#b(mudRtb_w@Py#HCC#xCXE@_kjh|Nr~`@1V`Q-v8!N{?9JGqalCx2Hu)&{_m2{+m)vO_Syf~Vg3J-^}q8DzgAoB zY*#upMep%ShexxO{+;o-FhTs)BAxp)#r~eOSywLddLGBG~|BNrQG?N7|#Ke;j?Xb!aB)Qr(# zVSXm~p~tJ6!NH+GS8r3RbNLPq5v56m2?_!tT5`=Mh8#EENAjiI)MMGy(7@rIn^)h+ zz{SqN!7T2~$&)K6#vm10-o@1KB*`PpBP!3wH+5zi*92xEQC>dYbz*{C5^QYj63)!b z?84Ig{JetfEbQBQik!HZcz6#8@vv};a0*=GIO)X7B)fn`MDhyD?wc;GtjsL0UM0VM J=jO;@4FGr*ZsY&} literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tongue_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tongue_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2e657fa323f04ac09ecbe2900ad1351c1e2367f GIT binary patch literal 446 zcmV;v0YUypNk%w1VH5xq0M$PL|K??uWe$s03;fzmx`!YC|Ni~574xeW|JFVC%|vT4 zqyM)X|N7;zO$-0!TmRrq?dbUayBYt@DF5P7|Jp^$UsharxLs|J_H$IRyT`Am5o5{qe=$$C7#HB^ zi6!6E?f=d(=-A8j(o6sJTL0`)|JrK%;*$T^LjT`T|K?HUu`TGhH`vFo|I#$WTo0FP z8UO$PA^8LW002J#EC2ui02BZe000Ktz@KnPEE^$ZJ}wu^Wb#NN9?j>(!L?8+ zh^z5w0hk?L5}1d<5}^zb2nFZ>7==OxgDKuU9(frKfq?}yZ9@+L1uhB-1t=K|5DF>~ zAqxwN02w=vAvFjhDUUEBCYwTw7C169F9Q}75xnX o=QOEP6sAQ#avGAQ%Yxv*3UL}VEo`z5frb+jDQeuvu}BaAJJJrr?*IS* literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tounge_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/tounge_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2e657fa323f04ac09ecbe2900ad1351c1e2367f GIT binary patch literal 446 zcmV;v0YUypNk%w1VH5xq0M$PL|K??uWe$s03;fzmx`!YC|Ni~574xeW|JFVC%|vT4 zqyM)X|N7;zO$-0!TmRrq?dbUayBYt@DF5P7|Jp^$UsharxLs|J_H$IRyT`Am5o5{qe=$$C7#HB^ zi6!6E?f=d(=-A8j(o6sJTL0`)|JrK%;*$T^LjT`T|K?HUu`TGhH`vFo|I#$WTo0FP z8UO$PA^8LW002J#EC2ui02BZe000Ktz@KnPEE^$ZJ}wu^Wb#NN9?j>(!L?8+ zh^z5w0hk?L5}1d<5}^zb2nFZ>7==OxgDKuU9(frKfq?}yZ9@+L1uhB-1t=K|5DF>~ zAqxwN02w=vAvFjhDUUEBCYwTw7C169F9Q}75xnX o=QOEP6sAQ#avGAQ%Yxv*3UL}VEo`z5frb+jDQeuvu}BaAJJJrr?*IS* literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..77098821c622975362f3afbc4e83a515f88dc814 GIT binary patch literal 452 zcmV;#0XzOjNk%w1VH5xq0M$PL|J6JG>WKH(QvS3R|Ns8~`se@JME>b>{mnA&s2cvt zSoXIj|KLrPXcqp$CH}@P|KwEv;Yt3t8UM>H_^=p>S`7X1#s2T0zlIa&xHtH+9QCms z{<{4nlrMZV9%9Jke>-hWMee23h|JW-0>$U&RBbRc$&AZ*||G^mU!88B24FBIsqI4PYx-s|k`Tza%=D$Gy=3VE=V)f8O{?tRzkQe*n zWdHyFA^8LW002J#EC2ui02BZe000Kzz@KnPEEEg~i&As#4<4yHm85CIpv0RjjL76kr%>69@n^86O`Q_!!_6)m=_(@o3#G=M=QbG<10suQ9l+BC) literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/wink_smile.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/smiley/images/wink_smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..b21029548f7d4b48f9a0237e7e89a075750a4abf GIT binary patch literal 458 zcmV;*0X6E^0JL{_-^Ugy4&p`IW zJpcdyA^8LW002J#EC2ui02BZe000K(z@KnPEEZb5*x`vp%Gy=oX~>D;Gq#B z8pq^XgeDA@hoNxd`EHYOF`0fmEGPOA8IoAO{OE z3mm->2qFU;!wA+60U6B>5JM3W1O^=y0?`BkI{^U<5RE??8WA`E AT>t<8 literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..ba95622 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt @@ -0,0 +1,20 @@ +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 118 Missing: 0 +cy.js Found: 118 Missing: 0 +de.js Found: 118 Missing: 0 +el.js Found: 16 Missing: 102 +eo.js Found: 118 Missing: 0 +et.js Found: 31 Missing: 87 +fa.js Found: 24 Missing: 94 +fi.js Found: 23 Missing: 95 +fr.js Found: 118 Missing: 0 +hr.js Found: 23 Missing: 95 +it.js Found: 118 Missing: 0 +nb.js Found: 118 Missing: 0 +nl.js Found: 118 Missing: 0 +no.js Found: 118 Missing: 0 +tr.js Found: 118 Missing: 0 +ug.js Found: 39 Missing: 79 +zh-cn.js Found: 118 Missing: 0 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ar.js new file mode 100644 index 0000000..389f3c2 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ar.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص علي اليسار",rsquo:"علامة تنصيص علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash –",mdash:"Em dash —",iexcl:"علامة تعجب مقلوبة",cent:"رمز سنتيم",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين الياباني",brvbar:"خط عمودي مكسور",sect:"رمز الفصيلة",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/bg.js new file mode 100644 index 0000000..c68b979 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/bg.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ca.js new file mode 100644 index 0000000..907bb04 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ca.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Barra trencada",sect:"Símbol de secció",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Indicador ordinal femení", +laquo:"Signe de cometes angulars esquerra",not:"Símbol de negació",reg:"Símbol registrat",macr:"Macron",deg:"Símbol de grau",sup2:"Superíndex dos",sup3:"Superíndex tres",acute:"Accent agut",micro:"Símbol de micro",para:"Símbol de calderó",middot:"Punt volat",cedil:"Ce trencada",sup1:"Superíndex u",ordm:"Indicador ordinal masculí",raquo:"Signe de cometes angulars dreta",frac14:"Fracció vulgar un quart",frac12:"Fracció vulgar una meitat",frac34:"Fracció vulgar tres quarts",iquest:"Símbol d'interrogació invertit", +Agrave:"Lletra majúscula llatina A amb accent greu",Aacute:"Lletra majúscula llatina A amb accent agut",Acirc:"Lletra majúscula llatina A amb circumflex",Atilde:"Lletra majúscula llatina A amb titlla",Auml:"Lletra majúscula llatina A amb dièresi",Aring:"Lletra majúscula llatina A amb anell superior",AElig:"Lletra majúscula llatina Æ",Ccedil:"Lletra majúscula llatina C amb ce trencada",Egrave:"Lletra majúscula llatina E amb accent greu",Eacute:"Lletra majúscula llatina E amb accent agut",Ecirc:"Lletra majúscula llatina E amb circumflex", +Euml:"Lletra majúscula llatina E amb dièresi",Igrave:"Lletra majúscula llatina I amb accent greu",Iacute:"Lletra majúscula llatina I amb accent agut",Icirc:"Lletra majúscula llatina I amb circumflex",Iuml:"Lletra majúscula llatina I amb dièresi",ETH:"Lletra majúscula llatina Eth",Ntilde:"Lletra majúscula llatina N amb titlla",Ograve:"Lletra majúscula llatina O amb accent greu",Oacute:"Lletra majúscula llatina O amb accent agut",Ocirc:"Lletra majúscula llatina O amb circumflex",Otilde:"Lletra majúscula llatina O amb titlla", +Ouml:"Lletra majúscula llatina O amb dièresi",times:"Símbol de multiplicació",Oslash:"Lletra majúscula llatina O amb barra",Ugrave:"Lletra majúscula llatina U amb accent greu",Uacute:"Lletra majúscula llatina U amb accent agut",Ucirc:"Lletra majúscula llatina U amb circumflex",Uuml:"Lletra majúscula llatina U amb dièresi",Yacute:"Lletra majúscula llatina Y amb accent agut",THORN:"Lletra majúscula llatina Thorn",szlig:"Lletra minúscula llatina sharp s",agrave:"Lletra minúscula llatina a amb accent greu", +aacute:"Lletra minúscula llatina a amb accent agut",acirc:"Lletra minúscula llatina a amb circumflex",atilde:"Lletra minúscula llatina a amb titlla",auml:"Lletra minúscula llatina a amb dièresi",aring:"Lletra minúscula llatina a amb anell superior",aelig:"Lletra minúscula llatina æ",ccedil:"Lletra minúscula llatina c amb ce trencada",egrave:"Lletra minúscula llatina e amb accent greu",eacute:"Lletra minúscula llatina e amb accent agut",ecirc:"Lletra minúscula llatina e amb circumflex",euml:"Lletra minúscula llatina e amb dièresi", +igrave:"Lletra minúscula llatina i amb accent greu",iacute:"Lletra minúscula llatina i amb accent agut",icirc:"Lletra minúscula llatina i amb circumflex",iuml:"Lletra minúscula llatina i amb dièresi",eth:"Lletra minúscula llatina eth",ntilde:"Lletra minúscula llatina n amb titlla",ograve:"Lletra minúscula llatina o amb accent greu",oacute:"Lletra minúscula llatina o amb accent agut",ocirc:"Lletra minúscula llatina o amb circumflex",otilde:"Lletra minúscula llatina o amb titlla",ouml:"Lletra minúscula llatina o amb dièresi", +divide:"Símbol de divisió",oslash:"Lletra minúscula llatina o amb barra",ugrave:"Lletra minúscula llatina u amb accent greu",uacute:"Lletra minúscula llatina u amb accent agut",ucirc:"Lletra minúscula llatina u amb circumflex",uuml:"Lletra minúscula llatina u amb dièresi",yacute:"Lletra minúscula llatina y amb accent agut",thorn:"Lletra minúscula llatina thorn",yuml:"Lletra minúscula llatina y amb dièresi",OElig:"Lligadura majúscula llatina OE",oelig:"Lligadura minúscula llatina oe",372:"Lletra majúscula llatina W amb circumflex", +374:"Lletra majúscula llatina Y amb circumflex",373:"Lletra minúscula llatina w amb circumflex",375:"Lletra minúscula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"Símbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant", +asymp:"Gairebé igual a"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cs.js new file mode 100644 index 0000000..c9500d6 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cs.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Počáteční uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"Počáteční uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrácený vykřičník",cent:"Znak centu",pound:"Znak libry",curren:"Znak měny",yen:"Znak jenu",brvbar:"Přerušená svislá čára",sect:"Znak oddílu",uml:"Přehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo", +not:"Logistický zápor",reg:"Znak registrace",macr:"Pomlčka nad",deg:"Znak stupně",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Tečka uprostřed",cedil:"Ocásek vlevo",sup1:"Jednička jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"Obyčejný zlomek jedna čtvrtina",frac12:"Obyčejný zlomek jedna polovina",frac34:"Obyčejný zlomek tři čtvrtiny",iquest:"Znak obráceného otazníku", +Agrave:"Velké písmeno latinky A s čárkou nad vlevo",Aacute:"Velké písmeno latinky A s čárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokáněm",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvěma tečkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s čárkou nad vlevo",Eacute:"Velké písmeno latinky E s čárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokáněm", +Euml:"Velké písmeno latinky E s dvěma tečkami",Igrave:"Velké písmeno latinky I s čárkou nad vlevo",Iacute:"Velké písmeno latinky I s čárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokáněm",Iuml:"Velké písmeno latinky I s dvěma tečkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s čárkou nad vlevo",Oacute:"Velké písmeno latinky O s čárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokáněm",Otilde:"Velké písmeno latinky O s tildou", +Ouml:"Velké písmeno latinky O s dvěma tečkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O přeškrtnuté",Ugrave:"Velké písmeno latinky U s čárkou nad vlevo",Uacute:"Velké písmeno latinky U s čárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokáněm",Uuml:"Velké písmeno latinky U s dvěma tečkami",Yacute:"Velké písmeno latinky Y s čárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s čárkou nad vlevo",aacute:"Malé písmeno latinky a s čárkou nad vpravo", +acirc:"Malé písmeno latinky a s vokáněm",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvěma tečkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s čárkou nad vlevo",eacute:"Malé písmeno latinky e s čárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokáněm",euml:"Malé písmeno latinky e s dvěma tečkami",igrave:"Malé písmeno latinky i s čárkou nad vlevo",iacute:"Malé písmeno latinky i s čárkou nad vpravo", +icirc:"Malé písmeno latinky i s vokáněm",iuml:"Malé písmeno latinky i s dvěma tečkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s čárkou nad vlevo",oacute:"Malé písmeno latinky o s čárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokáněm",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvěma tečkami",divide:"Znak dělení",oslash:"Malé písmeno latinky o přeškrtnuté",ugrave:"Malé písmeno latinky u s čárkou nad vlevo", +uacute:"Malé písmeno latinky u s čárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokáněm",uuml:"Malé písmeno latinky u s dvěma tečkami",yacute:"Malé písmeno latinky y s čárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvěma tečkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokáněm",374:"Velké písmeno latinky Y s vokáněm",373:"Malé písmeno latinky w s vokáněm",375:"Malé písmeno latinky y s vokáněm",sbquo:"Dolní 9 uvozovka jednoduchá", +8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"Trojtečkový úvod",trade:"Obchodní značka",9658:"Černý ukazatel směřující vpravo",bull:"Kolečko",rarr:"Šipka vpravo",rArr:"Dvojitá šipka vpravo",hArr:"Dvojitá šipka vlevo a vpravo",diams:"Černé piky",asymp:"Téměř se rovná"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cy.js new file mode 100644 index 0000000..36a074f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/cy.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid", +reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig", +Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom", +Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild", +Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig", +aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom", +euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom", +otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda strôc",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod", +OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith", +diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/de.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/de.js new file mode 100644 index 0000000..73325db --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/de.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen", +reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex", +Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex", +Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent", +Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben", +aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema", +eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut", +ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex", +sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/el.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/el.js new file mode 100644 index 0000000..70f90d9 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/el.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","el",{euro:"Σύμβολο Ευρώ",lsquo:"Αριστερός χαρακτήρας μονού εισαγωγικού",rsquo:"Δεξιός χαρακτήρας μονού εισαγωγικού",ldquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",rdquo:"Δεξιός χαρακτήρας διπλού εισαγωγικού",ndash:"Παύλα en",mdash:"Παύλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"Σύμβολο σεντ",pound:"Σύμβολο λίρας",curren:"Σύμβολο συναλλαγματικής μονάδας",yen:"Σύμβολο Γιεν",brvbar:"Σπασμένη μπάρα",sect:"Σύμβολο τμήματος",uml:"Διαίρεση",copy:"Σύμβολο πνευματικών δικαιωμάτων", +ordf:"Feminine ordinal indicator",laquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",not:"Not sign",reg:"Σύμβολο σημάτων κατατεθέν",macr:"Μακρόν",deg:"Σύμβολο βαθμού",sup2:"Εκτεθειμένο δύο",sup3:"Εκτεθειμένο τρία",acute:"Οξεία",micro:"Σύμβολο μικρού",para:"Σύμβολο παραγράφου",middot:"Μέση τελεία",cedil:"Υπογεγραμμένη",sup1:"Εκτεθειμένο ένα",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Γνήσιο κλάσμα ενός τετάρτου",frac12:"Γνήσιο κλάσμα ενός δεύτερου",frac34:"Γνήσιο κλάσμα τριών τετάρτων", +iquest:"Ανάποδο θαυμαστικό",Agrave:"Λατινικό κεφαλαίο γράμμα A με βαρεία",Aacute:"Λατινικό κεφαλαίο γράμμα A με οξεία",Acirc:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Atilde:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Auml:"Λατινικό κεφαλαίο γράμμα A με διαλυτικά",Aring:"Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω",AElig:"Λατινικό κεφαλαίο γράμμα Æ",Ccedil:"Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη",Egrave:"Λατινικό κεφαλαίο γράμμα E με βαρεία",Eacute:"Λατινικό κεφαλαίο γράμμα E με οξεία",Ecirc:"Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ", +Euml:"Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά",Igrave:"Λατινικό κεφαλαίο γράμμα I με βαρεία",Iacute:"Λατινικό κεφαλαίο γράμμα I με οξεία",Icirc:"Λατινικό κεφαλαίο γράμμα I με περισπωμένη",Iuml:"Λατινικό κεφαλαίο γράμμα I με διαλυτικά ",ETH:"Λατινικό κεφαλαίο γράμμα Eth",Ntilde:"Λατινικό κεφαλαίο γράμμα N με περισπωμένη",Ograve:"Λατινικό κεφαλαίο γράμμα O με βαρεία",Oacute:"Λατινικό κεφαλαίο γράμμα O με οξεία",Ocirc:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη ",Otilde:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη", +Ouml:"Λατινικό κεφαλαίο γράμμα O με διαλυτικά",times:"Σύμβολο πολλαπλασιασμού",Oslash:"Λατινικό κεφαλαίο γράμμα O με μολυβιά",Ugrave:"Λατινικό κεφαλαίο γράμμα U με βαρεία",Uacute:"Λατινικό κεφαλαίο γράμμα U με οξεία",Ucirc:"Λατινικό κεφαλαίο γράμμα U με περισπωμένη",Uuml:"Λατινικό κεφαλαίο γράμμα U με διαλυτικά",Yacute:"Λατινικό κεφαλαίο γράμμα Y με οξεία",THORN:"Λατινικό κεφαλαίο γράμμα Thorn",szlig:"Λατινικό μικρό γράμμα απότομο s",agrave:"Λατινικό μικρό γράμμα a με βαρεία",aacute:"Λατινικό μικρό γράμμα a με οξεία", +acirc:"Λατινικό μικρό γράμμα a με περισπωμένη",atilde:"Λατινικό μικρό γράμμα a με περισπωμένη",auml:"Λατινικό μικρό γράμμα a με διαλυτικά",aring:"Λατινικό μικρό γράμμα a με δακτύλιο πάνω",aelig:"Λατινικό μικρό γράμμα æ",ccedil:"Λατινικό μικρό γράμμα c με υπογεγραμμένη",egrave:"Λατινικό μικρό γράμμα ε με βαρεία",eacute:"Λατινικό μικρό γράμμα e με οξεία",ecirc:"Λατινικό μικρό γράμμα e με περισπωμένη",euml:"Λατινικό μικρό γράμμα e με διαλυτικά",igrave:"Λατινικό μικρό γράμμα i με βαρεία",iacute:"Λατινικό μικρό γράμμα i με οξεία", +icirc:"Λατινικό μικρό γράμμα i με περισπωμένη",iuml:"Λατινικό μικρό γράμμα i με διαλυτικά",eth:"Λατινικό μικρό γράμμα eth",ntilde:"Λατινικό μικρό γράμμα n με περισπωμένη",ograve:"Λατινικό μικρό γράμμα o με βαρεία",oacute:"Λατινικό μικρό γράμμα o με οξεία ",ocirc:"Λατινικό πεζό γράμμα o με περισπωμένη",otilde:"Λατινικό μικρό γράμμα o με περισπωμένη ",ouml:"Λατινικό μικρό γράμμα o με διαλυτικά",divide:"Σύμβολο διαίρεσης",oslash:"Λατινικό μικρό γράμμα o με περισπωμένη",ugrave:"Λατινικό μικρό γράμμα u με βαρεία", +uacute:"Λατινικό μικρό γράμμα u με οξεία",ucirc:"Λατινικό μικρό γράμμα u με περισπωμένη",uuml:"Λατινικό μικρό γράμμα u με διαλυτικά",yacute:"Λατινικό μικρό γράμμα y με οξεία",thorn:"Λατινικό μικρό γράμμα thorn",yuml:"Λατινικό μικρό γράμμα y με διαλυτικά",OElig:"Λατινικό κεφαλαίο σύμπλεγμα ΟΕ",oelig:"Λατινικό μικρό σύμπλεγμα oe",372:"Λατινικό κεφαλαίο γράμμα W με περισπωμένη",374:"Λατινικό κεφαλαίο γράμμα Y με περισπωμένη",373:"Λατινικό μικρό γράμμα w με περισπωμένη",375:"Λατινικό μικρό γράμμα y με περισπωμένη", +sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Οριζόντια αποσιωπητικά",trade:"Σύμβολο εμπορικού κατατεθέν",9658:"Μαύρος δείκτης που δείχνει προς τα δεξιά",bull:"Κουκκίδα",rarr:"Δεξί βελάκι",rArr:"Διπλό δεξί βελάκι",hArr:"Διπλό βελάκι αριστερά-δεξιά",diams:"Μαύρο διαμάντι",asymp:"Σχεδόν ίσο με"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/en.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/en.js new file mode 100644 index 0000000..c973e03 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/en.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/eo.js new file mode 100644 index 0000000..f937dc0 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/eo.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno", +sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao", +Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo", +Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno", +szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao", +igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno", +uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo", +bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/es.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/es.js new file mode 100644 index 0000000..b1254c9 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/es.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","es",{euro:"Símbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Guión corto",mdash:"Guión medio largo",iexcl:"Signo de admiración invertido",cent:"Símbolo centavo",pound:"Símbolo libra",curren:"Símbolo moneda",yen:"Símbolo yen",brvbar:"Barra vertical rota",sect:"Símbolo sección",uml:"Diéresis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares", +not:"Signo negación",reg:"Signo de marca registrada",macr:"Guión alto",deg:"Signo de grado",sup2:"Superíndice dos",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracción ordinaria de un quarto",frac12:"Fracción ordinaria de una mitad",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina mayúscula con acento grave", +Aacute:"Letra A latina mayúscula con acento agudo",Acirc:"Letra A latina mayúscula con acento circunflejo",Atilde:"Letra A latina mayúscula con tilde",Auml:"Letra A latina mayúscula con diéresis",Aring:"Letra A latina mayúscula con aro arriba",AElig:"Letra Æ latina mayúscula",Ccedil:"Letra C latina mayúscula con cedilla",Egrave:"Letra E latina mayúscula con acento grave",Eacute:"Letra E latina mayúscula con acento agudo",Ecirc:"Letra E latina mayúscula con acento circunflejo",Euml:"Letra E latina mayúscula con diéresis", +Igrave:"Letra I latina mayúscula con acento grave",Iacute:"Letra I latina mayúscula con acento agudo",Icirc:"Letra I latina mayúscula con acento circunflejo",Iuml:"Letra I latina mayúscula con diéresis",ETH:"Letra Eth latina mayúscula",Ntilde:"Letra N latina mayúscula con tilde",Ograve:"Letra O latina mayúscula con acento grave",Oacute:"Letra O latina mayúscula con acento agudo",Ocirc:"Letra O latina mayúscula con acento circunflejo",Otilde:"Letra O latina mayúscula con tilde",Ouml:"Letra O latina mayúscula con diéresis", +times:"Signo de multiplicación",Oslash:"Letra O latina mayúscula con barra inclinada",Ugrave:"Letra U latina mayúscula con acento grave",Uacute:"Letra U latina mayúscula con acento agudo",Ucirc:"Letra U latina mayúscula con acento circunflejo",Uuml:"Letra U latina mayúscula con diéresis",Yacute:"Letra Y latina mayúscula con acento agudo",THORN:"Letra Thorn latina mayúscula",szlig:"Letra s latina fuerte pequeña",agrave:"Letra a latina pequeña con acento grave",aacute:"Letra a latina pequeña con acento agudo", +acirc:"Letra a latina pequeña con acento circunflejo",atilde:"Letra a latina pequeña con tilde",auml:"Letra a latina pequeña con diéresis",aring:"Letra a latina pequeña con aro arriba",aelig:"Letra æ latina pequeña",ccedil:"Letra c latina pequeña con cedilla",egrave:"Letra e latina pequeña con acento grave",eacute:"Letra e latina pequeña con acento agudo",ecirc:"Letra e latina pequeña con acento circunflejo",euml:"Letra e latina pequeña con diéresis",igrave:"Letra i latina pequeña con acento grave", +iacute:"Letra i latina pequeña con acento agudo",icirc:"Letra i latina pequeña con acento circunflejo",iuml:"Letra i latina pequeña con diéresis",eth:"Letra eth latina pequeña",ntilde:"Letra n latina pequeña con tilde",ograve:"Letra o latina pequeña con acento grave",oacute:"Letra o latina pequeña con acento agudo",ocirc:"Letra o latina pequeña con acento circunflejo",otilde:"Letra o latina pequeña con tilde",ouml:"Letra o latina pequeña con diéresis",divide:"Signo de división",oslash:"Letra o latina minúscula con barra inclinada", +ugrave:"Letra u latina pequeña con acento grave",uacute:"Letra u latina pequeña con acento agudo",ucirc:"Letra u latina pequeña con acento circunflejo",uuml:"Letra u latina pequeña con diéresis",yacute:"Letra u latina pequeña con acento agudo",thorn:"Letra thorn latina minúscula",yuml:"Letra y latina pequeña con diéresis",OElig:"Diptongo OE latino en mayúscula",oelig:"Diptongo oe latino en minúscula",372:"Letra W latina mayúscula con acento circunflejo",374:"Letra Y latina mayúscula con acento circunflejo", +373:"Letra w latina pequeña con acento circunflejo",375:"Letra y latina pequeña con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Viñeta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/et.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/et.js new file mode 100644 index 0000000..d6e875e --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/et.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jagamismärk",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Kaubamärgi märk",9658:"Black right-pointing pointer", +bull:"Kuul",rarr:"Nool paremale",rArr:"Topeltnool paremale",hArr:"Topeltnool vasakule",diams:"Black diamond suit",asymp:"Ligikaudu võrdne"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fa.js new file mode 100644 index 0000000..b32ff77 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fa.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت نقل قول دوتایی چپ",rdquo:"علامت نقل قول دوتایی راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"نشان سواگیری",copy:"نشان کپی رایت",ordf:"شاخص ترتیبی مونث",laquo:"اشاره چپ مکرر برای زاویه علامت نقل قول",not:"نشان ثبت نشده",reg:"نشان ثبت شده", +macr:"نشان خط بالای حرف",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"نشان محل بند",middot:"نقطه میانی",cedil:"سدیل",sup1:"بالانویس 1",ordm:"شاخص ترتیبی مذکر",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"واحد عامیانه 1/4",frac12:"واحد عامینه نصف",frac34:"واحد عامیانه 3/4",iquest:"علامت سوال معکوس",Agrave:"حرف A بزرگ لاتین با تلفظ غلیظ",Aacute:"حرف A بزرگ لاتین با تلفظ شدید",Acirc:"حرف A بزرگ لاتین با دور",Atilde:"حرف A بزرگ لاتین با صدای کامی", +Auml:"حرف A بزرگ لاتین با نشان سواگیری",Aring:"حرف A بزرگ لاتین با حلقه بالا",AElig:"حرف Æ بزرگ لاتین",Ccedil:"حرف C بزرگ لاتین با نشان سواگیری",Egrave:"حرف E بزرگ لاتین با تلفظ درشت",Eacute:"حرف E بزرگ لاتین با تلفظ زیر",Ecirc:"حرف E بزرگ لاتین با خمان",Euml:"حرف E بزرگ لاتین با نشان سواگیری",Igrave:"حرف I بزرگ لاتین با تلفظ درشت",Iacute:"حرف I بزرگ لاتین با تلفظ ریز",Icirc:"حرف I بزرگ لاتین با خمان",Iuml:"حرف I بزرگ لاتین با نشان سواگیری",ETH:"حرف لاتین بزرگ واکه ترتیبی",Ntilde:"حرف N بزرگ لاتین با مد", +Ograve:"حرف O بزرگ لاتین با تلفظ درشت",Oacute:"حرف O بزرگ لاتین با تلفظ ریز",Ocirc:"حرف O بزرگ لاتین با خمان",Otilde:"حرف O بزرگ لاتین با مد",Ouml:"حرف O بزرگ لاتین با نشان سواگیری",times:"نشان ضربدر",Oslash:"حرف O بزرگ لاتین با میان خط",Ugrave:"حرف U بزرگ لاتین با تلفظ درشت",Uacute:"حرف U بزرگ لاتین با تلفظ ریز",Ucirc:"حرف U بزرگ لاتین با خمان",Uuml:"حرف U بزرگ لاتین با نشان سواگیری",Yacute:"حرف Y بزرگ لاتین با تلفظ ریز",THORN:"حرف بزرگ لاتین خاردار",szlig:"حرف کوچک لاتین شارپ s",agrave:"حرف a کوچک لاتین با تلفظ درشت", +aacute:"حرف a کوچک لاتین با تلفظ ریز",acirc:"حرف a کوچک لاتین با خمان",atilde:"حرف a کوچک لاتین با صدای کامی",auml:"حرف a کوچک لاتین با نشان سواگیری",aring:"حرف a کوچک لاتین گوشواره دار",aelig:"حرف کوچک لاتین æ",ccedil:"حرف c کوچک لاتین با نشان سدیل",egrave:"حرف e کوچک لاتین با تلفظ درشت",eacute:"حرف e کوچک لاتین با تلفظ ریز",ecirc:"حرف e کوچک لاتین با خمان",euml:"حرف e کوچک لاتین با نشان سواگیری",igrave:"حرف i کوچک لاتین با تلفظ درشت",iacute:"حرف i کوچک لاتین با تلفظ ریز",icirc:"حرف i کوچک لاتین با خمان", +iuml:"حرف i کوچک لاتین با نشان سواگیری",eth:"حرف کوچک لاتین eth",ntilde:"حرف n کوچک لاتین با صدای کامی",ograve:"حرف o کوچک لاتین با تلفظ درشت",oacute:"حرف o کوچک لاتین با تلفظ زیر",ocirc:"حرف o کوچک لاتین با خمان",otilde:"حرف o کوچک لاتین با صدای کامی",ouml:"حرف o کوچک لاتین با نشان سواگیری",divide:"نشان بخش",oslash:"حرف o کوچک لاتین با میان خط",ugrave:"حرف u کوچک لاتین با تلفظ درشت",uacute:"حرف u کوچک لاتین با تلفظ ریز",ucirc:"حرف u کوچک لاتین با خمان",uuml:"حرف u کوچک لاتین با نشان سواگیری",yacute:"حرف y کوچک لاتین با تلفظ ریز", +thorn:"حرف کوچک لاتین خاردار",yuml:"حرف y کوچک لاتین با نشان سواگیری",OElig:"بند بزرگ لاتین OE",oelig:"بند کوچک لاتین oe",372:"حرف W بزرگ لاتین با خمان",374:"حرف Y بزرگ لاتین با خمان",373:"حرف w کوچک لاتین با خمان",375:"حرف y کوچک لاتین با خمان",sbquo:"نشان نقل قول تکی زیر-9",8219:"نشان نقل قول تکی high-reversed-9",bdquo:"نقل قول دوتایی پایین-9",hellip:"حذف افقی",trade:"نشان تجاری",9658:"نشانگر سیاه جهت راست",bull:"گلوله",rarr:"فلش راست",rArr:"فلش دوتایی راست",hArr:"فلش دوتایی چپ راست",diams:"نشان الماس سیاه", +asymp:"تقریبا برابر با"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fi.js new file mode 100644 index 0000000..33f76c2 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fi.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..92c5afc --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma", +Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe", +Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma", +eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe", +373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr.js new file mode 100644 index 0000000..7a275e4 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/fr.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron", +Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu", +Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron", +auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu", +ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe", +373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/gl.js new file mode 100644 index 0000000..c659249 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/gl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","gl",{euro:"Símbolo do euro",lsquo:"Comiña simple esquerda",rsquo:"Comiña simple dereita",ldquo:"Comiñas dobres esquerda",rdquo:"Comiñas dobres dereita",ndash:"Guión",mdash:"Raia",iexcl:"Signo de admiración invertido",cent:"Símbolo do centavo",pound:"Símbolo da libra",curren:"Símbolo de moeda",yen:"Símbolo do yen",brvbar:"Barra vertical rota",sect:"Símbolo de sección",uml:"Diérese",copy:"Símbolo de dereitos de autoría",ordf:"Indicador ordinal feminino",laquo:"Comiñas latinas, apertura", +not:"Signo negación",reg:"Símbolo de marca rexistrada",macr:"Guión alto",deg:"Signo de grao",sup2:"Superíndice dous",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice un",ordm:"Indicador ordinal masculino",raquo:"Comiñas latinas, peche",frac14:"Fracción ordinaria de un cuarto",frac12:"Fracción ordinaria de un medio",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina maiúscula con acento grave", +Aacute:"Letra A latina maiúscula con acento agudo",Acirc:"Letra A latina maiúscula con acento circunflexo",Atilde:"Letra A latina maiúscula con til",Auml:"Letra A latina maiúscula con diérese",Aring:"Letra A latina maiúscula con aro enriba",AElig:"Letra Æ latina maiúscula",Ccedil:"Letra C latina maiúscula con cedilla",Egrave:"Letra E latina maiúscula con acento grave",Eacute:"Letra E latina maiúscula con acento agudo",Ecirc:"Letra E latina maiúscula con acento circunflexo",Euml:"Letra E latina maiúscula con diérese", +Igrave:"Letra I latina maiúscula con acento grave",Iacute:"Letra I latina maiúscula con acento agudo",Icirc:"Letra I latina maiúscula con acento circunflexo",Iuml:"Letra I latina maiúscula con diérese",ETH:"Letra Ed latina maiúscula",Ntilde:"Letra N latina maiúscula con til",Ograve:"Letra O latina maiúscula con acento grave",Oacute:"Letra O latina maiúscula con acento agudo",Ocirc:"Letra O latina maiúscula con acento circunflexo",Otilde:"Letra O latina maiúscula con til",Ouml:"Letra O latina maiúscula con diérese", +times:"Signo de multiplicación",Oslash:"Letra O latina maiúscula con barra transversal",Ugrave:"Letra U latina maiúscula con acento grave",Uacute:"Letra U latina maiúscula con acento agudo",Ucirc:"Letra U latina maiúscula con acento circunflexo",Uuml:"Letra U latina maiúscula con diérese",Yacute:"Letra Y latina maiúscula con acento agudo",THORN:"Letra Thorn latina maiúscula",szlig:"Letra s latina forte minúscula",agrave:"Letra a latina minúscula con acento grave",aacute:"Letra a latina minúscula con acento agudo", +acirc:"Letra a latina minúscula con acento circunflexo",atilde:"Letra a latina minúscula con til",auml:"Letra a latina minúscula con diérese",aring:"Letra a latina minúscula con aro enriba",aelig:"Letra æ latina minúscula",ccedil:"Letra c latina minúscula con cedilla",egrave:"Letra e latina minúscula con acento grave",eacute:"Letra e latina minúscula con acento agudo",ecirc:"Letra e latina minúscula con acento circunflexo",euml:"Letra e latina minúscula con diérese",igrave:"Letra i latina minúscula con acento grave", +iacute:"Letra i latina minúscula con acento agudo",icirc:"Letra i latina minúscula con acento circunflexo",iuml:"Letra i latina minúscula con diérese",eth:"Letra ed latina minúscula",ntilde:"Letra n latina minúscula con til",ograve:"Letra o latina minúscula con acento grave",oacute:"Letra o latina minúscula con acento agudo",ocirc:"Letra o latina minúscula con acento circunflexo",otilde:"Letra o latina minúscula con til",ouml:"Letra o latina minúscula con diérese",divide:"Signo de división",oslash:"Letra o latina minúscula con barra transversal", +ugrave:"Letra u latina minúscula con acento grave",uacute:"Letra u latina minúscula con acento agudo",ucirc:"Letra u latina minúscula con acento circunflexo",uuml:"Letra u latina minúscula con diérese",yacute:"Letra y latina minúscula con acento agudo",thorn:"Letra Thorn latina minúscula",yuml:"Letra y latina minúscula con diérese",OElig:"Ligadura OE latina maiúscula",oelig:"Ligadura oe latina minúscula",372:"Letra W latina maiúscula con acento circunflexo",374:"Letra Y latina maiúscula con acento circunflexo", +373:"Letra w latina minúscula con acento circunflexo",375:"Letra y latina minúscula con acento circunflexo",sbquo:"Comiña simple baixa, de apertura",8219:"Comiña simple alta, de peche",bdquo:"Comiñas dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando á dereita",bull:"Viñeta",rarr:"Frecha á dereita",rArr:"Frecha dobre á dereita",hArr:"Frecha dobre da esquerda á dereita",diams:"Diamante negro",asymp:"Case igual a"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/he.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/he.js new file mode 100644 index 0000000..29c7398 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/he.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"סימן ציטוט יחיד שמאלי",rsquo:"סימן ציטוט יחיד ימני",ldquo:"סימן ציטוט כפול שמאלי",rdquo:"סימן ציטוט כפול ימני",ndash:"קו מפריד קצר",mdash:"קו מפריד ארוך",iexcl:"סימן קריאה הפוך",cent:"סנט",pound:"פאונד",curren:"מטבע",yen:"ין",brvbar:"קו שבור",sect:"סימן מקטע",uml:"שתי נקודות אופקיות (Diaeresis)",copy:"סימן זכויות יוצרים (Copyright)",ordf:"סימן אורדינאלי נקבי",laquo:"סימן ציטוט זווית כפולה לשמאל",not:"סימן שלילה מתמטי",reg:"סימן רשום", +macr:"מקרון (הגיה ארוכה)",deg:"מעלות",sup2:"2 בכתיב עילי",sup3:"3 בכתיב עילי",acute:"סימן דגוש (Acute)",micro:"מיקרו",para:"סימון פסקה",middot:"נקודה אמצעית",cedil:"סדיליה",sup1:"1 בכתיב עילי",ordm:"סימן אורדינאלי זכרי",raquo:"סימן ציטוט זווית כפולה לימין",frac14:"רבע בשבר פשוט",frac12:"חצי בשבר פשוט",frac34:"שלושה רבעים בשבר פשוט",iquest:"סימן שאלה הפוך",Agrave:"אות לטינית A עם גרש (Grave)",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde", +Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"אות לטינית Æ גדולה",Ccedil:"Latin capital letter C with cedilla",Egrave:"אות לטינית E עם גרש (Grave)",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"אות לטינית I עם גרש (Grave)",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis", +ETH:"אות לטינית Eth גדולה",Ntilde:"Latin capital letter N with tilde",Ograve:"אות לטינית O עם גרש (Grave)",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"סימן כפל",Oslash:"Latin capital letter O with stroke",Ugrave:"אות לטינית U עם גרש (Grave)",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis", +Yacute:"Latin capital letter Y with acute accent",THORN:"אות לטינית Thorn גדולה",szlig:"אות לטינית s חדה קטנה",agrave:"אות לטינית a עם גרש (Grave)",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"אות לטינית æ קטנה",ccedil:"Latin small letter c with cedilla",egrave:"אות לטינית e עם גרש (Grave)",eacute:"Latin small letter e with acute accent", +ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"אות לטינית i עם גרש (Grave)",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"אות לטינית eth קטנה",ntilde:"Latin small letter n with tilde",ograve:"אות לטינית o עם גרש (Grave)",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis", +divide:"סימן חלוקה",oslash:"Latin small letter o with stroke",ugrave:"אות לטינית u עם גרש (Grave)",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"אות לטינית thorn קטנה",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex", +373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"סימן ציטוט נמוך יחיד",8219:"סימן ציטוט",bdquo:"סימן ציטוט נמוך כפול",hellip:"שלוש נקודות",trade:"סימן טריידמארק",9658:"סמן שחור לצד ימין",bull:"תבליט (רשימה)",rarr:"חץ לימין",rArr:"חץ כפול לימין",hArr:"חץ כפול לימין ושמאל",diams:"יהלום מלא",asymp:"כמעט שווה"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hr.js new file mode 100644 index 0000000..f55749e --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hr.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskličnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana prečka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak", +reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja točka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hu.js new file mode 100644 index 0000000..52327ec --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/hu.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel", +reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel", +Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel", +Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű", +agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel", +icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel", +uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele", +9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/id.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/id.js new file mode 100644 index 0000000..7c7885a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/id.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/it.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/it.js new file mode 100644 index 0000000..5bc136f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/it.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte", +not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave", +Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso", +Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso", +Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S", +agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto", +ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto", +ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn", +yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale", +trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ja.js new file mode 100644 index 0000000..0bbee62 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ja.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ja",{euro:"ユーロ記号",lsquo:"左シングル引用符",rsquo:"右シングル引用符",ldquo:"左ダブル引用符",rdquo:"右ダブル引用符",ndash:"半角ダッシュ",mdash:"全角ダッシュ",iexcl:"逆さ感嘆符",cent:"セント記号",pound:"ポンド記号",curren:"通貨記号",yen:"円記号",brvbar:"上下に分かれた縦棒",sect:"節記号",uml:"分音記号(ウムラウト)",copy:"著作権表示記号",ordf:"女性序数標識",laquo:" 始め二重山括弧引用記号",not:"論理否定記号",reg:"登録商標記号",macr:"長音符",deg:"度記号",sup2:"上つき2, 2乗",sup3:"上つき3, 3乗",acute:"揚音符",micro:"ミクロン記号",para:"段落記号",middot:"中黒",cedil:"セディラ",sup1:"上つき1",ordm:"男性序数標識",raquo:"終わり二重山括弧引用記号", +frac14:"四分の一",frac12:"二分の一",frac34:"四分の三",iquest:"逆疑問符",Agrave:"抑音符つき大文字A",Aacute:"揚音符つき大文字A",Acirc:"曲折アクセントつき大文字A",Atilde:"チルダつき大文字A",Auml:"分音記号つき大文字A",Aring:"リングつき大文字A",AElig:"AとEの合字",Ccedil:"セディラつき大文字C",Egrave:"抑音符つき大文字E",Eacute:"揚音符つき大文字E",Ecirc:"曲折アクセントつき大文字E",Euml:"分音記号つき大文字E",Igrave:"抑音符つき大文字I",Iacute:"揚音符つき大文字I",Icirc:"曲折アクセントつき大文字I",Iuml:"分音記号つき大文字I",ETH:"[アイスランド語]大文字ETH",Ntilde:"チルダつき大文字N",Ograve:"抑音符つき大文字O",Oacute:"揚音符つき大文字O",Ocirc:"曲折アクセントつき大文字O",Otilde:"チルダつき大文字O",Ouml:" 分音記号つき大文字O", +times:"乗算記号",Oslash:"打ち消し線つき大文字O",Ugrave:"抑音符つき大文字U",Uacute:"揚音符つき大文字U",Ucirc:"曲折アクセントつき大文字U",Uuml:"分音記号つき大文字U",Yacute:"揚音符つき大文字Y",THORN:"[アイスランド語]大文字THORN",szlig:"ドイツ語エスツェット",agrave:"抑音符つき小文字a",aacute:"揚音符つき小文字a",acirc:"曲折アクセントつき小文字a",atilde:"チルダつき小文字a",auml:"分音記号つき小文字a",aring:"リングつき小文字a",aelig:"aとeの合字",ccedil:"セディラつき小文字c",egrave:"抑音符つき小文字e",eacute:"揚音符つき小文字e",ecirc:"曲折アクセントつき小文字e",euml:"分音記号つき小文字e",igrave:"抑音符つき小文字i",iacute:"揚音符つき小文字i",icirc:"曲折アクセントつき小文字i",iuml:"分音記号つき小文字i",eth:"アイスランド語小文字eth", +ntilde:"チルダつき小文字n",ograve:"抑音符つき小文字o",oacute:"揚音符つき小文字o",ocirc:"曲折アクセントつき小文字o",otilde:"チルダつき小文字o",ouml:"分音記号つき小文字o",divide:"除算記号",oslash:"打ち消し線つき小文字o",ugrave:"抑音符つき小文字u",uacute:"揚音符つき小文字u",ucirc:"曲折アクセントつき小文字u",uuml:"分音記号つき小文字u",yacute:"揚音符つき小文字y",thorn:"アイスランド語小文字thorn",yuml:"分音記号つき小文字y",OElig:"OとEの合字",oelig:"oとeの合字",372:"曲折アクセントつき大文字W",374:"曲折アクセントつき大文字Y",373:"曲折アクセントつき小文字w",375:"曲折アクセントつき小文字y",sbquo:"シングル下引用符",8219:"左右逆の左引用符",bdquo:"ダブル下引用符",hellip:"三点リーダ",trade:"商標記号",9658:"右黒三角ポインタ",bull:"黒丸", +rarr:"右矢印",rArr:"右二重矢印",hArr:"左右二重矢印",diams:"ダイヤ",asymp:"漸近"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ku.js new file mode 100644 index 0000000..af275c9 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ku.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ", +ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار", +Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری", +Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری", +times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری", +atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ", +icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار", +uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری", +375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/lv.js new file mode 100644 index 0000000..3f76e26 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/lv.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zīme",lsquo:"Kreisā vienkārtīga pēdiņa",rsquo:"Labā vienkārtīga pēdiņa",ldquo:"Kreisā dubult pēdiņa",rdquo:"Labā dubult pēdiņa",ndash:"En svītra",mdash:"Em svītra",iexcl:"Apgriezta izsaukuma zīme",cent:"Centu naudas zīme",pound:"Sterliņu mārciņu naudas zīme",curren:"Valūtas zīme",yen:"Jenu naudas zīme",brvbar:"Vertikāla pārrauta līnija",sect:"Paragrāfa zīme",uml:"Diakritiska zīme",copy:"Autortiesību zīme",ordf:"Sievišķas kārtas rādītājs", +laquo:"Kreisā dubult stūra pēdiņu zīme",not:"Neparakstīts",reg:"Reģistrēta zīme",macr:"Garumzīme",deg:"Grādu zīme",sup2:"Augšraksts divi",sup3:"Augšraksts trīs",acute:"Akūta uzsvara zīme",micro:"Mikro zīme",para:"Rindkopas zīme ",middot:"Vidējs punkts",cedil:"Āķītis zem burta",sup1:"Augšraksts viens",ordm:"Vīrišķīgas kārtas rādītājs",raquo:"Labā dubult stūra pēdiņu zīme",frac14:"Vulgāra frakcija 1/4",frac12:"Vulgāra frakcija 1/2",frac34:"Vulgāra frakcija 3/4",iquest:"Apgriezta jautājuma zīme",Agrave:"Lielais latīņu burts A ar uzsvara zīmi", +Aacute:"Lielais latīņu burts A ar akūtu uzsvara zīmi",Acirc:"Lielais latīņu burts A ar diakritisku zīmi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zīmi",Aring:"Lielais latīņu burts A ar aplīti augšā",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar āķīti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akūtu uzsvara zīmi",Ecirc:"Lielais latīņu burts E ar diakritisko zīmi",Euml:"Lielais latīņu burts E ar diakritisko zīmi", +Igrave:"Lielais latīņu burts I ar uzsvaras zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi", +times:"Reizināšanas zīme ",Oslash:"Lielais latīņu burts O ar iesvītrojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zīmi",Uacute:"Lielais latīņu burts U ar akūto uzsvars zīmi",Ucirc:"Lielais latīņu burts U ar diakritisko zīmi",Uuml:"Lielais latīņu burts U ar diakritisko zīmi",Yacute:"Lielais latīņu burts Y ar akūto uzsvaras zīmi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatūru",agrave:"Mazs latīņu burts a ar uzsvara zīmi",aacute:"Mazs latīņu burts a ar akūto uzsvara zīmi", +acirc:"Mazs latīņu burts a ar diakritisko zīmi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zīmi",aring:"Mazs latīņu burts a ar aplīti augšā",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar āķīti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zīmi ",eacute:"Mazs latīņu burts e ar akūtu uzsvara zīmi",ecirc:"Mazs latīņu burts e ar diakritisko zīmi",euml:"Mazs latīņu burts e ar diakritisko zīmi",igrave:"Mazs latīņu burts i ar uzsvara zīmi ",iacute:"Mazs latīņu burts i ar akūtu uzsvara zīmi", +icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ", +uacute:"Mazs latīņu burts u ar akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ", +sbquo:"Mazas-9 vienkārtīgas pēdiņas",8219:"Lielas-9 vienkārtīgas apgrieztas pēdiņas",bdquo:"Mazas-9 dubultas pēdiņas",hellip:"Horizontāli daudzpunkti",trade:"Preču zīmes zīme",9658:"Melns pa labi pagriezts radītājs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandrīz vienāds ar"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nb.js new file mode 100644 index 0000000..1e8a859 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nb.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nl.js new file mode 100644 index 0000000..9a8fb14 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/nl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken", +reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Micro-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe", +Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu", +Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave", +Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema", +aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe", +iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave", +uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Œ",oelig:"Latijnse kleine letter œ",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe", +375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/no.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/no.js new file mode 100644 index 0000000..0787077 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/no.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pl.js new file mode 100644 index 0000000..6b0f802 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego", +laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania", +Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim", +Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym", +Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim", +eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą", +divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym", +375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie równe"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js new file mode 100644 index 0000000..cb4ea1a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada", +macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema", +Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo", +Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema", +aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo", +otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo", +373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt.js new file mode 100644 index 0000000..3517162 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/pt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo do Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão Simples",mdash:"Travessão Longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo do Cêntimo",pound:"Símbolo da Libra",curren:"Símbolo de Moeda",yen:"Símbolo do Iene",brvbar:"Barra quebrada",sect:"Símbolo de Secção",uml:"Trema",copy:"Símbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino", +laquo:"Aspa esquerda ângulo duplo",not:"Não Símbolo",reg:"Símbolo de Registado",macr:"Mácron",deg:"Símbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de Micro",para:"Símbolo de Parágrafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo pra Direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrugação invertido",Agrave:"Letra maiúscula latina A com acento grave", +Aacute:"Letra maiúscula latina A com acento agudo",Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra Maiúscula Latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema", +Igrave:"Letra maiúscula latina I com acento grave",Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema", +times:"Símbolo de Multiplicação",Oslash:"Letra maiúscula O com barra",Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo", +atilde:"Letra minúscula latina a com til",auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo", +icirc:"Letra minúscula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de Divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave", +uacute:"Letra minúscula latina u com acento agudo",ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo", +sbquo:"Aspa Simples inferior-9",8219:"Aspa Simples superior invertida-9",bdquo:"Aspa Duplas inferior-9",hellip:"Elipse Horizontal ",trade:"Símbolo de Marca Registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ru.js new file mode 100644 index 0000000..622078d --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ru.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ru",{euro:"Знак евро",lsquo:"Левая одинарная кавычка",rsquo:"Правая одинарная кавычка",ldquo:"Левая двойная кавычка",rdquo:"Левая двойная кавычка",ndash:"Среднее тире",mdash:"Длинное тире",iexcl:"перевёрнутый восклицательный знак",cent:"Цент",pound:"Фунт",curren:"Знак валюты",yen:"Йена",brvbar:"Вертикальная черта с разрывом",sect:"Знак параграфа",uml:"Умлаут",copy:"Знак охраны авторского права",ordf:"Указатель окончания женского рода ...ая",laquo:"Левая кавычка-«ёлочка»", +not:"Отрицание",reg:"Знак охраны смежных прав\\t",macr:"Макрон",deg:"Градус",sup2:"Надстрочное два",sup3:"Надстрочное три",acute:"Акут",micro:"Микро",para:"Абзац",middot:"Интерпункт",cedil:"Седиль",sup1:"Надстрочная единица",ordm:"Порядковое числительное",raquo:"Правая кавычка-«ёлочка»",frac14:"Одна четвертая",frac12:"Одна вторая",frac34:"Три четвёртых",iquest:"Перевёрнутый вопросительный знак",Agrave:"Латинская заглавная буква А с апострофом",Aacute:"Латинская заглавная буква A с ударением",Acirc:"Латинская заглавная буква А с циркумфлексом", +Atilde:"Латинская заглавная буква А с тильдой",Auml:"Латинская заглавная буква А с тремой",Aring:"Латинская заглавная буква А с кольцом над ней",AElig:"Латинская большая буква Æ",Ccedil:"Латинская заглавная буква C с седилью",Egrave:"Латинская заглавная буква Е с апострофом",Eacute:"Латинская заглавная буква Е с ударением",Ecirc:"Латинская заглавная буква Е с циркумфлексом",Euml:"Латинская заглавная буква Е с тремой",Igrave:"Латинская заглавная буква I с апострофом",Iacute:"Латинская заглавная буква I с ударением", +Icirc:"Латинская заглавная буква I с циркумфлексом",Iuml:"Латинская заглавная буква I с тремой",ETH:"Латинская большая буква Eth",Ntilde:"Латинская заглавная буква N с тильдой",Ograve:"Латинская заглавная буква O с апострофом",Oacute:"Латинская заглавная буква O с ударением",Ocirc:"Латинская заглавная буква O с циркумфлексом",Otilde:"Латинская заглавная буква O с тильдой",Ouml:"Латинская заглавная буква O с тремой",times:"Знак умножения",Oslash:"Латинская большая перечеркнутая O",Ugrave:"Латинская заглавная буква U с апострофом", +Uacute:"Латинская заглавная буква U с ударением",Ucirc:"Латинская заглавная буква U с циркумфлексом",Uuml:"Латинская заглавная буква U с тремой",Yacute:"Латинская заглавная буква Y с ударением",THORN:"Латинская заглавная буква Thorn",szlig:"Знак диеза",agrave:"Латинская маленькая буква a с апострофом",aacute:"Латинская маленькая буква a с ударением",acirc:"Латинская маленькая буква a с циркумфлексом",atilde:"Латинская маленькая буква a с тильдой",auml:"Латинская маленькая буква a с тремой",aring:"Латинская маленькая буква a с кольцом", +aelig:"Латинская маленькая буква æ",ccedil:"Латинская маленькая буква с с седилью",egrave:"Латинская маленькая буква е с апострофом",eacute:"Латинская маленькая буква е с ударением",ecirc:"Латинская маленькая буква е с циркумфлексом",euml:"Латинская маленькая буква е с тремой",igrave:"Латинская маленькая буква i с апострофом",iacute:"Латинская маленькая буква i с ударением",icirc:"Латинская маленькая буква i с циркумфлексом",iuml:"Латинская маленькая буква i с тремой",eth:"Латинская маленькая буква eth", +ntilde:"Латинская маленькая буква n с тильдой",ograve:"Латинская маленькая буква o с апострофом",oacute:"Латинская маленькая буква o с ударением",ocirc:"Латинская маленькая буква o с циркумфлексом",otilde:"Латинская маленькая буква o с тильдой",ouml:"Латинская маленькая буква o с тремой",divide:"Знак деления",oslash:"Латинская строчная перечеркнутая o",ugrave:"Латинская маленькая буква u с апострофом",uacute:"Латинская маленькая буква u с ударением",ucirc:"Латинская маленькая буква u с циркумфлексом", +uuml:"Латинская маленькая буква u с тремой",yacute:"Латинская маленькая буква y с ударением",thorn:"Латинская маленькая буква thorn",yuml:"Латинская маленькая буква y с тремой",OElig:"Латинская прописная лигатура OE",oelig:"Латинская строчная лигатура oe",372:"Латинская заглавная буква W с циркумфлексом",374:"Латинская заглавная буква Y с циркумфлексом",373:"Латинская маленькая буква w с циркумфлексом",375:"Латинская маленькая буква y с циркумфлексом",sbquo:"Нижняя одинарная кавычка",8219:"Правая одинарная кавычка", +bdquo:"Левая двойная кавычка",hellip:"Горизонтальное многоточие",trade:"Товарный знак",9658:"Черный указатель вправо",bull:"Маркер списка",rarr:"Стрелка вправо",rArr:"Двойная стрелка вправо",hArr:"Двойная стрелка влево-вправо",diams:"Черный ромб",asymp:"Примерно равно"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/si.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/si.js new file mode 100644 index 0000000..eac6894 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/si.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","si",{euro:"යුරෝ සලකුණ",lsquo:"වමේ තනි උපුටා දක්වීම ",rsquo:"දකුණේ තනි උපුටා දක්වීම ",ldquo:"වමේ දිත්ව උපුටා දක්වීම ",rdquo:"දකුණේ දිත්ව උපුටා දක්වීම ",ndash:"En dash",mdash:"Em dash",iexcl:"යටිකුරු හර්ෂදී ",cent:"Cent sign",pound:"Pound sign",curren:"මුල්‍යමය ",yen:"යෙන් ",brvbar:"Broken bar",sect:"තෙරේම් ",uml:"Diaeresis",copy:"පිටපත් අයිතිය ",ordf:"දර්ශකය",laquo:"Left-pointing double angle quotation mark",not:"සලකුණක් නොවේ",reg:"සලකුණක් ලියාපදිංචි කිරීම", +macr:"මුද්‍රිත ",deg:"සලකුණේ ",sup2:"උඩු ලකුණු දෙක",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sk.js new file mode 100644 index 0000000..7a79fb2 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sk.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrátený výkričník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Prerušená zvislá čiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor", +reg:"Znak registrácie",macr:"Pomlčka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"Obyčajný zlomok jedna štvrtina",frac12:"Obyčajný zlomok jedna polovica",frac34:"Obyčajný zlomok tri štvrtiny",iquest:"Otočený otáznik",Agrave:"Veľké písmeno latinky A s accentom", +Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkčeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkčeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom", +Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkčeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkčeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preškrtnuté",Ugrave:"Veľké písmeno latinky U s accentom", +Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkčeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkčeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad", +aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkčeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkčeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom", +oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkčeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preškrtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkčeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami", +OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkčeňom",374:"Veľké písmeno latinky Y s mäkčeňom",373:"Malé písmeno latinky w s mäkčeňom",375:"Malé písmeno latinky y s mäkčeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otočená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej značky",9658:"Čierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá šipka vpravo", +hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sl.js new file mode 100644 index 0000000..514e98a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomišljaj",mdash:"Em pomišljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena črta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak", +macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Moški zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena četrtina",frac12:"Ena polovica",frac34:"Tri četrtine",iquest:"Obrnjen vprašaj",Agrave:"Velika latinska črka A s krativcem",Aacute:"Velika latinska črka A z ostrivcem",Acirc:"Velika latinska črka A s strešico",Atilde:"Velika latinska črka A z tildo", +Auml:"Velika latinska črka A z diaeresis-om",Aring:"Velika latinska črka A z obročem",AElig:"Velika latinska črka Æ",Ccedil:"Velika latinska črka C s cedillo",Egrave:"Velika latinska črka E s krativcem",Eacute:"Velika latinska črka E z ostrivcem",Ecirc:"Velika latinska črka E s strešico",Euml:"Velika latinska črka E z diaeresis-om",Igrave:"Velika latinska črka I s krativcem",Iacute:"Velika latinska črka I z ostrivcem",Icirc:"Velika latinska črka I s strešico",Iuml:"Velika latinska črka I z diaeresis-om", +ETH:"Velika latinska črka Eth",Ntilde:"Velika latinska črka N s tildo",Ograve:"Velika latinska črka O s krativcem",Oacute:"Velika latinska črka O z ostrivcem",Ocirc:"Velika latinska črka O s strešico",Otilde:"Velika latinska črka O s tildo",Ouml:"Velika latinska črka O z diaeresis-om",times:"Znak za množenje",Oslash:"Velika prečrtana latinska črka O",Ugrave:"Velika latinska črka U s krativcem",Uacute:"Velika latinska črka U z ostrivcem",Ucirc:"Velika latinska črka U s strešico",Uuml:"Velika latinska črka U z diaeresis-om", +Yacute:"Velika latinska črka Y z ostrivcem",THORN:"Velika latinska črka Thorn",szlig:"Mala ostra latinska črka s",agrave:"Mala latinska črka a s krativcem",aacute:"Mala latinska črka a z ostrivcem",acirc:"Mala latinska črka a s strešico",atilde:"Mala latinska črka a s tildo",auml:"Mala latinska črka a z diaeresis-om",aring:"Mala latinska črka a z obročem",aelig:"Mala latinska črka æ",ccedil:"Mala latinska črka c s cedillo",egrave:"Mala latinska črka e s krativcem",eacute:"Mala latinska črka e z ostrivcem", +ecirc:"Mala latinska črka e s strešico",euml:"Mala latinska črka e z diaeresis-om",igrave:"Mala latinska črka i s krativcem",iacute:"Mala latinska črka i z ostrivcem",icirc:"Mala latinska črka i s strešico",iuml:"Mala latinska črka i z diaeresis-om",eth:"Mala latinska črka eth",ntilde:"Mala latinska črka n s tildo",ograve:"Mala latinska črka o s krativcem",oacute:"Mala latinska črka o z ostrivcem",ocirc:"Mala latinska črka o s strešico",otilde:"Mala latinska črka o s tildo",ouml:"Mala latinska črka o z diaeresis-om", +divide:"Znak za deljenje",oslash:"Mala prečrtana latinska črka o",ugrave:"Mala latinska črka u s krativcem",uacute:"Mala latinska črka u z ostrivcem",ucirc:"Mala latinska črka u s strešico",uuml:"Mala latinska črka u z diaeresis-om",yacute:"Mala latinska črka y z ostrivcem",thorn:"Mala latinska črka thorn",yuml:"Mala latinska črka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska črka W s strešico",374:"Velika latinska črka Y s strešico", +373:"Mala latinska črka w s strešico",375:"Mala latinska črka y s strešico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"Črni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena puščica",rArr:"Desno-usmerjena dvojna puščica",hArr:"Leva in desna dvojna puščica",diams:"Črna kara",asymp:"Skoraj enako"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sq.js new file mode 100644 index 0000000..bab1b7e --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sq.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë", +Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika", +Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika", +times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë", +acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë", +iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes", +ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor", +373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sv.js new file mode 100644 index 0000000..562aba4 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/sv.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken", +not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex", +Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex", +Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ", +ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø", +ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken", +trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/th.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/th.js new file mode 100644 index 0000000..77afffc --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/th.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/tr.js new file mode 100644 index 0000000..68836ab --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/tr.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti", +not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi", +Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi", +ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi", +THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi", +igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi", +uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti", +bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ug.js new file mode 100644 index 0000000..783aa37 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/ug.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ پەش سول",rsquo:"يالاڭ پەش ئوڭ",ldquo:"قوش پەش سول",rdquo:"قوش پەش ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"فوند ستېرلىڭ",curren:"پۇل بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگراف بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى", +deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندېكىس 2",sup3:"يۇقىرى ئىندېكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا چېكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندېكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent", +Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ", +ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent", +oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"بۆلۈش بەلگىسى",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn", +yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"خەتلەتكەن تاۋار ماركىسى بەلگىسى",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/uk.js new file mode 100644 index 0000000..7cb1680 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/uk.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","uk",{euro:"Знак євро",lsquo:"Ліві одинарні лапки",rsquo:"Праві одинарні лапки",ldquo:"Ліві подвійні лапки",rdquo:"Праві подвійні лапки",ndash:"Середнє тире",mdash:"Довге тире",iexcl:"Перевернутий знак оклику",cent:"Знак цента",pound:"Знак фунта",curren:"Знак валюти",yen:"Знак єни",brvbar:"Переривчаста вертикальна лінія",sect:"Знак параграфу",uml:"Умлаут",copy:"Знак авторських прав",ordf:"Жіночий порядковий вказівник",laquo:"ліві вказівні подвійні кутові дужки", +not:"Заперечення",reg:"Знак охорони суміжних прав",macr:"Макрон",deg:"Знак градуса",sup2:"два у верхньому індексі",sup3:"три у верхньому індексі",acute:"Знак акута",micro:"Знак мікро",para:"Знак абзацу",middot:"Інтерпункт",cedil:"Седиль",sup1:"Один у верхньому індексі",ordm:"Чоловічий порядковий вказівник",raquo:"праві вказівні подвійні кутові дужки",frac14:"Одна четвертина",frac12:"Одна друга",frac34:"три четвертих",iquest:"Перевернутий знак питання",Agrave:"Велика латинська A з гравісом",Aacute:"Велика латинська А з акутом", +Acirc:"Велика латинська А з циркумфлексом",Atilde:"Велика латинська А з тильдою",Auml:"Велике латинське А з умлаутом",Aring:"Велика латинська A з кільцем згори",AElig:"Велика латинська Æ",Ccedil:"Велика латинська C з седиллю",Egrave:"Велика латинська E з гравісом",Eacute:"Велика латинська E з акутом",Ecirc:"Велика латинська E з циркумфлексом",Euml:"Велика латинська А з умлаутом",Igrave:"Велика латинська I з гравісом",Iacute:"Велика латинська I з акутом",Icirc:"Велика латинська I з циркумфлексом", +Iuml:"Велика латинська І з умлаутом",ETH:"Велика латинська Eth",Ntilde:"Велика латинська N з тильдою",Ograve:"Велика латинська O з гравісом",Oacute:"Велика латинська O з акутом",Ocirc:"Велика латинська O з циркумфлексом",Otilde:"Велика латинська O з тильдою",Ouml:"Велика латинська О з умлаутом",times:"Знак множення",Oslash:"Велика латинська перекреслена O ",Ugrave:"Велика латинська U з гравісом",Uacute:"Велика латинська U з акутом",Ucirc:"Велика латинська U з циркумфлексом",Uuml:"Велика латинська U з умлаутом", +Yacute:"Велика латинська Y з акутом",THORN:"Велика латинська Торн",szlig:"Мала латинська есцет",agrave:"Мала латинська a з гравісом",aacute:"Мала латинська a з акутом",acirc:"Мала латинська a з циркумфлексом",atilde:"Мала латинська a з тильдою",auml:"Мала латинська a з умлаутом",aring:"Мала латинська a з кільцем згори",aelig:"Мала латинська æ",ccedil:"Мала латинська C з седиллю",egrave:"Мала латинська e з гравісом",eacute:"Мала латинська e з акутом",ecirc:"Мала латинська e з циркумфлексом",euml:"Мала латинська e з умлаутом", +igrave:"Мала латинська i з гравісом",iacute:"Мала латинська i з акутом",icirc:"Мала латинська i з циркумфлексом",iuml:"Мала латинська i з умлаутом",eth:"Мала латинська Eth",ntilde:"Мала латинська n з тильдою",ograve:"Мала латинська o з гравісом",oacute:"Мала латинська o з акутом",ocirc:"Мала латинська o з циркумфлексом",otilde:"Мала латинська o з тильдою",ouml:"Мала латинська o з умлаутом",divide:"Знак ділення",oslash:"Мала латинська перекреслена o",ugrave:"Мала латинська u з гравісом",uacute:"Мала латинська u з акутом", +ucirc:"Мала латинська u з циркумфлексом",uuml:"Мала латинська u з умлаутом",yacute:"Мала латинська y з акутом",thorn:"Мала латинська торн",yuml:"Мала латинська y з умлаутом",OElig:"Велика латинська лігатура OE",oelig:"Мала латинська лігатура oe",372:"Велика латинська W з циркумфлексом",374:"Велика латинська Y з циркумфлексом",373:"Мала латинська w з циркумфлексом",375:"Мала латинська y з циркумфлексом",sbquo:"Одиничні нижні лабки",8219:"Верхні одиничні обернені лабки",bdquo:"Подвійні нижні лабки", +hellip:"Три крапки",trade:"Знак торгової марки",9658:"Чорний правий вказівник",bull:"Маркер списку",rarr:"Стрілка вправо",rArr:"Подвійна стрілка вправо",hArr:"Подвійна стрілка вліво-вправо",diams:"Чорний діамонт",asymp:"Наближено дорівнює"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/vi.js new file mode 100644 index 0000000..03a5b75 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/vi.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","vi",{euro:"Ký hiệu Euro",lsquo:"Dấu ngoặc đơn trái",rsquo:"Dấu ngoặc đơn phải",ldquo:"Dấu ngoặc đôi trái",rdquo:"Dấu ngoặc đôi phải",ndash:"Gạch ngang tiếng anh",mdash:"Gạch ngang Em",iexcl:"Chuyển đổi dấu chấm than",cent:"Ký tự tiền Mỹ",pound:"Ký tự tiền Anh",curren:"Ký tự tiền tệ",yen:"Ký tự tiền Yên Nhật",brvbar:"Thanh hỏng",sect:"Ký tự khu vực",uml:"Dấu tách đôi",copy:"Ký tự bản quyền",ordf:"Phần chỉ thị giống cái",laquo:"Chọn dấu ngoặc đôi trái",not:"Không có ký tự", +reg:"Ký tự đăng ký",macr:"Dấu nguyên âm dài",deg:"Ký tự độ",sup2:"Chữ trồi lên trên dạng 2",sup3:"Chữ trồi lên trên dạng 3",acute:"Dấu trọng âm",micro:"Ký tự micro",para:"Ký tự đoạn văn",middot:"Dấu chấm tròn",cedil:"Dấu móc lưới",sup1:"Ký tự trồi lên cấp 1",ordm:"Ký tự biểu hiện giống đực",raquo:"Chọn dấu ngoặc đôi phải",frac14:"Tỉ lệ một phần tư",frac12:"Tỉ lệ một nửa",frac34:"Tỉ lệ ba phần tư",iquest:"Chuyển đổi dấu chấm hỏi",Agrave:"Ký tự la-tinh viết hoa A với dấu huyền",Aacute:"Ký tự la-tinh viết hoa A với dấu sắc", +Acirc:"Ký tự la-tinh viết hoa A với dấu mũ",Atilde:"Ký tự la-tinh viết hoa A với dấu ngã",Auml:"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu",Aring:"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu",AElig:"Ký tự la-tinh viết hoa của Æ",Ccedil:"Ký tự la-tinh viết hoa C với dấu móc bên dưới",Egrave:"Ký tự la-tinh viết hoa E với dấu huyền",Eacute:"Ký tự la-tinh viết hoa E với dấu sắc",Ecirc:"Ký tự la-tinh viết hoa E với dấu mũ",Euml:"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu", +Igrave:"Ký tự la-tinh viết hoa I với dấu huyền",Iacute:"Ký tự la-tinh viết hoa I với dấu sắc",Icirc:"Ký tự la-tinh viết hoa I với dấu mũ",Iuml:"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu",ETH:"Viết hoa của ký tự Eth",Ntilde:"Ký tự la-tinh viết hoa N với dấu ngã",Ograve:"Ký tự la-tinh viết hoa O với dấu huyền",Oacute:"Ký tự la-tinh viết hoa O với dấu sắc",Ocirc:"Ký tự la-tinh viết hoa O với dấu mũ",Otilde:"Ký tự la-tinh viết hoa O với dấu ngã",Ouml:"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu", +times:"Ký tự phép toán nhân",Oslash:"Ký tự la-tinh viết hoa A với dấu ngã xuống",Ugrave:"Ký tự la-tinh viết hoa U với dấu huyền",Uacute:"Ký tự la-tinh viết hoa U với dấu sắc",Ucirc:"Ký tự la-tinh viết hoa U với dấu mũ",Uuml:"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu",Yacute:"Ký tự la-tinh viết hoa Y với dấu sắc",THORN:"Phần viết hoa của ký tự Thorn",szlig:"Ký tự viết nhỏ la-tinh của chữ s",agrave:"Ký tự la-tinh thường với dấu huyền",aacute:"Ký tự la-tinh thường với dấu sắc",acirc:"Ký tự la-tinh thường với dấu mũ", +atilde:"Ký tự la-tinh thường với dấu ngã",auml:"Ký tự la-tinh thường với dấu hai chấm trên đầu",aring:"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu",aelig:"Ký tự la-tinh viết thường của æ",ccedil:"Ký tự la-tinh viết thường của c với dấu móc bên dưới",egrave:"Ký tự la-tinh viết thường e với dấu huyền",eacute:"Ký tự la-tinh viết thường e với dấu sắc",ecirc:"Ký tự la-tinh viết thường e với dấu mũ",euml:"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu",igrave:"Ký tự la-tinh viết thường i với dấu huyền", +iacute:"Ký tự la-tinh viết thường i với dấu sắc",icirc:"Ký tự la-tinh viết thường i với dấu mũ",iuml:"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu",eth:"Ký tự la-tinh viết thường của eth",ntilde:"Ký tự la-tinh viết thường n với dấu ngã",ograve:"Ký tự la-tinh viết thường o với dấu huyền",oacute:"Ký tự la-tinh viết thường o với dấu sắc",ocirc:"Ký tự la-tinh viết thường o với dấu mũ",otilde:"Ký tự la-tinh viết thường o với dấu ngã",ouml:"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu", +divide:"Ký hiệu phép tính chia",oslash:"Ký tự la-tinh viết thường o với dấu ngã",ugrave:"Ký tự la-tinh viết thường u với dấu huyền",uacute:"Ký tự la-tinh viết thường u với dấu sắc",ucirc:"Ký tự la-tinh viết thường u với dấu mũ",uuml:"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu",yacute:"Ký tự la-tinh viết thường y với dấu sắc",thorn:"Ký tự la-tinh viết thường của chữ thorn",yuml:"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu",OElig:"Ký tự la-tinh viết hoa gạch nối OE",oelig:"Ký tự la-tinh viết thường gạch nối OE", +372:"Ký tự la-tinh viết hoa W với dấu mũ",374:"Ký tự la-tinh viết hoa Y với dấu mũ",373:"Ký tự la-tinh viết thường w với dấu mũ",375:"Ký tự la-tinh viết thường y với dấu mũ",sbquo:"Dấu ngoặc đơn thấp số-9",8219:"Dấu ngoặc đơn đảo ngược số-9",bdquo:"Gấp đôi dấu ngoặc đơn số-9",hellip:"Tĩnh dược chiều ngang",trade:"Ký tự thương hiệu",9658:"Ký tự trỏ về hướng bên phải màu đen",bull:"Ký hiệu",rarr:"Mũi tên hướng bên phải",rArr:"Mũi tên hướng bên phải dạng đôi",hArr:"Mũi tên hướng bên trái dạng đôi",diams:"Ký hiệu hình thoi", +asymp:"Gần bằng với"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..aa42b83 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符号",lsquo:"左单引号",rsquo:"右单引号",ldquo:"左双引号",rdquo:"右双引号",ndash:"短划线",mdash:"长划线",iexcl:"竖翻叹号",cent:"分币符号",pound:"英镑符号",curren:"货币符号",yen:"日元符号",brvbar:"间断条",sect:"节标记",uml:"分音符",copy:"版权所有标记",ordf:"阴性顺序指示符",laquo:"左指双尖引号",not:"非标记",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"锐音符",micro:"微符",para:"段落标记",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"阳性顺序指示符",raquo:"右指双尖引号",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问号", +Agrave:"带抑音符的拉丁文大写字母 A",Aacute:"带锐音符的拉丁文大写字母 A",Acirc:"带扬抑符的拉丁文大写字母 A",Atilde:"带颚化符的拉丁文大写字母 A",Auml:"带分音符的拉丁文大写字母 A",Aring:"带上圆圈的拉丁文大写字母 A",AElig:"拉丁文大写字母 Ae",Ccedil:"带下加符的拉丁文大写字母 C",Egrave:"带抑音符的拉丁文大写字母 E",Eacute:"带锐音符的拉丁文大写字母 E",Ecirc:"带扬抑符的拉丁文大写字母 E",Euml:"带分音符的拉丁文大写字母 E",Igrave:"带抑音符的拉丁文大写字母 I",Iacute:"带锐音符的拉丁文大写字母 I",Icirc:"带扬抑符的拉丁文大写字母 I",Iuml:"带分音符的拉丁文大写字母 I",ETH:"拉丁文大写字母 Eth",Ntilde:"带颚化符的拉丁文大写字母 N",Ograve:"带抑音符的拉丁文大写字母 O",Oacute:"带锐音符的拉丁文大写字母 O",Ocirc:"带扬抑符的拉丁文大写字母 O",Otilde:"带颚化符的拉丁文大写字母 O", +Ouml:"带分音符的拉丁文大写字母 O",times:"乘号",Oslash:"带粗线的拉丁文大写字母 O",Ugrave:"带抑音符的拉丁文大写字母 U",Uacute:"带锐音符的拉丁文大写字母 U",Ucirc:"带扬抑符的拉丁文大写字母 U",Uuml:"带分音符的拉丁文大写字母 U",Yacute:"带抑音符的拉丁文大写字母 Y",THORN:"拉丁文大写字母 Thorn",szlig:"拉丁文小写字母清音 S",agrave:"带抑音符的拉丁文小写字母 A",aacute:"带锐音符的拉丁文小写字母 A",acirc:"带扬抑符的拉丁文小写字母 A",atilde:"带颚化符的拉丁文小写字母 A",auml:"带分音符的拉丁文小写字母 A",aring:"带上圆圈的拉丁文小写字母 A",aelig:"拉丁文小写字母 Ae",ccedil:"带下加符的拉丁文小写字母 C",egrave:"带抑音符的拉丁文小写字母 E",eacute:"带锐音符的拉丁文小写字母 E",ecirc:"带扬抑符的拉丁文小写字母 E",euml:"带分音符的拉丁文小写字母 E",igrave:"带抑音符的拉丁文小写字母 I", +iacute:"带锐音符的拉丁文小写字母 I",icirc:"带扬抑符的拉丁文小写字母 I",iuml:"带分音符的拉丁文小写字母 I",eth:"拉丁文小写字母 Eth",ntilde:"带颚化符的拉丁文小写字母 N",ograve:"带抑音符的拉丁文小写字母 O",oacute:"带锐音符的拉丁文小写字母 O",ocirc:"带扬抑符的拉丁文小写字母 O",otilde:"带颚化符的拉丁文小写字母 O",ouml:"带分音符的拉丁文小写字母 O",divide:"除号",oslash:"带粗线的拉丁文小写字母 O",ugrave:"带抑音符的拉丁文小写字母 U",uacute:"带锐音符的拉丁文小写字母 U",ucirc:"带扬抑符的拉丁文小写字母 U",uuml:"带分音符的拉丁文小写字母 U",yacute:"带抑音符的拉丁文小写字母 Y",thorn:"拉丁文小写字母 Thorn",yuml:"带分音符的拉丁文小写字母 Y",OElig:"拉丁文大写连字 Oe",oelig:"拉丁文小写连字 Oe",372:"带扬抑符的拉丁文大写字母 W",374:"带扬抑符的拉丁文大写字母 Y", +373:"带扬抑符的拉丁文小写字母 W",375:"带扬抑符的拉丁文小写字母 Y",sbquo:"单下 9 形引号",8219:"单高横翻 9 形引号",bdquo:"双下 9 形引号",hellip:"水平省略号",trade:"商标标志",9658:"实心右指指针",bull:"加重号",rarr:"向右箭头",rArr:"向右双线箭头",hArr:"左右双线箭头",diams:"实心方块纸牌",asymp:"约等于"}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/specialchar.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/specialchar.js new file mode 100644 index 0000000..7f4348c --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/specialchar/dialogs/specialchar.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j); +var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml(" "),e.getContentElement("info","htmlPreview").getElement().setHtml(" "),b.getParent().removeClass("cke_light_background"), +j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault(); +break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)): +d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=[''],d=0,g=b.length,h,e;d');for(var j=0;j'+h+''+e+"")}else f.push('")}f.push("")}f.push("
 ');f.push("
",''+l.options+"");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab, +title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox", +align:"top",children:[{type:"html",html:"
"},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"
 
"},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", +html:"
 
"}]}]}]}]}]}}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/table/dialogs/table.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/table/dialogs/table.js new file mode 100644 index 0000000..3d9a69b --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/table/dialogs/table.js @@ -0,0 +1,21 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;kl&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&& +a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles"); +a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:" "},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing", +this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right", +html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0"+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}}, +e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom, +"bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]], +setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan), +setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()): +a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b= +a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info", +"borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d
'),d='';a.image&&b&&(d+='');d+='");k.on("click",function(){p(a.html)});return k}function p(a){var b=CKEDITOR.dialog.getCurrent();b.getValueOf("selectTpl","chkInsertOpt")?(c.fire("saveSnapshot"),c.setData(a,function(){b.hide();var a=c.createRange();a.moveToElementEditStart(c.editable());a.select();setTimeout(function(){c.fire("saveSnapshot")},0)})):(c.insertHtml(a),b.hide())}function i(a){var b=a.data.getTarget(), +c=g.equals(b);if(c||g.contains(b)){var d=a.data.getKeystroke(),f=g.getElementsByTag("a"),e;if(f){if(c)e=f.getItem(0);else switch(d){case 40:e=b.getNext();break;case 38:e=b.getPrevious();break;case 13:case 32:b.fire("click")}e&&(e.focus(),a.data.preventDefault())}}}var h=CKEDITOR.plugins.get("templates");CKEDITOR.document.appendStyleSheet(CKEDITOR.getUrl(h.path+"dialogs/templates.css"));var g,h="cke_tpl_list_label_"+CKEDITOR.tools.getNextNumber(),f=c.lang.templates,l=c.config;return{title:c.lang.templates.title, +minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:"selectTpl",label:f.title,elements:[{type:"vbox",padding:5,children:[{id:"selectTplText",type:"html",html:""+f.selectPromptMsg+""},{id:"templatesList",type:"html",focus:!0,html:'
'+f.options+""},{id:"chkInsertOpt",type:"checkbox",label:f.insertOption, +"default":l.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var a=this.getContentElement("selectTpl","templatesList");g=a.getElement();CKEDITOR.loadTemplates(l.templates_files,function(){var b=(l.templates||"default").split(",");if(b.length){var c=g;c.setHtml("");for(var d=0,h=b.length;d'+f.emptyListMsg+"")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})(); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/default.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/default.js new file mode 100644 index 0000000..337f9fc --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/default.js @@ -0,0 +1,6 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.addTemplates("default",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+"templates/images/"),templates:[{title:"Image and Title",image:"template1.gif",description:"One main image with a title and text that surround the image.",html:'

Type the title here

Type the text here

'},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.", +html:'

Title 1

Title 2

Text 1Text 2

More text goes here.

'},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'

Title goes here

Table title
   
   
   

Type the text here

'}]}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/images/template1.gif b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/templates/templates/images/template1.gif new file mode 100644 index 0000000000000000000000000000000000000000..efdabbebd4503ceb55c948fa73b9b83cbd373e57 GIT binary patch literal 375 zcmV--0f_!bNk%w1VPpVC0FeLyva+%O00960{{R30A^8LV00000EC2ui0Av7000092 zgpaAq?GK}zwAu@W-n{z{hT=$;9b%^H%BpA!$8!13_AS@=&Xal%3~GMDB95pDD3{Ep z^T{;k4xj+g%7JRP+$IPq!1Bb&uKB$DQa@x|8x8NO4b`hO25#TOnRw~9=3yE0xyeE4CQ8$(2)Mz>8udZCXX=BRr7DZbW_#-a zYZEHlJM(KAEc4dditDMnJ4(CC+&uK06fIp0D*Z|wX5EYpGb{?;a*WKVoEoWp!Y!`y zeo4*}FFC(bZf@duda#%D-q zaHzPUxA@lRm;@PFNk%w1VPpVC0FeLyva+%O00960{{R30A^8LV00000EC2ui0Av7000092 zgpaAq?GK}zwAu@W-n{z{hT=$;9b%^H%BpA!$8!13_AS@=&Xal%3~GMDB93TG#*l%g z^9hYgr_`$T`us4l+^+W<)gC_JviY3#AeC&_xD98m<8-m1jvsB&<_@0q~XXRsCap^IRqK$(K#c!N9pBf82AawVH$?WN){q&IjedXiz+EX zOS+od%WDgp+d909toAG5`lTy-9D18rOxWx+T}>D*o&1Qa9n5V^96nACtqfi*?*05t zZSMX~zfpQ^<%jRPUfiDEO8=eEuB)DKv}S_cJW8uTxqL`=(AMXYB~Aenu4SM=e_ zrj6M`kqsZ_xrlC}y^5evW>krApudqWP2zFM5Fo{b%sA$2wGU)SI5vkKVQCad(WEn$ zGF`IFr&KONpB8ayRSwduHn4I{;q@zxs8h=VDkqjl*t8(;n#c+zd*_U=jy QeEa(S3plV~2n7HDJNoX*`2YX_ literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/LICENSE.md b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/LICENSE.md new file mode 100644 index 0000000..c7d374a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor WSC Plugin** +Copyright © 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/README.md b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/README.md new file mode 100644 index 0000000..46eeafb --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/README.md @@ -0,0 +1,25 @@ +CKEditor WebSpellChecker Plugin +=============================== + +This plugin brings Web Spell Checker (WSC) into CKEditor. + +WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation. +2. Enable the "wsc" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'wsc'; + +That's all. WSC will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/ciframe.html b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/ciframe.html new file mode 100644 index 0000000..25db3c7 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/ciframe.html @@ -0,0 +1,66 @@ + + + + + + + + +

+ diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmp.html b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmp.html new file mode 100644 index 0000000..6764295 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmp.html @@ -0,0 +1,118 @@ + + + + + iframe + + + + +
+ + + + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 0000000..0d675f4 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.css b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.css new file mode 100644 index 0000000..9e834f1 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.js new file mode 100644 index 0000000..abe0b08 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,67 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function v(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires; +if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){document.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=a.fn||null,f=a.id||"",g=a.target||window,h=a.message||{id:f};"[object Object]"==Object.prototype.toString.call(a.message)&& +(a.message.id||(a.message.id=f),h=a.message);a=window.JSON.stringify(h,b);g.postMessage(a,"*")}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode= +null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null, +text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},Suggestions:{instance:null,text:"Suggestions"}};var w=function(b){for(var c in b)b[c].instance.getElement().setText(a.LocalizationComing[c])},x=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}}, +j,n;a.framesetHtml=function(b){return''};a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(), +c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(h){h=h||window.event; +h.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?s(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))})};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto", +position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),g,h,e=[];if(0===d.options.length){for(g in b)e.push([g,b[g]]);e.sort();for(var k=0;k"},{type:"html",id:"Content",label:"spellContent", +html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px", +"default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance=this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'WebSpellChecker.net', +setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){n=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left", +widths:["50%","50%","50%","50%"],children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this}, +onClick:c},{type:"button",id:"AddWord",label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this}, +onClick:c}]},{type:"vbox",id:"rightCol_col__right",widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id);a.LocalizationButton.IgnoreAllWords.instance=this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", +widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'WebSpellChecker.net'}]}]},{type:"hbox", +id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button", +id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
"},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}}, +{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"
", +onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)}, +onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", +widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right", +width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"
"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId, +c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}}, +{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}}, +{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'WebSpellChecker.net', +setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox", +id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'WebSpellChecker.net',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking", +label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp", +a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red", +html:"
",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words", +labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox", +id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]= +!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)}, +onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"
"+a.LocalizationComing.OptionsTextIntro+"
",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[]; +a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},onLoad:function(){b=this;e.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords= +b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked", +!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML= +a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&& +d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){var c=b.data.definition;a.onLoadOverlay=new o({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})(); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc_ie.js new file mode 100644 index 0000000..6b39b00 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/plugins/wsc/dialogs/wsc_ie.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang|| +f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display", +"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='', +l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='

'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"

");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display", +"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script", +{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}}); +CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/ajax.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/ajax.html new file mode 100644 index 0000000..7987593 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/ajax.html @@ -0,0 +1,82 @@ + + + + + Ajax — CKEditor Sample + + + + + + +

+ CKEditor Samples » Create and Destroy Editor Instances for Ajax Applications +

+
+

+ This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing + area will be displayed in a <div> element. +

+

+ For details of how to create this setup check the source code of this sample page + for JavaScript code responsible for the creation and destruction of a CKEditor instance. +

+
+

Click the buttons to create and remove a CKEditor instance.

+

+ + +

+ +
+
+ + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/api.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/api.html new file mode 100644 index 0000000..b9142e3 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/api.html @@ -0,0 +1,207 @@ + + + + + + API Usage — CKEditor Sample + + + + + + +

+ CKEditor Samples » Using CKEditor JavaScript API +

+
+

+ This sample shows how to use the + CKEditor JavaScript API + to interact with the editor at runtime. +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+ + +
+ +
+
+ + + + +

+

+ + +
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/appendto.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/appendto.html new file mode 100644 index 0000000..0c94eba --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/appendto.html @@ -0,0 +1,57 @@ + + + + + CKEDITOR.appendTo — CKEditor Sample + + + + + +

+ CKEditor Samples » Append To Page Element Using JavaScript Code +

+
+
+

+ CKEDITOR.appendTo is basically to place editors + inside existing DOM elements. Unlike CKEDITOR.replace, + a target container to be replaced is no longer necessary. A new editor + instance is inserted directly wherever it is desired. +

+
CKEDITOR.appendTo( 'container_id',
+	{ /* Configuration options to be used. */ }
+	'Editor content to be used.'
+);
+
+ +
+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/datafiltering.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/datafiltering.html new file mode 100644 index 0000000..1a2e860 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/datafiltering.html @@ -0,0 +1,401 @@ + + + + + Data Filtering — CKEditor Sample + + + + + + +

+ CKEditor Samples » Data Filtering and Features Activation +

+
+

+ This sample page demonstrates the idea of Advanced Content Filter + (ACF), a sophisticated + tool that takes control over what kind of data is accepted by the editor and what + kind of output is produced. +

+

When and what is being filtered?

+

+ ACF controls + every single source of data that comes to the editor. + It process both HTML that is inserted manually (i.e. pasted by the user) + and programmatically like: +

+
+editor.setData( '<p>Hello world!</p>' );
+
+

+ ACF discards invalid, + useless HTML tags and attributes so the editor remains "clean" during + runtime. ACF behaviour + can be configured and adjusted for a particular case to prevent the + output HTML (i.e. in CMS systems) from being polluted. + + This kind of filtering is a first, client-side line of defense + against "tag soups", + the tool that precisely restricts which tags, attributes and styles + are allowed (desired). When properly configured, ACF + is an easy and fast way to produce a high-quality, intentionally filtered HTML. +

+ +

How to configure or disable ACF?

+

+ Advanced Content Filter is enabled by default, working in "automatic mode", yet + it provides a set of easy rules that allow adjusting filtering rules + and disabling the entire feature when necessary. The config property + responsible for this feature is config.allowedContent. +

+

+ By "automatic mode" is meant that loaded plugins decide which kind + of content is enabled and which is not. For example, if the link + plugin is loaded it implies that <a> tag is + automatically allowed. Each plugin is given a set + of predefined ACF rules + that control the editor until + config.allowedContent + is defined manually. +

+

+ Let's assume our intention is to restrict the editor to accept (produce) paragraphs + only: no attributes, no styles, no other tags. + With ACF + this is very simple. Basically set + config.allowedContent to 'p': +

+
+var editor = CKEDITOR.replace( textarea_id, {
+	allowedContent: 'p'
+} );
+
+

+ Now try to play with allowed content: +

+
+// Trying to insert disallowed tag and attribute.
+editor.setData( '<p style="color: red">Hello <em>world</em>!</p>' );
+alert( editor.getData() );
+
+// Filtered data is returned.
+"<p>Hello world!</p>"
+
+

+ What happened? Since config.allowedContent: 'p' is set the editor assumes + that only plain <p> are accepted. Nothing more. This is why + style attribute and <em> tag are gone. The same + filtering would happen if we pasted disallowed HTML into this editor. +

+

+ This is just a small sample of what ACF + can do. To know more, please refer to the sample section below and + the official Advanced Content Filter guide. +

+

+ You may, of course, want CKEditor to avoid filtering of any kind. + To get rid of ACF, + basically set + config.allowedContent to true like this: +

+
+CKEDITOR.replace( textarea_id, {
+	allowedContent: true
+} );
+
+ +

Beyond data flow: Features activation

+

+ ACF is far more than + I/O control: the entire + UI of the editor is adjusted to what + filters restrict. For example: if <a> tag is + disallowed + by ACF, + then accordingly link command, toolbar button and link dialog + are also disabled. Editor is smart: it knows which features must be + removed from the interface to match filtering rules. +

+

+ CKEditor can be far more specific. If <a> tag is + allowed by filtering rules to be used but it is restricted + to have only one attribute (href) + config.allowedContent = 'a[!href]', then + "Target" tab of the link dialog is automatically disabled as target + attribute isn't included in ACF rules + for <a>. This behaviour applies to dialog fields, context + menus and toolbar buttons. +

+ +

Sample configurations

+

+ There are several editor instances below that present different + ACF setups. All of them, + except the last inline instance, share the same HTML content to visualize + how different filtering rules affect the same input data. +

+
+ +
+ +
+

+ This editor is using default configuration ("automatic mode"). It means that + + config.allowedContent is defined by loaded plugins. + Each plugin extends filtering rules to make it's own associated content + available for the user. +

+
+ + + +
+ +
+ +
+ +
+

+ This editor is using a custom configuration for + ACF: +

+
+CKEDITOR.replace( 'editor2', {
+	allowedContent:
+		'h1 h2 h3 p blockquote strong em;' +
+		'a[!href];' +
+		'img(left,right)[!src,alt,width,height];' +
+		'table tr th td caption;' +
+		'span{!font-family};' +'
+		'span{!color};' +
+		'span(!marker);' +
+		'del ins'
+} );
+
+

+ The following rules may require additional explanation: +

+
    +
  • + h1 h2 h3 p blockquote strong em - These tags + are accepted by the editor. Any tag attributes will be discarded. +
  • +
  • + a[!href] - href attribute is obligatory + for <a> tag. Tags without this attribute + are disarded. No other attribute will be accepted. +
  • +
  • + img(left,right)[!src,alt,width,height] - src + attribute is obligatory for <img> tag. + alt, width, height + and class attributes are accepted but + class must be either class="left" + or class="right" +
  • +
  • + table tr th td caption - These tags + are accepted by the editor. Any tag attributes will be discarded. +
  • +
  • + span{!font-family}, span{!color}, + span(!marker) - <span> tags + will be accepted if either font-family or + color style is set or class="marker" + is present. +
  • +
  • + del ins - These tags + are accepted by the editor. Any tag attributes will be discarded. +
  • +
+

+ Please note that UI of the + editor is different. It's a response to what happened to the filters. + Since text-align isn't allowed, the align toolbar is gone. + The same thing happened to subscript/superscript, strike, underline + (<u>, <sub>, <sup> + are disallowed by + config.allowedContent) and many other buttons. +

+
+ + +
+ +
+ +
+ +
+

+ This editor is using a custom configuration for + ACF. + Note that filters can be configured as an object literal + as an alternative to a string-based definition. +

+
+CKEDITOR.replace( 'editor3', {
+	allowedContent: {
+		'b i ul ol big small': true,
+		'h1 h2 h3 p blockquote li': {
+			styles: 'text-align'
+		},
+		a: { attributes: '!href,target' },
+		img: {
+			attributes: '!src,alt',
+			styles: 'width,height',
+			classes: 'left,right'
+		}
+	}
+} );
+
+
+ + +
+ +
+ +
+ +
+

+ This editor is using a custom set of plugins and buttons. +

+
+CKEDITOR.replace( 'editor4', {
+	removePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
+	removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
+	format_tags: 'p;h1;h2;h3;pre;address'
+} );
+
+

+ As you can see, removing plugins and buttons implies filtering. + Several tags are not allowed in the editor because there's no + plugin/button that is responsible for creating and editing this + kind of content (for example: the image is missing because + of removeButtons: 'Image'). The conclusion is that + ACF works "backwards" + as well: modifying UI + elements is changing allowed content rules. +

+
+ + +
+ +
+ +
+ +
+

+ This editor is built on editable <h1> element. + ACF takes care of + what can be included in <h1>. Note that there + are no block styles in Styles combo. Also why lists, indentation, + blockquote, div, form and other buttons are missing. +

+

+ ACF makes sure that + no disallowed tags will come to <h1> so the final + markup is valid. If the user tried to paste some invalid HTML + into this editor (let's say a list), it would be automatically + converted into plain text. +

+
+

+ Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. +

+
+ + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/divreplace.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/divreplace.html new file mode 100644 index 0000000..721aa4f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/divreplace.html @@ -0,0 +1,141 @@ + + + + + Replace DIV — CKEditor Sample + + + + + + + +

+ CKEditor Samples » Replace DIV with CKEditor on the Fly +

+
+

+ This sample shows how to automatically replace <div> elements + with a CKEditor instance on the fly, following user's doubleclick. The content + that was previously placed inside the <div> element will now + be moved into CKEditor editing area. +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+

+ Double-click any of the following <div> elements to transform them into + editor instances. +

+
+

+ Part 1 +

+

+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

+
+
+

+ Part 2 +

+

+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

+

+ Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus + sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum + vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate. +

+
+
+

+ Part 3 +

+

+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi + semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna + rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla + nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce + eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus. +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/index.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/index.html new file mode 100644 index 0000000..d59a6c4 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/index.html @@ -0,0 +1,128 @@ + + + + + CKEditor Samples + + + + +

+ CKEditor Samples +

+
+
+

+ Basic Samples +

+
+
Replace textarea elements by class name
+
Automatic replacement of all textarea elements of a given class with a CKEditor instance.
+ +
Replace textarea elements by code
+
Replacement of textarea elements with CKEditor instances by using a JavaScript call.
+ +
Create editors with jQuery New!
+
Creating standard and inline CKEditor instances with jQuery adapter.
+
+ +

+ Basic Customization +

+
+
User Interface color
+
Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.
+ +
User Interface languages
+
Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.
+
+ + +

Plugins

+
+
Magicline pluginNew!
+
Using the Magicline plugin to access difficult focus spaces.
+ +
Full page support
+
CKEditor inserted with a JavaScript call and used to edit the whole page from <html> to </html>.
+
+
+
+

+ Inline Editing New! +

+
+
Massive inline editor creation New!
+
Turn all elements with contentEditable = true attribute into inline editors.
+ +
Convert element into an inline editor by code New!
+
Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.
+ +
Replace textarea with inline editor New!
+
A form with a textarea that is replaced by an inline editor at runtime.
+ + +
+ +

+ Advanced Samples +

+
+
Data filtering and features activation New!
+
Data filtering and automatic features activation basing on configuration.
+ +
Replace DIV elements on the fly
+
Transforming a div element into an instance of CKEditor with a mouse click.
+ +
Append editor instances
+
Appending editor instances to existing DOM elements.
+ +
Create and destroy editor instances for Ajax applications
+
Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.
+ +
Basic usage of the API
+
Using the CKEditor JavaScript API to interact with the editor at runtime.
+ +
XHTML-compliant style
+
Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.
+ +
Read-only mode
+
Using the readOnly API to block introducing changes to the editor contents.
+ +
"Tab" key-based navigation New!
+
Navigating among editor instances with tab key.
+ + + +
Using the JavaScript API to customize dialog windows
+
Using the dialog windows API to customize dialog windows without changing the original editor code.
+ +
Using the "Enter" key in CKEditor
+
Configuring the behavior of Enter and Shift+Enter keys.
+ +
Output for Flash
+
Configuring CKEditor to produce HTML code that can be used with Adobe Flash.
+ +
Output HTML
+
Configuring CKEditor to produce legacy HTML 4 code.
+ +
Toolbar ConfigurationsNew!
+
Configuring CKEditor to display full or custom toolbar layout.
+ +
+
+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlineall.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlineall.html new file mode 100644 index 0000000..839d5ef --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlineall.html @@ -0,0 +1,311 @@ + + + + + Massive inline editing — CKEditor Sample + + + + + + + +
+

CKEditor Samples » Massive inline editing

+
+

This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with contentEditable attribute set to value true:

+
<div contenteditable="true" > ... </div>
+

Click inside of any element below to start editing.

+
+
+
+ +
+
+
+

+ Fusce vitae porttitor +

+

+ + Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor. + +

+

+ Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum nisl nulla sem in metus. Maecenas wisi. Donec nec erat volutpat. +

+
+

+ Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium. + Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum +

+
+
+

+ Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu. +

+
+

Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.

+

Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.

+
+
+
+
+

+ Integer condimentum sit amet +

+

+ Aenean nonummy a, mattis varius. Cras aliquet. + Praesent magna non mattis ac, rhoncus nunc, rhoncus eget, cursus pulvinar mollis.

+

Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.

+

Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.

+
+
+

+ Praesent wisi accumsan sit amet nibh +

+

Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.

+

Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce gravida, erat vitae augue. Fusce urna fringilla gravida.

+

In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.

+
+
+
+
+

+ CKEditor logo +

+

Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.

+

+ Nullam laoreet vel consectetuer tellus suscipit +

+
    +
  • Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.
  • +
  • Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.
  • +
  • Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.
  • +
+

Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus.

+

Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.

+

Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.

+
+
+
+
+ Tags of this article: +

+ inline, editing, floating, CKEditor +

+
+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinebycode.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinebycode.html new file mode 100644 index 0000000..6a5b18f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinebycode.html @@ -0,0 +1,121 @@ + + + + + Inline Editing by Code — CKEditor Sample + + + + + + +

+ CKEditor Samples » Inline Editing by Code +

+
+

+ This sample shows how to create an inline editor instance of CKEditor. It is created + with a JavaScript call using the following code: +

+
+// This property tells CKEditor to not activate every element with contenteditable=true element.
+CKEDITOR.disableAutoInline = true;
+
+var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
+
+

+ Note that editable in the code above is the id + attribute of the <div> element to be converted into an inline instance. +

+
+
+

Saturn V carrying Apollo 11 Apollo 11

+ +

Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

+ +

Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

+ +

Broadcasting and quotes

+ +

Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

+ +
+

One small step for [a] man, one giant leap for mankind.

+
+ +

Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

+ +
+

[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

+
+ +

Technical details

+ + + + + + + + + + + + + + + + + + + + + + + +
Mission crew
PositionAstronaut
CommanderNeil A. Armstrong
Command Module PilotMichael Collins
Lunar Module PilotEdwin "Buzz" E. Aldrin, Jr.
+ +

Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

+ +
    +
  1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
  2. +
  3. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
  4. +
  5. Lunar Module for landing on the Moon.
  6. +
+ +

After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.

+ +
+

Source: Wikipedia.org

+
+ + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinetextarea.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinetextarea.html new file mode 100644 index 0000000..49c29ee --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/inlinetextarea.html @@ -0,0 +1,110 @@ + + + + + Replace Textarea with Inline Editor — CKEditor Sample + + + + + + +

+ CKEditor Samples » Replace Textarea with Inline Editor +

+
+

+ You can also create an inline editor from a textarea + element. In this case the textarea will be replaced + by a div element with inline editing enabled. +

+
+// "article-body" is the name of a textarea element.
+var editor = CKEDITOR.inline( 'article-body' );
+
+
+
+

This is a sample form with some fields

+

+ Title:
+

+

+ Article Body (Textarea converted to CKEditor):
+ +

+

+ +

+
+ + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/jquery.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/jquery.html new file mode 100644 index 0000000..07e818a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/jquery.html @@ -0,0 +1,97 @@ + + + + + + jQuery Adapter — CKEditor Sample + + + + + + + + +

+ CKEditor Samples » Create Editors with jQuery +

+
+
+

+ This sample shows how to use the jQuery adapter. + Note that you have to include both CKEditor and jQuery scripts before including the adapter. +

+
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+<script src="/ckeditor/ckeditor.js"></script>
+<script src="/ckeditor/adapters/jquery.js"></script>
+
+

Then you can replace html elements with a CKEditor instance using the ckeditor() method.

+
+$( document ).ready( function() {
+	$( 'textarea#editor1' ).ckeditor();
+} );
+
+
+ +

Inline Example

+ +
+

Saturn V carrying Apollo 11Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

+

Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth. +

Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

+

One small step for [a] man, one giant leap for mankind.

Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

[...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

+
+ +
+ +

Framed Example

+ + + +

+ + + + + +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/dialog/dialog.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/dialog/dialog.html new file mode 100644 index 0000000..5576006 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/dialog/dialog.html @@ -0,0 +1,187 @@ + + + + + Using API to Customize Dialog Windows — CKEditor Sample + + + + + + + + + + +

+ CKEditor Samples » Using CKEditor Dialog API +

+
+

+ This sample shows how to use the + CKEditor Dialog API + to customize CKEditor dialog windows without changing the original editor code. + The following customizations are being done in the example below: +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+

A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

+
    +
  1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
  2. +
  3. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.
  4. +
+ + +

The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

+
    +
  1. Adding dialog tab – Add new tab "My Tab" to dialog window.
  2. +
  3. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
  4. +
  5. Adding dialog window fields – Add "My Custom Field" to the dialog window.
  6. +
  7. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
  8. +
  9. Setting default values for dialog window fields – Set default value of "Text Field" text field.
  10. +
  11. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
  12. +
+ + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/enterkey/enterkey.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/enterkey/enterkey.html new file mode 100644 index 0000000..f744756 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/enterkey/enterkey.html @@ -0,0 +1,103 @@ + + + + + ENTER Key Configuration — CKEditor Sample + + + + + + + + + +

+ CKEditor Samples » ENTER Key Configuration +

+
+

+ This sample shows how to configure the Enter and Shift+Enter keys + to perform actions specified in the + enterMode + and shiftEnterMode + parameters, respectively. + You can choose from the following options: +

+
    +
  • ENTER_P – new <p> paragraphs are created;
  • +
  • ENTER_BR – lines are broken with <br> elements;
  • +
  • ENTER_DIV – new <div> blocks are created.
  • +
+

+ The sample code below shows how to configure CKEditor to create a <div> block when Enter key is pressed. +

+
+CKEDITOR.replace( 'textarea_id', {
+	enterMode: CKEDITOR.ENTER_DIV
+});
+

+ Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

+
+
+ When Enter is pressed:
+ +
+
+ When Shift+Enter is pressed:
+ +
+
+
+

+
+ +

+

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputforflash.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputforflash.html new file mode 100644 index 0000000..93ee5ea --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputforflash.html @@ -0,0 +1,280 @@ + + + + + Output for Flash — CKEditor Sample + + + + + + + + + + + + +

+ CKEditor Samples » Producing Flash Compliant HTML Output +

+
+

+ This sample shows how to configure CKEditor to output + HTML code that can be used with + + Adobe Flash. + The code will contain a subset of standard HTML elements like <b>, + <i>, and <p> as well as HTML attributes. +

+

+ To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard + JavaScript call, and define CKEditor features to use HTML elements and attributes. +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+

+ To see how it works, create some content in the editing area of CKEditor on the left + and send it to the Flash object on the right side of the page by using the + Send to Flash button. +

+ + + + + +
+ + +

+ +

+
+
+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputhtml.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputhtml.html new file mode 100644 index 0000000..6f99b1b --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/htmlwriter/outputhtml.html @@ -0,0 +1,221 @@ + + + + + HTML Compliant Output — CKEditor Sample + + + + + + + + + + +

+ CKEditor Samples » Producing HTML Compliant Output +

+
+

+ This sample shows how to configure CKEditor to output valid + HTML 4.01 code. + Traditional HTML elements like <b>, + <i>, and <font> are used in place of + <strong>, <em>, and CSS styles. +

+

+ To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard + JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes. +

+

+ A snippet of the configuration code can be seen below; check the source of this page for + full definition: +

+
+CKEDITOR.replace( 'textarea_id', {
+	coreStyles_bold: { element: 'b' },
+	coreStyles_italic: { element: 'i' },
+
+	fontSize_style: {
+		element: 'font',
+		attributes: { 'size': '#(size)' }
+	}
+
+	...
+});
+
+
+

+ + + +

+

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/magicline/magicline.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/magicline/magicline.html new file mode 100644 index 0000000..78de03b --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/magicline/magicline.html @@ -0,0 +1,207 @@ + + + + + Using Magicline plugin — CKEditor Sample + + + + + + + + + +

+ CKEditor Samples » Using Magicline plugin +

+
+

+ This sample shows the advantages of Magicline plugin + which is to enhance the editing process. Thanks to this plugin, + a number of difficult focus spaces which are inaccessible due to + browser issues can now be focused. +

+

+ Magicline plugin shows a red line with a handler + which, when clicked, inserts a paragraph and allows typing. To see this, + focus an editor and move your mouse above the focus space you want + to access. The plugin is enabled by default so no additional + configuration is necessary. +

+
+
+ +
+

+ This editor uses a default Magicline setup. +

+
+ + +
+
+
+ +
+

+ This editor is using a blue line. +

+
+CKEDITOR.replace( 'editor2', {
+	magicline_color: 'blue'
+});
+
+ + +
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/toolbar/toolbar.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/toolbar/toolbar.html new file mode 100644 index 0000000..b6ab63b --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/toolbar/toolbar.html @@ -0,0 +1,232 @@ + + + + + Toolbar Configuration — CKEditor Sample + + + + + + + + + +

+ CKEditor Samples » Toolbar Configuration +

+
+

+ This sample page demonstrates editor with loaded full toolbar (all registered buttons) and, if + current editor's configuration modifies default settings, also editor with modified toolbar. +

+ +

Since CKEditor 4 there are two ways to configure toolbar buttons.

+ +

By config.toolbar

+ +

+ You can explicitly define which buttons are displayed in which groups and in which order. + This is the more precise setting, but less flexible. If newly added plugin adds its + own button you'll have to add it manually to your config.toolbar setting as well. +

+ +

To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:

+ +
+CKEDITOR.replace( 'textarea_id', {
+	toolbar: [
+		{ name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] },	// Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
+		[ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],			// Defines toolbar group without name.
+		'/',																					// Line break - next group will be placed in new line.
+		{ name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
+	]
+});
+ +

By config.toolbarGroups

+ +

+ You can define which groups of buttons (like e.g. basicstyles, clipboard + and forms) are displayed and in which order. Registered buttons are associated + with toolbar groups by toolbar property in their definition. + This setting's advantage is that you don't have to modify toolbar configuration + when adding/removing plugins which register their own buttons. +

+ +

To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:

+ +
+CKEDITOR.replace( 'textarea_id', {
+	toolbarGroups: [
+		{ name: 'document',	   groups: [ 'mode', 'document' ] },			// Displays document group with its two subgroups.
+ 		{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },			// Group's name will be used to create voice label.
+ 		'/',																// Line break - next group will be placed in new line.
+ 		{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ 		{ name: 'links' }
+	]
+
+	// NOTE: Remember to leave 'toolbar' property with the default value (null).
+});
+
+ + + +
+

Full toolbar configuration

+

Below you can see editor with full toolbar, generated automatically by the editor.

+

+ Note: To create editor instance with full toolbar you don't have to set anything. + Just leave toolbar and toolbarGroups with the default, null values. +

+ +

+	
+ + + + + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/wysiwygarea/fullpage.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/wysiwygarea/fullpage.html new file mode 100644 index 0000000..c1da0ee --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/plugins/wysiwygarea/fullpage.html @@ -0,0 +1,77 @@ + + + + + Full Page Editing — CKEditor Sample + + + + + + + + + + +

+ CKEditor Samples » Full Page Editing +

+
+

+ This sample shows how to configure CKEditor to edit entire HTML pages, from the + <html> tag to the </html> tag. +

+

+ The CKEditor instance below is inserted with a JavaScript call using the following code: +

+
+CKEDITOR.replace( 'textarea_id', {
+	fullPage: true,
+	allowedContent: true
+});
+
+

+ Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

+

+ The allowedContent in the code above is set to true to disable content filtering. + Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations. +

+
+
+ + + +

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/readonly.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/readonly.html new file mode 100644 index 0000000..8df1d95 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/readonly.html @@ -0,0 +1,73 @@ + + + + + Using the CKEditor Read-Only API — CKEditor Sample + + + + + + +

+ CKEditor Samples » Using the CKEditor Read-Only API +

+
+

+ This sample shows how to use the + setReadOnly + API to put editor into the read-only state that makes it impossible for users to change the editor contents. +

+

+ For details on how to create this setup check the source code of this sample page. +

+
+
+

+ +

+

+ + +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebyclass.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebyclass.html new file mode 100644 index 0000000..488ee2c --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebyclass.html @@ -0,0 +1,57 @@ + + + + + Replace Textareas by Class Name — CKEditor Sample + + + + + +

+ CKEditor Samples » Replace Textarea Elements by Class Name +

+
+

+ This sample shows how to automatically replace all <textarea> elements + of a given class with a CKEditor instance. +

+

+ To replace a <textarea> element, simply assign it the ckeditor + class, as in the code below: +

+
+<textarea class="ckeditor" name="editor1"></textarea>
+
+

+ Note that other <textarea> attributes (like id or name) need to be adjusted to your document. +

+
+
+

+ + +

+

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebycode.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebycode.html new file mode 100644 index 0000000..ba2c79d --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/replacebycode.html @@ -0,0 +1,56 @@ + + + + + Replace Textarea by Code — CKEditor Sample + + + + + +

+ CKEditor Samples » Replace Textarea Elements Using JavaScript Code +

+
+
+

+ This editor is using an <iframe> element-based editing area, provided by the Wysiwygarea plugin. +

+
+CKEDITOR.replace( 'textarea_id' )
+
+
+ + +

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.css b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.css new file mode 100644 index 0000000..53da31c --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.css @@ -0,0 +1,339 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ + +html, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre +{ + line-height: 1.5em; +} + +body +{ + padding: 10px 30px; +} + +input, textarea, select, option, optgroup, button, td, th +{ + font-size: 100%; +} + +pre, code, kbd, samp, tt +{ + font-family: monospace,monospace; + font-size: 1em; +} + +body { + width: 960px; + margin: 0 auto; +} + +code +{ + background: #f3f3f3; + border: 1px solid #ddd; + padding: 1px 4px; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +abbr +{ + border-bottom: 1px dotted #555; + cursor: pointer; +} + +.new +{ + background: #FF7E00; + border: 1px solid #DA8028; + color: #fff; + font-size: 10px; + font-weight: bold; + padding: 1px 4px; + text-shadow: 0 1px 0 #C97626; + text-transform: uppercase; + margin: 0 0 0 3px; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + + -moz-box-shadow: 0 2px 3px 0 #FFA54E inset; + -webkit-box-shadow: 0 2px 3px 0 #FFA54E inset; + box-shadow: 0 2px 3px 0 #FFA54E inset; +} + +h1.samples +{ + color: #0782C1; + font-size: 200%; + font-weight: normal; + margin: 0; + padding: 0; +} + +h1.samples a +{ + color: #0782C1; + text-decoration: none; + border-bottom: 1px dotted #0782C1; +} + +.samples a:hover +{ + border-bottom: 1px dotted #0782C1; +} + +h2.samples +{ + color: #000000; + font-size: 130%; + margin: 15px 0 0 0; + padding: 0; +} + +p, blockquote, address, form, pre, dl, h1.samples, h2.samples +{ + margin-bottom: 15px; +} + +ul.samples +{ + margin-bottom: 15px; +} + +.clear +{ + clear: both; +} + +fieldset +{ + margin: 0; + padding: 10px; +} + +body, input, textarea +{ + color: #333333; + font-family: Arial, Helvetica, sans-serif; +} + +body +{ + font-size: 75%; +} + +a.samples +{ + color: #189DE1; + text-decoration: none; +} + +form +{ + margin: 0; + padding: 0; +} + +pre.samples +{ + background-color: #F7F7F7; + border: 1px solid #D7D7D7; + overflow: auto; + padding: 0.25em; + white-space: pre-wrap; /* CSS 2.1 */ + word-wrap: break-word; /* IE7 */ + -moz-tab-size: 4; + -o-tab-size: 4; + -webkit-tab-size: 4; + tab-size: 4; +} + +#footer +{ + clear: both; + padding-top: 10px; +} + +#footer hr +{ + margin: 10px 0 15px 0; + height: 1px; + border: solid 1px gray; + border-bottom: none; +} + +#footer p +{ + margin: 0 10px 10px 10px; + float: left; +} + +#footer #copy +{ + float: right; +} + +#outputSample +{ + width: 100%; + table-layout: fixed; +} + +#outputSample thead th +{ + color: #dddddd; + background-color: #999999; + padding: 4px; + white-space: nowrap; +} + +#outputSample tbody th +{ + vertical-align: top; + text-align: left; +} + +#outputSample pre +{ + margin: 0; + padding: 0; +} + +.description +{ + border: 1px dotted #B7B7B7; + margin-bottom: 10px; + padding: 10px 10px 0; + overflow: hidden; +} + +label +{ + display: block; + margin-bottom: 6px; +} + +/** + * CKEditor editables are automatically set with the "cke_editable" class + * plus cke_editable_(inline|themed) depending on the editor type. + */ + +/* Style a bit the inline editables. */ +.cke_editable.cke_editable_inline +{ + cursor: pointer; +} + +/* Once an editable element gets focused, the "cke_focus" class is + added to it, so we can style it differently. */ +.cke_editable.cke_editable_inline.cke_focus +{ + box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000; + outline: none; + background: #eee; + cursor: text; +} + +/* Avoid pre-formatted overflows inline editable. */ +.cke_editable_inline pre +{ + white-space: pre-wrap; + word-wrap: break-word; +} + +/** + * Samples index styles. + */ + +.twoColumns, +.twoColumnsLeft, +.twoColumnsRight +{ + overflow: hidden; +} + +.twoColumnsLeft, +.twoColumnsRight +{ + width: 45%; +} + +.twoColumnsLeft +{ + float: left; +} + +.twoColumnsRight +{ + float: right; +} + +dl.samples +{ + padding: 0 0 0 40px; +} +dl.samples > dt +{ + display: list-item; + list-style-type: disc; + list-style-position: outside; + margin: 0 0 3px; +} +dl.samples > dd +{ + margin: 0 0 3px; +} +.warning +{ + color: #ff0000; + background-color: #FFCCBA; + border: 2px dotted #ff0000; + padding: 15px 10px; + margin: 10px 0; +} + +/* Used on inline samples */ + +blockquote +{ + font-style: italic; + font-family: Georgia, Times, "Times New Roman", serif; + padding: 2px 0; + border-style: solid; + border-color: #ccc; + border-width: 0; +} + +.cke_contents_ltr blockquote +{ + padding-left: 20px; + padding-right: 8px; + border-left-width: 5px; +} + +.cke_contents_rtl blockquote +{ + padding-left: 8px; + padding-right: 20px; + border-right-width: 5px; +} + +img.right { + border: 1px solid #ccc; + float: right; + margin-left: 15px; + padding: 5px; +} + +img.left { + border: 1px solid #ccc; + float: left; + margin-right: 15px; + padding: 5px; +} diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.js b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.js new file mode 100644 index 0000000..efa20d1 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample.js @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// Tool scripts for the sample pages. +// This file can be ignored and is not required to make use of CKEditor. + +(function() { + // Check for sample compliance. + CKEDITOR.on( 'instanceReady', function( ev ) { + var editor = ev.editor, + meta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ), + requires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [], + missing = []; + + if ( requires.length ) { + for ( var i = 0; i < requires.length; i++ ) { + if ( !editor.plugins[ requires[ i ] ] ) + missing.push( '' + requires[ i ] + '' ); + } + + if ( missing.length ) { + var warn = CKEDITOR.dom.element.createFromHtml( + '
' + + 'To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.' + + '
' + ); + warn.insertBefore( editor.container ); + } + } + }); +})(); diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample_posteddata.php b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample_posteddata.php new file mode 100644 index 0000000..3edb925 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/sample_posteddata.php @@ -0,0 +1,16 @@ +
+
+-------------------------------------------------------------------------------------------
+  CKEditor - Posted Data
+
+  We are sorry, but your Web server does not support the PHP language used in this script.
+
+  Please note that CKEditor can be used with any other server-side language than just PHP.
+  To save the content created with CKEditor you need to read the POST data on the server
+  side and write it to a file or the database.
+
+  Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+  For licensing, see LICENSE.md or http://ckeditor.com/license
+-------------------------------------------------------------------------------------------
+
+
*/ include "assets/posteddata.php"; ?> diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/tabindex.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/tabindex.html new file mode 100644 index 0000000..a72254f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/tabindex.html @@ -0,0 +1,75 @@ + + + + + TAB Key-Based Navigation — CKEditor Sample + + + + + + + +

+ CKEditor Samples » TAB Key-Based Navigation +

+
+

+ This sample shows how tab key navigation among editor instances is + affected by the tabIndex attribute from + the original page element. Use TAB key to move between the editors. +

+
+

+ +

+
+

+ +

+

+ +

+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/uicolor.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/uicolor.html new file mode 100644 index 0000000..d6885be --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/uicolor.html @@ -0,0 +1,69 @@ + + + + + UI Color Picker — CKEditor Sample + + + + + +

+ CKEditor Samples » UI Color +

+
+

+ This sample shows how to automatically replace <textarea> elements + with a CKEditor instance with an option to change the color of its user interface.
+ Note:The UI skin color feature depends on the CKEditor skin + compatibility. The Moono and Kama skins are examples of skins that work with it. +

+
+
+

+ This editor instance has a UI color value defined in configuration to change the skin color, + To specify the color of the user interface, set the uiColor property: +

+
+CKEDITOR.replace( 'textarea_id', {
+	uiColor: '#14B8C4'
+});
+

+ Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

+

+ + +

+

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/uilanguages.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/uilanguages.html new file mode 100644 index 0000000..dce2c93 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/uilanguages.html @@ -0,0 +1,119 @@ + + + + + User Interface Globalization — CKEditor Sample + + + + + + +

+ CKEditor Samples » User Interface Languages +

+
+

+ This sample shows how to automatically replace <textarea> elements + with a CKEditor instance with an option to change the language of its user interface. +

+

+ It pulls the language list from CKEditor _languages.js file that contains the list of supported languages and creates + a drop-down list that lets the user change the UI language. +

+

+ By default, CKEditor automatically localizes the editor to the language of the user. + The UI language can be controlled with two configuration options: + language and + + defaultLanguage. The defaultLanguage setting specifies the + default CKEditor language to be used when a localization suitable for user's settings is not available. +

+

+ To specify the user interface language that will be used no matter what language is + specified in user's browser or operating system, set the language property: +

+
+CKEDITOR.replace( 'textarea_id', {
+	// Load the German interface.
+	language: 'de'
+});
+

+ Note that textarea_id in the code above is the id attribute of + the <textarea> element to be replaced. +

+
+
+

+ Available languages ( languages!):
+ +
+ + (You may see strange characters if your system does not support the selected language) + +

+

+ + +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/samples/xhtmlstyle.html b/src/public/static/smartadmin/js/plugin/ckeditor/samples/xhtmlstyle.html new file mode 100644 index 0000000..484eb00 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/samples/xhtmlstyle.html @@ -0,0 +1,231 @@ + + + + + XHTML Compliant Output — CKEditor Sample + + + + + + + +

+ CKEditor Samples » Producing XHTML Compliant Output +

+
+

+ This sample shows how to configure CKEditor to output valid + XHTML 1.1 code. + Deprecated elements (<font>, <u>) or attributes + (size, face) will be replaced with XHTML compliant code. +

+

+ To add a CKEditor instance outputting valid XHTML code, load the editor using a standard + JavaScript call and define CKEditor features to use the XHTML compliant elements and styles. +

+

+ A snippet of the configuration code can be seen below; check the source of this page for + full definition: +

+
+CKEDITOR.replace( 'textarea_id', {
+	contentsCss: 'assets/outputxhtml.css',
+
+	coreStyles_bold: {
+		element: 'span',
+		attributes: { 'class': 'Bold' }
+	},
+	coreStyles_italic: {
+		element: 'span',
+		attributes: { 'class': 'Italic' }
+	},
+
+	...
+});
+
+
+

+ + + +

+

+ +

+
+ + + diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog.css new file mode 100644 index 0000000..00ca8e3 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie.css new file mode 100644 index 0000000..613de5a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie7.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie7.css new file mode 100644 index 0000000..4422d2a --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie8.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie8.css new file mode 100644 index 0000000..888f2bd --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_iequirks.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_iequirks.css new file mode 100644 index 0000000..4bb22b6 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_opera.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_opera.css new file mode 100644 index 0000000..4bec3d6 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/dialog_opera.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor.css new file mode 100644 index 0000000..e27f1d8 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_gecko.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_gecko.css new file mode 100644 index 0000000..9efdf60 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie.css new file mode 100644 index 0000000..b8b80ab --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie7.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie7.css new file mode 100644 index 0000000..cba32dd --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie8.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie8.css new file mode 100644 index 0000000..68134a3 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_iequirks.css b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_iequirks.css new file mode 100644 index 0000000..c68d433 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5f9bd06fa3e896dce035af6f15c66f19a28b6c GIT binary patch literal 20427 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 literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons_hidpi.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/icons_hidpi.png new file mode 100644 index 0000000000000000000000000000000000000000..034ba6f21188981c4f57f9a697e5046d1a3e5e1d GIT binary patch literal 66930 zcmZsD1y~h-xAky1z#%;X(hU+4(xCLAJ48}CR9YJ8PU!~e5~MqX14uUtNH<7#N%+nG zzW06a{l4de=i$K2FfcQ}z4zK{t$o7PRAh0n$gltaz?GMi(g0s+0N@c4h7Nw0;QBcG zpP%KWBsASK_q{zbHK)=po$L-2wO?x=Ejs_;J;(Ys&Z}J8PY1K3S;N;RR7OwmlK;uZ zL&`%N9^T7!qr|NewJzFAlHXhMfwqYb0)Em6IsXv1cb@sUces6pWCn2Qr4F?+<`w0u&&~Zt zBS!7v;n6=fhVdNs`{+p4$o@GV)r-7q40Ip76+58I9se35wC@bL$*QG;eR@V4PRAe* zDI^4tBsiR8IL0{WUTxk&q6>BJ1(?5KAy-dmI6FS>{&ah;(*%#m6DNeq#Y5%ebC|JU zw8kXpGWm}g6EH0!(fp0!W1@fWIONqW{nrc3(a5<=7Sa+@uC_`yheYyd{I&&yx=nC! zadT_S_5}U9zkU1WEt)+x$QhLchbXYv@RL7dWsST#oRbFH+&I{ehpg?JR$Yrn(6hE5 z5PAR@L{KkwW7&Xp8-EDB_jhnvIkPz6EHI0AfJ8ki;EK3E)~qP zWA*&A@C~AM3QGb`1B0NWqZbIwR8niQEu;1_O z1t5ZAx;Hy8!M!4-FPNd-u+Z+~+xz2#11!-8V zNuOv)tEUqxlY=rt+|#nJwP&&GJJ8;o{YHSvW3aX|n! zQgL))A^3@fMgQ4Hb#?W}pFalpsWAs-{U|O}bv+owIF_kFj0PivBU3mGbTl-f(#f<# z+)Z-OJZ3sVtlZYtjMl66+XfE`ykvOINhFQh_J`KTCc4ZK5czoI2Z}o%u@==VoVN2x z#lHEsqnQ{vFJ9BWPgyIVfeMdF#xsQFg&A{(ne|1xJb%-4{4HT|@m=!b=Jg@g{2B zUD-CHJmB~UD575m(N9CWAxOKi&XvSdG*_-gubvo_QLJKny0wK+Cv?sd^f!}@UO-t9 zm?h+EAX;gPI@{hll}EgU8u&(IIX9bC;w9~)2}7#t1rbG-snWG-PT z#h(nQsG`@$XJ$e>+HdV9Yijo(08Te@$ALj1xx>6OfSUNp6MvJ`l0sp)c&dfl zn;HibjYfmsz}QlDahU)74ln9;)}IRo;0%XIvHPyssgn~2nkCCgBBlLyJL{Y0l@?ua z46O*t)Y)TIq#eILc}B(&9|?|wAO$lEhm48}p1FKLf!@%8>unKuuq)sm40p8JhyIMK z>~|biR)lrdg`oSv#Sf_XDWbhqQI3TxfnVq=`d=c(O0Z4Q%96tKVA1O|5vFzU{13k@ zj7cb7y4v_S$FJZ4%gS1=j1}{w7r3}7&vpf488E?6UbSn#*`iEJN@6N2D^o=e?0f*j z7}KX?Spuc^9dBM!6UoTP2&XPvt*1(M1K|F4n4N|dE63HJLH;*230$kva50YNOO?%R zjhmO~@=bGdb53GjMFUYA!(z?R57obDe%#!WTR+t9wQ~vc*iez_O?$0?4+c$@&;6e> z40QC5Qd2X`5p<h!o=sqyUE>X*_Qkfv|h`;4TwDFqv7^(!j5l$B!23YVFtv&~Ds; zi_tW2f+T}WQd08z?9T;eqmy|9UO#u3f*;@@M1hmXu_&R#hR-m7s#^hZ@KArhBleES zSw8un%D1?9(CW1_$%QZOOvFisf>^22`yAZU<5@4tPl5yHihmNW#v2^nWLkNAFrGes z^!zZC($R)7VZd)jFaG4|OW!&>fYYfLhZ6_Yb|~aBwde(hZnCtmuUJL%VTMNd zfrzBuD;fwb$#)e0b_uu#z-w3oYh3;-<@_u6a9Mg0Ak{)R; z7!TeKqytDbg=GxRN?&7|^Qn2e+W7-lI09M2cIS`8_SNrr*ljv@gCl&B>Z)w4ixbmP z>QIp#4{OB5ny7>f@(4kSUcMP4u~UQ7Z2ZhdZ+vIbs=LwG@}NkPg=6Sw0bdq-uAl4!pm@ zk0JKI0ZfI;X62v)<+|OpR@y5Si#35l|C1Qv93)f*IoWG?+Hf^*hG@)V~3gQ>&k~y?k+kB$K2iBt;_Lj_Qn95WAC_oM$?14 zO}utm_7Ff#1NNtIKl=%n`6!w!^mdXgh@5%fRU-xbbdj**0?oKHtC~_b3h? zl>j8PS8X~K#+yX=q?z{$ckGOrg>|oskk=;Si0h zyRN11c2ww4&MSHktoqspA~B`p#P5E_&6=U$Q|FU0L1x6g+j(YfBnyLsZ)$e41i&?) zIuaZddppH@^j483L4;w5h~03XoBR`3!nZ9+x*+6%Bi9)*n?tp5%z=Jm(aYeJrfX-+ zOb?H3Md3&Mga|=G1ScVanGnH%FTqR*ArA+UDGn~)+81J@;g8mCEf}F>W%KvVKWw6J zV)?$`;(-s8lO&P3u!AOOA&EUaF()xAC(UfrU0akra*$=pZD#MEg8AR87v20VtE*rX zEL0m+@R9mwe+8+SyHNOI7Y{5411TGpzSltCGy2B{a{&_4Tvq+%OI}?ap-Lz!M+&x9 z*^>a~fNens;YZ096JYXxc<=#X0<8q$qFnB9B8&eKuX47}(J(2`O4U56t~$v9uCCCz zI1I&%6N%(BCXq40L3aqq5k75Q-lS=nWufJ+CK!EhWBbjsv&|!lAp&Qprkc`eu8?_< zQ<^bh;5#QeDxL7yzM%W~l-?^R73f2ucP|bPaX6=5kH0v;pMm@O^=pOhpI=I{xY59n z5p>-rQOOb>pb&HbyB|4x^s!8NU3Wc5EfI%JengjC>1#IpaAO($jMIFVy^yqxtl$0&A3%0b@Tl`3c;pAf##iS_So;@v`sTWn*oEg~qpMtnfvr z%t`mONd$sr6CDF1zu3l{G>4EV5-mgYItLvo8J4~;o0Plzs!bf$90bRgdo4T2k&~$P z=EKF*=T&jQu8|x)khUcz(Ij!bFNW1%aZzw_UWle<-&Kk@`wBkAIrz&w!K8+}JL;k_-ds{fSk7(HY!j4O=% zYq}&`yJJ0H-60B!I0VRN}|7^i&%w%u6JZk$27d2aO^B;%e3|2m{(QEysdF zFJDGc#V}1{>alJ`SVK`I+Cld zr5@*OAg74T%>FwTHR1|Io&iLRin1^hOj@DKgL#a6u9tOn`Tm=mn^7&oF^D;%?tuhG zt|w?{!{g)QgYbr`A8{#{=tUP&sEjXP*OrdVmNQ~Oc?Ab7&SF(6#GqVLPn))NYbYTbJhf5((gz4C@<>ObJU#_|~uQ&*js13fGzq|Jli?ZZt z@VZ`Q4T>G={Rs&S40PbcaSuhcObF*9`=k`zjpC+)m!qPLfYGyJL9=2g&#<9^zh8Kh zWgpBl(f$#NgTKdI@cnx~Xk_H>e`7um)^YS-2d=3jTff7f1^SziSpHf?FQ0uooa*1v zc2}dBn&Jj$k&5TOVTaduh~1yRYWuTWrsU=(@aNB;)TJfEOi^z#m0|+$J}^IfrlFvy zSbf7wsrS9id0Q*Q=JWuBU(u+2?QQ8MfVB9%p)t%IQHr zL`2*VlC%vms)WfQ^tMt;L+3j#T9Igwv3#pZhOccK@h@aDY(++~Xi)rS-Zk1c-AyX$ zKVwt^sKY@VOyj%uJx<}TE`gfkn~IK$s|#8RJo>Jh{(*r`Y2r8Ib}lakfMeiT&&iRW zt>d_hC}RpM+2S!)@c8m_%ns2l>N?;ojlH#+8B1)6wk<(>Mb}AL7^?%Ip0Mall zOjA;EKNWvazi{18r9@`;>Un5Do?!~n7S!bAr5ay z9Rxr3e`t2N2FVZq1SSG}H3VC0d1Iqnc$^6w2F+m}Y@nBouA?O@+r_G%G8Fx=_PuLz za*{Gmu7Hn;2_t~P|Cz#mEJ2~B{LikW1SVFMP_v)U^>IuT+>%u@o4^e1?6b*g@GhmIdCMSSz}eK%6ji8PYH1cQaDLMGgI{<~Qh4qe{)}2;Ei`dbWlB&)`gSxu zg-JjugE1u~Wyr8n+qHGEX8s`gGe=71D-C??22QG6bNsw_r{=S4^1omD2+vw6`Z)>N zrr>MJ?}-1+xa@0|a+JrEPhJhrl2-oCa5+mXBTg7Z$rKu*XJB{5$-#EX-I21-ggY;KAy zd!PTd28`=wlbt$^| zCd_Eo>+Ye{8};ElH7X4W-miaAGyg)GCx3CdXZttgk9C28B>w%dUO7?hK-xrcbUL$s zqEJa!58;~my(FhLLsIqnBy;zHL&t%`g*UUGGg#*hI7roP1A^qN*^TNy@(s2b>SzW+ z&3M}Qg?Ow{zF+t<2C8MW03kbX zV#39}dPvJrCj^-$4k44#{&mqqus)E%!8Ygn$cm3K1qHyO8$;y!24A|0Ei$jPw4fvC zJ*JxU4*4|h1f$DS#Un?-Ho$a_q0<=dw&1b-tH*(vGbemSoo|{wsyD>^LOU@@nf4h9 z*mJ?qPs%HOMZQQG>p^4!b3-k3z%|m&i|@oJRC=45HULIXPEqW%#iB zWLC->m+>-RILSu*vK9^GKMW^Dms z@Q7t#0kh!2+3J+ooyi@H#HQhGg<-vwkGcd3RKky82!;XqeX!TPSNW|MK=u$DecjmH zmMkL7h03;%1tU|mIgCWbW)5VS2_t61JS4=!M63z1gSt6MKEXl|zcHhTd`Qm9(mFR= zhCvx4YugM(fRFVVSB8WpGdil5Kd|JvO=^bNYxS`#G-hX&OgvYO;K%nrK0HN|2L45<6wN>@Si7`{g$ye1Q_fxrz}t);>BS7$W|S|6tlH@^I;OHS>3J`oJ~AYi&F z(Lo_`PKHj#PnE?^13}z9{LXs*`r0hU!r+D9_dRibcFwYVv-P8FFGr;$)CnHTlf7~_ zc@}+RLQU(dnA&n3$%#Z3M|BsM{p85fvduh}SCfL7p#&sOn*flZ95TYlbpMwacf=%i z|1W*+e8m5%&f~f39U{H^82y9;Ha*+>7=lcY^;HZ(V#xX$xGmpstZ(R1EQ?G%()|X7 zyN7veeG@}2K%H?}9oh@-C~=%3j!XY%pNy8_YoiXk=_u0tb`ojhwmaY?X+|ld!A?d| zv5PC=-Fb8*wRl-uL-hv(eMM|@7yFNT5b#{UakqSZ{hnTtN^prn?|1CHr%!X%GVcL^ z^FtT3YL)XJ^^o^v5)UmWl@FlsCAXr&ZhhxRF-Tt0_6}ecK84Gg5BmUs`|nN+Vt#%B z`~8ExKvx-BR!BEK<0)#vZ^+c-LqZ?5x3h`0^#te0H1*20r05KdaMa19?#QtQZ3j z`w-QVYJYvRgLZ7M7eeBHnx6g?+#=j3@yaU2;ziLfuq!5%?~)!$X`~N_4<;5BVPgUu z(xm8!s^b7`A}g0Z8!5h5MM{sQ9&09?k)n*SX}?iJ0wt)N8rgF^g{7rx<2JIGgKC6m zScR!-db7zs)uf`j)>wKr@tA+?aw1g+$T7qNe{wtSBh#bo17yUx}$Jcqp*kpJo45dfs-7@R%xn zeH!tEbt8JVc5_C+#{KnB_V63uM}EDsRG#}HpPFf4zYh*9T2(TCfqI6*7D%@{0iS@w zk2jkskMLiAVZ{&6DQneUVryxjhMpgq%h?fj!Zt?5H|=Xzz+2$17rsdrGMsr z#t(`O42m^syM4I5kx9VJWA55MGdY;6FJ3z<=GJtrt8dWa#zD>61_k&jNtSyOaiKhw zD5a{p+}uvdCukrz`sVFj{IKJ>JQOpQy`ZDqUr&{S4H+|YaDdZn*h!^~`)W!m6@-qs ze)Bhh@H`sxgAZN&3V|g5A3@sH>vN=(f|=Xc7p8 znE&3j--gr-{8fELPQG~>5s`a)*m}gG@IF;zF5^o}bVQ%k?(RnEK*D`rG&M0xVKGZ# zzSgKz)5y+A|7d2WDs!Q}X5?K6+aU$uqdaVRQ#16OTH~xkf`xsUVVw^!gdAIt;S#f# zVk_`7-rGam-TMv~J*R?yUpkYnWrq#(k}==*g?-%4ej2o|n90s%t}ue*KmqxZebOta?vBh-~lIUG+BCPo4n?V)oTb75m;^UW3pXhdkc>hq5;;;@@1g@lb2x@Q1N&fU#e6x-0=%SV)h=~7YR4f9>R_>G_#?$>GT zcULUN|gyZNO>PV(sdr z(MkSv*dAjUH84bgFs{~Hb!7(|gs9`AI z6Ln>K8eR*X90ouvAx$Tae($x8E6@byk5_+hvTzH z2&)Ujmd`1ObC#EaASsR7FSHgKT-h15wYZbp+J4Fk+gP6UADQ(Zi%TN#%k0}8gU_m@ zyqvOLqgND;hO&Ek5%jiy(so-_HXxzkom{#(ROR!_U=YElzA^a3!pB#V$&Gd>$i-lR z^UqC8Rl;oL zGcmogf3NX4NK1$K74h!}$f8jWSb2T@51)_Uqy5juVD1x=4Bb+L=KW=uCW(-+T-Q9l9?3~Ut)=y0-r3LI& zwtpn6*2x-S7~>?tQ8n_tnEDZcjXfd!R>gW6N+|teG^D#~{-9|;UXcUc!JcU9ug&J^ zCM#$k&`Ay+FeiJO8J8?BFONx%7up%p4NBs@!?U#=s4F2j&pJSD^;Rs2kQgKzSMs8( zvc6*0)zyK#21x*OuW62!Qq~>JFPd;xk4Y*0{QFl@9-3oesJaxWGkJL2l(!rtFqJh6S4dWvQMSKpU_O|hThc+A}Rm!vyTQc!;aDygMkIo;k>l5c}YDU^oQ(*gx zJ*@5&7oVS>JESMJF-LH6;%IRgEt%HMW<@LB_D4iMKm3P{WG9n=a|-eX%`AKIP$TJe z321_XfHsHw-Ko})kPy>3?mQZrzExyRPoy?k`E;uZ=R)(!-I@I{Xk+;~8Ab<^=$S8G z*gx_37D}-5*!~Qc;^lc`{P$4#lZP>|ABWwo$rErY%|hMrj- zKcJIF#o3K|>1_6GAwUF2xJHHhDVSpV36K@3TqrZMp0&K;Ao(N%cIhNIAv$fS<);pU zQR|;S=Z;++p!yvVAbc`P7NWHI5dHeVw0DDB<+s+>d1Aa!v!wSm66wxr4EUV`2~5o$ z?GGOTg52C(aV0{dCqk2YG;kPfO!R7DVjwArR_fv?!IUj; zR)CC@QBy_Q@_hDQ!g(SqkZ{5F(v;6I!TU8VizSFT_@xtON zhkpohihnFnIC;gzvR^7Hd^{%$B6KrGdsOG_d0vCi{;`C(cBwEp1&EiEmVBUvKzy1KeAXlM3dDy4xxb=Xo$5YO`wg3|j4aRG+{W4SCUF_fAg=e=KQ~(z;qFvd3!asa z)h&9!2>e!3~i1n4KwkW}Sme0sb{eP6OS zjP!#b90pD|L2y+`fLNjny1Sg4Dm&s#8wmz+IC^8NwfPdOefv$~@)1TiXR7Cthrx+Q zih<*R0e{BGKn!~TaJk&i6K#WtroN3N-G;wHfh`#U7 zEww_dn>^?k83iw~+40nz3i$&7Gh5@-s^BcYQ_&l4lK`%HBLfIK=6Q;S03@@jPsR@MaHD!WCHkv@9buP?_UV(BLMhaALDyK{OkI&#D-zLv(5 zXQXfBt(l%^cifEJCQep@T_DjpdSRWLrROaMh@6)4^5|ywE@XtM#+G6l?f(Y-W00F> z7`WvqJU4f8It#UHZ0!IIX`^Ffk6ITGRUc8kJgUvIf0H zD>4bJbTI>KpIZ5wl6(?+Ti-~mfjFKhQf5SiX)I3CWzQ_(p(2?hxc@MS{NteI&he_U zCC59Mv&c#0uH70Tz%0CeH{T#CH|Y#?<4lL^tvr-fwAEDQR*YV4W!Pf@rzkmf1woi- z5G6qhnIMbD;Zh++Y>{AkRHH#ACMUkz-0Ha5%0NgOd_F2=tz?5b_|6eAmz9f%l$VxX z-w+#$M=w$d6?x7#b|^Qt-*ODg(8umCa20}DRme17fIrlhw*SFA|C=yUk&^VCVMo@#7$!Kjvc3(jQ>Cg#3|c zaSl!Q-EK?G)X4oH=;VS(X?n&yX#ys>p^pcft7WF!YOv#LC#Ty9RWWGpZ5X^jQFs|Du4hcxJ(jWoE$>PNJbV0eP>Vd=BP9|#z?G?U(kb3e5MmSQw ze&9>dR#KFBi-er)yTQ!6^H<#i1z%*%%x`qvBwCJsn3z9&#aL~Q_K&-%wMUUAZ7A}z zwvIb;>`dIal1ya4fkH@x9ad~^KDaPY1eMahoBh=Jf>x;D**B<|I`>0H^R9t!l068FTMj?lZmWb% z69Z#bR>}5x-26_?QVZrh>@mOPn6PIpPZc#z-zr?-sZLMN{0L7<;x?;}Y6+a2(`$Af zOyt^=Oj1dsOPQYTJ!K-ZwLe^Ld{p~(?9#)aqH`etLSuKJWlqZYeZODVh_U>MMx9@Z z#$4Jy%gpZ+FOAm*%8zYVzgCv+T3MaDi-so&!~?YEu^MwYD{lcJ)9*4#l-XVZ_Fgwb zzlFTXdQ09IpSF_vn1LR_O#;T1=l1R4MFR;ugDE9B+qK@Za=^hN7pn*zt^nk>q-91L z{^}LbF4EifpXm1gH_VI*_;1MRxBLG`p#kS;I}ecm_+J0&%AHGj;QH|adR#;|+23Kn zuiz5A0qid@VRbHx!Clgk5m020C}qhs8-Y$V=7VgNSDP6|OAOWhBfv;mY9*vOl1OA~ z?k7|?KBwRDobs3g7e5FNN8~xu%Fs6)EQFVn3;1AKDQ0>%#{8+AF+C_vXB;~xm%9^nesOV- zVv&XlMD}#K3uiHgcE`no-tn9uV+Bdcq18CouC+Y6Vg`B6A}$qJfFHr)VtcuMgAxiH z8+(r5X{(}CJ|X=pzrKblNg*M3AviGLMyVwxG>;Y})uW`*W;IZQlWd``r&oG|&x>03 z;b5kH>+bAq43xYJar#TYaJ>^Gx6(?oGL98|SL1pm+CfdeM`E_TD3q{@_1^r3iwxN3`0SrnbuK~)Xt0N5D6F6q+1vj^# zvR0wj%+1@Ch9-3sQJ82)NkL}X*4(T-SEr<@b@>gNgx~T}UnR9yY`C?Lwa4ia2+(1-kM z@i2QfBC>w^Zav%3Yl3g%tOr^b;^MDow?+hnC`(GKBe5YMf7L=XoaPh(pDbsz9~>KE zJ=oimw6}k*5E)r4_3FBl)BcHprH^t8)^0; z-Eu6MX=77jK3#$Zt?%sj{yw4Ta-%)9Us@1c`reLK#u`_JDQG{U?Dyipt0G?IG~rpZ z+F8@c7#jKC`+EeJcJr3x(~xSe9FF`NHhKyy+P=*>yp`AGj(`>dmgTXP=6QN{riilg zbLWSFwO#uxU%)s){l!J&9}JA`_opU+=__wdY~JBaQd^V+%pAfz<~3*4M_HaHJ(Mm9 zAk_;aRZFOF_57v^qrdh?xSfPwL0UV^)*NU>I=wdEUMeAF&p=SjoY`OmZnlbgQ4t1#;{{ zer0C&iv8`@6-|g(^Vt*|+6Whv=diDN%&rRglZHgKFEn*D)+9B@E>&l4HgyK6p0!<^_S1-~cJ_^qx>iG7 zO&&z*{`FbYVl~FJR7ZLQo0*=sx3sjbE}FEntvVr^7HIdV1tWLjov>&rcKc1aJuVIo z4k!+T12Fj$VQp=~?oLjt7w)lpuBf|Co&66#dp|Kp&^%MG>_fG;<2XG%HRdIwg+czM zg`dRyy^i4$)3zbgP*|?Cea9I=F|&H{(S$!E;USAjvZmPN;Jp<{BvvdejAS4F;*x_k z+c5Y~0a+hcW;&LssQ1hvRChbYQoB>saUL!*P5$ix{AUj|gmsm0X0D%u^k zHZHlZd#PcCz=P-?3!n7Ur%3XwTZC1YxT1=8uicz&OUBb+Lm1S9x-A1)nBLkppnXb0 z&JCVAhV6RhF+{{dQO>qU4Ir_0m3~MxxhNg06Kg}n#Kko3RqW8O+ zDHPhEV+%(?oyTRDeH4>`dnq@G55?1PNiVPyP{+ld7$0|dMuCSN&mfV^P^X-2NU?j^ zejZ6T&R?0IuZ%AZ`fRe7V_FYehF)x(9hmA81u%D+R{K@Y^H4?2;_K+^X@bQFDcgAY z2-36@GF3LKCWs?X2+kf64QDhGlFIlDg!q+#|DN@`%*VHb))gm@5r)kdTN$VneVFNE zCTl^M;vs=tm zR6F~^_u;M#vl~e4vWwAkVlGrOCk4%xGR02igjn}4UU#O|1GLs>j!wB39sEbw*x2ei zYJOc^px-)r)rU@3<~E8{F;*s5B!Q?uThwXmnY4i;pA&iIOZrhq1~AUS7Hy)nn2>_|y_?z-mXarah5ga1kyPD2Bn;ypzYu489t}PTMk=9ye^;n}&In za|#8HUt(DQH41f4U*S8-dBlTx`oMWM_g8@Sp<4LVNMWV3I4k}ezy6>B@4AuD3n6T1 zw4_e5iGoZ2I||mK-AD3Kehl((l$E2O5Itj}e*-T(%JA5v7MTUUBH|eJO3R^&HhikG zCpMfgeli+?6C&T&zWt!F^}yBacJ%We-r+1NAohX@0vY2$1!Z!*4$*bQ^pY!iIyo7j zFhjY}D!_`LPv!qq9u$Q9HcEx^D?n~RNYKfVv%Ed)i`_e&P_`DcI(%#Z|Mfblg`b=& zO4Is@EOqew!D#w-W=KsQAWz5_?+-s^{UilW#OzvIrLtUHkjBYnl(Je20@tvUm z!d=bCU_^6jy67oax?f(DZk#Or$p(QcG9xAQPdb^U1{uDY`uafB_w|_ksvH1J{89NO z?+kjOi4*vb%otBV<#=^?g@%lrJfYpek{vZ37gQ|;CESszYr_Lg(f(2l#@vNA6E=14 zYBb)2$8nNqjFv_f8Z$Q3(=KlYa1D^r4sfGGP@L_SMcdkV%hOIselN5y#`2olVHJ?S zGWtbBA>_ZI%wNP6YbX9z7#2xRuAU?FM+KbS9H)kXFnWyp*>e_ubLDA}f(ywCS}y2y zckN7#bs;V=7H;5*wZ&%8#}J;HQr~CgQ;M?8#+xqk@d(W!Lhd{ymXnjy%lLsyrKw_M-tj9eM>z#@a*F9Iw1|1qOp zdm{cfq1^f6HI*v31^E9q`yZbCU(mjS;uva+&7LrkJ-U%s4s%g($5BVsWnZ1gTjO3XWbEZ)aJPP>`gG zfxeuFeCmg)$VZ`RLt5p3l9RJ)_Pv&o$h%oe%3v=B(@ZY!kL~ux#-f`|H+s5g9v(9C zgr8ZpK`^Kax8o?bTmWUQ1$NvKZ;vXY@k)Pmiqc=V;`bsHcuhr zU61UcRTIQGSZy>&Vi;`ht)A{DWo3mRiw}8atVG1Ne;@9rOp>RdJWcAL5|55{oHAp0 z%R_6M)9`TPUtgz* z_$hkNNqHE6P}#>hySl~~Q*0m0z?sCSK{WW`E3IOGCOFG!17~sI`1fv5j&!lVlpOf} z^Q+9$yVbhoE^K|dW=n10Oc9iwMn2Y@R4J2d(wtvXoe)&Q1v5uY@*_-0lge$s&UTGHyRocz@CXAho!9VIbKk#y2AX)GD}S+r!gJv#?L$HNOZ(1r)5J!)?41R zU2}Ov-~KF?UuuM87g1Q_5kA5c!c2eAt~ru0UI|;dd#cEP<0ZPWu~9dY&bQYlPU9Et zaTZO0Fg?odhJj;erOe$pla?+xRdFyjB5Z+7iJz_U`+TCICQBe`xFT4=IJ5r#>h@me zTxy^r*wA=S&zhEr~VVUshb7t7PCx-3wsy*EiI&puQa?JPS|* zjinesw{TuJ48#h$$tNk>*+v!@?n|y)o8Nplkp4z^=U3~4WfdAgmDOY;uFCd&=+)8l zqKJS|df8K4kl?4cb3g(6^}paXBP2z$tHD{lJlknDH1Rg9YnUL#&x91&Zyp{sLIT=# zLZ90fR|Su$V?>|5QW#TH$PfA?GqLI#*=+cHf z@_T(uG~*@5^FmF{$}#3b`yaJk19XMw?M=@1Wi#>@tqF5)F$dcWl)GOk5TGr~$%(hp zfr>C#g^J{fTk#WTiLUOMd$yFy)i|VX#dN*K`2i{^U(+YRJW3F-feNk#CbOm@P!A6o>wRI>W)LTG*<4*8Oqdqx9T|s8ZuCc0K0;=I52% zgg9%%X*}20>oKh;N~Psxp3i31n@0~$#7#(c$_19fe0hcR#cKx1(=%pNpFOv~!o}mZ z5sXqM7XS^)%Or7!T>))v3R&CW6nFJT05-6)3}{mP>hSG(t!?xPbS$aKb7ytf%<_;> z*)g!7XkYyNvd08IgV7HZ-JCf5_Df#@LA(|J>mcc*q~&<&$HILk4)0)BOHQgVq%Ry1 z4Y?j^JZgK@e9$lt$3r(UC0WlaRFsXAlUm8}pi=b=vPgpst)28y&pb0yg1w+hsVMr= z?i0=ogFypRXP5AR7y^VB0M6lHBSjj^4azh%HUD`x0b%=!k}o#`-=(q1rD>FQ?8_LH z$@X`4zzNUmNxqqtnzD*Nmtlh@!vi)i zpFCk681t33{i8E$LBJ%+=f0&B$jH>-F+{Yf$g1s=p^@H(1}vbiJc<$hQ^M_b_~zPM zw21;w)k%N;BcKczJHNDVNE=bfTIUoL45ME3ZiLVnmPN2sl(>IwFWPExVEzvNZSd_B zTG#64F;Lz}!7!heT(L11;uN00SNP&}md;m~mlpt{xuLKS8kwOeQjAfdBjLG)NyHu* z8FS%z{$pv)(Fr>Bk|EgjTuxvVJ-^wAl#41HeQkGge`7bWte=)CkeHP_S7 zK-lt=-(Lhi8cdullifO?Byq2HYF{kRVR2vK2*;r4VCHR7i$}FS=h_p5@?m zhnOUb?NG}pl;KeOZwGIMW17atxA9&syJLTTvCjNkk-awZSK3GA04RYul;Q8QSAmp( zD0&qxQY-4ip6p8qYgo^znuUkQhY#wHPfyR(HFaRXKgP&3f0Xm{%eCupg8#$SUw}mw zwci8ip*ti50SW1lknU1MIwYl}ySrN&ly0PvZjf#f>FzG+Zn)d;cfbF4pL-sj!!Tz! zGqY#T-tW8Kwbm;bx7`-T6o04u>=?SPKmGAzj~SHpf#xHdu9xb&U!h1A#C57 ztJQ;h8jt%q7SswuzHVg_itI{Q?6i##{#@lFFagNe?yw^PLRa+!1Oh=1sCW{!X%Q3f z&cTiF9)I!oQF>iXN6z#l+=9wDp-fcK3pMT+&7Jq2K>O6T9F0pWS3ylp{i&?!@%GW< zsIkv;T$Z~Mv%q1wGUq)O8LxeAyB=#2G6fwIUHe2Z;#FBX{{T!gN5XS;yQS=RER)j{ zzTt0I&Td9#XB$1H%d~Z>ftDn`LY^lEgelDB1L2@!>MFR<4y+Ybndg?Lm1#Kze!JD&|AZFCcj zO2XgV+=#b+>%#+r(MnN?oJsws(VQbpwT3?f{Lal~ljblXkGYnquP2>SKEO!rqRf6a zdXvoB^wa%UK&(cSXXBvh8$Zb<4k$60k0xJ4RyLBG1T#R)aopEvJNhF`;pADZQvQr2 z6|9HcPz-lr5-ecbow~N@fDcJQRK!SSQjPWP&J&dsur(2W-@}o8?A~%cQ6S``KZEM| zSU1mH3kZz}a4^UE0PbDVzj^s4)uB9F$&5o{J^$}-DaPTmm25@FtMeM~lPLbN;3WBC z$hSrKv0q+u!I~SOn1oRHb0+n6(^{L)$0>9$UCj;WDHcR8f}h1!z^XUuBfzcHe#Z+L zJ~e}}t@>Vh5+PTRnrKihT0Wh#yw{U)wTy*+e(}KV>q5at2@g4u8y3x)KS(Ky2MlGz z2AFa%7~5pw706{8%aQP3dZAaIv#c7wrPqdAd0}E*=JI=^pBY?kEjn18tPLYmi1qUr znZrn;*#9U>v9SSw9?7=+y06Dr0apwX8?is98%h^y`OHc^CcC$Ytf%Pqu7^Hdwdoho zC;};D&Zvmo3#On4xnD+bAz1Y2UA~gVY%k(bU-w0=?uX*Oh?gt?Iw}gNCso(`CY@!; z%f-#wx@^(#jcCERpV4e!b1gug;dG9uzjS^6tT6=yk@{hPvewCJ%Il0?N-LkQ^6G#x zIk!6po4x5y$LHY!>+yWQ`m5kktHtio5sPBcN1_BH{sYV}+Z{-xE2^cMoLJB&U0pII zZ~(l?+6Gglk79Y9U)THW4kwE6s1d#B;^(??A+3M|B)e`8qITh-!eWC7rqmzsT`N09 z$~=i5am9raq+1L~-%c+u?UrL^AMN1z0)D6n@+w^(8f00V%oZ@(O;1se*2&7_eo8fz zDfHk4U13Q3eSO8KsIA;(I`OwgibTi`mS8v|9W~2o0d7*7{)ZYVuctcl`&VDVLLMmg zy*N3O2NM{sKoz8fUP`5(>Fv&cJ)`Kfd*@9A6C z4e-l=uI%4->=M1kqHvE8)+Ta7K=%mSqnmY&hUeq=|92f$i%<}AlyYdBggkEqhhl!+BuN#ih!>d@1}K!n=^Hzn8C8W{Ds zk_j`mDUJpH(2NHP{J{Dl;z@{0Pn{@RTgEHax9DnFbf!?ass)fUm=lq z;&88j_rnaZ0!iM^-`!Q%4sybOVt-fB_C_>OSQP;OaS%l?1dzPXY5Q!%;U)_Qh z_=pKa5o9rt7Gn}6^yEYfGs6dn&N$d7bU#VZTk$!Z8a`S9I;wOc^Y`*{ti{E}nHn?P zsdC+DfKRd$C2SJy{gqMuvTg^V^z{{Huz%5Ma_7{pw5NVepf>I!^kHOspt#sfQ3YRi zZs{$(pcMUP)6b@x8?@&N(yGs8HHn6v{;IX1PEAeTgsOTx)3^MVOBBNllcOYBIt_TI z^VjLf6m65lk*wYCcE8pg!HqyG!Y`eh0Lx~vvq1PxL&Q<GY2!<5xk*KIQ%@(rR#{iT>hD5fV9`Ff(;v{pD@AR4fh9DnCcNQ^nNP;4MUs&eHe z6Zbm=Z97ueFCpv3J!bctKQEFZB@}`?h(FbJ>kk!PxPMgn2r%+0K)!fS9vH#YCrJ`F zh7YxZ2=%q7-`V2gy;|Eb!dCamI#>>~d_@Q)^pO2*^s=-I#?yJd_h()ez0FY-QPM}D zFf=*sZRvl_-DPsby4f7nJ<5T)^2&D*dK`_*BnzJrp+eXajmTz8O0^>M1$2;0^eTB7 zzm(fsBPI%k;z_{60(+o8-PzskILUc04B1lp4xz9qDN5-gRfs)$|2;SJTqj=EQ;$bA z1`KX@_mR=%r@eqC7oQV@#;Zj6^sp!QbHxsRR$#dV58SX?R6USl%xRlB2Tv%2v8%$c zv%{W{%`Xbz#kx(fq*k%u(RcCG!*joyHz%#x3l?(|>OTfs7UR>SE?h)E5sqn;%ELAY zb-8g-m@&x*psk&CAy8ewS9d`1c+*NzCW-r1vlGpR{r*@&_amg|?wN?k;vwHb@`Hg! zAR)X^U4SIu!{SRYhN@O1WNB$?OB5-=R+hejKDp~CQ#bj0r$*D(-&d}jfM3@;nF^`# zc5m-f-GU=vocX)xt+0QIB56#=3NmE5J?Tv$s;g^WXmyw_lO-6+@PcV?2?_rhucC0= zMD4J>l^CC}Cd_4tjsBtQHY}cT)saVpYQXI$5i4|ktS2o!%MH>5v=i_GXv?DPb68kdd*R2O zbN9;iyhKU;I5{y`NJvBN(}2}{-5{&al7Q%nTZbXX8+;%>x6y;X>tVP0!O+n1r&{SW zt4E0=LJDjVG{7MUCu0N`D$%FHLPZYUl$0FQ75OC!al@J3P5V5k8Q)zV>=Vz|tycDt z1_0gt^xnJo?~(G=)Yi-SU8+v}Y-MPanVP96HX?J+TEBA=byP8Z{PrG0l1zXsFb1T* zL?KxCF3_*xfq|~gfkZ{1Ie71Lg7!VTnFO1%w&ySncuK%Xu?O3X?>Le(;ER~;&zX>* z{Kxr=8-?N>Hf>pnX0zoBpuREExVC|jp$%-NB2!jXMdTdNU;OEWKDMA1;V$?QopOsa zCR@;0t~RbvhQODbE)VuCZI>W@{YOan=J6_sc&gOkUWdhzX1s|)SAT=Hn6MTXaGZL2 z)=ILTEk@)fy(UgNObKPz>wAM``c) zlTGl`KclmM+x?MV?xml52usBv_A<;_-oXL3Y=ez>jXw#Y4Z;+R>&Rc*IQim|x1ypj z=X@_CzAcU%T~QLEuAXiV@Hnr*3oI@cK%T^FCHrjj3g~(Uq96MG^TG)z`56I0Jz(3- zZp(1tUexU}O)5`J*GG71p%yK1IMWBIy#S`h2!}NZcF;UvwUKzbq;i`teI>UC@e+~ddc6gG&Hoi8z)&HQaQOg^VI*zy3%3no~1Ex zH}L(dXXjT};>DA#55TGJIi)qMB`cwT{dT&Gg#G^IPvN#}eR&_3D<&%KD93VR;^|Ti zgJ_9YYP3aCdC^ax*l)^#3bGLk=SzN;*6X!bAFhQU8)yeTSS$flOqdCg;jOi*dof4t zzll`A?j@9J*7{0Puk$cFFRlv<3{w(CW-sr(NCkOLp+v-R03mW17qR?W4_p1 z*4=A2Idh&0fG8)y0@vby6nV#&#pQFzn)6TPlCX^z9KS z_~&m`SlE}X;dC^~+Mahgbl{PiOj!0hHYFat(;^S2@4|m0^!p@fZJv-tt*;OhiWn%5 zKZAVaaLNXp`N&#~SHDu39zuOE!YbDWzvv8=Y#tk%K^5Thz8j?FAwrN&` zwOjlku&l%CV*P;}JA`@@%C*Gu_f6Zk6d{qtqN2;HQcr0##rrj~Xt+w!*H6(I4KtI5 z=hgTpCjKHa%jGGj(-xfEM15xszuD-k;p{gcKnb|DV&=Ohv0s}#KeDbbb zIgO4MIF-yDUJo@o4I#5{(P81^!Ubi(=>K%t2n(mHQN9C*PM}sE@V?A#KtZ))Ah8U)J2!<)mZw-_Sx!Mp7htd!!{q?iyAW; zs4Z-MIg33tvp9`Ug_3HqVr-GO>nrktmzV2WKdlG35I3x3Z9-<6s`en!`7KUP2XF)S+*drl@TNl)d7p+dP;+ zTW)G&v+caUFssbwWX?!I)!~*d=cgYc7k(K(kVx?S`E$+5F}}ATmji)A{DjE(BIkN$ z!oMff{<-01aCa%~#BRI+XG$JOCGgEi)1V5u-5Js{GBV;HKBMO4Kp5#`c)E2M&`P>u*3VBqe~<-s-SDH0886#m1FdI-_5iOZQ66g_ST6 zaFpi{tUb)mj6d&wqmHGxjkEqh>nRCTTXAEHAG33+&vstAES#uXTOWQ=ExsrjG$saQ zWjJut^50#cNZa@6WqSJiT@`2PL`O>nscA(vlMY*6`inw}7e#I4kDDB1p)3UlF*cAn1F>B-S2~dKUOp{IjZW4Av}to^u*OY5&>qEK0K! zk@3A2TsML|0gFyVPdN6P0O`7D)$DUfeYSzFUJ1OefDYEeNe6+?>&lS>&s4{Zt}|E> z4ELT>4qilXmwPjz{(5c&O5r6XOrS~-wVtKqB~bl()|BHnggulg96eiY(kHWr8@f;i zFRG^={Ml1rm^g||7*mS=-2EX?7j_l}yf05nGqWO>;S53GF-4Uo;C5A!BL~hP=cB+ z27piDx>#|Qp8UyKC1U9-Zh!8f%L|=!dj!TbRvF*Kjnzx&p}b_YQItAU=E#j(lBM?w zQkr9f5#!HwSQdO%Tl{~y>;LVK+pyGBKd*B2>Z6FG&v5+3GN=r!Mn$Wq5EsaCM9b7x zC>Bo9(AcfwB~kcr0xMzunhH`6h9SeWSXf+Sbk=S>eU?3%EE!=Er|S3R@P48o%?$xT z=acuNu-Dy^M<&tteRxvO{mS9S`FS55b@d(3+oA$e|As9piLlo+ZOxvFtT>`|1DwXI z(D8xCkr%`K=52urbIqQe>L86ECzRID9n7nhs((fRS5x=7TT7vt`P{|M!xanZ-{v<(R^&zJ zM{Q4!SO=KzLsbjJdGK%&UTYf80tP=91fu&oC17+(Vtk8;$m+1vtQ`#~R$<4E+k;wg zAEy6CM+;u=8cl207Z;Rc`RT>1@?xTG4c9X#2`@__z;xIq*?F`Srt)*=9M8Co(|w&o z9OGdkZ9Ho2Vc#BFoE)D<@*!{kmB9t}=jRvSy_cG6CNu1pR_S7PH3jXT9>PsHxsU8U zT9AXfWF#4GO18GNqtPimE6(x{5Rwri-yb&F*sXU4HSxK7jE>HS_XeRMm0rRlylL=P zBBFpHEY(c6#Z3OD|=oU2*>cSJcq z_pOUfv(VBI4LIU^)P4XW~Oa`CGhBaP$~X} zE0fRZM+4Brz9>bCR6_NTi&D_hS>m$lji_DLXlph4NUQX}8CBt0xC<8YU^}VayL!c} z{A)5%NbGXSbKXi86s6hVdRzzT5`wUUJ2s;*1=`HUg%tR>Mg26wpPxA4JNRnS8M;1M=%y7e@SUs?FB^H40Q z;wh68MRt;5QW7DPlO(?3NZu&zswKe|%QDg^%p?Cqk9zFy>!*ip({ec%m`|eRx#;BC z+`=mA$L1~-{0>}H*lJBER^I129 zHdCq+C!R>$y8iB8BiiLqSsNVZOda>kg(q{ZmOR3d)!p(`v7Sk(WpgCGbNXflB$+o@zgNUoXx-amp& zN%Cc&rG@8sx-CCGwvs?g$TdcbRH71a?Ql^MJFv#kI_*&0uc?OjXFNoGgn{y!uPZx= zZkYDmUlhD1M#i7=Y2=HPGnrCo#fEFj!|ZeDIkT?WMj8rI2KEL|K*4!4!GIsYc8e5z zTd2a250(jMS^alqW|sF`t02s`GqWlURVnTh#9&2ef0tvsv3+MwMBLW+5adYDiueCE znkeJgp3YCDsya3tr_jpxRl>@m?M4_PvWb&s}NVA5*3r zAUZb{^l9DfdbryQ;b4hS`ui%-@eRAlAN7f&lNI@4A%5#l81m^&9Kv9jK05&MtrtZS z$Ij1xic=z3x8*qn^yRO6jz3}k&;(ji2O@vSEHyOL8t1W4eLYZx93<8-HaV%Jtg-u5 z8Vd@H0a2Avf=cnTRUVN)pMPStBTaj);WGXilezX&KrU}NL0q}epJDwIOdm@Nh_&B` z*E^0fz4^Xx!nMcEX{y(1#(c7FiEo=24`|_cp_x%n05+meBsEb&=6Ojo;?3vx|0AsN}()JqWU|XFc|ScCOG^nqcgI`I;HYt50iO%&SM01(TA zFC&hzm=bF2*3MzLH8xgSJl%)0U~0I3vSX{N)vP4Wx3cY0%W{)bj#a-EfifN+DZp^I z5HPd)dZLUWvzym;;g*kD{&L`Zh7z>0yVr%5%8j)*H^7?3!FxWu2f3C?A(ZlnPz!WX zkLnAYoBfvyAW&Rcsj=b)Y}3!(1x}ONEa*B;y@K=nW7bX>m|yqwIBY}EyR|3!8wLo{ zJU~nw54EL(2O*$Zz2yt%UBIHY)y+MD<20yWI_f-y*fFrfb4kgHf zDus-i+O%P<#ConBBh%*j2tz!oW;&*ZDr1R;#>kJ!%6oVKd_M@0xj%Rx>y*>A>pw#< zzGW7S!;vaN0~MU1)i?nX%z7rB<_1k0R`QiAkVC6U@6A>_ogUc@dpd?3^}#S1BU7Y9 z#?Uoo_w`x8H>+wC^e%Fu(5&f$UW@WJp*ffEp1_!ACf+v8<%O<{;Nus{#7gAn)0|_` zmU5eWfkHX1lQ$QWnF-?8k-h)01#`@AP9ioIE8H}loY*0FSeU@h)r8&6&91|%WWo;^ zmbM!kA~97>%@3FJ2Fxw~|J%g)4iS%0X=tK5jCL1LR{b{<$30p9u*a*Y49==Dp1TXG zC%mlRS!9T3NboENms#j~-*PayC+g{Z!;qo--YuuaHMMktmgi~^!BSq_Wwb$-Ve%tz zepp@ncXzY*Ad!yAn-&D9J0;!gYON)Xy;>nb!sZTbG zU0ZzV78iUkRTu1~y``nm+&w&kB&pt%nNe-D-xEb5f<$cSlT9N6P>xEJjW;GZHELau zMkC3}$^z3f^IG@L&fWo?n*4m4=F{Jdw%}mNtfe#HZny6`W>;4`{1F{rAD5#__1jEC z241wlQ_8q{w&%yBdAHh)`VZ|qB~ehN%Ngzd#!hSEo2R6H3(B6gnivvMxKtMDTJEos zchu=oZ1U$oF>Pem5y-1uSNxDFj0T>oGd-_hO0_?{7C?#6I(4K?luwC|M*wBDoKZq$ zs@P*BGEZz^E7%k5eNG9Ij)0Dsinayv%@jRPAzgwzJZ)_dlTTJ!&}B}n+OE(F-=GLx z6v>O0ssevgQ2y(w^8E3UVduh~hXhmLdL_UW3^gktX-rH_=|9|FRA`n0;Jy+Tybnhw zCqE_B%;D)C)7m*MU=HK9{SsturW`~SOvL=V|DL}2{&WD;XhA;TkqYES3kzCFgT|({ zn*Zd-wZc~m4yLB2P!}s}vW%&PMb`jJ8+v#T&HyT?Hy#7d25`GCRh^e0b>I1}=6yH6 zTy}VH(DV3kXMoYIU%AqHci5FLn+j}6p?Ikv(5m2S*@p~#IMjF(-B0&^jllJ9Q30#NmQ01+BfKcK?c=>$8ovu>+tb65-OdQb{T6qdC>YRA@6*%2o=c=vr`}gmOzw5K!-KEQ!G)d+CIM~O_x!T;=$O7E{ zJedAPdVsH9R~mp(pkrhl;9=LrhSzHKd|_p!ANDD603l=h6F_E8VY*KVni2Fyqk%)L z3#re&ooxBMcFCw|+P9jCYAMET!{9V4QDlIHsznV>)d4H^U)(@c3f%gDVbcJ$(ka3J z0l@#azh5@W-D0KnmDn98e?aiXf;{OS9w3qFYlf`pYGlMVxX7)h8#&rk>e+BG4?&Q; zkMO+^8Bhd`E=~4O;535i2o4$XOWI385`@3dec8{tI%ji@7t{0O)i$GRJ^27NtZcCE zMMr~HS2_Y(L2HD}3dwnf3$#)9`xMH^_YCx`Es8LqC}1>o~(+HyBZzLyoP_u^EhTL4-?~w zDX#79ZOTt!B@-a3y1aBIF*kD~79cwVry@K0yKDA%p6-$Wh=r?vPS)Q^{>|Q%`4s6? zTWiUKV`evZKmk2bJ+=S67+$Ec)^<=fpaiwjLPA7_V9~NJzx-Z_e|NJNPYdI^l=;}t z9elT?8hewIAKWu(XJCr}!hB%N!UNSm6Wb7(cF}Fpf9H_U;}0$tFxfB@A%K+$C-fg% zWI(^8mQj^M{3pp+W&PyDq@9vT+Go0~X>PE_{%PAvkq(SuuRP#e)C`}EP@tni-EK(g zNnPgwyo^9G3iUt6A_d_+`80uP$v%UeiNF{c{3m*mZ`Y=I#M@U5P6u;X>-F0N1k<3< zu3oq0NCx`Pguac@)k=%mUYV-35C)I3ZP23Uj2YtuZ6`p;=nPzLJy7s-#wkcbMc4!R zX*vnz6|vzzs;FF`7qx>WgFnCz`baZga(%FT{aek`y8bStZ(Wp!L{7nf+YQVt zt^%YDi-(l|Ie5}%UR`C3@Zim){j&!5LoWJTfxP7uF0Wg}Y^Bxi)vhy&rDcj_b)S^P zM3>%O$0>mNfw>nBI}z#f>MEzWcux;Z7caVv4B8T;bv3jfnDOCB_}$O%7{t6eOfgtR zq*YWVRg3$(tK1)sV0Iu8zE!`dsHj{1qvo@gZ~~S?e&>DlY2X0&lNp2rM_?B91cH_v z(sn1r`Ceh6nQgjxo7Jbu5X?=7XF(NJ7} zB`&oa{23(?z9Mc+{OKfsteGF!Y}kq_KEo1=dNrt!5-fpjUz1fBk||&$buH|D9N>~S zfA&lDT1je;E>E$(&tb;6`ekWh$%aNL7y8N6ogh?9;XbE5_OuLlj9NSy43KuW)IsNo zgA$b)?s$l*0SyKb}w@o zj3m%D*)HIITpYm(E`XP&UnGw=rOO86fpL`*z0>pduf%D1KND4J(thHjw+Ql!%ka?u z#XJ7~5oqla5CPlC4H~mlm6q?d@x~ZoB-voP;Jg`EGPy#SDV05^z#sJjmjPurn9*Eu zWKTG_nI;=uH4f|~l-QmsP_lm#SmyA!Yy#9FZ!f|lZ-X@{wdqk%oFuzl&~`bYsdl4G zNlj&0ay%Qn52~wkq19}V*^Xy?Z_~U>|JkiYU(nWdw_5iM*nR-3PSt7R>An< z_6hm)?jMs0AannB@4Ig&7a<(6na}7DaznD@92~aBFas( zN38ck4^4`Uke&A%##{-*pDt4ijgjwyg2vDJ(s@2>WH_-5hF}GYHMs7MRX%uJE%9q2 z!1qt3;h=v}y5)hoN;Im)0EvvRr2~>s63N2r5P=R34gh=RiWm}*L%!KJ#f#Z|W2UcE ziiCaJx#&W+^Y^b9E4FW%7B?YsR&g;a=+eM9_BK0|zEOb1T9wr|9=lYhAEKj24E-6o3Qw`sw81=qQnEkZ8b3 z9=K@J(@g4>@iYqldW!yH3yl`#O-`yHuKWt2d=p8j4H-x9 zyc*{jVeU_%=vV#!0iU4%5|XZkk5~u|-V@jQ`2BwLUkyebZZEt?^Q7_Vko=x=&N3o; zk3ebk@i8dk(f{ik%_rEGe{@+zp7W?(-c%@Foi(J>>}t`ux8m z!JE2-U)%KXqy#v-ng2tCg1{bF%KzWCdW1py7Hz8U^XoQrJzQTgh+Ls)pP}|P=LYZ< zQe|lr^va6!2)xB4nU-pYkNTQCu72kDwachiRb|}&F%ceM(W%-v?vYN!97Qp1 z-{x=hyg9`ZzH1ylNhm4VPWrn$PJjRlBXBum@V(RDf3)-)84OKMrRQFqRh@Sx(DM6+}2D#(*|_$+uMBubjzrZyMpsQufMI%++K9 zVUx|(oz+8_i8H=bXRYu;)6w;?;!_Z)io(MdmX`)m({8QGs9$Yu*Lr#M)_+iutQ z-uKg8SUw88PCxX1{dTt&h#v`O?%;6msr56Z@(&9`oo6TJ&L~WJ^KK-0aQ%BXNZ>gs zQf$c~$h&(}HmcDQnF3@oGPaM5}hxyB5oYw3yrJ8j9FMvv{H@4A_ zBCI5et<4puRQQnr=zAKGDYWC1RvU$%Zn|Z;m$lqfu`|%zTk1t4esRCr@DLp{PWR;9 zXfOs&fgut(K$D1MZefugh&?`0q%6zQdfXY>-_zqiWVr;-wz1ss>Iz)~)AZtRaXAr? z3j6)|!9YvV{ZUob*mXBAQ7#VeIVxYcQMXk0AwuY%$YokCOv!#ZCa|nl@R39X;N#=V ziG|c!{>JMnE^oHiSMqMn;!Ng(X)tRx7oj!6H@Wxrp@lfOxVCV`ID8)VbW7z5&h%7N z;?uG9)880{S?}$YXVSf9z=@ch^&z6A&QEsY1BKW#R<6_oPtZTek?-Z-y*)G(ia+x< zZB}5VHZLkJuErJH2L$V%SC@x^Y%SSh6@2LiD%nw^<~~F3Un#KtVH2bGTGnI5lTYF3 zH+z!|JOS;_cN77-*kN1^tYX)WSGxc)-^s~o#I%;j^PUHB;ZX5|NsT7n##Z+5!6lFz zI|4ky06I((^17`&+a68?8Qq^3>B!Gsjt7QNz6kcAr5>Xtigf1PznlW@6wl#IDdLnE z-$s8pDGcLqZ-$IP3l1#bWXKzBWvq|90qq}=8hqb{5#3P#yFH0t&kvQU5u;bmUf@9l ziOI?|tMhc8$SBo&UPAj`PhMuuEwjxhWle``iA);yg#`uMJ8$pM${d|uY6D`__a+?U z>19XU<;6w8)lMV6rk_zuj^nbPzys%9@2c&_)z3wcB3p-4@73p5p4q%)p@sFGZN&W2 zG<^`?Ny_i)Jtt{E-mFW@?A+^#;$9+re}XUpSN+KM!j=cdo454G}_q5k5G={NXhJ@5KzK4w;C z{H~90)eBiQ>D(Qgyn2{Ud7cn!byjZM_~n4VUPb=_F4aO@dP`%`cRx_=2h={oMot=o z3G>f!CCTg5S~iuIWo19~Nxe3{!U3jKzk2%5_EjgSSvAjJm4wN)d-mo%qm~7iO<4+G z{7nyKG)a=CswyCmzeAv-n)f0JqNX;ruzL5&f)Q0(3bOP1RT#8Kwc6&s77B-ffe};{ z?f;puLhPGbxYBPuZ2l+7APbrNL1kKb;|#o@ZCtUDnVF>FD$BHK%N<057v^6aJ8Nmi zw@$~Dw(8p+FJSr!hd@_{?QIZ50<*>JVLIMEK?*~ol=*APBLv0?iS;dTP5x1CyVI6& zH8RR$WMtf1DK2j{NBhzR;1zT~9)?ItMnK%&q6ZHfC*~#vP=W0;u^BMUsHv(>b+|0K z^+_Oq-n^fQSUx&>6M`Diw-$^aTv9R!XcGF5=LNzq3(L!0o{2evraR2lvkRw79!Il; z!Cx0)2?+^z^#2$;SWpoLP8kyIp@!pYINxoh{9rJipDIQAYy1a1kz;Lbtz5zQY?aTG zH*pthCy)?@11c>@fk898Zv5u}%!yBrH8^UpN6<2L6dcm4)RS=HbdBoj2tWeKje@o| zMnH#eYpc+|P9oqX074=FUK?yz#iGIMrHUIfftZR53wg#zXL&VBRr%lVBgItv_HEXN zJ}}=rHw3tWnzy(29)J=DpnU~Zbx-uu|A+VEJ$^a9T4e)XW>8*;y_N*!WQZVb*F_Q& zSms9J%gWl)`*P0=u$g103;^rn7b$Ks%1Ih|dLLEF4%^pICXKp?YK>ARR_}~h!)TPQ z69MdPw#K>E!o$IXdCqjTvaGY;_?F9ck>BH@)FQ&X^kyT#8L*)t0`%V0{op@tf|k^8 z++@~jw4{+0<>R&uC8I?O9~6!?#yj1|USj z2+9JqKa0l2Ra-E$cR>S*!U?W#V^L98PF&sHe>U~Fz7-DW+cd-Uf4 z?Ct+={NK5Zw43odr$i2^)D-^(0hlsDeBdT%;olP=yX4j}S8J=zq`yCA_l!kTjWF^Fp27bMyZ>3k(Q z!Un9louykS@Pedv*{V;mfRfFxLBkMweXI=|*Rw5MIujS7LDMXE>h#MYbGvDes*CnBOkz|HZ z3PeY>3N_yr2uBX{{&y4~r&-5L%G@Cf7!L6?;tUom8>A7G6)Pwe=D!5Qn0OT-r{8#h zjtz-reO;4t7^Op|0KK9*fV_6~%2f{Lnk)EgoDCg97>uRk#x_e5w+EMN)Y*>H&j3c% zvYOZ0Roxnzn&t@YH2{;co~tQ38%*a9udb?MY9=RK@;VYccXVuqTN#JuByvRlAtx>m zKUACpK0roQZ2}0bC&{KAS9`9ZWnEQJc5lh78%Q%$1+k=J2N(HB?QiXS<=k zZ!cJYFNFPiZ=@g^0dozBkmoho0cKwrdx5;qw-Ak2wBl*^*Zh$5Ut*#t8HU%TUb{Ej z%P_WsdZ;CzDqK&_n6TX}wuj^(YDTrP1#n8DNxLW+G33j`MW7UGi^d*PS5{tk^SC;E z>799`3ppxD5r@XLCMo@V)_x&dZGtr6-eNJV`{d5P=KkJ4If^h6OLNc|4Q@ZWB|TJreh1qWC1@$be$zYEMvz5V8IcF^^-ThEnM z8DoM)qtU*tysd5fp~XWSn}DAqAu-X$+R`%O;4MAEf2eMzR#sLX7Sm-4W#hZ>6>#ms zd8rid={aF|I6Q_(QrQ>>PN#@%{`hmK_q3&z)h5Z1``e&wS1VJ0!&w$UWR;DFtVPUZXzH5TC@)_{m6t4Ib8%AOw(ILsO>?Z?_XWJgYn?a9* zYk=4Ql_yP3jTNtR|K^P48PI?#=&ID7UxK!9<$%Zp&cyo!{%|1`a2+}C#+9!TB?&af z5ew!##1#{3ytzRF&>)GNi8)T+*x$d8vuE39K>6E0PnX9mWmc10bDp!dw$>Fl#+rBT zXk&9UTmH1yrW1~?l7W&jHowiR^(%2|;(TCUpB5AYfM|qgY08=EFo_hp$`EkaYKlcg zlgAbtg1g4Zi@V$PdECZ?5JRl=)Rm8Q-Pa?P84`kMtY10p<6sBxvJs*uahZ)xS_Rqy z%WN~k{L-A3MfdZWN)|&C6MmSqx$|vd`SINgmn5q?e8T+6hpl+VQp6V0z?h6UBCw`D zlSmWSL0Z|&H8_GjUNlotkq1beNiJzsJ-GVqd2o1rm`S`T*RF)4(Ye!j%u%|4IH8wD zvX8^Y-25-f7qJmTqd_U5Fl_r^YJqJON-!#3$6>5mtI%@rs{>nVwfQr67LJn)JkyNOzHCHi5*`-@_W#cbQp z8gp}eOs%ethT}nBkv7Ae2GsV~Kq1xV(t4II5(bN)x(ECXGU@=8mbP>C2wnAC$h5}> z;96S&Si~OBJ6-O}rgVbdBj>aXoI>1Ih0R8jRuIsmSpEA)JOs${v1?rZy_g>qCMDg5 zmcR$>X1Hv#F*|4=Co^z-vW01e6GlzIapTu#sog`-AZc3W{5a=KA&*O`&x(pi=P968$n^!r6N?5nwFX#K z#m9dE9To?Mli9Z^rFK^j=If_nuiy9%j29Q*bY^ESDHq7=f)gl9DWC4K%r;~F7b1vrYhYnE^oQ~tmFN-32Z@I8*&3#=or=<_MLS= zT@JJW7xuWcT(Yh|16{m4L4TzqM?MzorDnJCn$GG^3?sk3GWS`#l@=}^T|EslR# zG+Zk|m?b>LGuTF7ev0b`TQt|-q zji>f}%Tf?Gb`6TNRIO=s;_kdJ55>d&AF2s^e8o|G`E%apeS&H@U|#!o==H7;4Oq8qc{c71NX+^?2YAYVD7*l;%JtFyx88*~5#6@P3K>Tr6{1~5BEhLIcR{yX-B z-B(@xyiEkrs1KAmG=U56kY{PV4!_k!qWrEx`6{T-DFVY98k=$iqUCE@ZCMOxMenmt zcEEqR0MY|CLuq^nkbGnwB4L88>HA6|;4W@{0oC; zn38O!YuVmfrGB~3t*U21{~)OLBcozez@V{s`7k#P!naK=D>wnHj3)DF%{FhZPaYop z0$yInfS%UU@^Wvwe0b-Hn7L}0;vGy1-q+19%eSiiRht9#z_psh!pw}f&hqB;webB^ zy;ScHk*YL8_UBA1CO}l$2Mppkjvg|J^V4`C?~KDQhP*H4A>V?$wks(gvT)F_&^f%T zvIv~!c%;?q3(P&=W1k@}8-gqSP7pdpV8F~~22rrW3kfTZ$KAO+X*5nEj0Hi#XdO!{ zK}2%n6nuCJFYerA@y>`qGG@&RJ(K~~5Q$ew!X9h2S*yFI)j@q#sVb=9yzTsKJ4%Tf+{>Ul^8|<20|?5`b=-O#uG!7_$#Ykoog_K zcO0-J)^07zYY7tKETw*6qz_pFv4(OiCsCyTdc#a3Pn0+nj$gl?h`922I`lZ3HA+=e z8>kc0Yj`>14@B9b*udc$TWn-v#CNT;Q=Y`qOal)&=y0-X|F^}~aJd08%&-&6iLi>M->>zxP=r#p9QVGlQ}sNqt+24)#4ZOg8h4MGL`Y5ypal~KhFmY zF4&D_;JOFisP}J73E)ucfA#)`4=7H@80c9QSu5;{QQ|x#88L;HpQFTCnYTtKgUcsR zH4xz@7~<8<^~A*d?ffAdR^-4gpkn?f0sX%%$j*S6YQ1YYaQAHMI;(-A_ir%k*(h3^Nl;(H@wfuSAkQ}Kn>D^FX zBfQh(B&h8nUq6_pupku zUslVx$V&@X0X(sLjYuTloS`*h_N848BwFdTJ*A`fePWHcpbuCi)}OAZDhhR>S&S;; zp}kqNwTuohXDh1VIN-5eT~Kk`?S&Eh1p+Ay-@f;y?IFE>=WYrDkPvSitN|%f?}3hQ zZlx~6XBr1LOAjK14UeZE=wOU|f!!{#0|#FCSJeY+sSps5ABTx@Ra-4l*{d&aL-RJ_pU=xBFHF z{)@k%qEc>ILnahN#1ex$%V>YL@-myYGjO2sM;g=(LlepYOVaTDN_z5P$}~xYM~rqe zt(IPtWfk;T(|javWVW#*+k1>{^58h4`$1DFS&Si4A(A^CRpkJ7yXDve*t3*WgUcWp zRtEf^cel3pE28K>pgczkUsbUX?!_y~F%qSJ#dcJ@z8C$$9JgHL5u;pGv5M>8_a8YX z<&Q~y-%08gazX4A5+_6%u;Sm0#VoYFyrhWrJ~EtNUahA!2vG;E(j6N>ZAdYCfk25Y zU4wx!g{VI*kW4WzBB!WW%Es>@jC^B$?~LCSAx#{jw!)daTMfEUmN%T-?m10zatb32 zv|`d5c-Vi_5&Pxw7M(0^sI3CNix7#as?AqKi`bZhP;YE+blaJ7cvH+njbI^Nf8@2O zq^z=*qDp+LRNj78Aa_d@ zb$NcAu4tD3}+my2*sKC8hurkaX!cqjDQO z#~i*FZ&C4|9q^uG`gl4hlVf14-PHjJce z!-A-ySGWzM^IMy&{;BUy0DH5+&W(oT;Y@@a@*&55@;JQ@_{{c~$W*7X>TDqhO*`Hh*aNuA^^&3l)=>+HSm%^z~gdWGrhqu%-5RQe#TktVRdp9 zW;Ff%!uFd`?k3mV7U{PZJq3u?nbzF6Uu{pk=Ub}`A#~Jr%6NAg<$1*#YkoYBjb>os zxZi?ff6trj!)J%@ObJ6GlebkeLmZ;7+f_%>yL-*|@txJqG9|KNM?=;aLt-VZYwpy; zBp&9YwaFgn+CC=jZWUs}PKV~Oh1`X(Px4Qe6Gq#n&~1xTC@0)LvyY$3vjD4E{!`Fy ziXjmA4Q=oxx$`FR1wAh6h`_`hCH_+BsCq{u(@@%oF?N-@D4lDO;@*$(ptlGzA}rk{ zJp2R@4P08EGWH8M+yn^~|6CfPbmp45TNzSM%?w>5^T| zIr15Cnd<9vTiM>79AfWDxPai1$?Z3%Q50FY+_Rx4t3f~9A1+@>$3}^IbqHnrq51-fuoZ(L0JWjg>fpQ}{o^7NN&qO=wIuJ^S0~QvZ$W(k%Tw%fdV% zlgBM{kBb_pV5J!O`X2D!9w1hR0}$KK&ks0x zgq6K}=K)=lERgnGG>GwG_qJ7~_4f5TIF^7wtg*dZfya*o1|V}9J_@3A9X^BEiu$So^n6I(66j#!EB z#8{LI@fQ6gU4)*sZRah{dxf8m3rbqf^Gc`3XUEfi-0h$7&MIOyeQK}@+>7|!TaHct z45o2iU6BU3P{z@@8LhCd0e#UT=~n&zpNM@L0RQAw;-dQzrrGR{Ys1G*DbgR*L>LMZ z11{L@_H3@Ev5{San~-d`XwfPI2-xDpNFmB@TYR+yd_rRXX>uK}7i#EkC-S~r5IK#A z*o&H(DNCajEJR-HC0`Z&h3B3x)zd?$HQ7_e=2 zrEbBqr0yW6v7o5RtOEMzjjg5)0o9@XCs#djT1pfi?ZKgh&*m;p5ePqoKHs&Ikd3XG zL)Lx0Cdcm-uD&n7;F%ZnUh;N}i@$x%Zw#*)O21QRV~2#9$C~D(pw9jbWN8u72yk$Z zl5(4xvlWfye5|8`n608R;saW}u4d}J0OjIIiP_Nj#80>A_nfoQ=AlZDm-AI$Pk;@@ z-ZF;zMm+;*GCp{LX)BKV{!&RwNxA;{ zXN>gLP2<-xer)h!6PDZ;YT@OTM;4hHLD?C>&yPT8@dj|^K7>;kem1!+U|JJJ!X(K- zF{0C2S>j8qj8G;8Pj5B@W0{pKIR?dEZ*NOA!g2LuuY z(K71t;Y#W}^fA8tLmthOB8wRb+1t0VJHm(wFK9mUiSVkq9UZwfX^NAhd3mUP@v=-f z;dEA9(1paPmswF-k1*&%eL_>*vJY}y?s5k~EkulxUq#z5D_3_NKkA>mP7ddM22|oh ztL`w|uKQ!-)n5IRl|LqDo`;*2A1S>gLm$IZa`m4>U{=s!Vdt6Y{M@M~hF&UZ@Rj?E zqiZJnpg54R@zTvLdsTw6X^tgiZhrD-4S#v|!X1~H+faE2Ez$PIjvv1tBYGQ_J|xI@ zksL8r_=2#RC3pujb6FiQo9RBh|1x#`T?hEJaGB_$TRWr9$VZYW6(&7HW#Z*7^1#*m zUp^!ceTZ0d=E<_j=|*0D$@ksfKO`o;S6DW9?MMDJPZP0y>%RXJK7Rg!rFaT*G_AI$ zGWp0WxOXaQjy-pOuQC;t$pK%%bAWb~Tva2COiUgrgXFph?%d@(-9Tx$q~A#od1Y1A zsHvVQZ()8xJy_jl2pk=^Y^QSRj*iZVR##iv7$hD8vs3t~<;3q$v$8WCo}ooYSUvzA z2@K24L=Q~(MhgZ9`yh{nDdlyN(l;m#}RU37$b zBkWs*sE^EOQ|O`J!EX1-pDG)Hn2EGrx;Lz=_g?qxq5v_{GZR;k%kk&NVcGoU*6U&s zNl6H)UKJWuDdTX6m`&-?IP!t^VGF;D^+xwwuiUpmTw6cr`tQbb6kr0ttp@O~bMo>O z&wkdnW*F!``Im*9!`UJ3nq09z{DyUU_sjElR#+!71BiQ~nN^f-i5$7QkT|RkCLiPr zp|MX-sL%nuZ{u-@8SdE+XDhq`50-+b>`u*1mDdvjLSBf`&iILk+1a$Axsr+Y@h~KP zd@9cp%`Xj&K%_mkA9Nu3)Uq*&n-wzC2^p}&m!joF13=rN*_XZn_AOcGjY^1YVvmMJ z^*1XWDY6Q(6#gSY!n4!4&DVIa}3z?i z)dDt{DNF1q=g|iz=X168K=A}VCl!k&{&YJjcSCLdR=}armm05qAvhPV_x)q6P^{(% z#;VLXVH_bG@a=qGi;FewYYy93U`&2~Y~(JP1qoBwci+bPO|_DX*Em4qp_&2}X{86= z<|l3nuGuK>(l6d5=fH2~aqT~eW&8u@=y*^?ekPQ|Z;r11Rx*LDutY{q$||#l(ba&X z3nO0%OQ5x$Vqu6@mRFIkn%Z3!=8C+aSIC(UP^Uquq-7a)r3ovwe4U;y2FACBh0Q@lvgRtxN zZ$w{y)zaN2k2?t-t~Tch^rJ(3Ga;;kevlSIIe1SA`ytCP94771NIrr8Ig{_%pFCpy z(75csxq|Z#NhT;rRtrU(&~mgBe&d(Vy~5tz!-$K$=h&dlTkpAhO^wW!e1x-wBx@(c zT9HoVFB$g?MqwQEwaWj&en1}0h2oaKdqEiNi2*+-ru%Z{I{W+)dvyHu&pg&L%>@1H z;6RqP@zTjJHfm3fIc8hY?07Cp>#u-i1S&uQE*-@3MvP$TDdUxCOt1=Skd~vP6+J}B zJ%RnY$yY)5lJEkfr$a=xMSfrK|6YaveMW_CLdO6PjU@tG}xlSbJwXrrAG@ek8q4ij@I+!gX~eS`2NU3#bdJABrb@Pz(j@kNiI zdOAvqIgVu&TuX<0Han5Mxa}<8ZpEm$j=3)qw~XeoQoU(s|0YBEQ!6#3olOy^i~SpA z3^&CSr(?8N2;!jvH_lsSRAYYI5_wB}-a_djGB$Stc^-#%4??~PSt74zB9VA5hIBSu zJI5v9XV%GXFQ4N6pRco1z;2wQ@)q_L0|flioiN$SVee$&?f!{T4m^f@iRC{bjJzOb zXvZ87TAuBG)S=VS4g|#wC{h+5*m047uBE11{Z_D`Tp7z%MzW?sAiiEvq?DL*3tsKH zFmxTX5KC4JO+nK3Dr$}OIW3tidU|i7qKH&-@pR^7T%#1a_gy42PNqRHR8py70N%nX zH0;{P4~Kj&0>+J=pE^{qdaeL@%;({tQ! z{lFa=^n#HbyWiJcnlu8hymg<%dnjWJhW>#~h`^}uKXkZ7)|T+Lpuobxl+o$Aqgu1) zx^5bW>Vg+@$KD>A?hQAdizHL*Z?1P=lgX9H;pC}lsXJ};FN5Y23_6!8hq1_3 z@Rg`KVd2DFx$?%ndsa2_3zwu7)E73~rmTO2m=ZKohPhF~jh!Vb_o>eV3}xN>brz_x z@Pf(4+u8)vIaFhRzvkn<+xqvFBv2QDsRVw@_W@F!_}tn+kO)6!AM#Fk&03svMO_5} zGJ4F)X@O`8m@R>B7p<05Jdo;#? zjPo~!0S9?3q6;QF`7fawXp#_F)>pZ+BAWrBMVgu}_TP5L%tKHjB_|4UvF;{u$Hjv; zB%%c3NPl*OlLnjt`=PCwug}Ij;D2)*UE&4HH(!khlc`Ml=@a$@tom7`3&?)Ou#4aCI^TNbjo|5! zv3~bvz11Bwwr&nYqT6WLzo{?EJCmE&Y=mE6fup_xx6lJBs$RAa)YPutxo`XsFEWea zQYrb=-d^Mk1fon4j*mUR35^L>$)PtWoxQy?ZZ zL=;vyl9*UbnU?A@?nIhUUh+|&V0h*S(1H>_rHZacx_7uTJ&b0Gh>xcri(4FB>3ff* z047R3EMg#mrDKI)D*fXIej@+UA?OcOaJ#A|n26|5wMjDzb;V|Upx1WsnsHKz$BOB% zK)it6#?lGlj$9a)Yg}R_W(0vB(8qRo0`XBqoy!&I$SDF-=zH4-#XB8x_rQ=Pl@S4XNY`m z{RA&aCzHI{tlZghsSe`G9$N?g@Djhs#2AKH@i3Z3IN=d^>LVE70s`b<%`^=_hwXkC z!#pbk!WsPmM)?l-=DP_bmr8SS6|u6jV-^<|1HYLC2?6`cJ@NWauHhQwaGpOxz%5!K zdDh={ey%xlCOw_udVBt)OZ?*c@ZU`RKKiCbO)K!^;}BTpX@D!uteljLnM1G6qw!YJ zP)6g~{`F-m>1?x0juu)Q_TcdJ)W#;ugIVe)9t&HgqO1odH>8bgP7(Ov)MFax1oNH( zwg^*ve7vsHJ%;-knm4wmwbQpVSLJ~6WsMsuAb+zG@^{~+;HM7ULBF}}^}s9R=576t zM?PXNroLWw(jsTPPIeZxB6@hP{UcCL(fW^5WV29a@Z1BGI2K|2?U(pc>@LIsw{w|R zWGn{AN`|%tt#cR`ePqHRrugw|1?^kd-via3KS#Mg?bi{S1Q*DwS!{5HfRi_17JK;M zH0SK1Ev$?7Kl9$35qFXIZ2>fg;leCSqp|7v!1a<+r%XyPxmy2ot~Rv>>{UZDAm$VT zG=~Zt;RW{wRx4}J&i{Jw>fdZDi}KNS00qS3=xF$3{Aatq}Um_FL^kDw8&CeR9B5P~rC*YLl2ct%a0l@eu@I!qIj+(79gq0d$j zav4f%c5;5OJ~lLjtdRc!-UqKnj~c&REqf)!lnjiO9Wk}bcnYGt_W!7YIALt)Nxd63 z&<$yR^7~WyY^<=LC`H|irRjX@4Rl4sEnbAv0S6RDZ1LHzB=TqbLvq(vU6ZR(!m68K zd;&i-xHSn%ME-S;sst8qSEnqPDoB?xjSV6kOmiVV0>_}H`1t(-Z0yrCx$}P_P_1y+ zoP&dtQ*Up7$hbpj_cHz$!Q<-zI>IqhMj{+*YwPUVa?=+u<=QhVsz zWUWjl@*lF}ppqUgcSRsxi9=L|k0ZyXr#qLsW45FA{PUK;wJ%jvTl=;%F)^3#WcFsi z@hV9=?T_|AQT$5Q{ah02>Hi+oy%DN>TiLYAf+cf{N`{n^cC!}v(dLcmcgRO|P)9XMB(yxJRw^yjTUA>?} z49}IZ!;ONlsVU6P&Q8%soi&<8iY6uuZfmpe3(uZH3J`k&cQ`kZS_x5A%tu zOI@?aG?4m=1W8yzf}X{|;r?pYb++pgLRf@rRT?Znrx-Rbe@;xiy>;uBrLuCk5irkv z!ORMuB48B+d-yJYi&(lj=x-_vcbZrFo*IG}VuO2b*0O+wpy8x%R(%E_jm#x6kJGRu;v{Mlcc9w{(n7IzQ^itbX^zEwRT)R~-RY zFk>mV-#sZ4F$|)Qn7}^Rr=D+c^_6btiXu3!&Q4crlarF1#2KPj0jB`568GW5ox;Mx z$Q$Pr~r;?8;b?mKafsi`TjSCrZAIG)p6Bs@4%k{+@e$yM4Q!$pF!{0YeTAD1Ex zSl$a7eYGEvG%Lb9ICE(+w|Ct=9Ssh?;Aa%aISG!SK%`Mj~^#FEB0 z&NFh6kbYk_Fg=)@U3SU6A&fjUG)?Tq%p{NLn4CO9I*_*g(+1@VVbzx}8C;r~7s04A zkIi{GM)WS*>FMCo-drzQK8=7(-G_53=ev2&OAxA4Z zU~qh+g@C|&qP2w{ntS@CFsG{F%-qMP@rJWKlKx>GO9&}&wmw>QcegOjiDG(c>RX}e zd)c+GM(QQa5f{E~cQkZ>B~%JLm0n5Vj6wNl4;@Gp|yik8l5 z6Jo~N5es~)gLOi0^)JO2DekMd`vYhi_q=_)`Iu`N!7vayy%IdJF`M_;%ZQMO3Xz~^ zW?b(8e4msH+o$(HR^TY`7rVOnCm3*AQMH$UlYjA6?NJgfEp^+98@L&(bG|n&pRnp4 z%!r@0ZNx=8_AdVVwG&DSf^yjA(@xxItKlH1;%8AgRf zggeg84^%uw<%_@iu3#!Y`D5na_NE`=hsZs_?FCTRI{_$f>FrU&h<W0aWW zdvfIDTv>f_cAd;ZHDiBWm^gCN-t(h3Uky~=(XL-=LgK-5c@g@Q#h-%kTv^C3Wxwu` zvB|=7&+-k+{xccQR_F*|Yzm(=i5p&S#Mq}iI@-P^={ADw5@>O2RuKoVzz?qD z{=_VIyKF-*YX0Up`|o?aVYQxIR%8&U5jg^Vvz__tl!1q zoM?K{msBzK!Pt29?Cfk$WONkWcSjZ2ij6xd+dlqTKfHm7(UaDTK;qMuxX$iuHJ)1i z-FSh0db-Z}UhCGH3m`cxDNVP?`0Oc`vk+~cYn&hbtBlC?TpP|&G$aM-V+K^6iZ|QX zBntW$0#Og+Bqx3-BT8Pjnd4VR`igaC>|K{@tuS1vEvuOk!>AII+2`ow;elh_`iIeZ zMCC;aiR5`<$;dyTKr&$dsJPxiSoPx6c?-%;lV(^ z{pisnBbWkztc*3@E7yl6lo7)(4;?1A*_Gc(PfSmzW!Z?~ehzD6K;vN%23&n|>VF%*i=2aX~7{%x@=_^hm zN>&~4LFAnB;A6lSkNA5Y6tqiZfpPP33FF#h$Bv~r{~N_^dESJJPFo=VUPS@|`NL3E;n2D$ci9GN;-S~;o z+}upQynv)Vq1MQ0Mb^?lJB#k0Hd-a(s~JiXDU&4St4TS&4?&$PE5jSFgbE7SI-YmM zeX*MsV3A{f8fZNblCu)UEb>sOsA$=3EgJvv4`*$a-cu9?hodMFKNslnI3=<=mS|+8 zB`0gMtTiwJT`gEzyxSvZH{aX<9Knv${nf?AQyF1wmB%a~0P)6NJi@9w!A3O9Ox#{1 zXJP}Jwgsb%@X})Vv0^zZ>zFl$mAdu?Qw;}+8KI|iK&dEMHt zesBn4ZAS8R4lmyP#BBJUlGrW=uG_s|uhp1XdSam59jc^mfa6 zIV$$91eTg}D{$YnwX@y3ItaenOK=aV4fG8HuCU-nM**=Jl&@|zZMP&sEw>8xoaepf z{dn~b&(H!XsP;aCjS$e8^rIns$1KyZ49r`kz$CWG%y|J{B|aP1Wm@L=f-!KrRR8L7 zdaHhQ{$Q`;#1!BM?GDvTH#^_FD{sgWzn7Vj&Xt;&7%qsHM)Ge~iat;q48sLrNj%Pn z`(Q^d&M(0ZH~#%v+WEw{wql`-03LoIo-~}4o_3r4{+^5LChKw;gm-|bZbv`%-?z>d16r?MZ|-^yPfx!E zvl~A?!xj?sH15&Xi+(?9Kb;&Gs9U`>#Qry zSI-U=_=T>z7&|R&MLgdD5EhsoNxa^gneL8Z$>KL`A#3T+=7sSQtBI;1TJcV$5>c|O z@Z*lYqznN;!J^bDlM>LXefZ;Nm}nbn%B0fvpHWHi=YpH4DbHV3V~F2LeJat94H4WS zcn=abIt~bO62sxPYee;dstV%5H3IF`dW!y2?R0v_&xcvr=Mbe@(HVDF&aW!{#%()R zFmZz)Dwt_ROK`}@2-*FctJ}4Mm}3lF)Rppt#gFHmQtqu!Gx>_7E0eLJEK~L*`|Q6} z^sCc(GDj^7J)djZ4rs7ZYxq*S!IGC)uCFUY>0Opz<+k##Sg$pscYpXL6ClKbo9ENI z;H2cCb$7|N`y|EEF~9VR{2RfJx7!mff*LTm9x*burlqExb3ro|fTs>#F|hKx)KxW; zzUV6supta}!@dol_hyZ>|5T1N(FHR~BUfS4K(&E^OTA}S%danwvCrhkPj)R`{bfOq z>$2wEa$VKvXnk*iaXd$z46_jviEoSh#xmqj1MfIyOiRnUo2ITJOow)TvHh=ly z8gn^R!KD9BR)Z&b`0FhqGeVVkRsxLPN00u1$?3qMV8&JbtW#~?moJncRAGlau@|;r zck?I?U{;fxN7+8WB|8#)KvH5tKP|R`-~A)Odu9rOtaw31G*~czZmbSwyl*+4w8BlA z4+toJv;qaL9M2=qn!A~$T()NJe|M@4Ph6%BK?hTF26C6X<+5U33F2X-YjOcVhWq00 zFFR7{x>wI``@Vg|!RPC;KH7_vIsX>~Oj-yuiztJ0rEPv$V1)R8IVA7&u7M|_V01_U-6v$lRcdydjKPaC-c9DX4>iA7Aq%( z8XfFZ*~DuW5i;Bls-nig;)EAsFA+GQyDg; z@^Ao1_-c?tF%yJE9j=>G=<5S-;aO_}U)@s$L@a87O3Cv@O2t@91Fex%vVg{V58(*C*ZnqKy;- zw{HEI86j`QDr}N={gZzGV72wa2Azm0ujeBrT3xG5#rlu>$N0D_2s1dDYCgueeC}~O zpKhSsVVHY5mZZ*2epZ~V1Va2KOvwo84eD`4!3m*2V)G?DrS@|9Xi^3|%fzBHg7^sk z!yrM!K)MW03mC;_NTsAku1X!HL-~T5GwcO(-CQ2)zxPonbms>mHfEP9dgU1mA*k59 z+9>i;vE;#JIgY_~Fcp$HFaMy6DuaZ^*;@RA%i`!Lcegdh>Pt&{?Umol40TT7m=)6o zgoNj=75eKIG?aIL$o4JI9sUpULdSQIOzN2{ml*0tIoNRc*t(#w-J%+F+RysS;4T?tKa%cGKdjjRUM6_3@5qGfjH?x zkS!dBp1eEXIGMYx)(?Q{r8H+Z4pm-F=KB=2WPiOMG&4t4_IqNp<|;GSU0E=8y z-AST8OL(2QJb4hZfy;rfqOJ3t?%WXG4t_>i<@gXFk&I?nHF5pBHj?syLql$X_J&gC zNfNaq$KdI0L_9ZetNHU{jFS7b}dBpCZGR$ugG>ER9ac%W~uR zS>E5q5~0hL{gKUEoT5o9dh7eb2L5&5vq!DIu$JdG)m^l{>;Lu3MGFp}VEoq~d*7h{ zTqfXpnV=_9or2wojV;T%4iAW8fWrmId^s0sy}c{W5)CODl3(AsK;!ZRN<9#p_=w@D zAJ2S*Yj%J1K|4m>8Jjx?4BlC9*j5fn6F?W0c=VE#L2?Vm$WJs2UYJ;m*HLsbXGiHq(1wP91#^>HP4P2K(XMVeg(XnkY<*b}(%MSie9kj;rjO)9+CXekM~s z;sYP_QZh41!pG=;7~@J!JD1+!-S~X^#ny(N2&e9;fM@eu_9rswcDo1H>NL;7qK+?? z4${+G2eU-`007p+tfl=iB@hCmI0Pxg4==x3>W!d;0&@xqdc+to@2gYDkY?NXD!yrR zs#O#W$AiOBZ1hND`=P_*2o)L0p#9pbgMiEOaAd${bus9PO1%G$1(GbNmC`r1y2^%R z3EwG+;Mreg$(<;4e;JZ(Tn3OqP4-+!yPAQcO2 z0XbIk^#3nyMAP0gbRYy%DYtaPz3=Sv|KJedgoztwAy(Br4GlRAA>3+V#Qyb5c3>iz zEfByteT#u7Huwu#A%PsfGI_A^)^_sRmOVOF+!WMxn^NU@-+lT_J+w7{&ER?ENEU*+ z_h>go*s{>9Jk`ZUKBeA1Zc_GTAzrgTKlCzxBYr>->i`q7s>7@({89FN~1VJvA zMr=2fS>1ecKF?yGCEJXN7J&Z3aBxxJKV!YYPF7rQWVW=&oAb`!zYjWL?C^I@I#X#; zxL>Ir_{u{u-ET58nO~XJx#R;886Ol1{i)>6S$ZGYAB^E@tuyi%Ue(udd4`wFnTW*u zDu1=Jn00HaGLIU~d;&mAlg-5CZmZwJIVy`@toZ46@_~v{9$(v%RaQy5j1YMka)RT% zy^H<-C@VU?{7S()*3GgT|kKW_LK%zPx#Qa^zdi+k2lkIgyn5W3{}j z=hfRkg@w|VM5c1*>O*wzc^DYJF{Y+wV@izEDY*?|kjKi-)(|Vd-W(+-pO~5YYlE0< zcrk5**De9kT2-S3of;2+Hl_akI|sZu=P}LkASxo3!C!ndgHE*_>n^}36^F&m>|R=D zJ2er@mf-82^X=B{;^MNc=FOj``%p*$EwN(|xq(53)g!fiWWX}9b&5JHw7p81rGVdY zqMhu8;Xgv(VAZk0#n-K82IvC->n+rnI(N2EatUP0`Fhr!4czUjt{Kh0qlZEPEU(wm zh6|_DFA;Gt0yfz{adez4<9Qzb!Qo!}vWSaMg0Kg|^>55h@dn)eiK;A@!q1N|$m$;+ zxeO1~s2AN;k=Bj{<}I}7D8P|_cSs}7~%j<(`Q)5k-oz!u+!u~ z7bpZ9+?pqaR7d=|bCOc@3?QQTZLfTLre2b90&@{7z6{}{ci%+K(#Vx6HQ2;f{JBjR zX!Q!UobMJEw5@x*q1#tNzSYmZ#;1ETVjkFG>o`?sJ0J*s{rHsS4vmt0;Ao{)n#3Cz zOS##s;N=)#$Gt7E>K4nGY&LzmV1$uhP?R_1u&Ff*1#>A21J^HLb8@F`m~lg@U! zax3N+zEvkN!_H|?OK?!8oi>s*_~q=wJJ#8&dX}HVDl^fP9mK3%ml~XJVC%Lbnqld9 zgRhwi@}Bj~eHhC@8#Y-*m~YFTPWS!Zt9lRPgd@1yL-$eVxH2B|>2d zYO3UKBj0wGjO0b22E*rGzn~+)(Dj?sHohd!uFJ)6vLVbbVxP7TAz5>J_H6NS^WGzp zz#bx|ti(>p57y0K|Bu{dcE~c&i8VoZsr%g3JVLV zil(w$RR!7g?$!B6LEinWy#V73%nB0pa#ZD(yp>$O%@fn^;* z@}(t0JZQCVAy&U7+oG4M&fo!QF|N91d~qg)VPm7g`8#id2nDn;GBU10V>?@U^Rawl zxOViU`pBWo=N(r}{9SwkW;n`lO{@PeQvI2;^WB1?j`dxvvY1|8vLN!dlz5Dy*}1Q~ z@3k`z zp{Cdh`TmER!Z`?RE6Ip`Ygr>RY)G|FO{SyYad;K47dIF#<1jazBScRGWtW)7R6q7? zn)^8OVC~WZu_kA)bn7i^G9E503y%eL{keRZ!S&m#*D?|Bz4!;V|SqJUKKtg8AWcCRYyRp(n#jiOmmu^rp3z}yc zqXj4HY&9O-X|vqLE^^fvx)z7#&QclX)?IeQ()iZ^70cI8gP0V}i`)=gy+`qfkSHwU zJ*Q?rdsoHEn3kS(3wrwJ43SLtZajC`iy=Czg;$cEw^b)A+*&dA zp3nQ!GY@%w>!6)!u-CatNoDA3+-~8O|3mnYifTvfZD_3tALtqb;)ViPrG<}M1`Sv) zDpOIN$a#c=?tEkW%{xB7rCDKTZpp4_IP>-M@@fO#Ns&=sze32Jfo=cfn$JiUQGysb zl>bjFm z#TbkgYF5~ye;XbtImBh}2Xj9Z-Hv(jR8Y0$SRl`1&l*BsX{6~p6UhjEUkrh>mC z2(X3Sc3<<-p~@p5dr3#3qpfvYH8RyD(TeZinZ1a8z6G82Oj%PPOhrv~_xcp8Ec%#> zHA^p2SvYFiY7i4(bD#I`UhgApGzLgZOG_XqoP_0SF%A^Kl-P%#~Q+X~)uo(Y<92}NhD4s)sLWzo+w&Smh`SI1I94xT1 zx>}BpM<8rsgP2Ds3A!Uq+W2TG6V)-ieAvFei{A3E+9-P}$M$xm8>$$zReY(~L3+O{ z*fWT(qvE@@5IQ|ERL|!aCj+&H9QIlv&@`(HNHjn_OVP)CpYq zi^!d*=|y?Hd)L7ikp$a2RaO3WdUR%w|J*V&E^eA9ME4csd)^e%zf&f;_E*^P+;AJ{ z3LC767a#9IoRoK?AFkam^8rc47s%_giM1>2vrnHkJ8f((|G*;qdR0I@okeE$hP%DG z4hDJIZZXmqLS<$RSY|cUk%u~euKOvlUozm{J+(YV(?mWfC5pAxyvPC z;n&)?{L9^nT&uiTzC1EiW;)>mLw9$fO5&4IJFsqDs(nl=rsSv_%TFdzdDb!F> zay)xHM|eU@G&FS63ac~nRRBZ_acMcZ1?0|_&$ib?LxbB3NNwX^#)dj^*Hez=p{KOZ zO~T?Y>@Ch~pTM3VJAe+`{%|3Sva z!HTAD`TB8~v5{W~8avNtHdj$ACM%q1;u^bAtHh+H85qf_d-lNRKU0R^N zu#yun%R!d25|mdwXyg5a3OCf=42d|S?P+Q!pf2`{7ZV8<{a9SSp9H%uQ3E5wB1#MbA)b{5=BnYyTb05=VR1jFCEKo-1rHb}Rfj z4YTO@2DC##nzX@OVTSsso98OW;X$ZDLw&=so?JKpE*29Lmu}9_@?RZ&z2AJZ&=CBD zmg&AHnI5Os*1#jJ?ZN&5Y^oZTTvnpVR{6+93-a++c{{OfJ|6x}@p5f_lSd8x{a5F- zfZ{=W5?&r4gEB-B-YwUDq8~EO;+KC)Yu^<7pT&1aV9pFSmp4|9+(RkY*?=1U14%qHB?7q@wIK{)~v?O;$0%xLbO z#RD%VO_Cdne9Ay#kbBXC6$@Lyft&^ES2GV98YBVHk1xDD3oFR-rB0hsv;U<61X-2d zsEyni#mLBIZmoO6O*|?~-==bDaSlE=yXDU-S_D-f>Ief3v_VX28mbEJN=mmSw(8qQ z^4K-Z<^_5AH+xjHx~p!hiG55+b|ECftT>2ZxyTmnG?#z)5Qm{V+SFt5WOra^MU(-X zl@#r}bD`WpNSGCm1uJjbBY-{;^Q$MkbO?v1W*%-Rh7tSZ6ck6iM`5VeH~M%3QioQ@ zqDvskTwOy67;5P1>GHAoU${P2@V{b%tmv&2+VIr=Zs0?jTfZpv?eb}iBtKQ`geLv5 z)r{xxlwm$NI=V^ToA)~y*_s;3drdSj&@9ctwd$tox?ASVkMy^gZ}Bq*J|PeBTRupim63CTuj*K7MYXaMJzQ^Z&<$ySkPS@Pb4Y3sdl>Y5V^- z9Q#1j5VmkmU`uod2lH;ft#6CZaimpCb4N^vpe8^wrU#x@8}01kvV42mqXuF&K!ZRv z{&Bj*D{eNnb}Z0zGs_Y-oq2)=V0#K^i+mHG|E&UEmv-ZDV$;t%7C|0d)yZW=ti|DO zwO-#B3KKUA$iTD$h^;JBGTGlhm-u%XqbdV#!=)=;t-s_@_1vtUkciKxE_%lteFri6 zY2)&N^a&bsC`h>J>~Cp0;_Fg>rIk*oio?NGAQ{jPGhtRZjPsDltFr}@sg`Hqq1MRZ zxpLPlg7-iLySuWY^mU$aOzc~)0X?ZT@wuEIC|o16v(X?H17#9@brh7+6m;!g*EF|! zz*El)CnRem{Tf^;m&omj*<}u4_F_KH z_KuXRfJ}K~dgpW5)TYc5&=hb}t;99cI8*P6U^cZS%{D%>*3h`vz87!C68Jqf)Bm8W zSP$3*BOmkJL3CcP7s*`~`+56F6{M&u!%|Rd|9%^PffK}{UYzblL`Sax*x1NzNM?QK zwqYwwc94})mc*iCIY!Q@ci_9iSO~uV+(M<)whF7Y1xK^2omjb3rt}8^4|j5M{ z$Yq+HI&d65NPj?2IzXQ1V_KwL{PG;lS07VTTZD;;5eR3c#w?UXEyv~y`{(&_D=U6z z(JcjH*C9+`6NO`}dg^-*MrSp;<#%p|(S2Hn^JJNMiGo#^B}K>rqkH4foCmh`V0T!N z)D`%u5dyoSK*t$HUkt?XhParRB!>=G)7*CF$9b26FZ=$@W-%ZVr@-{;vzR{&{uO;w zQ>^og@;-h2iitiRC*Wn0NyY7!F?_0{^C2}pSnKDf`<%)3hMR!O0bf6aeezpLG-Soc z2&1Ku#m>COL;IdcywQPZkP`mBFPH0F`|jSo8*3@Fa8sSA(YhyfxCSA2c-YquBYGh7 z>=@=*xYiNXAZN6*RI-i=Lq0}it+*F{OLPXp`pMbJ2p2Eas=Z|(%=X8lu zjeB*SUu6o10~^4)^uf6gFIWAS-vC$KmeNM405>&4l5^P+QdmkCT_fFNdld!DphT3( zid)I|Zc(z+y6_X+eY>wV1H34dUtrEL9wW<>yDwlD|kRH%77ZMaTvq-X{F`f}1-fic0KZaFWPdH&`j^nv zg`pC!6}tU;I;KGN5ZB0tNb((~1PPRw&|wH9U{Nnx zzS%Ho7#?VyR>fiQEC6f4hOLG)duh{+-u1NVfVWpu?p?OMbgyQe*U`l(Am4e#UZhqb z1}Y8Ezxkl3WzcgFFl&iAp7-}*{B17{gFOV2o_C)=;t`xatb!hO8t?^On0f<=K?c)< z{_8ZkkeRJKWmlJTk6YPv*v20|0B*SU8Ae1dUU&!WEfbLjSx6lgz^b1;dj`lp;AB&X zGil02ed>3NGIu%fSH<`)mInwUPPNM*Z0Z~|mlgeiuvb*akpu|*3`zUb@9Xsp4Y9lj zy~y1 zFg}SfhOMl)W7^xwCTh&!2L1s$`Ps*5#Af&N>-Kiox!oG&bVFN@)mjGkxvid0r{Gh@ zW@Qj3kKuzDB`S;1WeK3P0*Ooc4AFIyW0+l&VsLML%jaLNzqh57lT@2aT z>!>QDZteS~8#W!%Ac9DDcY}mVN~ffxbR&pJcc&nog0vtZ-AH#gNY}f3&Uemt{(4^q zW3bs{Fxar~x$d>*ysqm9hl(0LvPsOW8>#Uqu)%LEs6X;5R3twY3Xsx)nacB!sRK+2 zY^O!*%^RNlkI8o$!PT9*;<0HAvH1^0LV(f)Bo)WKjYjR$D45kqt@JosVJyrFyKpg* zx8g-mE@Ov9{o1*f;ldjYjoew3mzl!X*LEKkXJ7>I&tLn?`-n$}qW?b12n); znewvGCV74q{c~Wkt6&CbxE!Af)9Yl+SyqvQBh6qc&sekfPpo6L^<5PCzaCz0fxG2e|i1Adh^hl8-? zj$aSOFW2joKD(r&Y%~2|ibG_=nAW$`@X7JPr(5kw8ZT(zFzvW3{w5F-lFC;-PMsJvpU_@?cf_vO^E90-e*5eAmD(#>;&A)REg))IeJU`RUuw&3Zf-e! z{BR)TJ$F)GqE&(SzVB&M5X@We*rjGhN*bTUG>d)$zS?3Aotkl`{gtXno&Dp(y`5*) z83MgRAP~|;=ScB2Uv*%-decV)nQ?a0ehmFI0gnWUV&0!DJ>D;22nq_`N#1ZX@IHCC z_F6*le|*ifrCi$g2FWNQ1Fn*Ned{k%S(!e04-z*eWd*U1W=URM!3J0N9~{#+1oaRu zdrL!Y{AGz9_-#E09~l);An%E#z5w^jj}e1`n64+Ut08?6k*$v@gL)_$9?kFr++g$i z%@Ev+`k0xA#m#H!!;^i)9e9Unu3MC15i6(xu6=C?Bp#5OK10@nr0m{IzBb=F^AxVs zF6;2AU*KKt3;0uEbb4&usT?bbuzBLXeBy}%r|m3)nA}B;(wt-|7TOtbLCVz#C!Mht zM=QQrY0ULhU?rgKQqPuGxY_%<%l+$&JFE<6T`Mtx=jxG~)*T5B;K1vvzHWX-HD4eo zXePhvi0)w#4;2s*$zC8b+i-npe~255BZh$au?_2q!0D0Nhx>swjaSnaVCw)aUtA$B zUkkhh2A{OSq_W@EG9Nzh9X9N-epYNw=^k5My;fQ4&Z#Z7mI;F)eXOmmqj*&qnZj)h zkJH^sy!I2Jf!l0bjpNxfxq+b}BCY`oT>tIpd}2v9dfLvG9*dH;>oIWRRPkO3C|iAYjsxb`>DL0?}$w1?53FkG-v`i?-Oy2JOdPIz2NNUbsVXw z9@M~~lKOhta*{u?b8|3F&z$O4e-29_J*xnHdGjWL;)$>*kE_aAFj_(2^k+a*$ZR|t z5*ltkpVG4fjYI#Jm%TG_&-8()>kmAFIQHM0D27NX!vn`Au!}u$2Cz8>=#@Z*eP>CD zW?dv12YfEQ&tu2VIJ`fhLNTBJO-xsp$ocuX35fmlpcPb-4*j&PK${DaAiRBabW-@; z=J|2kQP@dh&zD7EqtO7vTsG9(%m1?VFaEPnMQWm#Kn9`edm4A%RZw6E8;w&adkb~~ z{~0>2v{A_ZBqll)j&)G=HemINua?{xvWg!vn_X~R`?85yLkfh0*i9lve-_z#kq^Jt za+6>pYqJn}H~Y58xbSzw^W#5nFRl>#J8}?#3Y75eLJn;iuMv_w&bE~3(9y*sR&dx_ zuYl4W>XJ44r*mgi0BfJbHEJAEN#_bza4da9@wazpkCd?N_rJot0ef9N_U5cwbK{QP{x0Xx#Hd7q#*WwDf)T=}QC79*(C#vdZxsjo$NAlIO7wVHl2 zI*sd}vSrdnsKW~BnC#u~dcJSQ?P(2J@w&Aq$dm46iihO|2P{`oq3Y+ErkFbK-uWv+ zcW~|T35m!rFZ9)P-+mam39j}ONwtFii*E_#_3Y04=CTaRF5*ZZ=>8%C}~NqvU&P6K3ewg{q25$fPy!Y(M7? z_d!0fp$-SmTJVPQyY5a<3}RReB-4Pm%HKG76pitcSnW5fKSfuLPPI{iRx>r~DrH>J zJrZt{?K+FW=@Qx|(rEP>#}=G8o|m$A1uiOGQ!#sQ*`?JR8UTwsbz z=2q-IgRW%=?g@fzmY?X=w=R8HlXX|pYM9NX#?c(Ds=%k2r8Wp7L+L=w{8RhQar~=F z=FLp1|5iKpOd9!8pGl*aJFS$Jq9llZ*ar4i8Xs2 z#br`X9}lK6cqG4Ezu2jO^Y%MvbiG~jy*&s4%?#l*b!!bXEX9uG9w*O#DEV6u3dH)s z)inX)mq)!Gv-%~$bU%lvTO-tkT2N~>(LqT6;0uq@`jW|qXQ$&$ky?&q2s+`Tow)C1 z)6y5g!Za&2N!Wzd`^T{YvgN4CHBQgmil@QsP>0v2jq_%_zOv?sT9+p{>j}6CQ>4-{ zhCf*SK_q<(BMBz%OXfRYG0=>G+HHB|?y{6u0PvJGNoih@buiu(6+l5j#~v_5JB--H znOT$tB7>HWdVrQ*f~jlbTke*jT`atv4y*Ug-*Lr?=ob*t2nsI(9LDNp` z8W~ZWpS+;*S#p%dLLJ-XDS{0m2K{_5l&Z|24Dtj9iY6H*5&J}!&u&cvS#36gogB^q z9QoiN5hbyH4nSaiInaAq=Zq%WqBkWkM(N#qntHzpOe7==?|b4Gv_w{!#o z2*;kB%w0;`=EaUOS&OE6wty1*b3tuQ8Ww%f-E*5B74j&&=0A_peFh$y-Lz-D#47SJ zsuiWinKW%N*qCnQT%w3V==)3`rwI$Ll&a-NGkN)C2E|>WLr271QNtk@IHx#d^Eg)Z zSI@55g@q%G7!fl+X4uK#$pb2ByX;`FtW;0e=MkGaBZ83N1jE;V2cDAH+nHnH8<8-4 z#er}eeP`;Fa$SRwA;toQGA_!5eia5sVepn{zxY7#m(XA1-BY_2VGu6;>o&8Hpj-{L zCci%aj^3(PS5}b7UyqGhvbSMXT?Tf1?F~|Eaj~Nip#c7%SeV#QS3}MlQ4;_algtT2 zjE4mi*!Uk)Sl4l{Ub&$)bcgf&V$VjF8h97CZW`UH5c-vDo~4+zFedPH zF~FqlB!iN9`lH*nOCgBGumw>O5E!^lABwqHF-hi-LcfwoFw?Aw$n^Qs5iC+g>_eXl_G#V$Zy2+N+;D*_^bm`ZtwV z3vSN}l?Nf=ARQgupBArrK<;|2_abq3q3MH-oUClLmilN!Q}BCye)7n>l^ERh%}qfX z4_g51zJECGMJ30UdvN7&VGrAm5yF)04R@rJTgRF97k!E(;n;FXK(j7IE7-X$)#JzUF70*vPWJmi=c41E= zDNBIUOf9Y5EK|SYj+-IYQOZXdJL5fTV2%@b7^gsqEeqJ@Z605%vRP)`{+tl@#}qF~ ze4oD(zJ4=uFgV(Kht1%I3N2C$sWJ;z4R`t%dsGFsH5#s2C7vpz8J{qNN&_-?P10la zBFw+85=)Qzh5w9JWzzRLIo${o*eoLx2V(|Xm5TNYff|b$VLG}kYzooR!GT`+=e>O+ z$H&)zX=*=Is>4GC3aIK`Kd@oeSYB?c<5c+d-f5q7#Ce`A_lSl9C=#)2(Ho2@x6d&Du6?vFhLK%oiw$@yyzC+=S}Y zm{jm_?qyIST%dqD5xeGU|1`qo7Q){eJL{A@1N; zC{-pPRgA;8SDW`YkYZu+Fr?WD%`H*=;7zwuE-$sE+&=1YxY!@v+}zXz3@FVEIfW9NAo92) zjKtw1o`<`1Al$~8vgYn%^cK+srXONT(PKtsi7#EhLP4c;=$CtvB7%fgaFiE;kV`3^ zHSe=g`Ow=FxoX0W8I&FvsESf<7&VH}%j%!Yp^NorZ)-rn zd}PNK$p6b@a7PF9X7#8o*9nZxTm>nr$Hvc?6&0s$q;d+LiCs|(Pv@c4+KqQKIlB)a@q`tRFsS9fwE!+| ziE!co8fFfn;L7|^r`v;f;beapjNJs9#grOIOcMWp8=>c~l^HX;4|+Jl+7C)2vsf$2 z7d6Fv1m{_a;eQ&LlqmhC@c(TU%*2A#=__{8deTjS>)u#eY&{nrj&3n2a+&SA(3sD~ zs$T^kI41wViz=+ItMj9*xH(+_N+0qaUHIwa$gY z6puIVtn3cI@n##G%$0?n(y{n8=I5H|$ta+mg|KIV^WH1TA;Q)=86Xd3~?@ z68>)JHyt*-hmu>&&@x)g6fgsVRoLxjxw{3pgR#oW+U+!(@IIOKpa~g=t-%O<@FO&@ z9uG27S?wAm3(BDgXD=Z8NNPw$9o+8SfA?Lu%T~0yxu5{t zzT4N%kmfG-e^9k^$RyS;F0}c@O>aqA$RcaL(9x*iO2L*ur!tGrbEjAGr$Hp*NR?Ah zo%FQ2j(z%6HV>D)XJs3ON;ts%BvK?Z>tW^Y+7CTMQeH)+t2!}JF+ZOi-e}aO&QY#I zJxyGL(@n2*DhVmfewDF6esm`@5I6+LWDvDgW!M&$840t;MG)FI@Db{ssZ#%PY+xd# z{Ojg=zmWMa;;O3}e)ufe;MJ>dJSo@^qncS22eOo&>zg+L)Tr-oy?=gK^7()zoJj#K zC(u_Z;4iyV+84YDp1!R(u(LBHKk>X5%)lO0Q89hj>iuVN$POf^vp#$>h%a@eMN328Sh1=!mHX zeT^b4x6_C5_#x)v;;V0Ajb7e++&n&#WpdITp|QnQ)EL#CqG_co&hX2D=Od0cf2uqZ zb8{;v2iiwQCNYxO*brcRl%BbJPwAtjZ39KMK3vjX8*QI%FhJAYUM=cWQWmx>#ZDTj zmG7Yyc~J#?YM_@*>i*;}QTVyZlEoPReGW|Hm&y=+^%9#*UI267G%ma1fKC2ajgsGp zvY3QUav@3;Cf&cQfj!BwYBbP(DM7@5e%D?$E%8~)uKIrtI{)s79HR~TBJJb#ue1l! z-*-vj&~zF>du~DJ*V3dC@cIx9B9o`c*bAa`VP^}y>FYD-c%K3n6&ZdYyFUa3Td3U7 zHu>GWy3!^Jq_%CEALU@h<3I!fZ1T0)N}ihYjrJK&3D5)l&Qw04cYJ3iW~Eo5opKfK zaKsvqdn(R!f3vBQ=8GzM+|B0u(?8k{4D{n@ai#o;gB@?5&<5Xe6%c?*zoQ{UYzFXY zOu}G0EtzMEd9ftp9uMvc!XWAqM*`LN;Vg>_zF-dI^vXWPRa(aOei^J_JNs7(ei>L@ z%%KPcTKG@vH*0VOfA``wZcfYfT|nVanAJReYuwX|5{xLhaUvdDDfT0$j&LZ4Mmdd_ zrAnOpMw<4AFG2SNelL9>dFTkEeUB*`J*<#v>@h9>2?UuXCHNo&@4G0c;EiXY(mX2v zy-{~yWQdFAcPlV3RJ^vI4V3|NS!tzI@S~C@x3_m~+ zrc(WCW1*q3_|D$;t^R8@e{pJ9B-iSRXD9_WO5zKH=5P*@3;5o!)|}Bhy`BREblCy2fO zgd^@Lq?ki2Q%MABSa)hnBPBI8T#YeUEM4qT_1N8)Y)i0B?B*wm>U(mOywNa#Ws1+& zDGP-Nbn>m1K>Z=XiH`ctBV`x~diJw}HEQN-^^Xw9^wfWZFYA|W6Ky{;JrO%)l#k-z6bX%hhSD)0LWqQokp@)tyqseN|;M<|dm5#s6;+2pBVD=5iwE+r?nD z$EP2`C;wO2y#kzLg9|W7CYU}xEB103@%TbK(&H})eg#2CK3uc=*)xTJn z>8`FHDuPWubn%xH`!P}?Bt2b#An`F$`gE~K*Omr4V?0mz0(+y0-!`-&5|Z#)37O)u z`?YsmWB9#cPcKP#(D3lCO8+8quI^yG776(8J#3dB+x%fIAC)+kzaTVDlWL!d@E*Bc z2ik%|#NTXHf%k;`FqYZQzkQqeAt2B@)E5ZyrADoS$9I0I6yk%;7D7-EIsYMve<4Jk zg$l1E(HjLq%(X=k#YdmJ}3OD1D2s@l!CO-6QpHQipIbs`|J z!Cw*iuecLaeilde-y-ko!eP^^M*J90fQf~bQ(w3>3&tChEdcU_%xD|tAefPq<+=OK zCI|uHtfrReoMOn^t~M}FJ{{?J4Zsd7gUn~%Gwy*^VV!{J!NUaJ^PVh2 z6C-l%7s(%CoR_dhxH~pU`L_ZijDIfLrEt&;K0(80%aSw$c2W@k8e$MldOScit<<@MczMdVucsFgTV2nff;3mE6%QPX^F7D`)PBF@C1 zlIfiQi}fxYmG|C0yS_0~iRdtEMh&xrZ$Tb8CI7&j{8cuHAn#;t?gcp%c@i&3gH{6O zlf>w7g8I6caEjkXKzP{!4kBPU772}59jh+gBtCnn>p`aZg}>^-OhZqum0_+E|5|e~ zj0W;IuATiE-5i8%f+e2E)T$2;VLp|Sag)_}3)Ugv8@5||_)hZ?qM_I3d>8xq{I-(^ zf~Mx@XB=76U+i+dAcBQmY~-k+c6N6Dxf+qO#e{?Y{IHqkDIEWOZJza4II2$}jtp)> zwonCK_W=L3XYP6v4sy^foJ-f!=$!F$b2AG{=ca{KZE>bkCug{200?X~0@4_qz6>@P zs*%zA=-VqCze)st(j>@#3;TP$*116wk;{*_;EoC7$L8U(C`G7zzLTrMz%sh`A&H3a z-48WXaJ_*0&Y!c>MU)W<)SXXC{xB!P_MeZJY>!T--Cv%h_pHGYqvw67e z>>sePVlT8br+_~u&Lhx=mNRB=ZrBP73j)k_=9@k6MZgrV{QM#jKniK-OSQuIsCtpr zRG4@W+`W#Pjxr4{xAU$;LPB^;CeedN!-hT+k50~9x6!<;i)Y^%+*}02pu~t;ZZH=D z^lY$aC2w-tP-O8h@0R&|DCBf(MCu>pXahVBo)flJwfK_gkZ_gB_33Ot0GzXwRObWm zmL;Bhsv8(!lYBW5zS!0yVyQL*u4oYd=X>wjqvz1#dfJ!3d28o8 zQIxo>^Q%`gxgi)5E{&wY(SAskB>sCKugrF5dz<7h=*}SpIZ_zFL5wnt1d_6{-M3(1 z^d=!80Sf|bP$HUNJPwP^)dDq^2*{n7)Bz2dIRxNx>aTd)_?KCs+k4ic<~&)M;Va-^ zgst(5ucRrWWeuZXb!LNgtf;7H`|9}k{m6k^8ni!UU3bI%8Rp3 zw3MA4<-|!{6HYQEGnUj+1&lpH4^dfCZ3C@mZ;$ryIa!DpSXj!$^F|4Jaer;7t(Q(? z@b$w7E=SS4Kbc^%02`GfDgpOO5VkK$NpP<7WN}U$$SBASTb; zdu#zKX--5QDd1Dg@+(D^cnwhnK5;hb>306JN2Ph*{CNAq_{IGA$cWQxgo4@!>{G+s zVnf>hX^9Zxt+F^+Yt?_x1d?=zmeW2!_ozA@o?+HHC1t?p4u*n_-Wz2fnP^Slc8ZAT z(ey^QBnlq=N zNWK>g{bcjgP)0f6hx3lQzu3T%{z$fV8eiOcD>rsl@q5#~`Z@r5;o8kE?{KAk#;Q_x z#xcqbTF_ZxmGDIoa@oS;Cck@Y=6(Rq0p)WtT3*?>i5(ZKx%wj&$zBtvD@QHNT!+Zn zVi=nb&X`1`fB*%AD8<1zLt$fP94W2tr@zov>K)n+?mBMHlh$yp@`Z8ae0>eyDg5>T zl%m^w1?B`aM8%x(9nh>RgNjjUN}4I7XkeHoAZE_{+$my$*;v0uNbj+8fJbH`OH8xynU`f#oCCxud}nmO9KEn~&BuFzQ93NnHWiRLUoj1_GtkxwY%3NJdJFLQcgBeHkcE2X=Nm}aixw{&dd7qOE zk7UWD$>U1rEgDS}zU242{iL?};!*3LeJk5C$k~CA-Fjk9pNii1zvVjh<-|cj8@P!3 z9v&S*mym}$LiUcjWM&B$DpsoY0uR1$I$)TZeA z8C%d7ZkV5RRl<&r)i@v{>j3$6B3{_!4Va8Kkd!>y-WiPub4d{FR1iwv*-ziVLEIhV ze~IC^%-YADi zsDXaF>%Xx;;Hjx*`P+9tELS=>Aqr!s@70{UjI3V`Z#Vf26NW|VZKjhbWMpa^zkUpi zo`KY~bred9OLhoOI<;PAl2>nS=zAYtZ+R&0M88FdAG=T$y^l9+HR(#}D=rQw-nIT9 zVQjp0#?}mrc{ysvP5=7?rFwcv?9fU47}-v`_Z?OIn497bjp8>g!Fv5ZT@8J`xmyt5 zsTz}< zuz!JA|0nU>m#GJbwy zyL)>ls~BvkkQ>||JT^^5PQ=zm@5$l}uFau^B!B6LeI$&FjXB$u4isc$H7%`BVnc6r z*1Ia{0Nw7{nXAdojeb9?v7Ka>8iD@!OkW2>hodyeOvL12;D__vnUhl=l7x}>X~uB+ zrz8VU1?cz{lqUBXkINHl`&ne@kdkX zVULh+-#a$}JE#}^-R??&-3%0smD(>L2y}sIcK(TP!Lfj)#}TYcvLGZw%v#RM*4hMG z1~gv$SbIk$jJViXT0A3}xps9v7I$w^9e!b&oj>C3eU9X{@vs>Tttl(g-Ob@bh~dRT zy3A+Br_uzPT(ecg^~$jZq_HobC4AdJg7d~>MTvFAPp}ot)Hn`=Sn#@XK6PjhpSzF$ z-mw0bkMsmX!F`iNOOV#ieI!sLpMDf2!qFsgQK6B5DcwKu2O*>Jgoi}qDC1*#w2MU$ z945`GJjv;`+R_N5>2g9G6KzZawlIkFArsOC7}wq-Das?rK@yml*sBx2nW^qas<1a$8 zgtX)Yve6U&kT9w|3tE~vDiJBv9V+Ik|Gr4T#QwQ#5K{Z0nC8kE+}l)6uL}z1=I)Yb zCXjGOM$(7nQLHD53<(Jf@2=OvJ@nyQd@t_=oHtdoc(F>CaI*H_-f~e_PDLkP% zOq&c2NK?aLJ}_nf@^>%bi6F7(WkuRe?kkdxx2^QId4Z5rY_S`s4_mRD7Tv&O+(s}e!}LfKEM7R8 zUD@DX0V0^scHh8>^ZlYuJAjqF^XjIBu}CnEl3+INfvu3C{u{!J+<5u$ucKDklRMIK za)JK>ilU}JKe@lZy6QlpS$2CQ%SA~FmX1f9;zaI@I@I|-@b6DxBtTzsrTv|>Z!AG{ ziO)18LifY#sY;(xOuTmetA^k-5Vi0S^b3;hCB|LR+}Hkqo5(I`ps`$02_X| z6W|<}-n{XwUuv`dweuH&A5VpP9);fP(I&31zsXKOfM;iCM_xezu9F>&kc<<~+^)B6 z!{Li;&<`$4$&yj;Ee*L)eD$=gc)A=Yds#zE%XMS@_ia;C6B3|X8L^WbqKtmny}ae% zUG|=s#tGv8M z<;xe+ry!dUB%^sUnbee8uXs>`wuWB4{r&NFmFe4_9;&>yHbXH^P7~VT*QtXRc0hH5 zi5z4_P&O`+P2li&+xCblZu1sC{Ocd&q1pA48^T}UsQ8H+5mAV%lC#!^xYVUejNNju$%92y9WZ3~YOU<5e`6ty(*- zueU34w0=(*-Jxw}*$_37?7e3akg?S}~|wSvHKT3yX@Z*txiBc$t|o8siC? zZ=04x&`06DT+|d<;>Wa#!c>7NY8dn)zW^@#Y8nyCs#0&H^-%+_a3=9mZI#<``ylSU`Yp9^sUt?C5semtID9ZWl zblxagYK@j!zeswPNs7(QHA8_TMU=zL@|g%tPW%I5!9=~~(PADX*rOueh$_Y8BU@eM zmgekiik!%CI{ivi zdJJ(n{0y{{t`LK=*SY8*32{aeP?_TTb}W>>$3L%u)bbTH<;#Ew5Zgu4f#y0u*j?&# zWvuj0rpumwRKnr2e_g3EMmA=<#^+H+`{`IoEW|tCWAe~Mna?BDwllg`+=c9lC@NF9 zig40e)Suzv1B}Bt%QU;wQ^UIk2i0yGQS224!6ec<0J=C>V#73Od%%HFf$Ylsv{Je3xu^DIWtyMQC@A{fBFPV`ip>Cx{a9C4JPn}7kFEG$~S!W?~X_I#aP|fWyPuX z;}br6RABT%i2|90FbG3NE`p)5C8vA{4;}euh$O0l!6mRl0ZEe_QwtbX56#+s2T9UQ z$$THm-GG9$rcBdDJA!TcB|AxQ|3(Lp`+ET;gYa8*gGG1_qQkt{AYUjZV}!G={IENJ z)x@X$D70to=kjtk3_WD%zH2S2Mz8JUi?uY;1hPNVtFNe_*#OoTG-gh3Q7WLM6YssX z98Uj+WQ2T->F*cehM!v+;6?7%w0PjO0#v0WWMqPK3kw-oOv`A$P*rYeikEMownp9{`vvD;NnsaEsNlPssUkW9F)|aCDw9vD?CldJB2ZcJV_x=jR0%F9^*m2s8Ek(y zyIR|``foMEf1Tl155>XM_6GiqVfHS@YoDLVYUfDBtx$0*HPin*`#(cn@L*Mp=Cz-6 zu^88J{m{v?F!%nm*~zl9LPUvnJz$00 z3d8$0VDKY$m^~$%29X*Oba;J;n;I9X4tHkIL+VO{C$AF{4AXS=MYKxB-+`>>_ZI-9 z-WF)J2$sRhMvflakCSG25xjG`+hXHiWX;Ghw|}@-t>p!w;8;u2tUPS=Q@uU89$)0cJs%y&C1%!YM7oyxeecQdVDHe* z{mbiQmrzs3E7`BgDd5~!<-RjU3vEHTdAR+0A+w|-`V^1t;>YO`1H$L?@HCwT8$L(YyvRn%rP24&kl!G_wAjK z!2hIn+n?V_8b1-n2^$-;3EwBqkC!Vw1&O;e3epm7r3P*$cCC?&SXWco^gX)Jfl3Nst@ z|L7PDG5_B?25_|brNOWO*w{0lhHbJ+%YwqWU~vdU@v}gwfSs_h{P|zU0OF4f0?Wqb zcL%mC%~!90S*WwK1GG1icl-J#>0UI29PF*3LK4;=N3%-IMzM&aJq42!=`a2M;eylRQplSMtQkj$4-2__4Ejg zRlj+A#(BBjTznLTL{d>Z3ui}1haxz78g5zHa_fa3wOUfQqiz^Nj}9wAVD@NsOWDEC z(z`od0Q>6ay%MH;p;rYD@k4*A&6SQFGQBm1F*-UUtE)LBV0W*csoFQV9gx+4MsB|d z25}L_{r!EifmUdSkXtiab^@&9IoJHPW`!POGUyD8hAtR%IFol)zxa2IWw#-6 zJN!c<9^tniH5C6M;5=;X{1-v1k%X6ofk8_98D@X=_R*1?kB^9f_X-kRE}pZ}-@|Y- zG;i1I;x|H;0~t+haG&mGFo^d1>t{Mba4<2m%geEW#6S1#mFWpO3hntvM+^sp*1J%K zj7SB(v>N4|oy&{!i&nIDI$}}h!}*Km^mHc)7)h4*7MJB}L6QL;bVty>DIJ1fI_Yn) zL~!g*0-A*ZTPa|Lvj#bwPAdNtRx`w}+`&t_If+6F6Z*#cMe{0|M_gd&WJQk3r@SUl z>UGOI?q9KqAj2TR)xp?!1-WUEHw7Jj4G3%5+5J;8t7ib?<9uqT%dsg=pz;q~(>pYT44nu#ST!7U#32{FR$}t`qS04h zZm6oHqy%h-Om_Nh29$e-abb%hj0(2%4Keof4JS3sZ~q+w!R_kAknEA__v1SOetD4w P2z)5Wyp%4NGz$Db-O*E$ literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/arrow.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1eb39c6763770690d4cd6faf81503975a25f08 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol>0V4T5^Y?)SlDyqr82*Fcg1yTp14TFsJR*x3 z7`TN&n2}-D90{Nxdx@v7EBhTTAs$Q7;?s#GK%q&VE{-7@=ig3J6RR&$neB-Qn+l0CXLLr>mdKI;Vst0B#;z A`2YX_ literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/close.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..04b9c97dde8273f8518060c82104b38b51832fa0 GIT binary patch literal 824 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_D|iQ=q4dV~EA+rIQW2r5r_$|IbhBX1!iK_4XmB4ZGuZyxX>Mli(%E z3$HvlGJ~HaFWITo!p#_bl)s>kG4~ILn4ZiInf3+cyI*T<`W(k~_vmY;nOSN7-tT?5 z_kMlG#)t>?(@N_U7A5H`{SZHU%5|y8mTLiCjxG~YC1*%7ESS=i8mXXUVBBMvkk)Zx zV?z+v(jd;QQM_K73j+!*M=?Jx=(qL zyV9$j>$uN4a_JV!q7Nf$g=w9`d^C7^PGA=~P!uT~qnS$!bq$4+Rn zRm$m#aRaT?oBmm{=FQhCd#|NJzRQD|8O+Vit9IW#m0|Mh$eHi2ze*L#9F{1SQ8HHc z4Zg9BH*Meg5Uo|W-`4Hlx9=LmhWqbRZRG0Hp8YoQowzL1@kK9x5mTUu>hHgCQ-VsW z92RMKolEYT^XF2b3{bDqtLv}7DjKgo{7|9&u;Yx#t3aOM*WBA}k1bpkwU1Xgef{_8 zQ_+pAttB$Yjb{4TF*LmYZ6CdM+Pt%A&Pql~pVU2tB$E3i4jY^)wB33;_hapR#yj&8 z_k69LfBWq=h6*9Umc$MPj)YE+L~jQEM2UT~&p(fMdGbAP`{}*^yE`_mUcEY>LGD~J zSC6>3_=>RA3QDRDyr(~v8;?`jEllcfxgCxj?;QX|b^2DN4hVt@qz0ADq;^f4F ZRK5J7^x5xhq=1STJYD@<);T3K0RTH-Q&a!| literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/close.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/hidpi/close.png new file mode 100644 index 0000000000000000000000000000000000000000..8abca8e9726db1db199a0872d24b08842ec8ea62 GIT binary patch literal 1792 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 literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/lock.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..c127f9ebe788baaf9c69bea6d1c7653d990cbe3c GIT binary patch literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_D|i<3~>y#}JFtwUamcJ$4Xi+b?OIx5#CqXV9F5Wxj{CWzI9}I~1#a zxe)M?q2wX2-yR1Qm6(Yl9w#m)DsJBWEpFlsaiv2;q%iS9F@!!9`;&sdy-?D_h?Q(q*;!@Xr zV*c4mE2&-y9=7-yFU!6waO`^Yu%KeH%1PY`s-8vGGJN?_6BIZECcgK-;k1vV>B05e zw{L%aRyS9L^8l;C?_&!@*Ij?jI3e|BVW3Dk!?h@eu0=aeZ+auK;QH%@t6uNgR=ody zy3tGqgSmdn?`v`p(oynm@B2FvhaW#y*4NkH6rr=P%R;Vy@CgHpZ{!H zwJLSq^XbxxyXWj>$o)R8an-!;6a1mJ`I1|7zP)n_4XvrE3Ak>WC{a{WQnD>V=iDWe zr8?eoifiiXfN&PEETh{4m<&t;ucLK6UWP&V5D literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/refresh.png b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/images/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a061c50de209f0b3749537a6a20fba2b93c8e3 GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_D|i(=iY?K- z+T>WE_|9u#iQ?6_3VMH-)0Rt%@4C1)k0tvrvkZ&loF;Dff{VURL7EFQFE4q&cfzy3 zyEe~Io3gXOO#IyOrv>Y-ye^HC6Fg|Zv+1TzaBy%32gBbw`SYJU7IB2K9;mpPF-z@b z$*deR?~M^h40Ve#ULHzQ+dU=I$FK<`iUaz4iRSe5FrS zX0ui2pHGeyQ)*)MIVU^YWeHafbN;PubEBf8ldGzJy9yaFtrFZ>9zj|)JT`TzH=g*%O7yY+w z-(Ff@AAkDkr|k!{%YV;oZf0J4HS0ekf9TZNv!&0SJC|W1b>a2bfKZ;pKdSTd{lmk; z>ViX$F{O!#iPf>ltl`$5UteQoE)C=@^Vp&fY6xhvdmBH3f7!H z?LF(PT3d%eTcX+IlQ#lI7-N`O939qQSLSivdwp`e%afTMHdV$tqPW~jOU|4`{&{%O;vd(ZWIzOti+-G(*I=klM5?CjN2 zER5>v>iwZxU+&T?luK3-Pe-~bU zDYGi;PTuyNd-opon#6Mcvw^R0=-*hEFr%4grhoqY`F)7i)T0)Cd($@m%wK)=ms@B* z!@BkBIhzr!AdYO6I#mR{Use1WE>9gP2NC6cwc)I$z JtaD0e0su#cn~(qi literal 0 HcmV?d00001 diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/readme.md b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/readme.md new file mode 100644 index 0000000..f24ec4f --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/skins/moono/readme.md @@ -0,0 +1,51 @@ +"Moono" Skin +==================== + +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by +the CKEditor team. "Moono" is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Features +------------------- +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. +It comes with the following features: + +- Chameleon feature with brightness, +- high-contrast compatibility, +- graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **icons/**: contains all skin defined icons, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG source of the skin icons. + +License +------- + +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. diff --git a/src/public/static/smartadmin/js/plugin/ckeditor/styles.js b/src/public/static/smartadmin/js/plugin/ckeditor/styles.js new file mode 100644 index 0000000..b58e0bd --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/ckeditor/styles.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin, which shows a combo +// in the editor toolbar, containing all styles. Other plugins instead, like +// the div plugin, use a subset of the styles on their feature. +// +// If you don't have plugins that depend on this file, you can simply ignore it. +// Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. + +CKEDITOR.stylesSet.add( 'default', [ + /* Block Styles */ + + // These styles are already available in the "Format" combo ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline Styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles combo, removing them from the toolbar. + // (This requires the "stylescombo" plugin) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object Styles */ + + { + name: 'Styled image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } +]); + diff --git a/src/public/static/smartadmin/js/plugin/colorpicker/bootstrap-colorpicker.js b/src/public/static/smartadmin/js/plugin/colorpicker/bootstrap-colorpicker.js new file mode 100644 index 0000000..5cc0076 --- /dev/null +++ b/src/public/static/smartadmin/js/plugin/colorpicker/bootstrap-colorpicker.js @@ -0,0 +1,540 @@ +/* ========================================================= + * bootstrap-colorpicker.js + * http://www.eyecon.ro/bootstrap-colorpicker + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +!function( $ ) { + + // Color object + + var Color = function(val) { + this.value = { + h: 1, + s: 1, + b: 1, + a: 1 + }; + this.setColor(val); + }; + + Color.prototype = { + constructor: Color, + + //parse a string to HSB + setColor: function(val){ + val = val.toLowerCase(); + var that = this; + $.each( CPGlobal.stringParsers, function( i, parser ) { + var match = parser.re.exec( val ), + values = match && parser.parse( match ), + space = parser.space||'rgba'; + if ( values ) { + if (space === 'hsla') { + that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values)); + } else { + that.value = CPGlobal.RGBtoHSB.apply(null, values); + } + return false; + } + }); + }, + + setHue: function(h) { + this.value.h = 1- h; + }, + + setSaturation: function(s) { + this.value.s = s; + }, + + setLightness: function(b) { + this.value.b = 1- b; + }, + + setAlpha: function(a) { + this.value.a = parseInt((1 - a)*100, 10)/100; + }, + + // HSBtoRGB from RaphaelJS + // https://github.com/DmitryBaranovskiy/raphael/ + toRGB: function(h, s, b, a) { + if (!h) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = b * s; + X = C * (1 - Math.abs(h % 2 - 1)); + R = G = B = b - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return { + r: Math.round(R*255), + g: Math.round(G*255), + b: Math.round(B*255), + a: a||this.value.a + }; + }, + + toHex: function(h, s, b, a){ + var rgb = this.toRGB(h, s, b, a); + return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + + toHSL: function(h, s, b, a){ + if (!h) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + } + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: H, + s: S, + l: L, + a: a||this.value.a + }; + } + }; + + // Picker object + + var Colorpicker = function(element, options){ + this.element = $(element); + var format = options.format||this.element.data('color-format')||'hex'; + this.format = CPGlobal.translateFormats[format]; + this.isInput = this.element.is('input'); + this.component = this.element.is('.color') ? this.element.find('.add-on') : false; + + this.picker = $(CPGlobal.template) + .appendTo('body') + .on('mousedown', $.proxy(this.mousedown, this)); + + if (this.isInput) { + this.element.on({ + 'focus': $.proxy(this.show, this), + 'keyup': $.proxy(this.update, this) + }); + } else if (this.component){ + this.component.on({ + 'click': $.proxy(this.show, this) + }); + } else { + this.element.on({ + 'click': $.proxy(this.show, this) + }); + } + if (format === 'rgba' || format === 'hsla') { + this.picker.addClass('alpha'); + this.alpha = this.picker.find('.colorpicker-alpha')[0].style; + } + + if (this.component){ + this.picker.find('.colorpicker-color').hide(); + this.preview = this.element.find('i')[0].style; + } else { + this.preview = this.picker.find('div:last')[0].style; + } + + this.base = this.picker.find('div:first')[0].style; + this.update(); + }; + + Colorpicker.prototype = { + constructor: Colorpicker, + + show: function(e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (!this.isInput) { + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + } + $(document).on({ + 'mousedown': $.proxy(this.hide, this) + }); + this.element.trigger({ + type: 'show', + color: this.color + }); + }, + + update: function(){ + this.color = new Color(this.isInput ? this.element.prop('value') : this.element.data('color')); + this.picker.find('i') + .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() + .eq(1).css('top', 100 * (1 - this.color.value.h)).end() + .eq(2).css('top', 100 * (1 - this.color.value.a)); + this.previewColor(); + }, + + setValue: function(newColor) { + this.color = new Color(newColor); + this.picker.find('i') + .eq(0).css({left: this.color.value.s*100, top: 100 - this.color.value.b*100}).end() + .eq(1).css('top', 100 * (1 - this.color.value.h)).end() + .eq(2).css('top', 100 * (1 - this.color.value.a)); + this.previewColor(); + this.element.trigger({ + type: 'changeColor', + color: this.color + }); + }, + + hide: function(){ + this.picker.hide(); + $(window).off('resize', this.place); + if (!this.isInput) { + $(document).off({ + 'mousedown': this.hide + }); + if (this.component){ + this.element.find('input').prop('value', this.format.call(this)); + } + this.element.data('color', this.format.call(this)); + } else { + this.element.prop('value', this.format.call(this)); + } + this.element.trigger({ + type: 'hide', + color: this.color + }); + }, + + place: function(){ + var offset = this.component ? this.component.offset() : this.element.offset(); + this.picker.css({ + top: offset.top + this.height, + left: offset.left + }); + }, + + //preview color change + previewColor: function(){ + try { + this.preview.backgroundColor = this.format.call(this); + } catch(e) { + this.preview.backgroundColor = this.color.toHex(); + } + //set the color for brightness/saturation slider + this.base.backgroundColor = this.color.toHex(this.color.value.h, 1, 1, 1); + //set te color for alpha slider + if (this.alpha) { + this.alpha.backgroundColor = this.color.toHex(); + } + }, + + pointer: null, + + slider: null, + + mousedown: function(e){ + e.stopPropagation(); + e.preventDefault(); + + var target = $(e.target); + + //detect the slider and set the limits and callbacks + var zone = target.closest('div'); + if (!zone.is('.colorpicker')) { + if (zone.is('.colorpicker-saturation')) { + this.slider = $.extend({}, CPGlobal.sliders.saturation); + } + else if (zone.is('.colorpicker-hue')) { + this.slider = $.extend({}, CPGlobal.sliders.hue); + } + else if (zone.is('.colorpicker-alpha')) { + this.slider = $.extend({}, CPGlobal.sliders.alpha); + } else { + return false; + } + var offset = zone.offset(); + //reference to knob's style + this.slider.knob = zone.find('i')[0].style; + this.slider.left = e.pageX - offset.left; + this.slider.top = e.pageY - offset.top; + this.pointer = { + left: e.pageX, + top: e.pageY + }; + //trigger mousemove to move the knob to the current position + $(document).on({ + mousemove: $.proxy(this.mousemove, this), + mouseup: $.proxy(this.mouseup, this) + }).trigger('mousemove'); + } + return false; + }, + + mousemove: function(e){ + e.stopPropagation(); + e.preventDefault(); + var left = Math.max( + 0, + Math.min( + this.slider.maxLeft, + this.slider.left + ((e.pageX||this.pointer.left) - this.pointer.left) + ) + ); + var top = Math.max( + 0, + Math.min( + this.slider.maxTop, + this.slider.top + ((e.pageY||this.pointer.top) - this.pointer.top) + ) + ); + this.slider.knob.left = left + 'px'; + this.slider.knob.top = top + 'px'; + if (this.slider.callLeft) { + this.color[this.slider.callLeft].call(this.color, left/100); + } + if (this.slider.callTop) { + this.color[this.slider.callTop].call(this.color, top/100); + } + this.previewColor(); + this.element.trigger({ + type: 'changeColor', + color: this.color + }); + return false; + }, + + mouseup: function(e){ + e.stopPropagation(); + e.preventDefault(); + $(document).off({ + mousemove: this.mousemove, + mouseup: this.mouseup + }); + return false; + } + } + + $.fn.colorpicker = function ( option, val ) { + return this.each(function () { + var $this = $(this), + data = $this.data('colorpicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('colorpicker', (data = new Colorpicker(this, $.extend({}, $.fn.colorpicker.defaults,options)))); + } + if (typeof option === 'string') data[option](val); + }); + }; + + $.fn.colorpicker.defaults = { + }; + + $.fn.colorpicker.Constructor = Colorpicker; + + var CPGlobal = { + + // translate a format from Color object to a string + translateFormats: { + 'rgb': function(){ + var rgb = this.color.toRGB(); + return 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')'; + }, + + 'rgba': function(){ + var rgb = this.color.toRGB(); + return 'rgba('+rgb.r+','+rgb.g+','+rgb.b+','+rgb.a+')'; + }, + + 'hsl': function(){ + var hsl = this.color.toHSL(); + return 'hsl('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%)'; + }, + + 'hsla': function(){ + var hsl = this.color.toHSL(); + return 'hsla('+Math.round(hsl.h*360)+','+Math.round(hsl.s*100)+'%,'+Math.round(hsl.l*100)+'%,'+hsl.a+')'; + }, + + 'hex': function(){ + return this.color.toHex(); + } + }, + + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setLightness' + }, + + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + + // HSBtoRGB from RaphaelJS + // https://github.com/DmitryBaranovskiy/raphael/ + RGBtoHSB: function (r, g, b, a){ + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return {h: H||1, s: S, b: V, a: a||1}; + }, + + HueToRGB: function (p, q, h) { + if (h < 0) + h += 1; + else if (h > 1) + h -= 1; + + if ((h * 6) < 1) + return p + (q - p) * h * 6; + else if ((h * 2) < 1) + return q; + else if ((h * 3) < 2) + return p + (q - p) * ((2 / 3) - h) * 6; + else + return p; + }, + + HSLtoRGB: function (h, s, l, a) + { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(CPGlobal.HueToRGB(p, q, tr) * 255); + var g = Math.round(CPGlobal.HueToRGB(p, q, tg) * 255); + var b = Math.round(CPGlobal.HueToRGB(p, q, tb) * 255); + return [r, g, b, a||1]; + }, + + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [ + { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ], + execResult[ 3 ], + execResult[ 4 ] + ]; + } + }, { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[ 4 ] + ]; + } + }, { + re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ], 16 ) + ]; + } + }, { + re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) + ]; + } + }, { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + space: 'hsla', + parse: function( execResult ) { + return [ + execResult[1]/360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + } + ], + template: '')[0]; + oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); + + /* + * All DataTables are wrapped in a div + */ + oSettings.nTableWrapper = $('
')[0]; + oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; + + /* Track where we want to insert the option */ + var nInsertNode = oSettings.nTableWrapper; + + /* Loop over the user set positioning and place the elements as needed */ + var aDom = oSettings.sDom.split(''); + var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j; + for ( var i=0 ; i
')[0]; + + /* Check to see if we should append an id and/or a class name to the container */ + cNext = aDom[i+1]; + if ( cNext == "'" || cNext == '"' ) + { + sAttr = ""; + j = 2; + while ( aDom[i+j] != cNext ) + { + sAttr += aDom[i+j]; + j++; + } + + /* Replace jQuery UI constants */ + if ( sAttr == "H" ) + { + sAttr = oSettings.oClasses.sJUIHeader; + } + else if ( sAttr == "F" ) + { + sAttr = oSettings.oClasses.sJUIFooter; + } + + /* The attribute can be in the format of "#id.class", "#id" or "class" This logic + * breaks the string into parts and applies them as needed + */ + if ( sAttr.indexOf('.') != -1 ) + { + var aSplit = sAttr.split('.'); + nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); + nNewNode.className = aSplit[1]; + } + else if ( sAttr.charAt(0) == "#" ) + { + nNewNode.id = sAttr.substr(1, sAttr.length-1); + } + else + { + nNewNode.className = sAttr; + } + + i += j; /* Move along the position array */ + } + + nInsertNode.appendChild( nNewNode ); + nInsertNode = nNewNode; + } + else if ( cOption == '>' ) + { + /* End container div */ + nInsertNode = nInsertNode.parentNode; + } + else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange ) + { + /* Length */ + nTmp = _fnFeatureHtmlLength( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'f' && oSettings.oFeatures.bFilter ) + { + /* Filter */ + nTmp = _fnFeatureHtmlFilter( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'r' && oSettings.oFeatures.bProcessing ) + { + /* pRocessing */ + nTmp = _fnFeatureHtmlProcessing( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 't' ) + { + /* Table */ + nTmp = _fnFeatureHtmlTable( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'i' && oSettings.oFeatures.bInfo ) + { + /* Info */ + nTmp = _fnFeatureHtmlInfo( oSettings ); + iPushFeature = 1; + } + else if ( cOption == 'p' && oSettings.oFeatures.bPaginate ) + { + /* Pagination */ + nTmp = _fnFeatureHtmlPaginate( oSettings ); + iPushFeature = 1; + } + else if ( DataTable.ext.aoFeatures.length !== 0 ) + { + /* Plug-in features */ + var aoFeatures = DataTable.ext.aoFeatures; + for ( var k=0, kLen=aoFeatures.length ; k') : + sSearchStr==="" ? '' : sSearchStr+' '; + + var nFilter = document.createElement( 'div' ); + nFilter.className = oSettings.oClasses.sFilter; + nFilter.innerHTML = '
'+sSearchStr+'
'; + if ( !oSettings.aanFeatures.f ) + { + nFilter.id = oSettings.sTableId+'_filter'; + } + + var jqFilter = $('input[type="text"]', nFilter); + + // Store a reference to the input element, so other input elements could be + // added to the filter wrapper if needed (submit button for example) + nFilter._DT_Input = jqFilter[0]; + + jqFilter.val( oPreviousSearch.sSearch.replace('"','"') ); + jqFilter.bind( 'keyup.DT', function(e) { + /* Update all other filter input elements for the new display */ + var n = oSettings.aanFeatures.f; + var val = this.value==="" ? "" : this.value; // mental IE8 fix :-( + + for ( var i=0, iLen=n.length ; i=0 ; i-- ) + { + var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ), + oSettings.aoColumns[iColumn].sType ); + if ( ! rpSearch.test( sData ) ) + { + oSettings.aiDisplay.splice( i, 1 ); + iIndexCorrector++; + } + } + } + + + /** + * Filter the data table based on user input and draw the table + * @param {object} oSettings dataTables settings object + * @param {string} sInput string to filter on + * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0) + * @param {bool} bRegex treat as a regular expression or not + * @param {bool} bSmart perform smart filtering or not + * @param {bool} bCaseInsensitive Do case insenstive matching or not + * @memberof DataTable#oApi + */ + function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive ) + { + var i; + var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); + var oPrevSearch = oSettings.oPreviousSearch; + + /* Check if we are forcing or not - optional parameter */ + if ( !iForce ) + { + iForce = 0; + } + + /* Need to take account of custom filtering functions - always filter */ + if ( DataTable.ext.afnFiltering.length !== 0 ) + { + iForce = 1; + } + + /* + * If the input is blank - we want the full data set + */ + if ( sInput.length <= 0 ) + { + oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); + oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); + } + else + { + /* + * We are starting a new search or the new search string is smaller + * then the old one (i.e. delete). Search from the master array + */ + if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || + oPrevSearch.sSearch.length > sInput.length || iForce == 1 || + sInput.indexOf(oPrevSearch.sSearch) !== 0 ) + { + /* Nuke the old display array - we are going to rebuild it */ + oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); + + /* Force a rebuild of the search array */ + _fnBuildSearchArray( oSettings, 1 ); + + /* Search through all records to populate the search array + * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 + * mapping + */ + for ( i=0 ; i').html(sSearch).text(); + } + + // Strip newline characters + return sSearch.replace( /[\n\r]/g, " " ); + } + + /** + * Build a regular expression object suitable for searching a table + * @param {string} sSearch string to search for + * @param {bool} bRegex treat as a regular expression or not + * @param {bool} bSmart perform smart filtering or not + * @param {bool} bCaseInsensitive Do case insensitive matching or not + * @returns {RegExp} constructed object + * @memberof DataTable#oApi + */ + function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive ) + { + var asSearch, sRegExpString; + + if ( bSmart ) + { + /* Generate the regular expression to use. Something along the lines of: + * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ + */ + asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' ); + sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$'; + return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" ); + } + else + { + sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch ); + return new RegExp( sSearch, bCaseInsensitive ? "i" : "" ); + } + } + + + /** + * Convert raw data into something that the user can search on + * @param {string} sData data to be modified + * @param {string} sType data type + * @returns {string} search string + * @memberof DataTable#oApi + */ + function _fnDataToSearch ( sData, sType ) + { + if ( typeof DataTable.ext.ofnSearch[sType] === "function" ) + { + return DataTable.ext.ofnSearch[sType]( sData ); + } + else if ( sData === null ) + { + return ''; + } + else if ( sType == "html" ) + { + return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" ); + } + else if ( typeof sData === "string" ) + { + return sData.replace(/[\r\n]/g," "); + } + return sData; + } + + + /** + * scape a string such that it can be used in a regular expression + * @param {string} sVal string to escape + * @returns {string} escaped string + * @memberof DataTable#oApi + */ + function _fnEscapeRegex ( sVal ) + { + var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ]; + var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' ); + return sVal.replace(reReplace, '\\$1'); + } + + + /** + * Generate the node required for the info display + * @param {object} oSettings dataTables settings object + * @returns {node} Information element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlInfo ( oSettings ) + { + var nInfo = document.createElement( 'div' ); + nInfo.className = oSettings.oClasses.sInfo; + + /* Actions that are to be taken once only for this feature */ + if ( !oSettings.aanFeatures.i ) + { + /* Add draw callback */ + oSettings.aoDrawCallback.push( { + "fn": _fnUpdateInfo, + "sName": "information" + } ); + + /* Add id */ + nInfo.id = oSettings.sTableId+'_info'; + } + oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' ); + + return nInfo; + } + + + /** + * Update the information elements in the display + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnUpdateInfo ( oSettings ) + { + /* Show information about the table */ + if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 ) + { + return; + } + + var + oLang = oSettings.oLanguage, + iStart = oSettings._iDisplayStart+1, + iEnd = oSettings.fnDisplayEnd(), + iMax = oSettings.fnRecordsTotal(), + iTotal = oSettings.fnRecordsDisplay(), + sOut; + + if ( iTotal === 0 ) + { + /* Empty record set */ + sOut = oLang.sInfoEmpty; + } + else { + /* Normal record set */ + sOut = oLang.sInfo; + } + + if ( iTotal != iMax ) + { + /* Record set after filtering */ + sOut += ' ' + oLang.sInfoFiltered; + } + + // Convert the macros + sOut += oLang.sInfoPostFix; + sOut = _fnInfoMacros( oSettings, sOut ); + + if ( oLang.fnInfoCallback !== null ) + { + sOut = oLang.fnInfoCallback.call( oSettings.oInstance, + oSettings, iStart, iEnd, iMax, iTotal, sOut ); + } + + var n = oSettings.aanFeatures.i; + for ( var i=0, iLen=n.length ; i'; + var i, iLen; + var aLengthMenu = oSettings.aLengthMenu; + + if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && + typeof aLengthMenu[1] === 'object' ) + { + for ( i=0, iLen=aLengthMenu[0].length ; i'+aLengthMenu[1][i]+''; + } + } + else + { + for ( i=0, iLen=aLengthMenu.length ; i'+aLengthMenu[i]+''; + } + } + sStdMenu += ''; + + var nLength = document.createElement( 'div' ); + if ( !oSettings.aanFeatures.l ) + { + nLength.id = oSettings.sTableId+'_length'; + } + nLength.className = oSettings.oClasses.sLength; + nLength.innerHTML = ''; + + /* + * Set the length to the current display length - thanks to Andrea Pavlovic for this fix, + * and Stefan Skopnik for fixing the fix! + */ + $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true); + + $('select', nLength).bind( 'change.DT', function(e) { + var iVal = $(this).val(); + + /* Update all other length options for the new display */ + var n = oSettings.aanFeatures.l; + for ( i=0, iLen=n.length ; i oSettings.aiDisplay.length || + oSettings._iDisplayLength == -1 ) + { + oSettings._iDisplayEnd = oSettings.aiDisplay.length; + } + else + { + oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; + } + } + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Note that most of the paging logic is done in + * DataTable.ext.oPagination + */ + + /** + * Generate the node required for default pagination + * @param {object} oSettings dataTables settings object + * @returns {node} Pagination feature node + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlPaginate ( oSettings ) + { + if ( oSettings.oScroll.bInfinite ) + { + return null; + } + + var nPaginate = document.createElement( 'div' ); + nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType; + + DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, + function( oSettings ) { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + ); + + /* Add a draw callback for the pagination on first instance, to update the paging display */ + if ( !oSettings.aanFeatures.p ) + { + oSettings.aoDrawCallback.push( { + "fn": function( oSettings ) { + DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } ); + }, + "sName": "pagination" + } ); + } + return nPaginate; + } + + + /** + * Alter the display settings to change the page + * @param {object} oSettings dataTables settings object + * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" + * or page number to jump to (integer) + * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1 + * @memberof DataTable#oApi + */ + function _fnPageChange ( oSettings, mAction ) + { + var iOldStart = oSettings._iDisplayStart; + + if ( typeof mAction === "number" ) + { + oSettings._iDisplayStart = mAction * oSettings._iDisplayLength; + if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "first" ) + { + oSettings._iDisplayStart = 0; + } + else if ( mAction == "previous" ) + { + oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? + oSettings._iDisplayStart - oSettings._iDisplayLength : + 0; + + /* Correct for under-run */ + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "next" ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + /* Make sure we are not over running the display array */ + if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart += oSettings._iDisplayLength; + } + } + else + { + oSettings._iDisplayStart = 0; + } + } + else if ( mAction == "last" ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1; + oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength; + } + else + { + oSettings._iDisplayStart = 0; + } + } + else + { + _fnLog( oSettings, 0, "Unknown paging action: "+mAction ); + } + $(oSettings.oInstance).trigger('page', oSettings); + + return iOldStart != oSettings._iDisplayStart; + } + + + + /** + * Generate the node required for the processing node + * @param {object} oSettings dataTables settings object + * @returns {node} Processing element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlProcessing ( oSettings ) + { + var nProcessing = document.createElement( 'div' ); + + if ( !oSettings.aanFeatures.r ) + { + nProcessing.id = oSettings.sTableId+'_processing'; + } + nProcessing.innerHTML = oSettings.oLanguage.sProcessing; + nProcessing.className = oSettings.oClasses.sProcessing; + oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable ); + + return nProcessing; + } + + + /** + * Display or hide the processing indicator + * @param {object} oSettings dataTables settings object + * @param {bool} bShow Show the processing indicator (true) or not (false) + * @memberof DataTable#oApi + */ + function _fnProcessingDisplay ( oSettings, bShow ) + { + if ( oSettings.oFeatures.bProcessing ) + { + var an = oSettings.aanFeatures.r; + for ( var i=0, iLen=an.length ; i 0 ) + { + nCaption = nCaption[0]; + if ( nCaption._captionSide === "top" ) + { + nScrollHeadTable.appendChild( nCaption ); + } + else if ( nCaption._captionSide === "bottom" && nTfoot ) + { + nScrollFootTable.appendChild( nCaption ); + } + } + + /* + * Sizing + */ + /* When x-scrolling add the width and a scroller to move the header with the body */ + if ( oSettings.oScroll.sX !== "" ) + { + nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX ); + nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX ); + + if ( nTfoot !== null ) + { + nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX ); + } + + /* When the body is scrolled, then we also want to scroll the headers */ + $(nScrollBody).scroll( function (e) { + nScrollHead.scrollLeft = this.scrollLeft; + + if ( nTfoot !== null ) + { + nScrollFoot.scrollLeft = this.scrollLeft; + } + } ); + } + + /* When yscrolling, add the height */ + if ( oSettings.oScroll.sY !== "" ) + { + nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY ); + } + + /* Redraw - align columns across the tables */ + oSettings.aoDrawCallback.push( { + "fn": _fnScrollDraw, + "sName": "scrolling" + } ); + + /* Infinite scrolling event handlers */ + if ( oSettings.oScroll.bInfinite ) + { + $(nScrollBody).scroll( function() { + /* Use a blocker to stop scrolling from loading more data while other data is still loading */ + if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 ) + { + /* Check if we should load the next data set */ + if ( $(this).scrollTop() + $(this).height() > + $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) + { + /* Only do the redraw if we have to - we might be at the end of the data */ + if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() ) + { + _fnPageChange( oSettings, 'next' ); + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + } + } + } ); + } + + oSettings.nScrollHead = nScrollHead; + oSettings.nScrollFoot = nScrollFoot; + + return nScroller; + } + + + /** + * Update the various tables for resizing. It's a bit of a pig this function, but + * basically the idea to: + * 1. Re-create the table inside the scrolling div + * 2. Take live measurements from the DOM + * 3. Apply the measurements + * 4. Clean up + * @param {object} o dataTables settings object + * @returns {node} Node to add to the DOM + * @memberof DataTable#oApi + */ + function _fnScrollDraw ( o ) + { + var + nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0], + nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], + nScrollBody = o.nTable.parentNode, + i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis, + nTheadSize, nTfootSize, + iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth, + nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null, + nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null, + ie67 = o.oBrowser.bScrollOversize, + zeroOut = function(nSizer) { + oStyle = nSizer.style; + oStyle.paddingTop = "0"; + oStyle.paddingBottom = "0"; + oStyle.borderTopWidth = "0"; + oStyle.borderBottomWidth = "0"; + oStyle.height = 0; + }; + + /* + * 1. Re-create the table inside the scrolling div + */ + + /* Remove the old minimised thead and tfoot elements in the inner table */ + $(o.nTable).children('thead, tfoot').remove(); + + /* Clone the current header and footer elements and then place it into the inner table */ + nTheadSize = $(o.nTHead).clone()[0]; + o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] ); + anHeadToSize = o.nTHead.getElementsByTagName('tr'); + anHeadSizers = nTheadSize.getElementsByTagName('tr'); + + if ( o.nTFoot !== null ) + { + nTfootSize = $(o.nTFoot).clone()[0]; + o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] ); + anFootToSize = o.nTFoot.getElementsByTagName('tr'); + anFootSizers = nTfootSize.getElementsByTagName('tr'); + } + + /* + * 2. Take live measurements from the DOM - do not alter the DOM itself! + */ + + /* Remove old sizing and apply the calculated column widths + * Get the unique column headers in the newly created (cloned) header. We want to apply the + * calculated sizes to this header + */ + if ( o.oScroll.sX === "" ) + { + nScrollBody.style.width = '100%'; + nScrollHeadInner.parentNode.style.width = '100%'; + } + + var nThs = _fnGetUniqueThs( o, nTheadSize ); + for ( i=0, iLen=nThs.length ; i nScrollBody.offsetHeight || + $(nScrollBody).css('overflow-y') == "scroll") ) + { + o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); + } + } + else + { + if ( o.oScroll.sXInner !== "" ) + { + /* x scroll inner has been given - use it */ + o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner); + } + else if ( iSanityWidth == $(nScrollBody).width() && + $(nScrollBody).height() < $(o.nTable).height() ) + { + /* There is y-scrolling - try to take account of the y scroll bar */ + o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth ); + if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth ) + { + /* Not possible to take account of it */ + o.nTable.style.width = _fnStringToCss( iSanityWidth ); + } + } + else + { + /* All else fails */ + o.nTable.style.width = _fnStringToCss( iSanityWidth ); + } + } + + /* Recalculate the sanity width - now that we've applied the required width, before it was + * a temporary variable. This is required because the column width calculation is done + * before this table DOM is created. + */ + iSanityWidth = $(o.nTable).outerWidth(); + + /* We want the hidden header to have zero height, so remove padding and borders. Then + * set the width based on the real headers + */ + + // Apply all styles in one pass. Invalidates layout only once because we don't read any + // DOM properties. + _fnApplyToChildren( zeroOut, anHeadSizers ); + + // Read all widths in next pass. Forces layout only once because we do not change + // any DOM properties. + _fnApplyToChildren( function(nSizer) { + aApplied.push( _fnStringToCss( $(nSizer).width() ) ); + }, anHeadSizers ); + + // Apply all widths in final pass. Invalidates layout only once because we do not + // read any DOM properties. + _fnApplyToChildren( function(nToSize, i) { + nToSize.style.width = aApplied[i]; + }, anHeadToSize ); + + $(anHeadSizers).height(0); + + /* Same again with the footer if we have one */ + if ( o.nTFoot !== null ) + { + _fnApplyToChildren( zeroOut, anFootSizers ); + + _fnApplyToChildren( function(nSizer) { + aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) ); + }, anFootSizers ); + + _fnApplyToChildren( function(nToSize, i) { + nToSize.style.width = aAppliedFooter[i]; + }, anFootToSize ); + + $(anFootSizers).height(0); + } + + /* + * 3. Apply the measurements + */ + + /* "Hide" the header and footer that we used for the sizing. We want to also fix their width + * to what they currently are + */ + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = ""; + nSizer.style.width = aApplied[i]; + }, anHeadSizers ); + + if ( o.nTFoot !== null ) + { + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = ""; + nSizer.style.width = aAppliedFooter[i]; + }, anFootSizers ); + } + + /* Sanity check that the table is of a sensible width. If not then we are going to get + * misalignment - try to prevent this by not allowing the table to shrink below its min width + */ + if ( $(o.nTable).outerWidth() < iSanityWidth ) + { + /* The min width depends upon if we have a vertical scrollbar visible or not */ + var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || + $(nScrollBody).css('overflow-y') == "scroll")) ? + iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; + + /* IE6/7 are a law unto themselves... */ + if ( ie67 && (nScrollBody.scrollHeight > + nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) + { + o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); + } + + /* Apply the calculated minimum width to the table wrappers */ + nScrollBody.style.width = _fnStringToCss( iCorrection ); + o.nScrollHead.style.width = _fnStringToCss( iCorrection ); + + if ( o.nTFoot !== null ) + { + o.nScrollFoot.style.width = _fnStringToCss( iCorrection ); + } + + /* And give the user a warning that we've stopped the table getting too small */ + if ( o.oScroll.sX === "" ) + { + _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ + " misalignment. The table has been drawn at its minimum possible width." ); + } + else if ( o.oScroll.sXInner !== "" ) + { + _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ + " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+ + " calculation" ); + } + } + else + { + nScrollBody.style.width = _fnStringToCss( '100%' ); + o.nScrollHead.style.width = _fnStringToCss( '100%' ); + + if ( o.nTFoot !== null ) + { + o.nScrollFoot.style.width = _fnStringToCss( '100%' ); + } + } + + + /* + * 4. Clean up + */ + if ( o.oScroll.sY === "" ) + { + /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting + * the scrollbar height from the visible display, rather than adding it on. We need to + * set the height in order to sort this. Don't want to do it in any other browsers. + */ + if ( ie67 ) + { + nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth ); + } + } + + if ( o.oScroll.sY !== "" && o.oScroll.bCollapse ) + { + nScrollBody.style.height = _fnStringToCss( o.oScroll.sY ); + + var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ? + o.oScroll.iBarWidth : 0; + if ( o.nTable.offsetHeight < nScrollBody.offsetHeight ) + { + nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra ); + } + } + + /* Finally set the width's of the header and footer tables */ + var iOuterWidth = $(o.nTable).outerWidth(); + nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth ); + nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth ); + + // Figure out if there are scrollbar present - if so then we need a the header and footer to + // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) + var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll"; + nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; + + if ( o.nTFoot !== null ) + { + nScrollFootTable.style.width = _fnStringToCss( iOuterWidth ); + nScrollFootInner.style.width = _fnStringToCss( iOuterWidth ); + nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; + } + + /* Adjust the position of the header in case we loose the y-scrollbar */ + $(nScrollBody).scroll(); + + /* If sorting or filtering has occurred, jump the scrolling back to the top */ + if ( o.bSorted || o.bFiltered ) + { + nScrollBody.scrollTop = 0; + } + } + + + /** + * Apply a given function to the display child nodes of an element array (typically + * TD children of TR rows + * @param {function} fn Method to apply to the objects + * @param array {nodes} an1 List of elements to look through for display children + * @param array {nodes} an2 Another list (identical structure to the first) - optional + * @memberof DataTable#oApi + */ + function _fnApplyToChildren( fn, an1, an2 ) + { + var index=0, i=0, iLen=an1.length; + var nNode1, nNode2; + + while ( i < iLen ) + { + nNode1 = an1[i].firstChild; + nNode2 = an2 ? an2[i].firstChild : null; + while ( nNode1 ) + { + if ( nNode1.nodeType === 1 ) + { + if ( an2 ) + { + fn( nNode1, nNode2, index ); + } + else + { + fn( nNode1, index ); + } + index++; + } + nNode1 = nNode1.nextSibling; + nNode2 = an2 ? nNode2.nextSibling : null; + } + i++; + } + } + + /** + * Convert a CSS unit width to pixels (e.g. 2em) + * @param {string} sWidth width to be converted + * @param {node} nParent parent to get the with for (required for relative widths) - optional + * @returns {int} iWidth width in pixels + * @memberof DataTable#oApi + */ + function _fnConvertToWidth ( sWidth, nParent ) + { + if ( !sWidth || sWidth === null || sWidth === '' ) + { + return 0; + } + + if ( !nParent ) + { + nParent = document.body; + } + + var iWidth; + var nTmp = document.createElement( "div" ); + nTmp.style.width = _fnStringToCss( sWidth ); + + nParent.appendChild( nTmp ); + iWidth = nTmp.offsetWidth; + nParent.removeChild( nTmp ); + + return ( iWidth ); + } + + + /** + * Calculate the width of columns for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnCalculateColumnWidths ( oSettings ) + { + var iTableWidth = oSettings.nTable.offsetWidth; + var iUserInputs = 0; + var iTmpWidth; + var iVisibleColumns = 0; + var iColums = oSettings.aoColumns.length; + var i, iIndex, iCorrector, iWidth; + var oHeaders = $('th', oSettings.nTHead); + var widthAttr = oSettings.nTable.getAttribute('width'); + var nWrapper = oSettings.nTable.parentNode; + + /* Convert any user input sizes into pixel sizes */ + for ( i=0 ; itd', nCalcTmp); + } + + /* Apply custom sizing to the cloned header */ + var nThs = _fnGetUniqueThs( oSettings, nTheadClone ); + iCorrector = 0; + for ( i=0 ; i 0 ) + { + oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth ); + } + iCorrector++; + } + } + + var cssWidth = $(nCalcTmp).css('width'); + oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ? + cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() ); + nCalcTmp.parentNode.removeChild( nCalcTmp ); + } + + if ( widthAttr ) + { + oSettings.nTable.style.width = _fnStringToCss( widthAttr ); + } + } + + + /** + * Adjust a table's width to take account of scrolling + * @param {object} oSettings dataTables settings object + * @param {node} n table node + * @memberof DataTable#oApi + */ + function _fnScrollingWidthAdjust ( oSettings, n ) + { + if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" ) + { + /* When y-scrolling only, we want to remove the width of the scroll bar so the table + * + scroll bar will fit into the area avaialble. + */ + var iOrigWidth = $(n).width(); + n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth ); + } + else if ( oSettings.oScroll.sX !== "" ) + { + /* When x-scrolling both ways, fix the table at it's current size, without adjusting */ + n.style.width = _fnStringToCss( $(n).outerWidth() ); + } + } + + + /** + * Get the widest node + * @param {object} oSettings dataTables settings object + * @param {int} iCol column of interest + * @returns {node} widest table node + * @memberof DataTable#oApi + */ + function _fnGetWidestNode( oSettings, iCol ) + { + var iMaxIndex = _fnGetMaxLenString( oSettings, iCol ); + if ( iMaxIndex < 0 ) + { + return null; + } + + if ( oSettings.aoData[iMaxIndex].nTr === null ) + { + var n = document.createElement('td'); + n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' ); + return n; + } + return _fnGetTdNodes(oSettings, iMaxIndex)[iCol]; + } + + + /** + * Get the maximum strlen for each data column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column of interest + * @returns {string} max string length for each column + * @memberof DataTable#oApi + */ + function _fnGetMaxLenString( oSettings, iCol ) + { + var iMax = -1; + var iMaxIndex = -1; + + for ( var i=0 ; i/g, "" ); + if ( s.length > iMax ) + { + iMax = s.length; + iMaxIndex = i; + } + } + + return iMaxIndex; + } + + + /** + * Append a CSS unit (only if required) to a string + * @param {array} aArray1 first array + * @param {array} aArray2 second array + * @returns {int} 0 if match, 1 if length is different, 2 if no match + * @memberof DataTable#oApi + */ + function _fnStringToCss( s ) + { + if ( s === null ) + { + return "0px"; + } + + if ( typeof s == 'number' ) + { + if ( s < 0 ) + { + return "0px"; + } + return s+"px"; + } + + /* Check if the last character is not 0-9 */ + var c = s.charCodeAt( s.length-1 ); + if (c < 0x30 || c > 0x39) + { + return s; + } + return s+"px"; + } + + + /** + * Get the width of a scroll bar in this browser being used + * @returns {int} width in pixels + * @memberof DataTable#oApi + */ + function _fnScrollBarWidth () + { + var inner = document.createElement('p'); + var style = inner.style; + style.width = "100%"; + style.height = "200px"; + style.padding = "0px"; + + var outer = document.createElement('div'); + style = outer.style; + style.position = "absolute"; + style.top = "0px"; + style.left = "0px"; + style.visibility = "hidden"; + style.width = "200px"; + style.height = "150px"; + style.padding = "0px"; + style.overflow = "hidden"; + outer.appendChild(inner); + + document.body.appendChild(outer); + var w1 = inner.offsetWidth; + outer.style.overflow = 'scroll'; + var w2 = inner.offsetWidth; + if ( w1 == w2 ) + { + w2 = outer.clientWidth; + } + + document.body.removeChild(outer); + return (w1 - w2); + } + + /** + * Change the order of the table + * @param {object} oSettings dataTables settings object + * @param {bool} bApplyClasses optional - should we apply classes or not + * @memberof DataTable#oApi + */ + function _fnSort ( oSettings, bApplyClasses ) + { + var + i, iLen, j, jLen, k, kLen, + sDataType, nTh, + aaSort = [], + aiOrig = [], + oSort = DataTable.ext.oSort, + aoData = oSettings.aoData, + aoColumns = oSettings.aoColumns, + oAria = oSettings.oLanguage.oAria; + + /* No sorting required if server-side or no sorting array */ + if ( !oSettings.oFeatures.bServerSide && + (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) + { + aaSort = ( oSettings.aaSortingFixed !== null ) ? + oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : + oSettings.aaSorting.slice(); + + /* If there is a sorting data type, and a function belonging to it, then we need to + * get the data from the developer's function and apply it for this column + */ + for ( i=0 ; i/g, "" ); + nTh = aoColumns[i].nTh; + nTh.removeAttribute('aria-sort'); + nTh.removeAttribute('aria-label'); + + /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ + if ( aoColumns[i].bSortable ) + { + if ( aaSort.length > 0 && aaSort[0][0] == i ) + { + nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); + + var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? + aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; + nTh.setAttribute('aria-label', sTitle+ + (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); + } + else + { + nTh.setAttribute('aria-label', sTitle+ + (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); + } + } + else + { + nTh.setAttribute('aria-label', sTitle); + } + } + + /* Tell the draw function that we have sorted the data */ + oSettings.bSorted = true; + $(oSettings.oInstance).trigger('sort', oSettings); + + /* Copy the master data into the draw array and re-draw */ + if ( oSettings.oFeatures.bFilter ) + { + /* _fnFilter() will redraw the table for us */ + _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); + } + else + { + oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); + oSettings._iDisplayStart = 0; /* reset display back to page 0 */ + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + } + + + /** + * Attach a sort handler (click) to a node + * @param {object} oSettings dataTables settings object + * @param {node} nNode node to attach the handler to + * @param {int} iDataIndex column sorting index + * @param {function} [fnCallback] callback function + * @memberof DataTable#oApi + */ + function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback ) + { + _fnBindAction( nNode, {}, function (e) { + /* If the column is not sortable - don't to anything */ + if ( oSettings.aoColumns[iDataIndex].bSortable === false ) + { + return; + } + + /* + * This is a little bit odd I admit... I declare a temporary function inside the scope of + * _fnBuildHead and the click handler in order that the code presented here can be used + * twice - once for when bProcessing is enabled, and another time for when it is + * disabled, as we need to perform slightly different actions. + * Basically the issue here is that the Javascript engine in modern browsers don't + * appear to allow the rendering engine to update the display while it is still executing + * it's thread (well - it does but only after long intervals). This means that the + * 'processing' display doesn't appear for a table sort. To break the js thread up a bit + * I force an execution break by using setTimeout - but this breaks the expected + * thread continuation for the end-developer's point of view (their code would execute + * too early), so we only do it when we absolutely have to. + */ + var fnInnerSorting = function () { + var iColumn, iNextSort; + + /* If the shift key is pressed then we are multiple column sorting */ + if ( e.shiftKey ) + { + /* Are we already doing some kind of sort on this column? */ + var bFound = false; + for ( var i=0 ; i 0 && sCurrentClass.indexOf(sNewClass) == -1 ) + { + /* We need to add a class */ + nTds[i].className = sCurrentClass + " " + sNewClass; + } + } + } + } + + + + /** + * Save the state of a table in a cookie such that the page can be reloaded + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnSaveState ( oSettings ) + { + if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying ) + { + return; + } + + /* Store the interesting variables */ + var i, iLen, bInfinite=oSettings.oScroll.bInfinite; + var oState = { + "iCreate": new Date().getTime(), + "iStart": (bInfinite ? 0 : oSettings._iDisplayStart), + "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd), + "iLength": oSettings._iDisplayLength, + "aaSorting": $.extend( true, [], oSettings.aaSorting ), + "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ), + "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ), + "abVisCols": [] + }; + + for ( i=0, iLen=oSettings.aoColumns.length ; i 4096 ) /* Magic 10 for padding */ + { + for ( var i=0, iLen=aCookies.length ; i 4096 ) { + if ( aOldCookies.length === 0 ) { + // Deleted all DT cookies and still not enough space. Can't state save + return; + } + + var old = aOldCookies.pop(); + document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+ + aParts.join('/') + "/"; + } + } + + document.cookie = sFullCookie; + } + + + /** + * Read an old cookie to get a cookie with an old table state + * @param {string} sName name of the cookie to read + * @returns {string} contents of the cookie - or null if no cookie with that name found + * @memberof DataTable#oApi + */ + function _fnReadCookie ( sName ) + { + var + aParts = window.location.pathname.split('/'), + sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=', + sCookieContents = document.cookie.split(';'); + + for( var i=0 ; i=0 ; i-- ) + { + aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) ); + } + + if ( sTrigger !== null ) + { + $(oSettings.oInstance).trigger(sTrigger, aArgs); + } + + return aRet; + } + + + /** + * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other + * library, then we use that as it is fast, safe and accurate. If the function isn't + * available then we need to built it ourselves - the inspiration for this function comes + * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is + * not perfect and absolutely should not be used as a replacement to json2.js - but it does + * do what we need, without requiring a dependency for DataTables. + * @param {object} o JSON object to be converted + * @returns {string} JSON string + * @memberof DataTable#oApi + */ + var _fnJsonString = (window.JSON) ? JSON.stringify : function( o ) + { + /* Not an object or array */ + var sType = typeof o; + if (sType !== "object" || o === null) + { + // simple data type + if (sType === "string") + { + o = '"'+o+'"'; + } + return o+""; + } + + /* If object or array, need to recurse over it */ + var + sProp, mValue, + json = [], + bArr = $.isArray(o); + + for (sProp in o) + { + mValue = o[sProp]; + sType = typeof mValue; + + if (sType === "string") + { + mValue = '"'+mValue+'"'; + } + else if (sType === "object" && mValue !== null) + { + mValue = _fnJsonString(mValue); + } + + json.push((bArr ? "" : '"'+sProp+'":') + mValue); + } + + return (bArr ? "[" : "{") + json + (bArr ? "]" : "}"); + }; + + + /** + * From some browsers (specifically IE6/7) we need special handling to work around browser + * bugs - this function is used to detect when these workarounds are needed. + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnBrowserDetect( oSettings ) + { + /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the + * width of the scrollbar, while other browsers ensure the inner element is contained + * without forcing scrolling + */ + var n = $( + '
'+ + '
'+ + '
'+ + '
'+ + '
')[0]; + + document.body.appendChild( n ); + oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false; + document.body.removeChild( n ); + } + + + /** + * Perform a jQuery selector action on the table's TR elements (from the tbody) and + * return the resulting jQuery object. + * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on + * @param {object} [oOpts] Optional parameters for modifying the rows to be included + * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter + * criterion ("applied") or all TR elements (i.e. no filter). + * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. + * Can be either 'current', whereby the current sorting of the table is used, or + * 'original' whereby the original order the data was read into the table is used. + * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page + * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * 'current' and filter is 'applied', regardless of what they might be given as. + * @returns {object} jQuery object, filtered by the given selector. + * @dtopt API + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Highlight every second row + * oTable.$('tr:odd').css('backgroundColor', 'blue'); + * } ); + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Filter to rows with 'Webkit' in them, add a background colour and then + * // remove the filter, thus highlighting the 'Webkit' rows only. + * oTable.fnFilter('Webkit'); + * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue'); + * oTable.fnFilter(''); + * } ); + */ + this.$ = function ( sSelector, oOpts ) + { + var i, iLen, a = [], tr; + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + var aoData = oSettings.aoData; + var aiDisplay = oSettings.aiDisplay; + var aiDisplayMaster = oSettings.aiDisplayMaster; + + if ( !oOpts ) + { + oOpts = {}; + } + + oOpts = $.extend( {}, { + "filter": "none", // applied + "order": "current", // "original" + "page": "all" // current + }, oOpts ); + + // Current page implies that order=current and fitler=applied, since it is fairly + // senseless otherwise + if ( oOpts.page == 'current' ) + { + for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i + *
  • 1D array of data - add a single row with the data provided
  • + *
  • 2D array of arrays - add multiple rows in a single call
  • + *
  • object - data object when using mData
  • + *
  • array of objects - multiple data objects when using mData
  • + * + * @param {bool} [bRedraw=true] redraw the table or not + * @returns {array} An array of integers, representing the list of indexes in + * aoData ({@link DataTable.models.oSettings}) that have been added to + * the table. + * @dtopt API + * + * @example + * // Global var for counter + * var giCount = 2; + * + * $(document).ready(function() { + * $('#example').dataTable(); + * } ); + * + * function fnClickAddRow() { + * $('#example').dataTable().fnAddData( [ + * giCount+".1", + * giCount+".2", + * giCount+".3", + * giCount+".4" ] + * ); + * + * giCount++; + * } + */ + this.fnAddData = function( mData, bRedraw ) + { + if ( mData.length === 0 ) + { + return []; + } + + var aiReturn = []; + var iTest; + + /* Find settings from table node */ + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + + /* Check if we want to add multiple rows or not */ + if ( typeof mData[0] === "object" && mData[0] !== null ) + { + for ( var i=0 ; i= oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart -= oSettings._iDisplayLength; + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + } + + if ( bRedraw === undefined || bRedraw ) + { + _fnCalculateEnd( oSettings ); + _fnDraw( oSettings ); + } + + return oData; + }; + + + /** + * Restore the table to it's original state in the DOM by removing all of DataTables + * enhancements, alterations to the DOM structure of the table and event listeners. + * @param {boolean} [bRemove=false] Completely remove the table from the DOM + * @dtopt API + * + * @example + * $(document).ready(function() { + * // This example is fairly pointless in reality, but shows how fnDestroy can be used + * var oTable = $('#example').dataTable(); + * oTable.fnDestroy(); + * } ); + */ + this.fnDestroy = function ( bRemove ) + { + var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); + var nOrig = oSettings.nTableWrapper.parentNode; + var nBody = oSettings.nTBody; + var i, iLen; + + bRemove = (bRemove===undefined) ? false : bRemove; + + /* Flag to note that the table is currently being destroyed - no action should be taken */ + oSettings.bDestroying = true; + + /* Fire off the destroy callbacks for plug-ins etc */ + _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] ); + + /* If the table is not being removed, restore the hidden columns */ + if ( !bRemove ) + { + for ( i=0, iLen=oSettings.aoColumns.length ; itr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove(); + + /* When scrolling we had to break the table up - restore it */ + if ( oSettings.nTable != oSettings.nTHead.parentNode ) + { + $(oSettings.nTable).children('thead').remove(); + oSettings.nTable.appendChild( oSettings.nTHead ); + } + + if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode ) + { + $(oSettings.nTable).children('tfoot').remove(); + oSettings.nTable.appendChild( oSettings.nTFoot ); + } + + /* Remove the DataTables generated nodes, events and classes */ + oSettings.nTable.parentNode.removeChild( oSettings.nTable ); + $(oSettings.nTableWrapper).remove(); + + oSettings.aaSorting = []; + oSettings.aaSortingFixed = []; + _fnSortingClasses( oSettings ); + + $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') ); + + $('th, td', oSettings.nTHead).removeClass( [ + oSettings.oClasses.sSortable, + oSettings.oClasses.sSortableAsc, + oSettings.oClasses.sSortableDesc, + oSettings.oClasses.sSortableNone ].join(' ') + ); + if ( oSettings.bJUI ) + { + $('th span.'+oSettings.oClasses.sSortIcon + + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove(); + + $('th, td', oSettings.nTHead).each( function () { + var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this); + var kids = jqWrapper.contents(); + $(this).append( kids ); + jqWrapper.remove(); + } ); + } + + /* Add the TR elements back into the table in their original order */ + if ( !bRemove && oSettings.nTableReinsertBefore ) + { + nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore ); + } + else if ( !bRemove ) + { + nOrig.appendChild( oSettings.nTable ); + } + + for ( i=0, iLen=oSettings.aoData.length ; i